Ë
    V‡iƒ1  ã                   óì   — d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d	d
lmZmZ d	dlmZ d	dlmZ d	dlmZ d„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"dZ#dZ$dZ%d„ Z&d„ Z'y)é    )ÚBytesION)ÚQ)ÚrenderÚredirectÚget_object_or_404)Úmessages)ÚHttpResponse)Úrender_to_string)ÚDecimalé   )ÚNormalizedInvoiceÚTauxDeChange)ÚExtractInvoiceUploadForm)Úingest_invoice_file)Úmake_qr_overlay_pdfc                 óº   — | €y|r|dk  ry	 t        t        | «      «      t        t        |«      «      z  j                  t        d«      «      S # t        $ r Y yw xY w)zTConvertit un montant CDF en USD (amount_cdf / rate). Retourne None si rate invalide.Nr   z0.01)r   ÚstrÚquantizeÚ	Exception)Ú
amount_cdfÚrates     úG/home/exaucensingi/Documents/ProjectPython/factures/extratfile/views.pyÚ_to_usdr      s[   € àÐØÙ�4˜1’9ØðÜœ˜J›Ó(¬7´3°t³9Ó+=Ñ=×GÑGÌÐPVËÓXÐXøÜò Ùðús   �A A Á	AÁAc           
      óJ  — d}t        | dd«      r-t        | j                  «      dkD  rt        | j                  «      }|dk(  r—|r|dk  r�t        j                  j                  d¬«      j                  «       }|s.t        j                  j                  dd«      j                  «       }|r0|j                  r$|j                  dkD  rt        |j                  «      }|dk(  xr	 |xr |dkD  }|s|| j                  j                  «       D �cg c]1  }|j                  |j                  |j                  |j                  d	œ‘Œ3 }}|| j                  | j                   | j"                  d
dddœS g }| j                  j                  «       D ]T  }|j%                  |j                  |j                  t'        |j                  |«      t'        |j                  |«      d	œ«       ŒV |t'        | j                  |«      t'        | j                   |«      t'        | j"                  |«      ddddœS c c}w )uy  
    Construit le contexte d'affichage des montants selon la devise (cdf ou usd).
    Si devise == 'usd' et que invoice.exchange_rate est renseignÃ©, convertit tous les montants en USD.
    Sinon affichage en CDF.
    Retourne: dict avec lines_display, total_ttc_display, ht_taxable_16_display, tva_16_display,
    currency_label, phrase_currency, devise (rÃ©el utilisÃ©).
    NÚexchange_rater   ÚusdT)Úactifz
