§
    !†iÿ  ã                  ój  — d dl mZ d dlZd dlZd dlmZmZmZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlZ	 d dlZd dlmZ dZn# e$ r dZY nw xY w	 d d	lmZ d dlmZ dZn# e$ r dZY nw xY wd!d„Zd"d„Zd#d„Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Zd$d„Zd%d„Z d&d„Z!d'd„Z"d(d „Z#dS ))é    )ÚannotationsN)Ú	dataclassÚasdictÚfield)ÚListÚOptionalÚDictÚAnyÚUnion)ÚPath)ÚImageTF)ÚdecodeÚsÚstrÚreturnc                óR   — t          j        dd| ¦  «                             ¦   «         S )Nz[ \t]+ú )ÚreÚsubÚstrip©r   s    úSD:\djangoapp\venvfact\factures\extratfile\extractor\normalized_invoice_extractor.pyÚ_clean_spacesr      s"   € ÝŒ6�)˜S !Ñ$Ô$×*Ò*Ñ,Ô,Ð,ó    úOptional[float]c                óf  — | sd S |                       ¦   «                              dd¦  «        } t          j        d| ¦  «        r+|                      dd¦  «                             dd¦  «        } n¥|                      d¦  «        dk    r0|                      d¦  «        dk    r|                      dd¦  «        } n\|                      d¦  «        dk    rC|                      d¦  «        dk    r*|                      dd¦  «                             dd¦  «        } 	 t          | ¦  «        S # t          $ r Y d S w xY w)Nr   Ú z\d+\.\d{3},\d{2}ú.ú,é   r   )r   Úreplacer   ÚsearchÚcountÚfloatÚ
