ó
    æÌj-  ã                   óÊ  • S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKr\R                  " S5      rS rS	\4S
 jrS\\   S	\4S jr SS\S\S\S\\   S\S\S\S\S	\4S jjr S S\S\S\S\\\\4      S-  S	\4
S jjr  S!S\S\S\S\S\\   S\S\S\S\\\\4      S-  S	\4S jjr S"S\S\S\S\S\\   S\S\S	\4S jjrS"S\S\S\S\S	\4
S jjrg)#uÔ  
email_service.py â€” e-mails transactionnels Meeconic (SMTP TLS 587).

Deux envois :
  - send_order_confirmation()  â†’ reÃ§u HTML Ã  la famille aprÃ¨s commande
  - send_company_notification()â†’ alerte interne Ã  l'Ã©quipe Meeconic

Variables .env (service transactionnel recommandÃ© : Brevo ou Resend â€” PAS Gmail) :
    SMTP_HOST   (ex. smtp-relay.brevo.com / smtp.resend.com)
    SMTP_PORT   (587)
    SMTP_USER   (login SMTP)
    SMTP_PASS   (clÃ© SMTP, pas le mot de passe du compte)
    SMTP_FROM   ("Meeconic <noreply@photos.meeconic.com>")  â€” dÃ©faut SMTP_USER
    COMPANY_NOTIFICATION_EMAIL  (destinataire des alertes internes)