-date_tauxz-id)ÚdesignationÚquantityÚ
unit_priceÚamountÚCDFzfrancs congolaisÚcdf)Úlines_displayÚtotal_ttc_displayÚht_taxable_16_displayÚtva_16_displayÚcurrency_labelÚphrase_currencyÚdeviseÚUSDu   dollars amÃ©ricains)ÚgetattrÚfloatr   r   ÚobjectsÚfilterÚfirstÚorder_byÚtauxÚlinesÚallr   r   Úunit_price_ttcÚ
amount_ttcÚtotal_ttc_cdfÚht_taxable_16Útva_16Úappendr   )Úinvoicer*   r   Útaux_objÚuse_usdÚliner$   s          r   Ú_invoice_display_currencyr?      sù  € ð €DÜˆw˜¨Ô.´5¸×9NÑ9NÓ3OÐRSÒ3SÜ�W×*Ñ*Ó+ˆØ�‚¡¨°ª	Ü×'Ñ'×.Ñ.°TÐ.Ó:×@Ñ@ÓBˆÙÜ#×+Ñ+×4Ñ4°\À5ÓI×OÑOÓQˆHÙ˜Ÿš¨(¯-©-¸!Ò*;Ü˜Ÿ™Ó'ˆDØ˜‰oÒ3 $Ò3¨4°!©8€Gáð  Ÿ™×)Ñ)Ó+ö
ð ð  $×/Ñ/Ø ŸM™MØ"×1Ñ1ØŸ/™/ó	ð
ˆð 
ð +Ø!(×!6Ñ!6Ø%,×%:Ñ%:Ø%Ÿn™nØ#Ø1Øñ
ð 	
ð €MØ—‘×!Ñ!Ó#ò ˆØ×ÑØ×+Ñ+ØŸ™Ü! $×"5Ñ"5°tÓ<Ü˜dŸo™o¨tÓ4ñ	
õ 	ðð 'Ü$ W×%:Ñ%:¸DÓAÜ!(¨×)>Ñ)>ÀÓ!EÜ! '§.¡.°$Ó7ØØ0Øñð ùò7
s   Ä6H c                 ó  — t        | dd«      sy	 ddl}|j                  ddd¬«      }|j                  | j                  «       |j                  d	¬
«       |j                  dd¬«      }t        j                  dd¬«      5 }|j                  |d¬«       |j                  }ddd«       t        j                  j                  «      j                  dd«      }d| j                  › �|fS # 1 sw Y   ŒIxY w# t         $ r Y yw xY w)u‘   GÃ©nÃ¨re l'image QR et la sauvegarde dans un fichier temporaire. Retourne (uri pour le template, path absolu pour link_callback) ou (None, None).Úqr_rawN)NNr   r   é   é   ©ÚversionÚbox_sizeÚborderT©ÚfitÚblackÚwhite©Ú
fill_colorÚ
back_colorFú.png©ÚdeleteÚsuffixÚPNG©Úformatú\ú/zqr:)r,   ÚqrcodeÚQRCodeÚadd_datarA   ÚmakeÚ
make_imageÚtempfileÚNamedTemporaryFileÚsaveÚnameÚosÚpathÚabspathÚreplaceÚpkr   )r;   rX   ÚqrÚimgÚtmprb   Úabs_paths          r   Ú_write_qr_temp_filerj   Y   sç   € ä�7˜H dÔ+ØðÛØ�]‰] 1¨q¸ˆ]Ó;ˆØ
�‰�G—N‘NÔ#Ø
�‰�DˆÔØ�m‰m w¸7ˆmÓCˆÜ×(Ñ(°¸fÔEð 	ÈØ�H‰H�S ˆHÔ'Ø—8‘8ˆD÷	ô —7‘7—?‘? 4Ó(×0Ñ0°°sÓ;ˆØ�W—Z‘Z�LÐ! 8Ð+Ð+÷	ð 	ûô ò Ùðús+   �A/C3 Á? C'ÂAC3 Ã'C0Ã,C3 Ã3	C?Ã>C?c                 ó  — t        | j                  xs d| j                  xs d«      }|j                  «       �r|j                  d   }|j
                  j                  «       j                  d«      s%t        j                  | d«       t        | dd|i«      S 	 t        j                  dt        j                  j                  |j
                  «      d   ¬	«      5 }|j!                  «       D ]  }|j#                  |«       Œ |j
                  }ddd«       	 |j                  j%                  d
