
    "hn                     >   d dl Z d dlmZ d dlZd dlZd dl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Zd dlmZ d dlmZmZmZ ej&                  j)                  d       d dlmZ d d	lmZ 	 d
 Z e       ZdZdZdZdZdZdZ dZ!d Z"dee#   de$fdZ%d Z&d Z'd Z(ddZ)y)    N)datetime)MIMEMultipart)MIMETextescape)ListDictAnyz/var/www/html/config)get_connection)load_dotenvc                  J   t         j                  j                  t         j                  j                  t                    } t         j                  j                  |       }t         j                  j                  |dd      }t        |       g d}i }|D ]P  }t        j                  |      }||j                         dk(  rt        d| d|       |j                         ||<   R 	 t        |d         |d<   t        d
       |S # t        $ r t        d|d    d	      w xY w)Nconfiguracionesz.env)	SMTP_HOST	SMTP_PORT	SMTP_USER	SMTP_PASSAPP_URLAPP_NAMESMTP_NOTIFY u#   ❌ ERROR: La variable de entorno 'u&   ' no está definida o está vacía en r   u   ❌ ERROR: SMTP_PORT ('u&   ') debe ser un número entero válido.u.   ✅ Configuración SMTP cargada correctamente.)ospathdirnameabspath__file__joinr   getenvstrip
ValueErrorintprint)
script_dircrm_direnv_pathrequired_varsconfigvarvalues          O/var/www/dev.api.imparables.com.co/api_imparables/crm/administracion/mailing.pycargar_configuracion_smtpr*   (   s    
!J ggooj)Gww||G%6?H M F $		#=EKKMR/5cU:`ai`jk  kkms$
!&"56{ 

