
    iJ                         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Jr  S SK	J
r
Jr  S SKJrJrJrJr  \R"                  " \R$                  S9  \R&                  " \5      r      SS jrS	 rS
 rS rS rSS jrg)    N)current_user)datetime)current_apprender_template)MailMessage)obtener_destinatarios_mailvalidar_mail_list_existeguardar_log_envioobtener_subject_de_mail_list)levelc                 )   SS/ / / SS./ / UU / SS.	n[         R                  " 5       n U (       Gdx  US   R                  S5        S	US
'   U[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  WR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ U(       Gd  U(       Ga  [        U5      nU=(       d    SnU(       d  US   R                  S5        OSnUS   R                  S5        U[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  WR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ [         R"                  nU=(       d    0 nU=(       d    / nU=(       d    0 nU=(       d    0 n[        R                  SU  35        / / / S.nU(       Ga  [        R                  S U 35        [%        U5      nUS   (       Gd~  US   R                  S!US
    35        S"US
'   U[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ US#   (       d2  US   R                  S$U S%35        [        R'                  S$U S&35        OUS'   (       d2  US   R                  S$U S(35        [        R'                  S$U S(35        Ou[)        U5      nUS   (       aF  US   R+                  US   5        US   R+                  US   5        US   R+                  US   5        OUS   R                  S)US
    35        U(       aY  S HS  nUU;   d  M  UU   (       d  M  UU    H3  nU(       d  M  S*U;   d  M  UUU   ;  d  M  UU   R                  U5        M5     MU     US   (       Gd  U(       Gd  U(       Gdx  US   R                  S+5        S,US
'   U[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ US   R                  S-5        S.US'   S/US
'   U[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ US   US   US   [-        US   5      [-        US   5      -   [-        US   5      -   S.US0'   / nU Hi  n[/        U5      nUS1   (       a7  UR                  U5        US   R                  UR                  S2S35      5        MO  US   R                  S4US
    35        Mk     [1        X.5      n [3        U 40 UD6n [5        UUS   US   (       a  US   OSUS   (       a  US   OSUUR                  S85      S99nU H6  n [7        UU5      nUS   (       d  US   R                  S:US
    35        M6  M8     [9        [         5      nUR;                  U5        S.US'   S>US0   S?    S@3US
'   [        R                  SAU  35        [         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
 [        UUSR                  WR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  U$ ! [         a    Sn
 GN
f = f! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = f! [         a    Sn
 G
Nf = f! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = f! [         a    Sn
 GNf = f! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = f! [         a    Sn
 GNFf = f! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = f! [         a    Sn
 GNf = f! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = f! [         Ga  nUS   R                  S5U  S6[        U5       35        S7US
'   Us SnA[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
O! [         a    Sn
 Of = f [        UUSR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ ! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = fSnAff = f! [         a?  nUS   R                  S;UR                  S2S<5       S=[        U5       35         SnAGM  SnAff = f! [         Ga  nUS   R                  SB[        U5       35        SCUS
'   [        R                  SB[        U5       35        Us SnA[         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
O! [         a    Sn
 Of = f [        UUSR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  $ ! [         a+  n[        R                  S[        U5       35         SnA$ SnAff = fSnAff = f! [         aQ  nUS   R                  SD[        U5       35        SEUS
'   [        R                  SF[        U5       35         SnAGNjSnAff = f! [         a    Sn
 GNf = f! [         a,  n[        R                  S[        U5       35         SnAU$ SnAff = f! [         R                  " 5       n	[        X-
  5      US'   US   (       a  [        R                  SU 35        O[        R                  SU 35         [        R                  n
O! [         a    Sn
 Of = f [        UUSR                  WR                  S/ 5      5      SR                  UR                  S/ 5      5      SR                  UR                  S/ 5      5      U [        R                  " U5      [        R                  " UR                  S/ 5      5      U
US   (       a  SOSUR                  S5      (       a!  SR                  UR                  S/ 5      5      OSS9  f ! [         a+  n[        R                  S[        U5       35         SnAf SnAff = f= f)GuT  
Función universal para envío de correos electrónicos utilizando Flask-Mail.

Args:
    template_path (str): Ruta del template HTML relativa a templates/
    asunto (str): Asunto del correo
    template_data (dict, optional): Datos para inyectar en el template
    mail_list_id (int, optional): ID de la lista de correos en Util_MailListHead
    destinatarios_adicionales (dict, optional): Destinatarios adicionales
        {'TO': ['email1@test.com'], 'CC': ['email2@test.com'], 'BCC': ['email3@test.com']}
    archivos_adjuntos (list, optional): Lista de archivos adjuntos
        [{'tipo': 'local', 'ruta': 'path/file.pdf', 'nombre': 'archivo.pdf'},
         {'tipo': 'url', 'ruta': 'https://...', 'nombre': 'archivo_web.pdf'}]
    configuracion_adicional (dict, optional): Configuraciones adicionales
    
Returns:
    dict: Resultado del envío
F r   )TOCCBCCtotal_destinatariosN)	successmensajedestinatarioserroreswarningsmail_list_idtemplate_usadoarchivos_enviadostiempo_ejecucionr   ztemplate_path es requeridou!   Parámetros de entrada inválidosr   r   r   z1Proceso completado exitosamente para MailListID: u    Proceso falló para MailListID: SYSTEM;r   r   r   r   ENVIADOFALLIDOz; )r   subjectrecipients_torecipients_ccrecipients_bcctemplate_usedtemplate_data
files_sentsent_bystatus	error_msgz Error al guardar log de correo: z[Sin Asunto]r   u6   No se encontró asunto en la BD, usando "[Sin Asunto]"u@   No se proporcionó asunto ni mail_list_id, usando "[Sin Asunto]"u*   Iniciando envío de correo para template: r   r   r   z(Obteniendo destinatarios de MailListID: zError al validar MailListID: u"   Error en validación de MailListIDexistezMailListID z no existe en la base de datosz
 no existeactivou    está inactivoz&Error al obtener destinatarios de BD: @z:Debe proporcionar mail_list_id o destinatarios_adicionalesz*No hay destinatarios para enviar el correou+   No se encontraron destinatarios TO válidosTz=Proceso completado con advertencias - no hay destinatarios TOr   validonombrearchivou   Archivo no válido: zError al renderizar template 'z': z Error en renderizado de templateMAIL_DEFAULT_SENDER)r!   
recipientsccbcchtmlsenderError al adjuntar archivo: zError al adjuntar archivo desconocidoz: zCorreo enviado exitosamente a r   z destinatariosz'Correo enviado exitosamente. Template: zError al enviar correo: u   Error en envío de correozError general: zError general en el procesoz*Error general en enviar_correo_universal: )r   nowappendstrloggerinfoerrorr   email	Exceptionr   joingetjsondumpsr   r   configr
   warningr	   extendlenvalidar_archivo_adjuntopreparar_datos_templater   r   agregar_archivo_adjuntor   send)template_pathasuntor&   r   destinatarios_adicionalesarchivos_adjuntosconfiguracion_adicional	resultadoinicio_tiempo
fin_tiempor(   destinatarios_finalese	asunto_bdrF   
validaciondestinatarios_bdtipor@   archivos_validadosr1   resultado_validaciondatos_templatecuerpo_htmlmsgresultado_adjuntomails                              bC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Utilities_module\MailManagement.pyenviar_correo_universalrd      s   <  ""RPQR$' 
I LLNMvFi ''(DE#FIi d \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@AcgC 8F	"4n j)001ij+Fj)001st L \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acgi ##%+-3"9"?R$=$C!@PQ (*B ? KKB<.QR 2,?Ji(()$++.KJW`LaKb,cd'K	)$ ^ \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg} h'*%,,{<.Hf-gh\N*EF)*%,,{<.-XY\N/JK $>l#K #I.)$/667G7MN)$/667G7MN)%0778H8OPj)003YZjktZuYv1wx %+449RSW9X9X!:4!@ 5SE\eCXY]C^6^1$7>>uE "A , %T**(A)$++,hi'S	)$ ` \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg *%,,-Z['+	)$'f	)$ V \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acgq (-'-(/#&'<T'B#CcJ_`dJeFf#fil  nC  DI  nJ  jK  $K	&
	/"  (G#:7#C #H-"))'2-.55gkk(I6VW*%,,/CDXYbDcCd-ef ) 1G	)-J>JK"	062G2M(.SW4I%4P)%0VZ zz"78C .@(?W(M%,Y7!*-447RSdenSoRp5qr 8 . $DIIcN $(Ii %CIoD^_tDuCv  wE  $FIi KKA-QR \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G
	F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg  +  	G	$  	FLL;CF8DEE	F%  	G	$  	FLL;CF8DEE	F%  	G	$  	FLL;CF8DEE	F%  	G	$  	FLL;CF8DEE	F%  	G	$  	FLL;CF8DEE	F_  	i ''*HWZ[^_`[aZb(cd#EIi \ \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G 	G		F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg  	FLL;CF8DEE	F_	. ! @j)003MgkkZbdqNrMssuvyz{v|u}1~@  	i ''*B3q6((KL#>Ii LL3CF8<= \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G 	G		F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg  	FLL;CF8DEE	FW	  L)##oc!fX$>?<	)A#a&JKKL&  	G	$  	FLL;CF8DEE	F= \\^
(+J,F(G	$% YKKKL>Z[LL;L>JK	"((G 	G		F)!hh'<'@'@r'JK!hh'<'@'@r'JK"xx(=(A(A%(LM+"jj7::imm4G&LM$-i$8yiEN]]S\E]E]$))IMM)R$@Acg  	FLL;CF8DEE	Fs  "AI+ +r6<C+s	(AAI+ "t3C+tB0AI+ 0uC+u-C=AI+ .AI+ :AI+ AI+ AI+ AAI+ v!C+v*AI+ w"C+w5
B9AI+ x- AAA# 0A@AAA# 8AK	 	C+AK 6ss	
s>!s99s>tt
u	!uu	uu
v)!vvv'&v'*
w4!ww"w21w25
x*?!x%%x*-A@8)A@!A@"AI+ {{'&{'+C+
A@!!A@@A@@A@@AI+ @
AA @!3AAAAA# AAA A AA# A#AI(A.AAI#B5AI(B6AI+ DAD,D,AD;D:AD;D?C+AH+H+
AI H5!AIIAI I#AI(I(AI+ I+
AKI5AAKJ;AL KAKKAL K	AKKAKK
ALK&!ALLALLA!AR?M7ANNAR?NANNAR?NANNAR?NC+ARRAR?R
AR<R!AR7R2AR?R7AR<R<AR?c                    [        U [        5      (       d  SSSS.$ U R                  S5      nU R                  SS5      nU(       d  SSUS.$  US:X  a  [        R                  R                  U5      (       aT  [        R                  R                  U5      (       a0  [        R                  " U[        R                  5      (       a  S	S
SS.$ SSU 3SS.$ US:X  aO  SSK	nUR                  R                  U5      nUR                  S;   a  UR                  (       a  S	SSS.$ SSU 3SS.$ SSU S3US.$ ! [         a  nSS[        U5       3US.s SnA$ SnAff = f)u  
Valida si un archivo adjunto es válido (local o URL).

Args:
    archivo (dict): Diccionario con información del archivo
                   {'tipo': 'local', 'ruta': '/path/to/file', 'nombre': 'archivo.pdf'}
                   {'tipo': 'url', 'ruta': 'https://...', 'nombre': 'archivo.pdf'}

Returns:
    dict: Resultado de la validación
          {'valido': True/False, 'mensaje': 'descripción', 'tipo': 'local/url'}
FzArchivo debe ser un diccionarioN)r/   r   r[   rutar[   localzRuta del archivo es requeridaTu   Archivo local válidoz,Archivo local no encontrado o no accesible: urlr   )httphttpsu   URL válidau   URL inválida: u   Tipo de archivo no válido: z. Use "local" o "url"zError al validar archivo: )
isinstancedictrC   ospathexistsisfileaccessR_OKurllib.parseparseurlparseschemenetlocrA   r<   )r1   rf   r[   urllib
parsed_urlrW   s         rc   rJ   rJ      s^    gt$$,MW[\\;;vD;;vw'D,KUYZZa7?ww~~d##t(<(<4QSQXQXAYAY"&3JT[\\"'6bcgbh4isz{{U]..t4J  $55*:K:K"&=%PP"'odV4LV[\\ $2NtfTi0jtxyy a.HQ,Q[_``as8   A=D3 D3 AD3  D3 )	D3 3
E=EEEc                     UR                  SS5      nUR                  S5      nUR                  SS5      nUR                  SS5      nUS:X  a=  [        US5       nU R                  XEUR                  5       5        S	S	S	5        S
SU 3S.$ US:X  aS  SS	Kn UR
                  R                  U5       nUR                  5       n	U R                  XEU	5        S	S	S	5        S
SU 3S.$ SSU 3S.$ ! , (       d  f       Nw= f! , (       d  f       N/= f! [         a  n
SS[        U
5       3S.s S	n
A
$ S	n
A
ff = f! [         a  n
SS[        U
5       3S.s S	n
A
$ S	n
A
ff = f)u   
Agrega un archivo adjunto al mensaje de correo.

Args:
    msg (Message): Mensaje de Flask-Mail
    archivo (dict): Información del archivo
    
Returns:
    dict: Resultado de la operación
r[   rg   rf   r0   archivo_adjuntomimetypezapplication/octet-streamrbNTzArchivo local adjuntado: r   r   rh   r   zArchivo URL adjuntado: Fz&Error al descargar archivo desde URL: zTipo de archivo no soportado: r8   )	rC   openattachreadurllib.requestrequesturlopenrA   r<   )r`   r1   r[   rf   r0   r|   fprx   responsedatarW   s              rc   rL   rL   )  s_   U{{67+{{6"X'89;;z+EF7?dD!R

6RWWY7 "#2KF80TUUU]!h^^++D1X#==?DJJv6 2 $(6MfX4VWW
  %3QRVQW1XYY! "! 21  h#(7]^abc^d]e5fggh  U /J3q6(-STTUs   AD7 !C-<D7 
D7 D 2#C>D %D7 -
C;7D7 >
DD 
D4D/)D4*D7 /D44D7 7
EEEEc                 b   [         R                  " 5       R                  [         R                  " 5       R                  S5      SSUR	                  SS5       SUR	                  SS5       3UR	                  SS5       SUR	                  SS5       S	3S
SSS.	nU (       a  UR                  U 5        U$ )u   
Prepara los datos que se enviarán al template, incluyendo variables globales.

Args:
    template_data (dict): Datos específicos del template
    config (Config): Configuración de Flask
    
Returns:
    dict: Datos completos para el template
z%d de %B, %YIGSAz"Integradora de Servicios AvanzadosSCHEMEri   z://Host	localhostz/static/img/logo.pngzsoporte@igsa.comzventas@igsa.comz+52 (999) 123-4567)	u   año_actualfecha_actualempresaempresa_completaurl_baselogo_empresasoporte_emailventas_emailtelefono_principal)r   r:   yearstrftimerC   update)r&   rF   datos_completoss      rc   rK   rK   S  s      ||~** //?@zz(F34C

6;8W7XY!::h78FJJv{<[;\\pq+)2
O }-    c                     [        U 5      n[        U 5      nU UR                  SS5      UR                  SS5      UR                  S5      UR                  S5      UR                  SS5      [        UR                  S/ 5      5      [        UR                  S	/ 5      5      [        UR                  S
/ 5      5      S.SSS.	nU$ ! [         a  nSS[        U5       3S.s SnA$ SnAff = f)u   
Obtiene información resumida sobre el envío de correo.

Args:
    mail_list_id (int): ID de la lista de correos
    
Returns:
    dict: Información del envío
r,   Fr-   r!   	module_idr   r   r   r   r   r+   Tu#   Información obtenida correctamente)	r   r,   r-   r!   r   r   destinatarios_por_tipor   r   u   Error al obtener información: r~   N)r
   r	   rC   rI   rA   r<   )r   rY   r   r>   rW   s        rc   obtener_info_envior   s  s    
-l;
2<@ ) nnXu5 nnXu5!~~i0#4#0#4#45JA#N-++D"56-++D"56=,,UB78'
 <
   
8QA
 	

s   C C 
C(C#C(#C(c                      [         R                  nU=(       d    0 n[        X#5      n[        U 5      n[	        U40 UD6nUUUUSSS.nU$ ! [
         a  nSS[        U5       3S.s SnA$ SnAff = f)a  
Genera una vista previa del correo sin enviarlo.

Args:
    mail_list_id (int): ID de la lista de correos
    template_path (str): Ruta del template HTML
    template_data (dict, optional): Datos para el template
    
Returns:
    dict: Preview del correo
TzPreview generado correctamente)html_content
info_envior^   rN   r   r   FzError al generar preview: r~   N)r   rF   rK   r   r   rA   r<   )	r   rN   r&   rF   r^   r   r_   previewrW   s	            rc   generar_preview_correor     s    
##%+ 1G (5
 &mF~F ($,*7
  
3CF8<
 	

s   AA
 

A/A*$A/*A/)NNNNNN)N)rm   rD   loggingflask_loginr   r   flaskr   r   
flask_mailr   r   )Consultas_SQL.Utilities.MailManagementSQLr	   r
   r   r   basicConfigINFO	getLogger__name__r=   rd   rJ   rL   rK   r   r    r   rc   <module>r      s    
   $  . $ \  \   ',, '			8	$ " cL,a^'UT@&
R)
r   