ValueErrorr   s    r   Ú
_to_numberr&      s"  € Øð ØˆtØ	�Š‰	Œ	×Ò˜#˜rÑ"Ô"€AÝ	„yÐ$ aÑ(Ô(ð 5Ø�IŠI�c˜2ÑÔ×&Ò& s¨CÑ0Ô0ˆˆà�7Š7�3‰<Œ<˜1ÒÐ §¢¨¡¤°Ò!2Ð!2Ø—	’	˜#˜sÑ#Ô#ˆAˆAØ�WŠW�S‰\Œ\˜QÒÐ 1§7¢7¨3¡<¤<°1Ò#4Ð#4Ø—	’	˜#˜rÑ"Ô"×*Ò*¨3°Ñ4Ô4ˆAðÝ�Q‰xŒxˆøÝð ð ð Øˆtˆtðøøøs   ÄD" Ä"
D0Ä/D0ÚpathúUnion[str, Path]c                óú   ‡— t          j        ¦   «         }t          | d¦  «        5 Št          ˆfd„d¦  «        D ]}|                     |¦  «         Œ	 d d d ¦  «         n# 1 swxY w Y   |                     ¦   «         S )NÚrbc                 ó.   •— ‰                       d¦  «        S )Ni   )Úread)Úfs   €r   ú<lambda>z_sha1_file.<locals>.<lambda>1   s   ø€  !§&¢&¨Ñ"5Ô"5€ r   r   )ÚhashlibÚsha1ÚopenÚiterÚupdateÚ	hexdigest)r'   ÚhÚchunkr-   s      @r   Ú
_sha1_filer7   .   s¹   ø€ ÝŒ‰Œ€AÝ	ˆd�DÑ	Ô	ð ˜QÝÐ5Ð5Ð5Ð5°sÑ;Ô;ð 	ð 	ˆEØ�HŠH�U‰OŒOˆOˆOð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �;Š;‰=Œ=Ðs   ¥,AÁA"Á%A"c                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )ÚInvoiceLiner   Údesignationr   Úunit_price_ttcÚquantityÚ
amount_ttcN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   r9   r9   6   sB   € € € € € € àÐÐÑØ#Ð#Ð#Ñ#ØÐÐÑØÐÐÑÐÐr   r9   c                  ó.  — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
d	ed
<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    ee¬¦  «        Zded<   dZded<   dZded<   dS )ÚNormalizedInvoiceDataNúOptional[str]Úinvoice_typeÚinvoice_numberÚcode_def_dgiÚdef_nidÚdef_compteursÚdef_datetimezOptional[int]Únb_articlesr   Úht_taxable_16Útva_16Útotal_ttc_cdfÚpayment_modeÚtotal_ttc_usdÚexchange_rateÚexchange_rate_dateÚisfÚqr_raw)Údefault_factoryzList[InvoiceLine]ÚlinesÚsource_sha1Úsource_filename)r>   r?   r@   rF   rA   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r   ÚlistrW   rX   rY   rB   r   r   rD   rD   =   sc  € € € € € € à"&€LÐ&Ð&Ð&Ñ&Ø$(€NÐ(Ð(Ð(Ñ(Ø"&€LÐ&Ð&Ð&Ñ&Ø!€GÐ!Ð!Ð!Ñ!Ø#'€MÐ'Ð'Ð'Ñ'Ø"&€LÐ&Ð&Ð&Ñ&Ø!%€KÐ%Ð%Ð%Ñ%Ø%)€MÐ)Ð)Ð)Ñ)Ø"€FÐ"Ð"Ð"Ñ"Ø%)€MÐ)Ð)Ð)Ñ)Ø"&€LÐ&Ð&Ð&Ñ&Ø%)€MÐ)Ð)Ð)Ñ)Ø%)€MÐ)Ð)Ð)Ñ)Ø(,ÐÐ,Ð,Ð,Ñ,Ø€CÐÐÐÑØ €FÐ Ð Ð Ñ Ø$˜u°TÐ:Ñ:Ô:€EÐ:Ð:Ð:Ñ:Ø!%€KÐ%Ð%Ð%Ñ%Ø%)€OÐ)Ð)Ð)Ñ)Ð)Ð)r   rD   Úpdf_pathc                ó6  — g }t          j        t          | ¦  «        ¦  «        5 }|j        D ]A}|                     ¦   «         pd}|                     ¦   «         r|                     |¦  «         ŒB	 d d d ¦  «         n# 1 swxY w Y   d                     |¦  «        S )Nr   ú
)Ú
pdfplumberr1   r   ÚpagesÚextract_textr   ÚappendÚjoin)r[   Ú
text_partsÚpdfÚpageÚts        r   Úextract_text_from_pdfrg   T   sÔ   € Ø€JÝ	Œ�˜X™œÑ	'Ô	'ð %¨3Ø”Ið 	%ð 	%ˆDØ×!Ò!Ñ#Ô#Ð) rˆAØ�wŠw‰yŒyð %Ø×!Ò! !Ñ$Ô$Ð$øð	%ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð
 �9Š9�ZÑ Ô Ð s   ¤A
A;Á;A?ÂA?Ú
image_pathc                ó¾   — t           st          d¦  «        ‚t          j        t	          | ¦  «        ¦  «                             d¦  «        }t          j        |¦  «        S )NzCOCR non disponible. Installez pytesseract, pillow et tesseract-ocr.ÚRGB)ÚOCR_AVAILABLEÚRuntimeErrorr   r1   r   ÚconvertÚpytesseractÚimage_to_string)rh   Úimgs     r   Úextract_text_from_imagerq   ]   sN   € Ýð bÝÐ`ÑaÔaÐaÝ
Œ*•S˜‘_”_Ñ
%Ô
%×
-Ò
-¨eÑ
4Ô
4€CÝÔ& sÑ+Ô+Ð+r   rE   c                óæ   — t           sd S t          j        t          | ¦  «        ¦  «                             d¦  «        }t          |¦  «        }|sd S |d         j                             dd¬¦  «        S )Nrj   r   zutf-8r!   )Úerrors)ÚQR_AVAILABLEr   r1   r   rm   Ú	qr_decodeÚdatar   )rh   rp   Úcodess      r   Úextract_qr_from_imagerx   c   si   € Ýð ØˆtÝ
Œ*•S˜‘_”_Ñ
%Ô
%×
-Ò
-¨eÑ
4Ô
4€CÝ�c‰NŒN€EØð ØˆtØ�Œ8Œ=×Ò °	ÐÑ:Ô:Ð:r   Útextc                óþ
  — |                       dd¦  «        } d„ |                      d¦  «        D ¦   «         }d                     |¦  «        }t          g ¬¦  «        }t	          j        d|t          j        ¦  «        }|r,|                     d¦  «                             ¦   «         |_	        t	          j        d|t          j        ¦  «        }|r,|                     d¦  «         
                    ¦   «         |_        t	          j        d|t          j        ¦  «        }|r,|                     d¦  «         
                    ¦   «         |_        t	          j        d	|t          j        ¦  «        }|r,|                     d¦  «         
                    ¦   «         |_        t	          j        d
|t          j        ¦  «        }|r't          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|r,|                     d¦  «         
                    ¦   «         |_        t	          j        d|t          j        ¦  «        }|r't#          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|r't'          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|r't'          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|r't'          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|r9t          |                     d¦  «        ¦  «                             ¦   «         |_        t	          j        d|t          j        ¦  «        }|r't'          |                     d¦  «        ¦  «        |_        t	          j        d|t          j        ¦  «        }|rAt'          |                     d¦  «        ¦  «        |_        |                     d¦  «        |_        t	          j        d|t          j        ¦  «        }|r,|                     d¦  «         
                    ¦   «         |_        t	          j        d¦  «        }|D ]Ã}|                     |¦  «        }|rª|j                             tA          t          |                     d¦  «        ¦  «        t'          |                     d¦  «        ¦  «        t'          |                     d¦  «        ¦  «        t'          |                     d¦  «        ¦  «        ¦  «        ¦  «         ŒÄ|S )Núr]   c                ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S rB   )r   )Ú.0Úls     r   ú
<listcomp>z&parse_invoice_text.<locals>.<listcomp>o   s-   € Ð>Ð>Ð>˜1°A·G²G±I´IÐ>ˆQ�WŠW‰YŒYÐ>Ð>Ð>r   ©rW   z(FACTURE\s+DE\s+VENTE)r    u+   Facture\s*n[Â°o]\s*[:\-]?\s*([A-Z0-9\-\/]+)z(Code\s*DEF\/DGI\s*[:\-]?\s*([A-Z0-9\-]+)z"DEF\s*NID\s*[:\-]?\s*([A-Z0-9\-]+)z2DEF\s*Compteurs\s*[:\-]?\s*([0-9\/]+\s*[A-Z]{1,4})zRDEF\s*Heure\s*[:\-]?\s*([0-9]{2}\/[0-9]{2}\/[0-9]{4}\s+[0-9]{2}:[0-9]{2}:[0-9]{2})z(Nombre\s*d[''']articles\s*[:\-]?\s*(\d+)zOH\.?T\.?\s*\(Taxable\s*16[,\.]00%\)\s*[:\-]?\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)z@TVA\s*\(16[,\.]00%\)\s*[:\-]?\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)zITotal\s*TTC\s*[:\-]?\s*(?:CDF|FC|USD)?\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)u2   Mode\s*de\s*paiement\s*[:\-]?\s*([A-ZÃ‰ÃˆÃŠA-Z ]+)z.Montant\s*TTC\s*\(USD\)\s*[:\-]?\s*([0-9\.,]+)zTCours\s*de\s*change\s*[:\-]?\s*([0-9\.,]+)\s*\(du\s*([0-9]{2}\/[0-9]{2}\/[0-9]{4})\)é   z\bISF\s*[:\-]?\s*([A-Z0-9\-]+)zm^\s*\d+\s+(.+?)\s+([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)\s+(\d+(?:[.,]\d+)?)\s+([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)\s*$é   é   )!r!   Úsplitrb   rD   r   r"   Ú
IGNORECASEÚgroupÚupperrF   r   rG   rH   rI   r   rJ   rK   ÚintrL   r&   rM   rN   rO   rP   rQ   rR   rS   rT   ÚcompileÚmatchrW   ra   r9   )ry   rW   Újoinedrv   ÚmÚ
line_regexr~   Úmms           r   Úparse_invoice_textr�   m   su  € Ø�<Š<˜˜dÑ#Ô#€DØ>Ð> §
¢
¨4Ñ 0Ô 0Ð>Ñ>Ô>€EØ�YŠY�uÑÔ€FÝ  rÐ*Ñ*Ô*€Då
Œ	Ð+¨VµR´]ÑCÔC€AØð /ØŸGšG A™JœJ×,Ò,Ñ.Ô.ˆÔÝ
Œ	Ð@À&Í"Ì-ÑXÔX€AØð 1ØŸgšg a™jœj×.Ò.Ñ0Ô0ˆÔÝ
Œ	Ð=¸vÅrÄ}ÑUÔU€AØð /ØŸGšG A™JœJ×,Ò,Ñ.Ô.ˆÔÝ
Œ	Ð7¸ÅÄÑOÔO€AØð *Ø—w’w˜q‘z”z×'Ò'Ñ)Ô)ˆŒÝ
Œ	ÐGÈÕQSÔQ^Ñ_Ô_€AØð 7Ý*¨1¯7ª7°1©:¬:Ñ6Ô6ˆÔÝ
Œ	ÐgÐioÕqsÔq~ÑÔ€AØð /ØŸGšG A™JœJ×,Ò,Ñ.Ô.ˆÔÝ
Œ	Ð=¸vÅrÄ}ÑUÔU€AØð +Ý˜qŸwšw q™zœz™?œ?ˆÔÝ
Œ	ÐdÐflÕnpÔn{Ñ|Ô|€AØð 4Ý'¨¯ª°©
¬
Ñ3Ô3ˆÔÝ
Œ	ÐUÐW]Õ_aÔ_lÑmÔm€AØð -Ý  §¢¨¡¤Ñ,Ô,ˆŒÝ
Œ	Ð^Ð`fÕhjÔhuÑvÔv€AØð 4Ý'¨¯ª°©
¬
Ñ3Ô3ˆÔÝ
Œ	ÐGÈÕQSÔQ^Ñ_Ô_€AØð >Ý)¨!¯'ª'°!©*¬*Ñ5Ô5×;Ò;Ñ=Ô=ˆÔÝ
Œ	ÐCÀVÍRÌ]Ñ[Ô[€AØð 4Ý'¨¯ª°©
¬
Ñ3Ô3ˆÔÝ
Œ	ÐiÐkqÕsuô  tAñ  	Bô  	B€AØð -Ý'¨¯ª°©
¬
Ñ3Ô3ˆÔØ"#§'¢'¨!¡*¤*ˆÔÝ
Œ	Ð3°V½R¼]ÑKÔK€AØð &Ø—7’7˜1‘:”:×#Ò#Ñ%Ô%ˆŒå”Øxñô €Jð ð ð ˆØ×Ò˜aÑ Ô ˆØð 	ØŒJ×Ò�kÝ˜bŸhšh q™kœkÑ*Ô*Ý˜2Ÿ8š8 A™;œ;Ñ'Ô'Ý˜2Ÿ8š8 A™;œ;Ñ'Ô'Ý˜2Ÿ8š8 A™;œ;Ñ'Ô'ñ	ô ñ ô ð øð €Kr   úDict[str, Any]c                ó<  — t          | ¦  «        } t          g ¬¦  «        }| j        |_        t	          | ¦  «        |_        | j                             ¦   «         dk    rht          | ¦  «        }| 	                    ¦   «         st          d¦  «        ‚t          |¦  «        }|j        |_        |j        |_        t          |¦  «        S t          | ¦  «        }t          |¦  «        }|j        |_        |j        |_        t          | ¦  «        |_        t          |¦  «        S )Nr€   z.pdfuS   PDF sans texte (probablement scannÃ©). Convertissez en image ou uploadez une image.)r   rD   ÚnamerY   r7   rX   ÚsuffixÚlowerrg   r   rl   r�   r   rq   rx   rU   )r'   Úoutry   Úparseds       r   Úextract_normalized_invoicer—   ®   sû   € Ý�‰:Œ:€DÝ
 bÐ
)Ñ
)Ô
)€CØœ)€CÔÝ  Ñ&Ô&€C„Oà„{×ÒÑÔ˜fÒ$Ð$Ý$ TÑ*Ô*ˆØ�zŠz‰|Œ|ð 	ÝØeñô ð õ $ DÑ)Ô)ˆØ!$Ô!4ˆÔØ œ_ˆÔÝ�f‰~Œ~Ðå" 4Ñ(Ô(€DÝ Ñ%Ô%€FØ Ô0€FÔØœ€FÔÝ)¨$Ñ/Ô/€F„MÝ�&‰>Œ>Ðr   )r   r   r   r   )r   r   r   r   )r'   r(   r   r   )r[   r(   r   r   )rh   r(   r   r   )rh   r(   r   rE   )ry   r   r   rD   )r'   r(   r   r�   )$Ú
__future__r   r   r/   Údataclassesr   r   r   Útypingr   r   r	   r
   r   Úpathlibr   r^   rn   ÚPILr   rk   Ú	ExceptionÚpyzbar.pyzbarr   ru   rt   r   r&   r7   r9   rD   rg   rq   rx   r�   r—   rB   r   r   ú<module>rŸ      sD  ðà "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð à Ð Ð Ð ðØÐÐÐØÐÐÐÐÐØ€M€MøØð ð ð Ø€M€M€MðøøøðØ1Ð1Ð1Ð1Ð1Ð1ØÐÐÐÐÐØ€L€LøØð ð ð Ø€L€L€Lðøøøð-ð -ð -ð -ðð ð ð ð ð ð ð ð ð ð  ð  ð  ð  ñ  ô  ñ „ð ð ð*ð *ð *ð *ð *ñ *ô *ñ „ð*ð,!ð !ð !ð !ð,ð ,ð ,ð ,ð;ð ;ð ;ð ;ð>ð >ð >ð >ðBð ð ð ð ð s!   ²? ¿A	ÁA	ÁA ÁA&Á%A&