:;M  
%f[&9%::`a
 	

s   (D D"zsmtp.office365.comiK  z&notificacionelectronica@mascredimas.uszdSU#oH+z$%RTakz(https://dev.crm.imparables.cic-ware.com/
Imparablesu   Notificaciones Electrónicasc                 
   	 dQdt         dt        dt         fd}t        dt        | j	                                      | j                  d      }t        |t              r/|D cg c]#  }|j                         s|j                         % }}n|r|j                         gng }| j                  d      xs	 dt         j                         }| j                  d	      xs d
}t        dt        |              t        d|D cg c]
  } |       c}       t        d|       t        dt        |             t        dt        dt        d t                     t        dt               |sdddS dt         dt        fd} ||      r|}n$ddlm}	 d |	|      j%                  dd      z   dz   }d| dt         d| d | d!t         d"}
g }g }	 t        d#       t'        j(                         }t+        j,                  t        t              5 }|j/                          t        d$       |j1                  |%       |j/                          t        d& |t                     |j3                  t        t4               t        d'       t7        |      D ]  \  }}	 t9        d(      }t         d)t         d*|d+<   ||d,<   ||d-<   t;        |
d.      }|j=                  |       |j?                  t        ||jA                                |jC                  |       t        d/ ||       d0|d1z    d2t        |       d3        	 d d d        t        d7t        |       d8t        |              t        |      dk(  r9t        |      d1k(  rd9d:dS d9d;t        |       d<t        |      t        |      d=S t        |      dkD  rId9d>t        |       d?t        |       d@t        |       dAt        |      t        |      t        |      |dBS ddCt        |       dDt        |      |dES # t
        $ r Y w xY wc c}w c c}w # t
        $ r?}|jC                  |t        |      d4       t        d5 ||       d6|        Y d }~d }~ww xY w# 1 sw Y   MxY w# t*        jD                  $ r{}	 tG        |dFd       }tG        |dGdH      jI                  dIJ      }n# t
        $ r d t        |      }}Y nw xY wt        dK| dL|        ddM| dN|xs t        |       dcY d }~S d }~wt
        $ r0}t        dOtK        |             ddPt        |       dcY d }~S d }~ww xY w)RNsvisiblereturnc                 x    | syt        |       |dz  k  rt        |       dkD  r| d   dz   S | S | d | dz   | | d  z   S Nr         r   u   …lenr-   r.   s     r)   _maskzsendEmail.<locals>._maskk   S    1v1$'*1vzqte|8q8Xg;&G8955    #[DEBUG][sendEmail] input_data keys:destinatarioasunto   Notificación cuerpo_correor   ([DEBUG][sendEmail] destinatarios count: ![DEBUG][sendEmail] destinatarios:[DEBUG][sendEmail] asunto:%[DEBUG][sendEmail] cuerpo_correo.len:[DEBUG][sendEmail] SMTP host:port:user:[DEBUG][sendEmail] senderName:F+   No se especificaron destinatarios válidos.successmessagec                     d| v xr d| v S N<> r-   s    r)   _parece_htmlzsendEmail.<locals>._parece_html       ax$C1H$r9   r   r   <p>
<br></p>
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>  </title>
        <style>
            body {
                font-family: Arial, sans-serif;
            }
            .container {
                max-width: 600px;
                margin: 0 auto;
                padding: 20px;
                border: 1px solid #e0e0e0;
                border-radius: 5px;
            }
            .header {
                text-align: center;
                margin-bottom: 20px;
            }
            .footer {
                text-align: center;
                margin-top: 20px;
                color: #666;
                font-size: 12px;
            }
            a { color: #0b57d0; text-decoration: none; }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">
                <h1></h1>
                <p>K</p>
            </div>

            <div class="content">
                U   
            </div>

            <div class="footer">
                <p>🖥 Equipo C</p>
            </div>
        </div>
    </body>
    </html>
    -   [DEBUG][sendEmail] Abriendo conexión SMTP…   [DEBUG][sendEmail] STARTTLS…context)[DEBUG][sendEmail] Intentando login como:3   [DEBUG][sendEmail] Login OK. Enviando mensaje(s)…alternative <rN   FromToSubjecthtml[DEBUG][sendEmail] Enviado a  (r3   /)r;   error$[DEBUG][sendEmail] Error enviando a : 1[DEBUG][sendEmail] Proceso completado. Enviados: , Errores: T5   El correo electrónico ha sido enviado correctamente.Los 7    correos electrónicos han sido enviados correctamente.)rI   rJ   enviadostotalSe enviaron  de 
 correos. 
 fallaron.)rI   rJ   rv   errores_countrw   detalles_errores$   No se pudo enviar ningún correo de 
 intentos.)rI   rJ   r|   r}   	smtp_code
smtp_errorr9   ignoreerrors0[DEBUG][sendEmail] SMTPAuthenticationError code= error=-   Error en el envío del correo electrónico: () [DEBUG][sendEmail] Exception:,   Error en el envío del correo electrónico:    )&strr    r!   listkeys	Exceptionget
isinstancer   appNamer5   hostnameportusername
senderNameboolrh   r   replacesslcreate_default_contextsmtplibSMTPehlostarttlsloginpassword	enumerater   r   attachsendmail	as_stringappendSMTPAuthenticationErrorgetattrdecoderepr)
input_datar7   destinatario_inputemaildestinatariosr<   cuerporQ   cuerpo_htmlr   	html_bodyenviados_exitososerroresr`   serverir;   rJ   partecodeerrs                         r)   	sendEmailr   f   s   
	6S 	63 	6s 	6 	3T*//:K5LM
 $7$d+4FX5%++-XX8J+1134PRnnX&DN7)*DKKMF^^O,2F 
4S5G4H
IJ	
--/Xe/XY	
&/	
13v;?	'h 

*J7 D
 	
% % % FfVn44T6BBVK x 8 I 8     !(y )W0If GS
=>,,.\\(D) 	]VKKM23OOGO,KKM=uXOLL8,GH $-]#; ]<]+M:G)3Bxj&BGFO$0GDM)/GI&#Iv6DNN4(OOHlG<M<M<OP%,,\:9%:M9NbQRSTQTPUUVWZ[hWiVjjklm]	]: 	A#FWBXAYYdehipeqdrst w<1=!Q&#V   $!%c*;&<%==tu #$5 6 /	  "#a')#.?*@)Ac-FXEYYcdghodpcqq{| 12!$W]+$+  !A#mBTAUU_`!$W$+	 A   Y 0Yd ! ]NNL3q6#RS@|AT@UUWXYWZ[\\]3	] 	]~ ** 

	%1k40D!\3/66h6GC 	%c!f#D	%@gcUSTFtfBs}VYZ[V\o^
 	

  