Si SMTP n'est pas configurÃ©, les fonctions renvoient False sans lever d'erreur.
é    N)Úencoders)ÚMIMEBase)ÚMIMEMultipart)ÚMIMETextzmeeconic.emailc                  ó°  • [         R                  " SS5      n [        [         R                  " SS5      5      n[         R                  " SS5      R                  5       n[         R                  " S[         R                  " SS5      5      R	                  S	S5      n[         R                  " S
[         R                  " SU5      5      R                  5       nXX#U4$ )NÚ	SMTP_HOSTzsmtp-relay.brevo.comÚ	SMTP_PORTÚ587Ú	SMTP_USERÚ ÚSMTP_PASSWORDÚ	SMTP_PASSÚ Ú	SMTP_FROMÚ
EMAIL_FROM)ÚosÚgetenvÚintÚstripÚreplace)ÚhostÚportÚuserÚpwÚsenders        ÚYD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\services\email_service.pyÚ_cfgr      sš   € Ü�9Š9�[Ð"8Ó9€DÜŒr�yŠy˜ eÓ,Ó-€DÜ�9Š9�[ "Ó%×+Ñ+Ó-€Dä�9Š9�_¤b§i¢i°¸RÓ&@ÓA×IÑIÈ#ÈrÓR€BÜ�YŠY�{¤B§I¢I¨l¸DÓ$AÓB×HÑHÓJ€FØ�t Ð'Ð'ó    Úreturnc                  óF   • [        5       u    pp [        U=(       a    U5      $ ©N)r   Úbool)Ú_r   r   s      r   Úis_configuredr$   )   s   € Ü›Ñ€A€q�Ü�—˜ÓÐr   Úitemsc                 ó€  • SnU  Hµ  n[         R                  " [        UR                  SS5      5      5      nUR                  S5      (       a1  [         R                  " SUR                  S5      =(       d    S 35      OSnUR                  SS5      nUR                  SS	5      U-  nUS
U SU SU SUS S3	-  nM·     U$ )Nr   Úformat_labelÚis_magicu   âœ¨ Ú	job_labelÚquantityé   Ú
unit_pricer   z^<tr><td style='padding:9px 12px;border-bottom:1px solid #F0EDE4;font-size:13px;color:#141B2E'>z_</td><td style='padding:9px 12px;border-bottom:1px solid #F0EDE4;font-size:13px;color:#6E7585'>zq</td><td style='padding:9px 12px;border-bottom:1px solid #F0EDE4;font-size:13px;text-align:center;color:#6E7585'>z†</td><td style='padding:9px 12px;border-bottom:1px solid #F0EDE4;font-size:13px;text-align:right;font-family:monospace;color:#0A1F44'>ú.0fu    â‚¬</td></tr>)ÚhtmlÚescapeÚstrÚget)r%   ÚrowsÚitÚlabelÚoptÚqtyÚprices          r   Ú_items_rowsr8   .   sæ   € Ø€DÛˆÜ—’œC §¡ ~°rÓ :Ó;Ó<ˆØACÇÁÈ
×ASÑASŒd�kŠk˜D §¡¨Ó!4×!:¸Ð ;Ð<Ô=ÐY[ˆØ�f‰f�Z Ó#ˆØ—‘�| QÓ'¨#Ñ-ˆØØlÐmrÐlsð tiØilÐhmð n{Ø{~Ðzð @Pð QVð  WZð  P[ð  [iðjñ	
Šñ ð €Kr   ÚnameÚorder_idÚfamily_codeÚtotalÚhas_digitalÚ
portal_urlÚattachedc                 ó”  • [         R                  " U =(       d    S5      [         R                  " U5      p SnU(       a_  U(       a*  [         R                  " UR                  S5       SU 35      OSn	U	(       a  SU	 S3OSn
U(       a  SU S3OSnS	U-   S
-   U
-   S-   nSUS S R                  5        SU S[	        U5       SUS SU S3$ )Nr   Ú/z/?code=z
 <a href="z=" style="color:#0A1F44;font-weight:700">Ouvrir mon espace</a>u6   Vos photos numÃ©riques HD sont jointes Ã  cet e-mail (u1   ). Vous pouvez aussi les retrouver Ã  tout momentu>   Vos photos numÃ©riques HD sont disponibles au tÃ©lÃ©chargementzU<tr><td style='padding:18px 32px 0'><p style='margin:0;font-size:13px;color:#141B2E'>u:    dans votre espace famille (rubrique Â« Mes commandes Â»).z</p></td></tr>u¢  <!DOCTYPE html>
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"></head>
<body style="margin:0;padding:0;background:#F7F4EE;font-family:Outfit,Arial,sans-serif">
  <table width="100%" cellpadding="0" cellspacing="0" style="background:#F7F4EE;padding:40px 0"><tr><td align="center">
    <table width="560" cellpadding="0" cellspacing="0" style="background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 4px 24px rgba(10,31,68,.08);border:1px solid #E7E2D6">
      <tr><td style="background:linear-gradient(135deg,#071633,#0A1F44);padding:26px 32px">
        <div style="color:#fff;font-size:22px;font-weight:700;letter-spacing:3px">MEE<span style="color:#E8D48B">CO</span>NIC</div>
        <div style="color:rgba(255,255,255,.7);font-size:12px;margin-top:4px">L'instant d'Ã©cole</div>
      </td></tr>
      <tr><td style="padding:28px 32px 0">
        <h1 style="margin:0;color:#0A1F44;font-size:24px;font-family:Georgia,serif">Commande confirmÃ©e !</h1>
        <p style="margin:12px 0 0;font-size:14px;color:#141B2E">Bonjour,</p>
        <p style="margin:8px 0 0;font-size:14px;color:#141B2E">Votre commande <strong>é   u<  </strong> a bien Ã©tÃ© reÃ§ue.</p>
      </td></tr>
      <tr><td style="padding:18px 32px 0">
        <p style="margin:0;font-size:11px;color:#9ca3af;text-transform:uppercase;letter-spacing:.08em">Code famille</p>
        <p style="margin:4px 0 0;font-family:monospace;font-size:18px;font-weight:800;color:#0A1F44">u  </p>
      </td></tr>
      <tr><td style="padding:18px 32px 0">
        <table width="100%" style="border-collapse:collapse;border:1px solid #F0EDE4;border-radius:10px;overflow:hidden">
          <thead><tr style="background:#F7F4EE">
            <th style="padding:9px 12px;text-align:left;font-size:10.5px;color:#6E7585;text-transform:uppercase">Format</th>
            <th style="padding:9px 12px;text-align:left;font-size:10.5px;color:#6E7585;text-transform:uppercase">Option</th>
            <th style="padding:9px 12px;text-align:center;font-size:10.5px;color:#6E7585;text-transform:uppercase">QtÃ©</th>
            <th style="padding:9px 12px;text-align:right;font-size:10.5px;color:#6E7585;text-transform:uppercase">Prix</th>
          </tr></thead>
          <tbody>u  
            <tr><td colspan="3" style="padding:12px;border-top:2px solid #C9A227;font-weight:700;color:#0A1F44">Total payÃ©</td>
                <td style="padding:12px;border-top:2px solid #C9A227;text-align:right;font-family:monospace;font-size:18px;font-weight:800;color:#0A1F44">r-   uJ    â‚¬</td></tr>
          </tbody>
        </table>
      </td></tr>
      u‹  <tr><td style="padding:24px 32px 0">
        <p style="margin:0;font-size:12px;color:#6E7585;line-height:1.6">Livraison des tirages en classe sous 5 Ã  10 jours ouvrÃ©s. Merci de votre confiance.</p>
      </td></tr>
      <tr><td style="padding:24px 0 0"><div style="height:5px;background:linear-gradient(90deg,#C9A227,#E8D48B)"></div></td></tr>
    </table>
  </td></tr></table>
</body></html>)r.   r/   ÚrstripÚupperr8   )r9   r:   r;   r%   r<   r=   r>   r?   ÚdlÚlinkÚctaÚleads               r   Ú_confirmation_htmlrI   >   s4  € äŸš D§J¨BÓ/´·²¸[Ó1Iˆ+Ø	€BÞÞOYŒt�{Š{˜j×/Ñ/°Ó4Ð5°W¸[¸MÐJÔKÐ_aˆÞbf�
˜4˜&Ð ]Ñ^Ðlnˆö EMð IÈÈ
ð SAñ AàPð 	ð fØñØSñTØVYñZØ\lñmˆðWð X`Ð`bÐabÐWc×WiÑWiÓWkÐVlð mfð grÐerð 
sô ˜eÓ$Ð%ð &[ð \að  beð  [fð fð 
€dð ðA&ð &r   ÚtoÚsubjectr.   Úattachmentsc           	   ƒ   óˆ  #   • [        5       (       d  [        R                  SU5        g[        5       u  pEpgn [	        U(       a  SOS5      n	XS'   X‰S'   X	S'   U	R                  [        USS	5      5        U=(       d    /  HZ  u  p«[        S
S5      nUR                  U5        [        R                  " U5        UR                  SSU
S9  U	R                  U5        M\     [        R                  " X”XVUSS9I S h  v•N   [        R                  SX5        g N! [         a   n[        R!                  SX5         S nAgS nAff = f7f)Nu+   SMTP not configured â€” e-mail skipped (%s)FÚmixedÚalternativeÚSubjectÚFromÚTor.   zutf-8Úapplicationzoctet-streamzContent-DispositionÚ
attachment)ÚfilenameT)Úhostnamer   ÚusernameÚpasswordÚ	start_tlszE-mail sent -> %s (%s)zE-mail sending failed -> %s: %s)r$   ÚlogÚwarningr   r   Úattachr   r   Úset_payloadr   Úencode_base64Ú
add_headerÚ
aiosmtplibÚsendÚinfoÚ	ExceptionÚerror)rJ   rK   r.   rL   r   r   r   r   r   ÚmsgÚfnameÚdataÚpartÚes                 r   Ú_sendrj   t   s  é € ä�?‰?Ü�‰ÐAÀ7ÔKØÜ#'£6Ñ €D�˜&ðÜ¦{™G¸ÓFˆØ ˆI‰ØˆF‰ØˆD‰	Ø�
‰
”8˜D &¨'Ó2Ô3Ø&×,¨"Ò,‰KˆEÜ˜M¨>Ó:ˆDØ×Ñ˜TÔ"Ü×"Ò" 4Ô(Ø�O‰OÐ1°<È%ˆOÑPØ�J‰J�tÖñ -ô �oŠo˜c°tÐUWÐcgÑh×hÐhÜ�‰Ð)¨2Ô7Øñ 	iøô ó Ü�	‰	Ð3°RÔ;ÜûðüsA   ‚5E¸B?D Ã7DÃ8D ÄEÄD Ä
D?ÄD:Ä5EÄ:D?Ä?Ec	              ƒ   óž   #   • [        XX4XVU[        U=(       d    / 5      S9n	[        U SUSS R                  5        3X˜5      I Sh  v•N $  N7f)u^   ReÃ§u de commande envoyÃ© Ã  la famille, avec les originaux HD en piÃ¨ces jointes s'il y en a.)r?   u"   Meeconic â€” Commande confirmÃ©e #NrB   )rI   Úlenrj   rD   )
rJ   r9   r:   r;   r%   r<   r=   r>   rL   Úbodys
             r   Úsend_order_confirmationrn   Ž   sU   é € ô
 ˜d¨kÀ%ÐV`Ü'*¨;×+<¸"Ó'=ñ?€Dä�rÐ?ÀÈÈ!À×@RÑ@RÓ@TÐ?UÐVÐX\Ój×jÐjÑjùs   ‚AAÁAÁAÚcustomer_nameÚcustomer_emailc              ƒ   óœ  #   • U=(       d    [         R                  " SS5      R                  5       nU(       d  g[        U5      n[        R
                  " U5      [        R
                  " U=(       d    S5      [        R
                  " U=(       d    S5      p©nSU SU	 SU
 SU SUS	 S
U  S3n[        USU SUS	 S3U5      I Sh  v•N $  N7f)uB   Alerte interne Ã  l'Ã©quipe Meeconic (COMPANY_NOTIFICATION_EMAIL).ÚCOMPANY_NOTIFICATION_EMAILr   Fu-  <!DOCTYPE html><html><body style="font-family:Arial,sans-serif;background:#F7F4EE;padding:32px 0">
    <table width="560" cellpadding="0" cellspacing="0" style="margin:0 auto;background:#fff;border-radius:12px;overflow:hidden;border:1px solid #E7E2D6">
      <tr><td style="background:#0A1F44;padding:22px 32px">
        <div style="color:rgba(255,255,255,.7);font-size:11px;text-transform:uppercase;letter-spacing:.1em">Notification interne</div>
        <div style="color:#fff;font-size:19px;font-weight:700;margin-top:4px">ðŸ›’ Nouvelle commande</div></td></tr>
      <tr><td style="padding:22px 32px">
        <p style="margin:0 0 4px;font-size:11px;color:#6E7585;text-transform:uppercase">Code famille</p>
        <p style="margin:0 0 14px;font-size:20px;font-weight:800;color:#0A1F44;font-family:monospace">zR</p>
        <p style="margin:4px 0;font-size:13px;color:#141B2E"><b>Classe :</b> u    â€” z”</p>
        <table width="100%" style="margin-top:14px;border-collapse:collapse;border:1px solid #F0EDE4;border-radius:8px;overflow:hidden"><tbody>zz</tbody></table>
        <p style="margin:14px 0 0;font-size:16px;font-weight:700;text-align:right;color:#0A1F44">Total : r-   uW    â‚¬</p>
        <p style="margin:12px 0 0;font-size:11px;color:#9ca3af">ID commande : z™</p>
      </td></tr>
      <tr><td><div style="height:4px;background:linear-gradient(90deg,#C9A227,#E8D48B)"></div></td></tr>
    </table></body></html>u   ðŸ›’ Nouvelle commande â€” u    â‚¬N)r   r   r   r8   r.   r/   rj   )r:   r;   ro   rp   r%   r<   rJ   r2   Úfamily_code_hÚname_hÚemail_hrm   s               r   Úsend_company_notificationrv   ˜   s  é € ð ×
;”—	’	Ð6¸Ó;×	BÑ	BÓ	D€BÞØÜ�uÓ€DÜ%)§[¢[°Ó%=¼t¿{º{È=×K^Ð\^Ó?_Ôae×alÒalÐm{÷  nBð  @Bó  bC˜7€Mðgð huÐfuð vNØNTÈXÐUZÐ[bÐZcð dPð QUð  PVð VjØjoÐpsÐitð uOØOWÈjð Yð€Dô �rÐ8¸¸ÀUÈ5ÐQTÈ+ÐUYÐZÐ\`Óa×aÐaÑaùs   ‚CCÃC
ÃCc              ƒ   óÚ   #   • U(       a  S[         R                  " U5       S3OSnSUSS R                  5        SU S3n[        U S	USS R                  5        3U5      I Sh  v•N $  N7f)
uI   PrÃ©vient la famille que son paiement a Ã©chouÃ© (elle peut recommencer).z<p><a href="z"">Retourner sur le portail</a></p>r   zr<html><body style="font-family:Arial,sans-serif;color:#141B2E"><p>Bonjour,</p><p>Le paiement de votre commande <b>NrB   ut   </b> n'a pas abouti. Aucun montant n'a Ã©tÃ© dÃ©bitÃ©. Vous pouvez recommencer votre commande depuis le portail.</p>u+   <p>â€” L'Ã©quipe Meeconic</p></body></html>u"   Meeconic â€” Paiement non abouti #)r.   r/   rD   rj   )rJ   r9   r:   r>   rF   rm   s         r   Úsend_payment_failedrx   ³   s„   é € æ[eˆ]œ4Ÿ;š; zÓ2Ð3Ð3VÑWÐkm€Dð3à3;¸B¸Q°<×3EÑ3EÓ3GÐ2Hð InØnrÐmsØ9ð	;€Dô
 �rÐ?ÀÈÈ!À×@RÑ@RÓ@TÐ?UÐVÐX\Ó]×]Ð]Ñ]ùs   ‚A"A+Á$A)Á%A+)Fr   r   r!   )Fr   N)r   )Ú__doc__r.   Úloggingr   Úemailr   Úemail.mime.baser   Úemail.mime.multipartr   Úemail.mime.textr   r`   Ú	getLoggerrZ   r   r"   r$   ÚlistÚdictr0   r8   Úfloatr   rI   ÚtupleÚbytesrj   rn   rv   rx   © r   r   Ú<module>r†      sý  ðñó" Û Û 	Ý Ý $Ý .Ý $ã à×ÒÐ(Ó)€ò(ð�tô ð
�t˜D‘zð  cô ð" YZñ3˜Sð 3¨Cð 3¸cð 3È$ÈtÉ*ð 3Ð]bð 3Ø$(ð3Ø>Að3ØRUð3Ø^aõ3ðn ?Cñ�Cð  #ð ¨Sð Ø! %¨¨U¨
Ñ"3Ñ4°tÑ;ðØGKõð8 PRØPTñk cð k°ð kÀð kØ/2ðkØ;?À¹:ðkØNSðkà/3ðkàILðkð 04°E¸#¸u¸*Ñ4EÑ/FÈÑ/Mðkð Z^õkð /1ñb¨cð bÀð bÐTWð bØ47ðbØ@DÀTÁ
ðbØSXðbà(+ðbà59õbñ6^ #ð ^¨Sð ^¸Cð ^ÈSð ^ÐZ^ö ^r   