«      }t'        |j                  d   j(                  |rt+        |«      nd|j                  j%                  d«      xs dj-                  «       |j                  j%                  d«      xs d|j                  j%                  d«      xs d|j                  j%                  d«      xs d|j                  j%                  d«      xs d|¬«	      }t        j.                  | d«       t1        d|j(                  ¬«      	 t        j2                  |«       S t        | dd|i«      S # 1 sw Y   �ŒOxY w# t4        $ r Y S w xY w# 	 t        j2                  «       w # t4        $ r Y w w xY wxY w# t4        $ rW}t+        |«      }	d|	j                  «       v sd|	j                  «       v r|	› d�}	t        j                  | d|	› �«       Y d}~Œ°d}~ww xY w)u`   Formulaire : sociÃ©tÃ©, client, upload PDF/image â†’ extraction â†’ redirection vers impression.NÚfile)ú.pdfrO   z.jpgz.jpegz.gifz.bmpz.tiffu0   Format acceptÃ© : PDF ou image (PNG, JPG, etc.).zextratfile/upload.htmlÚformFr   rP   Úclient_typeÚsocieteÚ Úpayment_modeÚ
client_nomÚ
client_nifÚclient_telephoneÚclient_adresse)Ú
societe_idro   rr   rs   rt   ru   rv   Úsource_file_fieldz'Facture extraite. Vous pouvez imprimer.úextratfile:print©re   zno such tableÚ
extratfileu)    â€” ExÃ©cutez : python manage.py migratezErreur lors de l'extraction : )r   ÚPOSTÚFILESÚis_validÚcleaned_datar`   ÚlowerÚendswithr   Úerrorr   r]   r^   ra   rb   ÚsplitextÚchunksÚwriteÚgetr   re   r   ÚstripÚsuccessr   Úunlinkr   )
Úrequestrn   Úfrh   ÚchunkÚtmp_pathÚclient_type_objr;   ÚeÚ
err_details
             r   Úextract_uploadr‘   m   s   € ä# G§L¡LÒ$8°D¸'¿-¹-Ò:OÈ4ÓP€DØ‡}�}…Ø×Ñ˜fÑ%ˆØ�v‰v�|‰|‹~×&Ñ&Ð'aÔbÜ�N‰N˜7Ð$VÔWÜ˜'Ð#;¸fÀd¸^ÓLÐLð	SÜ×,Ñ,°EÄ"Ç'Á'×BRÑBRÐST×SYÑSYÓBZÐ[\ÑB]Ô^ð $ÐbeØŸX™X›Zò %�EØ—I‘I˜eÕ$ð%àŸ8™8�÷$ð