-tAw7Ec!fXN
 	

s   :P" !P27P2P7
=R B
RB"P<9R<AR %R .AR R "	P/.P/<	R4Q?9R?RRRR U(*STS,)T+S,,+TUU)%UUUdestinatarios_exitosos
id_campanac                 B   | sdddS 	 t        j                  d      }t        j                  |      }t	               }|dddS |j                         }d}| D cg c]  }|||f	 }}|j                  ||       |j                          |j                  }	|j                          |j                          dd	|	 d
|	dS c c}w # t        $ rP}
dt               v r)	 j                          |j                          n#  Y nxY wddt        |
       dcY d}
~
S d}
~
ww xY w)uA   
    Registra los logs de envío exitoso en la base de datos
    Fz,No hay destinatarios exitosos para registrarrH   zAmerica/BogotaNu%   Error de conexión a la base de datosz
            INSERT INTO campanas_envio_correos_logs (id_campana, correo, fecha_envio)
            VALUES (%s, %s, %s)
        TzSe registraron u    logs de envío)rI   rJ   	registros
conexionBDzError al registrar logs: )pytztimezoner   nowr   cursorexecutemanycommitrowcountcloser   localsrollbackr   )r   r   colombia_tzfecha_envior   r   querycorreodatos_insercionregistros_insertadosr   s              r)   registrar_logs_envior   .  sB    " -[\\)Smm$45ll;/#%
$1XYY""$ LbbJ<bb 	5/2% ()=(>oN-
 	
 c   S68###%  " /HQ-QRRSsN   :C C C &AC  C 	DD C<;D<D >DDDc                 
   	 dPdt         dt        dt         fd}t        dt        | j	                                      | j                  d      }t        |t              r/|D cg c]#  }|j                         s|j                         % }}n|r|j                         gng }| j                  d      xs	 dt         j                         }| j                  d	      xs d
}t        dt        |              t        d|D cg c]
  } |       c}       t        d|       t        dt        |             t        dt        dt        d t                     t        dt               |sddg dS dt         dt        fd} ||      r|}n!dt!        |      j#                  dd      z   dz   }d| dt         d| d| dt         d }	g }
g }g }	 t        d!       t%        j&                         }t)        j*                  t        t              5 }|j-                          t        d"       |j/                  |#       |j-                          t        d$ |t                     |j1                  t        t2               t        d%       t5        |      D ]  \  }}	 t7        d&      }t         d't         d(|d)<   ||d*<   ||d+<   t9        |	d,      }|j;                  |       |j=                  t        ||j?                                |
jA                  |       |jA                  |       t        d- ||       d.|d/z    d0t        |       d1        	 d d d        t        d5t        |
       d6t        |              t        |      d7k(  r=t        |      d/k(  rd8d9d/d/|d:S d8d;t        |
       d<t        |
      t        |      |d:S t        |
      d7kD  rJd8d=t        |
       d>t        |       d?t        |       d@t        |
      t        |      t        |      ||dAS ddBt        |       dCt        |      |g dDS # t
        $ r Y 	w xY wc c}w c c}w # t
        $ r?}|jA                  |t        |      d2       t        d3 ||       d4|        Y d }~d }~ww xY w# 1 sw Y   SxY w# t(        jB                  $ r|}	 tE        |dEd       }tE        |dFdG      jG                  dHI      }n# t
        $ r d t        |      }}Y nw xY wt        dJ| dK|        ddL| dM|xs t        |       g dcY d }~S d }~wt
        $ r1}t        dNtI        |             ddOt        |       g dcY d }~S d }~ww xY w)QNr-   r.   r/   c                 x    | syt        |       |dz  k  rt        |       dkD  r| d   dz   S | S | d | dz   | | d  z   S r1   r4   r6   s     r)   r7   z"sendEmail_marketing.<locals>._maskg  r8   r9   r:   r;   r<   r=   r>   r   r?   r@   rA   rB   rC   rD   rE   rF   FrG   )rI   rJ   r   c                     d| v xr d| v S rL   rO   rP   s    r)   rQ   z)sendEmail_marketing.<locals>._parece_html  rR   r9   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   ra   rb   rc   rd   rN   re   rf   rg   rh   ri   rj   r3   rk   rl   rm   ro   rp   rq   rr   r   Trs   )rI   rJ   rv   rw   r   rt   ru   rx   ry   rz   r{   )rI   rJ   rv   r|   rw   r   r}   r~   r   )rI   rJ   r|   r}   r   r   r   r9   r   r   r   r   r   r   r   r   r   )%r   r    r!   r   r   r   r   r   r   r   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r7   r   r   r   r<   r   rQ   r   r   r   destinatarios_exitosos_detaller   r`   r   r   r;   rJ   r   r   r   r   s                         r)   sendEmail_marketingr   b  s   
	6S 	63 	6s 	6 	3T*//:K5LM
 $7$d+4FX5%++-XX8J+1134PRnnX&DN7)*DKKMF^^O,2F 
