Ë
    5IÎj£/  ã                   ó²  — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlZ ej                  d«      Zd„ Zd	efd
„Zdee   d	efd„Z	 ddedededee   dedededed	efd„Z	 d dedededeeeef      dz  d	ef
d„Z	 	 d!dededededee   dedededeeeef      dz  d	efd„Z	 d"dededededee   deded	efd„Zd"dedededed	ef
d„Zy)#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                  ó¦  — t        j                  dd«      } t        t        j                  dd«      «      }t        j                  dd«      j                  «       }t        j                  dt        j                  dd«      «      j	                  d	d«      }t        j                  d
t        j                  d|«      «      j                  «       }| ||||fS )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        ú1/var/www/photos/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˜R Ð'Ð'ó    Úreturnc                  ó@   — t        «       \  } } }}} t        |xr |«      S ©N)r   Úbool)Ú_r   r   s      r   Úis_configuredr$   )   s#   € Ü›Ñ€A€qˆ$��AÜ�’˜ÓÐr   Úitemsc                 ó`  — d}| D ]¦  }t        j                  t        |j                  dd«      «      «      }|j                  d«      r)t        j                  |j                  d«      xs d› «      nd}|j                  dd«      }|j                  dd«      |z  }|d	|› d
|› d|› d|d›d�	z  }Œ¨ |S )Nr   Úformat_labelÚis_magicÚ	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Ó :Ó;Ó<ˆØ=?¿V¹VÀJÔ=OŒd�k‰k˜RŸV™V KÓ0Ò6°BÐ7Ô9ÐUWˆØ�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                 ó^  — t        j                  | xs d«      t        j                  |«      }} d}|rO|r)t        j                  |j                  d«      › d|› �«      nd}	|	rd|	› d�nd}
|rd|› d�nd}d	|z   d
z   |
z   dz   }d|d d j                  «       › d|› dt	        |«      › d|d›d|› d�S )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   >   s6  € äŸ™ D¢J¨BÓ/´·±¸[Ó1Iˆ+€DØ	€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              ƒ   ó€  K  — t        «       st        j                  d|«       yt        «       \  }}}}}	 t	        |rdnd«      }	||	d<   ||	d<   | |	d<   |	j                  t        |dd	«      «       |xs g D ]\  \  }
}t        d
d«      }|j                  |«       t        j                  |«       |j                  dd|
¬«       |	j                  |«       Œ^ t        j                  |	||||d¬«      ƒ d {  –—†  t        j                  d| |«       y7 Œ# t        $ r!}t        j!                  d| |«       Y d }~yd }~ww xY w­w)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   s0  è ø€ äŒ?Ü�‰ÐAÀ7ÔKØÜ#'£6Ñ €Dˆ$��b˜&ðÜ¡{™G¸ÓFˆØ ˆˆI‰ØˆˆF‰ØˆˆD‰	Ø�
‰
”8˜D &¨'Ó2Ô3Ø&Ò,¨"ò 	‰KˆE�4Ü˜M¨>Ó:ˆDØ×Ñ˜TÔ"Ü×"Ñ" 4Ô(Ø�O‰OÐ1°<È%ˆOÔPØ�J‰J�tÕð	ô �o‰o˜c¨D°tÀdÐUWÐcgÔh×hÐhÜ�‰Ð)¨2¨wÔ7Øð 	iùô ò Ü�	‰	Ð3°R¸Ô;ÜûðüsA   ‚2D>µB=D Ã2DÃ3D ÄD>ÄD Ä	D;ÄD6Ä1D>Ä6D;Ä;D>c	              ƒ   óB  K  — d|dd j                  «       › �}	t        |||||||t        |xs g «      ¬«      }
t        | |	|
|«      ƒ d{  –—† ry|syt        j                  dt        |«      |«       t        |||||||d¬«      }
t        | |	|
«      ƒ d{  –—† S 7 ŒP7 Œ­w)	u^   ReÃ§u de commande envoyÃ© Ã  la famille, avec les originaux HD en piÃ¨ces jointes s'il y en a.u"   Meeconic â€” Commande confirmÃ©e #NrB   )r?   TFuF   E-mail with %d attachment(s) refused for %s â€” resending without themr   )rD   rI   Úlenrj   rZ   r[   )rJ   r9   r:   r;   r%   r<   r=   r>   rL   rK   Úbodys              r   Úsend_order_confirmationrn   Ž   s¹   è ø€ ð
 3°8¸B¸Q°<×3EÑ3EÓ3GÐ2HÐI€GÜ˜d H¨k¸5À%ÈÐV`Ü'*¨;Ò+<¸"Ó'=ô?€Dä�2�w  kÓ2×2Ð2ØÙØô ‡K�KÐXÔZ]Ð^iÓZjÐltÔuÜ˜d H¨k¸5À%ÈÐV`ÐklÔm€DÜ�r˜7 DÓ)×)Ð)ð 3øð *ús%   ‚ABÁ
BÁABÂBÂBÂBÚcustomer_nameÚcustomer_emailc              ƒ   ón  K  — |xs t        j                  dd«      j                  «       }|syt        |«      }t	        j
                  |«      t	        j
                  |xs d«      t	        j
                  |xs d«      }
}	}d|› d|	› d|
› d|› d|d	›d
| › d�}t        |d|› d|d	›d�|«      ƒ d{  –—† S 7 Œ­w)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�6€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   ‚B,B5Â.B3Â/B5c              ƒ   óÎ   K  — |rdt        j                  |«      › d�nd}d|dd j                  «       › d|› d�}t        | d	|dd j                  «       › �|«      ƒ d{  –—† S 7 Œ­w)
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ô  ðñó" Û Û 	Ý Ý $Ý .Ý $ã à€g×ÑÐ(Ó)€ò(ð�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ñ* cð *°ð *Àð *Ø/2ð*Ø;?À¹:ð*ØNSð*à/3ð*àILð*ð 04°E¸#¸u¸*Ñ4EÑ/FÈÑ/Mð*ð Z^ó*ð, /1ñb¨cð bÀð bÐTWð bØ47ðbØ@DÀTÁ
ðbØSXðbà(+ðbà59óbñ6^ #ð ^¨Sð ^¸Cð ^ÈSð ^ÐZ^ô ^r   