Ø"&×"3Ñ"3×"7Ñ"7¸Ó"F�Ü-ØØ#×0Ñ0°Ñ;×>Ñ>Ù8G¤ OÔ 4ÈRØ"&×"3Ñ"3×"7Ñ"7¸Ó"GÒ"MÈ2×!TÑ!TÓ!VØ#×0Ñ0×4Ñ4°\ÓBÒHÀbØ#×0Ñ0×4Ñ4°\ÓBÒHÀbØ%)×%6Ñ%6×%:Ñ%:Ð;MÓ%NÒ%TÐRTØ#'×#4Ñ#4×#8Ñ#8Ð9IÓ#JÒ#PÈbØ&'ô
�ô × Ñ  Ð*SÔTÜÐ 2°w·z±zÔBðÜ—I‘I˜hÕ'ô �'Ð3°f¸d°^ÓDÐD÷A$ñ $ûô. !ò ÙðûðÜ—I‘I˜hÕ'øÜ ò Ùðþô ò 	SÜ˜Q›ˆJØ *×"2Ñ"2Ó"4Ñ4¸È
×HXÑHXÓHZÑ8ZØ *˜|Ð+TÐU�
Ü�N‰N˜7Ð&DÀZÀLÐ$Q×RÑRûð		Sús‡   ÂAJ Ã3IÄJ ÄDI5 È4I&ÉI#ÉJ É&	I2É/J É1I2É2J É5JÉ7JÊJÊ	JÊJÊJÊJÊJ Ê	K?Ê(AK:Ë:K?c                 ó  — t        t        j                  j                  d«      |¬«      }| j                  j                  d«      xs dj                  «       j                  «       }|dvrd}t        ||«      }t        | d||d   |dœ«      S )u\   AperÃ§u facture extraite + bouton Imprimer PDF. ?devise=cdf|usd pour afficher en CDF ou USD.r3   rz   r*   r#   ©r#   r   zextratfile/print.html)r;   r*   Údisplay)
r   r   r.   Úprefetch_relatedÚGETr†   r‡   r€   r?   r   )rŠ   re   r;   r*   r”   s        r   Úextract_printr—   š   sˆ   € äÔ 1× 9Ñ 9× JÑ JÈ7Ó SÐXZÔ[€GØ�k‰k�o‰o˜hÓ'Ò0¨5×7Ñ7Ó9×?Ñ?ÓA€FØ�^Ñ#ØˆÜ'¨°Ó8€GÜ�'Ð2ØØ˜(Ñ#Øñ5ó ð ó    c                 óV	  ‡‡‡— t        t        j                  j                  d«      |¬«      }d|j                  xs |j
                  › d�}| j                  j                  d«      xs dj                  «       j                  «       }|dvrd}t        ||«      }t        |«      \  ŠŠdŠt        |d	d«      r{t        |j                  d
d«      rd|j                  j                  rN	 t        j                   j#                  |j                  j                  j                   «      j%                  dd«      Šˆˆˆfd„}|‰t+        ‰«      |dœ}t-        d|| ¬«      }t/        «       }		 ddlm}
 |
j5                  ||	d|¬«      }|j6                  r�t        |dd«      xs g }|rdj9                  d„ |dd D «       «      nd}t;        j<                  | d|› �«       t?        d|¬«      ‰r7t        j                   jA                  ‰«      r	 t        jB                  ‰«       S S S 	 ‰r5t        j                   jA                  ‰«      r	 t        jB                  ‰«       |	jG                  d«       |	jI                  «       }|s#t;        j<                  | d«       t?        d|¬«      S t        |dd«      rÙ	 ddl%m&}m'}  |t/        |«      «      }tQ        |jR                  d ¬!«      } ||«      } |«       }tU        |jV                  «      D ]E  \  }}|dk(  r*|jV                  r|jY                  |jV                  d   «       |j[                  |«       ŒG t/        «       }|j]                  |«       |jG                  d«       |jI                  «       }t_        |d"¬#«      }d$|› d%�|d&<   |S # t&        t(        f$ r dŠY �Œvw xY w# t(        $ r Y S w xY w# tD        $ rx}t;        j<                  | d|› �«       t?        d|¬«      cY d}~‰rFt        j                   jA                  ‰«      r&	 t        jB                  ‰«       S # t(        $ r Y S w xY wS S d}~ww xY w# t(        $ r Y �Œûw xY w# ‰rFt        j                   jA                  ‰«      r&	 t        jB                  ‰«       w # t(        $ r Y w w xY ww w xY w# tD        $ r Y �Œ,w xY w)'ud   GÃ©nÃ¨re le PDF Ã  partir du HTML (xhtml2pdf). ?devise=usd pour imprimer en USD (taux dans l'admin).r3   rz   zfacture-rm   r*   r#   r“   Nrp   ÚlogorV   rW   c                 ó*   •— | ‰k(  r‰r‰S | dk(  r‰r‰S y )Nzlogo:header© )ÚuriÚ	_basepathÚ	logo_pathÚqr_srcÚqr_temp_paths     €€€r   Úlink_callbackz"extract_pdf.<locals>.link_callback¹   s%   ø€ Ø�&Š=™\ØÐØ�-Ò¡IØÐØr˜   )r;   r    Úhas_logor”   zextratfile/invoice_print.html©rŠ   r   )Úpisazutf-8)ÚdestÚencodingr¢   Úlogz ; c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)r   )Ú.0r�   s     r   ú	<genexpr>zextract_pdf.<locals>.<genexpr>Ö   s   è ø€ Ò =¨A¤ Q§Ñ =ùs   ‚é   u(   Erreur inconnue (vÃ©rifier le HTML/CSS).zErreur PDF : ry   u!   Impossible de gÃ©nÃ©rer le PDF : u   Le PDF gÃ©nÃ©rÃ© est vide.rA   )Ú	PdfReaderÚ	PdfWriteréd   )Úy_mmzapplication/pdf©Úcontent_typezinline; filename="ú"zContent-Disposition)0r   r   r.   r•   Úinvoice_numberÚidr–   r†   r‡   r€   r?   rj   r,   rp   rš   ra   rb   rc   rd   Ú
ValueErrorÚOSErrorÚboolr
   r   Ú	xhtml2pdfr¥   Ú	CreatePDFÚerrÚjoinr   r‚   r   Úisfiler‰   r   ÚseekÚgetvalueÚpypdfr­   r®   r   rA   Ú	enumerateÚpagesÚ