4S5G4H
IJ	
--/Xe/XY	
&/	
13v;?	'h 

*J7 D&(
 	
% % % FfVn44T6BBVK x 8 I 8     !(y )W0If %'"G\
=>,,.\\(D) 	]VKKM23OOGO,KKM=uXOLL8,GH $-]#; ]<]+M:G)3Bxj&BGFO$0GDM)/GI&#Iv6DNN4(OOHlG<M<M<OP%,,\:299,G9%:M9NbQRSTQTPUUVWZ[hWiVjjklm]	]< 	A#FWBXAYYdehipeqdrst w<1=!Q&#V !.L   $!%c*;&<%==tu #$5 6 /.L  "#a')#.?*@)Ac-FXEYYcdghodpcqq{| 12!$W]+*H$+  !A#mBTAUU_`!$W$+*, O   Y 0Yh ! ]NNL3q6#RS@|AT@UUWXYWZ[\\]5	] 	]L ** 
	%1k40D!\3/66h6GC 	%c!f#D	%@gcUSTFtfBs}VYZ[V\o^&(
 	
  
-tAw7Ec!fXN&(
 	

s   :P9 !Q	7Q	Q
=R+ B
RB3Q
RAR+ &R+ AR+ R+ 9	QQ	R4RRRRR(#R+ +U2?*S*)T5*T T5T,T5/U25U2&U-'U2-U2c           	         | j                  dd      j                         }| j                  dd      j                         }| j                  d      }t        d      }t         dt         d|d<   ||d	<   d
t
         |d<   dt
         d| d| dt         d	}t        |d      }|j                  |       	 t        j                         }t        j                  t        t              5 }|j                          |j!                  |       |j#                  t        t$               |j'                  t        ||j)                                d d d        ddd}	|	S # 1 sw Y   xY w# t*        $ r}
ddt-        |
       dcY d }
