Ë
    w‡iZ.  ã                  óæ  — d dl mZ d dl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mZ 	 d dlZdZ	 d d	lmZ dZ	 d dlZd dlZdZd
d
d
d
d
d
d
dœZ  ejB                  dejD                  «      Z#dd„Z$dd„Z%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%d„Z0d&d„Z1y# e$ r dZY Œ“w xY w# e$ r dZY Œ—w xY w# e$ r dZY Œ™w xY w)'é    )ÚannotationsN)Ú	dataclassÚasdictÚfield)ÚListÚOptionalÚDictÚAnyÚUnion)ÚPath)ÚImageTF)ÚdecodeÚ-)õ   Â­u   â€�u   â€‘u   â€’u   â€“u   â€”u   âˆ’u0   (?<=\b[0-9A-Za-zÃ€-Ã¿])\s+(?=[0-9A-Za-zÃ€-Ã¿]\b)c                óv   — | s| S d}| }t        d«      D ]"  }|}t        j                  d|«      }||k(  sŒ! |S  |S )u†   
    Coller les lettres sÃ©parÃ©es par des espaces :
    ex: "T o t a l T T C : C D F 491.480,00" -> "Total TTC : CDF 491.480,00"
    Né
   Ú )ÚrangeÚ_RE_SPACED_LETTERSÚsub)ÚsÚprevÚcurÚ_s       új/home/exaucensingi/Documents/ProjectPython/can_archit/extratfile/extractor/normalized_invoice_extractor.pyÚ_collapse_spaced_lettersr   2   sV   € ñ
 ØˆØ€DØ