merge_pageÚadd_pager…   r	   )rŠ   re   r;   Úfilenamer*   r”   r¢   ÚcontextÚhtml_stringÚresultr¥   Úpisa_statusÚerr_logÚerr_msgr�   Ú	pdf_bytesr­   r®   Úbase_readerÚoverlay_bufÚoverlay_readerÚwriterÚiÚpageÚoutÚresponserŸ   r    r¡   s                             @@@r   Úextract_pdfrÕ   ¨   s1  ú€ äÔ 1× 9Ñ 9× JÑ JÈ7Ó SÐXZÔ[€GØ˜'×0Ñ0Ò>°G·J±JÐ?¸tÐD€HØ�k‰k�o‰o˜hÓ'Ò0¨5×7Ñ7Ó9×?Ñ?ÓA€FØ�^Ñ#ØˆÜ'¨°Ó8€Gä.¨wÓ7Ñ€FˆLØ€IÜˆw˜	 4Ô(¬W°W·_±_ÀfÈdÔ-SÐX_×XgÑXg×XlÒXlð	ÜŸ™Ÿ™¨¯©×(<Ñ(<×(AÑ(AÓB×JÑJÈ4ÐQTÓUˆIöð ØÜ˜“OØñ	€Gô #Ø'ØØô€Kô
 ‹Y€FðÝ"Ø—n‘nØØØØ'ð	 %ó 
ˆð �?Š?Ü˜k¨5°$Ó7Ò=¸2ˆGÙAH�e—j‘jÑ =°¸¸!°Ô =Ô=ÐNxˆGÜ�N‰N˜7 m°G°9Ð$=Ô>ÜÐ.°2Ô6ñ
 œBŸG™GŸN™N¨<Ô8ðÜ—	‘	˜,Õ'ð 9ˆ<ð ñ œBŸG™GŸN™N¨<Ô8ðÜ—	‘	˜,Ô'ð ‡K�K�„NØ—‘Ó!€IÙÜ�‰�wÐ <Ô=ÜÐ*¨rÔ2Ð2ô ˆw˜ $Ô'ð	ß2Ù#¤G¨IÓ$6Ó7ˆKÜ-¨g¯n©nÀ3ÔGˆKÙ& {Ó3ˆNÙ“[ˆFÜ$ [×%6Ñ%6Ó7ò &‘��4Ø˜’6˜n×2Ò2Ø—O‘O N×$8Ñ$8¸Ñ$;Ô<Ø—‘ Õ%ð&ô “)ˆCØ�L‰L˜ÔØ�H‰H�QŒKØŸ™›ˆIô ˜IÐ4EÔF€HØ(:¸8¸*ÀAÐ&F€HÐ"Ñ#Ø€OøôO œGÐ$ò 	Ø‹Ið	ûôT ò Ùðûô ò 3Ü�‰�wÐ"CÀAÀ3Ð GÔHÜÐ*¨rÔ2Ô2áœBŸG™GŸN™N¨<Ô8ðÜ—	‘	˜,Õ'øÜò Ùðúð 9ˆ<ûð	3ûô ò Úðûñ œBŸG™GŸN™N¨<Ô8ðÜ—	‘	˜,Õ'øÜò Ùðúð 9ˆ<ûô6 ò 	Úð	ús±   Ã$AN Å!A<N: Ç?N+È:P> Ê#CR ÎN(Î'N(Î+	N7Î6N7Î:	P;Ï%P6Ï(P;Ï)Q ÐP%Ð%	P1Ð0P1Ð6P;Ð;Q Ð>	QÑ
QÑ"RÑ1RÒRÒ	RÒRÒRÒRÒ	R(Ò'R(c                 ód  — | j                   j                  d«      xs dj                  «       }t        j                  j                  d«      j                  d«      j                  d«      }|r5|j                  t        |¬«      t        |¬«      z  t        |¬«      z  «      }t        | d	||d
œ«      S )uC   Liste des factures extraites avec actions RÃ©imprimer et Supprimer.Úqrq   rp   r3   z-created_at)Úinvoice_number__icontains)Úclient_nom__icontains)Úsource_filename__icontainszextratfile/invoice_list.html)Úinvoice_listr×   )r–   r†   r‡   r   r.   Úselect_relatedr•   r1   r/   r   r   )rŠ   r×   Úqss      r   Úextract_listrÞ      sš   € à	�‰�‰˜Ó	Ò	# ×*Ñ*Ó,€AÜ	×	"Ñ	"×	1Ñ	1°)Ó	<×	MÑ	MÈgÓ	V×	_Ñ	_Ð`mÓ	n€BÙØ�Y‰YÜ¨Ô*Ü aÔ(ñ)ä¨1Ô-ñ.ó
ˆô
 �'Ð9ÈBÐUVÑ;WÓXÐXr˜   c                 óÂ   — t        t        |¬«      }| j                  dk(  r1|j                  «        t	        j
                  | d«       t        d«      S t        | dd|i«      S )z:Suppression d'une facture extraite (confirmation requise).rz   r|   u   Facture extraite supprimÃ©e.zextratfile:listz&extratfile/invoice_confirm_delete.htmlr;   )r   r   ÚmethodrQ   r   rˆ   r   r   )rŠ   re   r;   s      r   Úextract_deleterá     sX   € äÔ 1°bÔ9€GØ‡~�~˜ÒØ�‰ÔÜ×Ñ˜Ð"@ÔAÜÐ)Ó*Ð*Ü�'ÐCÀiÐQXÐEYÓZÐZr˜   z&https://sygdef.dgirdc.cd/Account/LoginÚ	A2424493AÚ12345c                 óB   — t        | dt        dz   t        t        dœ«      S )uI   Page SYGDEF : bouton pour ouvrir la connexion dans une nouvelle fenÃªtre.zextratfile/sygdef_login.htmlz?ReturnUrl=%2F)Ú