~
S d }
~
ww xY w)Nuserr   r   codigorc   rd   rN   re   rf   zBienvenido a rg   z
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Bienvenido a u  </title>
        <style>
            body {
                font-family: Arial, sans-serif;
            }
            .container {
                max-width: 600px;
                margin: 0 auto;
                padding: 20px;
                border: 1px solid #e0e0e0;
                border-radius: 5px;
            }
            .header {
                text-align: center;
                margin-bottom: 20px;
            }
            .code {
                background-color: #f7f7f7;
                padding: 10px;
                border: 1px solid #e0e0e0;
                border-radius: 5px;
                text-align: center;
            }
            .footer {
                text-align: center;
                margin-top: 20px;
            }
        </style>
    </head>
      <body>
        <div class="container">
            <div class="header">
                <h1>Bienvenido al Movimiento Imparables</h1>
                <p>¡Gracias por unirte a nuestra plataforma!</p>
            </div>
            <p>Hola, <strong>u   </strong></p>
            <p>A continuación, te proporcionamos un código temporal para que puedas acceder a tu cuenta:</p>
            <div class="code">
                <h3>u  </h3>
            </div>
            <p>Utiliza este código como contraseña temporal para acceder a tu cuenta. Si no has solicitado un código temporal, ignora este mensaje o ponte en contacto con nuestro equipo de soporte.</p>
            <p>Recuerda que puedes cambiar tu contraseña en cualquier momento.</p>
            <p>Para acceder a tu cuenta, visita la siguiente ruta: <a href="u   "> Entrada al Sistema Imparables CRM</a></p>
            <div class="footer">
                <p>🖥 Equipo Imparables</p>
            </div>
        </div>
    </body>
    </html>
    rh   r_   Trs   rH   Fr   )r   r   r   r   r   r   appUrlr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   nombre_usuariocorreosr   rJ   r   r   r`   r   responser   s              r)   sendEmailEmployee2r   5  s     ^^FB/557NnnWb)//1G^^H%F M*G#Bxj2GFOGDM(	2GI %I #&F -- . H M NTH Ua7Ir Iv&DNN4
,,.\\(D) 	DVKKMOOGO,LL8,OOHgw/@/@/BC		D N
 	D 	D  
Ec!fXN
 	

s7   62E% (A"E
E% E"E% %	F	.F>F	F	c                    | rt        | t              sddi dS | j                         } | sddi dS t               }|ddi dS 	 d}|j	                  d	      }|j                  || f       |j                         }|j                          |j                          |r
dd
|  d|dS dd|  di dS # t        $ r<}j                          |j                          ddt        |       i dcY d}~S d}~ww xY w)u   
    Obtiene una plantilla de correo por categoría
    
    Args:
        template_category (str): La categoría de la plantilla a buscar
        
    Returns:
        dict: Objeto con estructura {success: bool, message: str, data: dict}
    Fu9   La categoría es requerida y debe ser una cadena de textorI   rJ   datau#   La categoría no puede estar vacíaN   Error de conexiónz
            SELECT 
                template_id,
                template_category,
                email_subject,
                email_body
            FROM email_templates 
            WHERE template_category = %s
            LIMIT 1
        T
dictionaryu)   Plantilla encontrada para la categoría ""u6   No se encontró ninguna plantilla para la categoría "Error: )	r   r   r   r   r   executefetchoner   r   )template_categoryr   r   r   template_datar   s         r)   get_email_template_by_categoryr     sJ    J/@#$FR
 	
 *//1<
 	
  !J+
 	
(
	 ""d"3u023)FGXFYYZ[%  !STeSffgh   
 Q)
 	

s%   A"B1 '	B1 1	C6:1C1+C61C6c                    | rt        | t              sddi dS |
||ddi dS t               }|ddi dS 	 |j                  d      }g }g }|0|j	                  d       |j	                  |j                                |"|j	                  d	       |j	                  |       |"|j	                  d
       |j	                  |       |j	                  |        ddj                  |       d}|j                  ||       |j                          |j                  dkD  rI|j                  d| f       |j                         }	|j                          |j                          dd|	dS |j                          |j                          dd|  i dS # t        $ r<}
j                          |j                          ddt        |
       i dcY d }
~
S d }
~
ww xY w)NFu8   El template_id es requerido y debe ser un número enteror   z2Debe especificar al menos un campo para actualizarr   Tr   ztemplate_category = %szemail_subject = %szemail_body = %szUPDATE email_templates SET z, z WHERE template_id = %sr   z4SELECT * FROM email_templates WHERE template_id = %sz"Plantilla actualizada exitosamenteu$   No se encontró la plantilla con ID r   )r   r    r   r   r   r   r   r   r   r   r   r   r   r   )template_idr   email_subject
email_bodyr   r   updatesvaluesr   updated_datar   s              r)   update_email_template_by_idr     s    jc:Q
 	
  ]%:z?QK
 	
  !J+
 	
7
""d"3 (NN34MM+1134$NN/0MM-(!NN,-MM*%k" .dii.@-AAXYuf%??QNNQT_Sab!??,LLLN  ?$  LLN A+O   
 Q)
 	

s$   D/F ((F 	G1GGG)NNN)*jsonr   hashlibsysr   base64r   r   email.mime.multipartr   email.mime.textr   r   rh   r   typingr   r	   r
   r   r   cnxpdor   dotenvr   r*   smtp_configr   r   r   r   r   r   r   r   r   r    r   r   r   r   r   rO   r9   r)   <module>r      s       
 	   
 . $   " " & ' ! 
*")Z ()  
 4 
4
+
E
P0Sc 0S 0ShO
f]
BM
bO
r9   