€Cä�2‹Yò ˆØˆÜ ×$Ñ$ R¨Ó-ˆØ�$‹;ØØ€Jðð
 €Jó    c                óð   — | s| S t        j                  d| «      } | j                  dd«      j                  dd«      } t        j	                  «       D ]  \  }}| j                  ||«      } Œ t        | «      } | S )u5   Normalise accents + tirets + colle lettres espacÃ©es.ÚNFCõ   Â Ú úÚ
)ÚunicodedataÚ	normalizeÚreplaceÚ_DASH_CHARSÚitemsr   )r   ÚchÚrepls      r   Ú_normalize_textr+   C   st   € áØˆÜ×Ñ˜e QÓ'€AØ	�	‰	�&˜#Ó×&Ñ& t¨TÓ2€AÜ×%Ñ%Ó'ò  ‰ˆˆDØ�I‰I�b˜$Ó‰ð ä  Ó#€AØ€Hr   c                óT   — t        j                  dd| xs d«      j                  «       S )Nz
[ \t\xa0]+r!   r   )Úrer   Ústrip©r   s    r   Ú_clean_spacesr0   N   s"   € Ü�6‰6�-  q¢w¨BÓ0×6Ñ6Ó8Ð8r   c                ó  — | sy t        | «      j                  «       j                  dd«      } t        j                  d| «      r#| j                  dd«      j                  dd«      } n…| j                  d«      dk(  r'| j                  d«      dk(  r| j                  dd«      } nJ| j                  d«      dk\  r6| j                  d«      dk\  r"| j                  dd«      j                  dd«      } 	 t        | «      S # t        $ r Y y w xY w)Nr!   r   z\d+\.\d{3},\d{2}ú.ú,é   r   )Ústrr.   r&   r-   ÚsearchÚcountÚfloatÚ
ValueErrorr/   s    r   Ú
_to_numberr:   Q   sÛ   € ÙØÜˆA‹�‰‹×Ñ˜s BÓ'€Aä	‡y�yÐ$ aÔ(Ø�I‰I�c˜2Ó×&Ñ& s¨CÓ0‰à�7‰7�3‹<˜1Ò §¡¨£°Ò!2Ø—	‘	˜#˜sÓ#‰AØ�W‰W�S‹\˜QÒ 1§7¡7¨3£<°1Ò#4Ø—	‘	˜#˜rÓ"×*Ñ*¨3°Ó4ˆAðÜ�Q‹xˆøÜò Ùðús   Ã,
C7 Ã7	DÄDc                óø   ‡— t        j                  «       }t        | d«      5 Št        ˆfd„d«      D ]  }|j	                  |«       Œ 	 d d d «       |j                  «       S # 1 sw Y   |j                  «       S xY w)NÚrbc                 ó&   •— ‰ j                  d«      S )Ni   )Úread)Úfs   €r   ú<lambda>z_sha1_file.<locals>.<lambda>e   s   ø€  !§&¡&¨Ó"5€ r   r   )ÚhashlibÚsha1ÚopenÚiterÚupdateÚ	hexdigest)ÚpathÚhÚchunkr?   s      @r   Ú
_sha1_filerJ   b   sh   ø€ Ü�‰‹€AÜ	ˆd�DÓ	ð ˜QÜÓ5°sÓ;ò 	ˆEØ�H‰H�U�Oñ	÷ð �;‰;‹=Ð÷ð �;‰;‹=Ðús   ¢&A!Á!A9c                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)ÚInvoiceLiner5   ÚdesignationúOptional[float]Úunit_price_ttcÚquantityÚ
amount_ttcN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   rL   rL   n   s   … àÓØ#Ó#ØÓØÔr   rL   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<   y)ÚNormalizedInvoiceDataNúOptional[str]Úinvoice_typeÚinvoice_numberÚcode_def_dgiÚdef_nidÚdef_compteursÚdef_datetimezOptional[int]Únb_articlesrN   Ú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)rR   rS   rT   rZ   rU   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r   Úlistrk   rl   rm   rV   r   r   rX   rX   u   sÇ   … à"&€L�-Ó&Ø$(€N�MÓ(à"&€L�-Ó&Ø!€Gˆ]Ó!Ø#'€M�=Ó'Ø"&€L�-Ó&à!%€K�Ó%Ø%)€M�?Ó)Ø"€FˆOÓ"Ø%)€M�?Ó)Ø"&€L�-Ó&Ø%)€M�?Ó)Ø%)€M�?Ó)Ø(,Ð˜Ó,à€CˆÓØ €FˆMÓ á$°TÔ:€EÐÓ:à!%€K�Ó%Ø%)€O�]Ô)r   rX   c                ó4  — g }t        j                  t        | «      «      5 }|j                  D ]C  }|j	                  «       xs d}t        |«      }|j                  «       sŒ3|j                  |«       ŒE 	 d d d «       dj                  |«      S # 1 sw Y   ŒxY w)Nr   r#   )	Ú
pdfplumberrC   r5   ÚpagesÚextract_textr+   r.   ÚappendÚjoin)Úpdf_pathÚ
text_partsÚpdfÚpageÚts        r   Úextract_text_from_pdfrz   •   s†   € Ø€JÜ	�‰œ˜X›Ó	'ð %¨3Ø—I‘Iò 	%ˆDØ×!Ñ!Ó#Ò) rˆAÜ Ó"ˆAØ�w‰w�yØ×!Ñ! !Õ$ñ		%÷%ð �9‰9�ZÓ Ð ÷%ð %ús   ¡?BÁ!BÂBc                ó   — t         st        d«      ‚t        j                  t	        | «      «      j                  d«      }	 t        j                  |d¬«      }t        |«      S # t        $ r" t        j                  |«      }Y t        |«      S w xY w)NzCOCR non disponible. Installez pytesseract, pillow et tesseract-ocr.ÚRGBzfra+eng)Úlang)
ÚOCR_AVAILABLEÚRuntimeErrorr   rC   r5   ÚconvertÚpytesseractÚimage_to_stringÚ	Exceptionr+   )Ú
image_pathÚimgÚtexts      r   Úextract_text_from_imager‡   Ÿ   s~   € ÝÜÐ`ÓaÐaÜ
�*‰*”S˜“_Ó
%×
-Ñ
-¨eÓ
4€Cð0Ü×*Ñ*¨3°YÔ?ˆô ˜4Ó Ð øô ò 0Ü×*Ñ*¨3Ó/‰Ü˜4Ó Ð ð0ús   Á A" Á"BÂBc                óÎ  — t         r/	 t        | «      }|r |d   j                  j                  dd¬«      S 	 t
        rŒ	 t        j                  | «      }t        |j                  «      dk(  r/|j                  d   dk(  r|d d …d d …d d d…f   j                  «       }t        j                  «       }|j                  |«      \  }}}|r|S 	 y y # t        $ r Y Œžw xY w# t        $ r Y y w xY w)Nr   zutf-8r&   )Úerrorsé   é   éÿÿÿÿ)ÚQR_AVAILABLEÚ	qr_decodeÚdatar   rƒ   ÚCV2_AVAILABLEÚnpÚarrayÚlenÚshapeÚcopyÚcv2ÚQRCodeDetectorÚdetectAndDecode)r…   ÚcodesÚopen_cv_imageÚdetectorr�   Úbboxr   s          r   Ú_decode_qr_from_pil_imager�   ®   sò   € åð	Ü˜c“NˆEÙØ˜Q‘x—}‘}×+Ñ+¨G¸IÐ+ÓFÐFð õ ð	ÜŸH™H S›MˆMä�=×&Ñ&Ó'¨1Ò,°×1DÑ1DÀQÑ1GÈ1Ò1LØ -ªa²±D°b°D¨jÑ 9× >Ñ >Ó @�ä×)Ñ)Ó+ˆHØ$×4Ñ4°]ÓC‰MˆD�$˜ÙØ�ð ñ
 øô% ò 	Ùð	ûô ò 	Øàð	ús#   ˆ,C	 ½BC Ã		CÃCÃ	C$Ã#C$c                ó"  — t         st        sy t        j                  t	        | «      «      j                  d«      }t        |«      }|r|S |j                  \  }}|j                  t        |dz  «      t        |dz  «      ||f«      }t        |«      S )Nr|   çš™™™™™á?)
r�   r�   r   rC   r5   r€   r�   ÚsizeÚcropÚint)r„   r…   ÚqrÚwrH   r¡   s         r   Úextract_qr_from_imager¥   É   sx   € Ý�MØÜ
�*‰*”S˜“_Ó
%×
-Ñ
-¨eÓ
4€CÜ	" 3Ó	'€BÙ	Øˆ	Ø�8‰8�D€A€qØ�8‰8”S˜˜T™“]¤C¨¨D©£M°1°aÐ8Ó9€DÜ$ TÓ*Ð*r   c                ó  — t         st        sy 	 dd l}t	        | «      }|j                  |«      }	 t        |«      dk(  r	 |j                  «        y t        t        |«      d«      }t        |«      D ]ß  }||   }|j                  |j                  dd«      d¬«      }t        j                  d|j                  |j                  g|j                   «      }t#        |«      }	|	r|	c |j                  «        S |j$                  \  }
}|j'                  t)        |
dz  «      t)        |dz  «      |
|f«      }t#        |«      }	|	sŒÍ|	c |j                  «        S  	 |j                  «        y # t        $ r Y y w xY w# |j                  «        w xY w)Nr   rŠ   F)ÚmatrixÚalphar|   rŸ   )r�   r�   Úfitzrƒ   r   rC   r“   ÚcloseÚminr   Ú
get_pixmapÚMatrixr   Ú	frombytesÚwidthÚheightÚsamplesr�   r    r¡   r¢   )ru   r©   rG   ÚdocÚ	max_pagesÚirx   Úpixr…   r£   r¤   rH   r¡   s                r   Úextract_qr_from_pdfr¶   Ô   sU  € Ý�MØðÛô �‹>€DØ
�)‰)�D‹/€CðÜˆs‹8�qŠ=Øð$ 	�	‰	�ô# œ˜C› !Ó$ˆ	Ü�yÓ!ò 	ˆAØ�q‘6ˆDØ—/‘/¨¯©°Q¸Ó):À%�/ÓHˆCÜ—/‘/ %¨#¯)©)°S·Z±ZÐ)@À#Ç+Á+ÓNˆCä*¨3Ó/ˆBÙØ‘	ð 	�	‰	�ð —8‘8‰DˆAˆqØ—8‘8œS  T¡›]¬C°°D±«M¸1¸aÐ@ÓAˆDÜ*¨4Ó0ˆBÚØ‘	ð 	�	‰	�ð!	ð à�	‰	�øô3 ò Ùðûð2 	�	‰	�ús6   �E$ °E3 ÁBE3 Ã3A	E3 Ä=E3 ÅE3 Å$	E0Å/E0Å3Fc                óp  — t        | «      } | j                  d«      }|D �cg c]  }t        |«      sŒt        |«      ‘Œ }}dj                  |«      }t	        g ¬«      }t        j                  d|t
        j                  t
        j                  z  «      }|r$|j                  d«      j                  «       |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|r$|j                  d«      j                  «       |_        t        j                  d|t
        j                  t
        j                  z  «      }|r$|j                  d«      j                  «       |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt        |j                  d«      «      |_        t        j                  d	|t
        j                  t
        j                  z  «      }|r$|j                  d«      j                  «       |_        t        j                  d
|t
        j                  t
        j                  z  «      }|rt%        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt)        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt)        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt)        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|r-t        |j                  d«      «      j                  «       |_        t        j                  d|t
        j                  t
        j                  z  «      }|rt)        |j                  d«      «      |_        t        j                  d|t
        j                  t
        j                  z  «      }|rCt)        |j                  d«      «      |_        |j                  d«      j                  «       |_        t        j                  d|t
        j                  t
        j                  z  «      }|r$|j                  d«      j                  «       |_        t        j:                  dt
        j                  «      }|D ]�  }|j=                  |«      }|sŒ|j>                  jA                  tC        t        |j                  d«      «      t)        |j                  d«      «      t)        |j                  d«      «      t)        |j                  d«      «      «      «       ŒŸ |S c c}w )Nr#   ©rk   z(FACTURE\s+DE\s+VENTE)r4   u/   Facture\s*n[Â°o]\s*[:\-]?\s*([A-Za-z0-9\/\-_]+)z.Code\s*DEF\/DGI\s*[:\-]?\s*([A-Za-z0-9\-]{6,})z%DEF\s*NID\s*[:\-]?\s*([A-Za-z0-9\-]+)u:   DEF\s*Compteurs\s*[:\-]?\s*([0-9\/]+\s*[A-Za-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})u/   Nombre\s*d['Â´`â€™]\s*articles\s*[:\-]?\s*(\d+)zNH\.?T\.?\s*\[[A-Z]\]\s*Taxable\s*16[,\.]00%\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)zITVA\s*\[[A-Z]\]\s*Taxable\s*16[,\.]00%\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)zETotal\s*TTC\s*[:\-]?\s*(?:CDF|FC)?\s*([0-9\.\s]+,[0-9]{2}|[0-9\.\s]+)uI   Mode\s*de\s*paiement\s*[:\-]?\s*([A-Za-zÃ€-Ã¿ ]+?)(?:\s+Total\s*TTC|\s*$)z.Montant\s*TTC\s*\(USD\)\s*[:\-]?\s*([0-9\.,]+)z\Cours\s*de\s*change\s*[:\-]?\s*([0-9\.,]+)\s*(?:\(du\s*|du\s*)([0-9]{2}\/[0-9]{2}\/[0-9]{4})r‹   z!\bISF\s*[:\-]?\s*([A-Za-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Š   é   )"r+   Úsplitr0   rt   rX   r-   r6   Ú
IGNORECASEÚUNICODEÚgroupÚupperrZ   r[   r.   r\   r]   r^   r_   r¢   r`   r:   ra   rb   rc   rd   re   rf   rg   rh   ÚcompileÚmatchrk   rs   rL   )	r†   Ú	raw_linesÚlrk   Újoinedr�   ÚmÚ
line_regexÚmms	            r   Úparse_invoice_textrÇ   ù   sœ  € Ü˜4Ó €Dà—
‘
˜4Ó €IØ'0ÖE !´MÀ!Õ4DŒ]˜1ÕÐE€EÐEØ�Y‰Y�uÓ€Fä  rÔ*€Dä
�	‰	Ð+¨V´R·]±]ÄRÇZÁZÑ5OÓP€AÙØŸG™G A›J×,Ñ,Ó.ˆÔô 	�	‰	Ø:ØÜ
�‰œŸ
™
Ñ"ó	€Añ
 	Ü+¨A¯G©G°A«JÓ7ˆÔä
�	‰	ÐCÀVÌRÏ]É]Ô]_×]gÑ]gÑMgÓh€AÙØŸG™G A›J×,Ñ,Ó.ˆÔä
�	‰	Ð:¸FÄBÇMÁMÔTV×T^ÑT^ÑD^Ó_€AÙØ—w‘w˜q“z×'Ñ'Ó)ˆŒä
�	‰	ÐOÐQWÔY[×YfÑYfÔik×isÑisÑYsÓt€AÙÜ*¨1¯7©7°1«:Ó6ˆÔä
�	‰	Ø]ØÜ
�‰œŸ
™
Ñ"ó	€Añ
 	ØŸG™G A›J×,Ñ,Ó.ˆÔä
�	‰	ÐDÀfÌbÏmÉmÔ^`×^hÑ^hÑNhÓi€AÙÜ˜qŸw™w q›z›?ˆÔä
�	‰	ÐcÐekÔmo×mzÑmzÔ}÷  ~Hñ  ~Hñ  nHó  	I€AÙÜ'¨¯©°«
Ó3ˆÔä
�	‰	Ð^Ð`fÔhj×huÑhuÔxz÷  yCñ  yCñ  iCó  	D€AÙÜ  §¡¨£Ó,ˆŒô 	�	‰	ØPØÜ
�‰œŸ
™
Ñ"ó	€Añ
 	Ü'¨¯©°«
Ó3ˆÔä
�	‰	ØTØÜ
�‰œŸ
™
Ñ"ó	€Añ
 	Ü)¨!¯'©'°!«*Ó5×;Ñ;Ó=ˆÔä
�	‰	ÐCÀVÌRÏ]É]Ô]_×]gÑ]gÑMgÓh€AÙÜ'¨¯©°«
Ó3ˆÔä
�	‰	ØgØÜ
�‰œŸ
™
Ñ"ó	€Añ
 	Ü'¨¯©°«
Ó3ˆÔØ"#§'¡'¨!£*×"2Ñ"2Ó"4ˆÔä
�	‰	Ð6¸ÄÇÁÔPR×PZÑPZÑ@ZÓ[€AÙØ—7‘7˜1“:×#Ñ#Ó%ˆŒô —‘ØxÜ
�
‰
ó€Jð ò ˆØ×Ñ˜aÓ ˆÚØ�J‰J×ÑœkÜ˜bŸh™h q›kÓ*Ü˜2Ÿ8™8 A›;Ó'Ü˜2Ÿ8™8 A›;Ó'Ü˜2Ÿ8™8 A›;Ó'ó	õ ðð €KùòG Fs
   ¡X3²X3c                ó8  — t        | «      } t        g ¬«      }| j                  |_        t	        | «      |_        | j                  j                  «       dk(  rst        | «      }|j                  «       rt        |«      nt        g ¬«      }t        | «      }|r||_        |j                  |_        |j
                  |_        t        |«      S t        | «      }t        |«      }|j                  |_        |j
                  |_        t        | «      |_        t        |«      S )Nr¸   z.pdf)r   rX   Únamerm   rJ   rl   ÚsuffixÚlowerrz   r.   rÇ   r¶   ri   r   r‡   r¥   )rG   Úoutr†   Úparsedr£   s        r   Úextract_normalized_invoicerÎ   g  sè   € Ü�‹:€DÜ
 bÔ
)€CØŸ)™)€CÔÜ  Ó&€C„Oà‡{�{×ÑÓ˜fÒ$Ü$ TÓ*ˆØ-1¯Z©Z¬\Ô# DÔ)Ô?TÐ[]Ô?^ˆô ! Ó&ˆÙØˆFŒMà!$×!4Ñ!4ˆÔØ Ÿ_™_ˆÔÜ�f‹~Ðô # 4Ó(€DÜ Ó%€FØ ×0Ñ0€FÔØŸ™€FÔÜ)¨$Ó/€F„MÜ�&‹>Ðr   )r   r5   Úreturnr5   )r   r5   rÏ   rN   )rG   úUnion[str, Path]rÏ   r5   )ru   rÐ   rÏ   r5   )r„   rÐ   rÏ   r5   )r…   z'Image.Image'rÏ   rY   )r„   rÐ   rÏ   rY   )ru   rÐ   rÏ   rY   )r†   r5   rÏ   rX   )rG   rÐ   rÏ   zDict[str, Any])2Ú
__future__r   r-   rA   r$   Údataclassesr   r   r   Útypingr   r   r	   r
   r   Úpathlibr   rp   ÚPILr   r�   r~   rƒ   Úpyzbar.pyzbarr   rŽ   r�   r–   Únumpyr‘   r�   ÚImportErrorr'   r¿   r¼   r   r   r+   r0   r:   rJ   rL   rX   rz   r‡   r�   r¥   r¶   rÇ   rÎ   rV   r   r   ú<module>rÙ      s=  ðå "ã 	Û Û ß 0Ñ 0ß 3Õ 3Ý ã Ý ðÛØ€MðÝ1Ø€LðÛÛØ€Mð ØØØØØØñ€ð  �R—Z‘ZÐ SÐUW×U_ÑU_Ó`Ð óó"	ó9óó"ð ÷ ð  ó ð ð ÷*ð *ó ð*ó>!ó!óó6	+óóJgô\øðm
 ò Ø‚Mðûð ò Ø‚Lðûð ò Ø‚Mðús5   ¼C ÁC Á
C& ÃCÃCÃC#Ã"C#Ã&C0Ã/C0