sygdef_urlÚsygdef_userÚsygdef_password)r   ÚSYGDEF_LOGIN_URLÚSYGDEF_DEFAULT_USERÚSYGDEF_DEFAULT_PASSWORDr¤   s    r   Úsygdef_loginrë     s)   € äØØ&ä*Ð-=Ñ=Ü.Ü6ñ	
óð r˜   c                 óÎ  — t        t        |¬«      }|j                  st        d¬«      S 	 ddl}|j                  ddd¬	«      }|j                  |j                  «       |j                  d
¬«       |j                  dd¬«      }t        «       }|j                  |d¬«       |j                  d«       t        |j                  «       d¬«      S # t        $ r t        d¬«      cY S w xY w)uM   Retourne l'image PNG du QR rÃ©gÃ©nÃ©rÃ© Ã  partir de qr_raw (pour l'aperÃ§u).rz   i”  )Ústatusr   Nr   rB   rC   rD   TrH   rJ   rK   rL   rS   rT   z	image/pngr±   iô  )r   r   rA   r	   rX   rY   rZ   r[   r\   r   r_   r¾   r¿   r   )rŠ   re   r;   rX   rf   rg   Úbuffers          r   Úextract_qr_imagerï   )  s½   € äÔ 1°bÔ9€GØ�>Š>Ü 3Ô'Ð'ð(ÛØ�]‰] 1¨q¸ˆ]Ó;ˆØ
�‰�G—N‘NÔ#Ø
�‰�DˆÔØ�m‰m w¸7ˆmÓCˆÜ“ˆØ�‰� ˆÔ&Ø�‰�AŒÜ˜FŸO™OÓ-¸KÔHÐHøÜò (Ü 3Ô'Ò'ð(ús   «B C ÃC$Ã#C$)(Úior   ra   r]   Údjango.db.modelsr   Údjango.shortcutsr   r   r   Údjango.contribr   Údjango.httpr	   Údjango.template.loaderr
   Údecimalr   Úmodelsr   r   Úformsr   Úservicesr   Ú	pdf_utilsr   r   r?   rj   r‘   r—   rÕ   rÞ   rá   rè   ré   rê   rë   rï   rœ   r˜   r   ú<module>rû      s|   ðÝ Û 	Û å ß @Ñ @Ý #Ý $Ý 3å ç 3Ý +Ý )Ý *ò	ò7òtò(*EòZòUòp
Yò[ð <Ð Ø!Ð Ø!Ð ò
ó(r˜   