a
    š§0iJ  ã                   @   s¸   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mZ d dl	m
Z
mZ d dlmZmZmZmZ ejejd e e¡Zddd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zddd„ZdS )é    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                 C   sh  ddg g g ddœg g || g ddœ	}t  ¡ }zzp| s‚|d  d¡ d	|d
< |W W t  ¡ }	t|	| ƒ|d< |d r†t d|› ¡ nt d|› ¡ z
tj}
W n t	y¶   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d rdnd| d¡r:d | dg ¡¡ndd W S  t	y~ } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S |s |r t|ƒ}|pžd}|s¶|d  d¡ nd}|d  d¡ |W W t  ¡ }	t|	| ƒ|d< |d rt d|› ¡ nt d|› ¡ z
tj}
W n t	y4   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d r˜dnd| d¡r¸d | dg ¡¡ndd W S  t	yü } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S tj}|pi }|pg }|p"i }|p,i }t d| › ¡ g g g dœ}|r”t d |› ¡ t|ƒ}|d sÊ|d  d!|d
 › ¡ d"|d
< |W W t  ¡ }	t|	| ƒ|d< |d rÌt d|› ¡ nt d|› ¡ z
tj}
W n t	yþ   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d rbdnd| d¡r‚d | dg ¡¡ndd W S  t	yÆ } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S |d# sþ|d  d$|› d%¡ t d$|› d&¡ n–|d' s2|d  d$|› d(¡ t d$|› d(¡ nbt|ƒ}|d r||d  |d ¡ |d  |d ¡ |d  |d ¡ n|d  d)|d
 › ¡ |rödD ]V}||v rž|| rž|| D ]2}|r¾d*|v r¾||| vr¾||  |¡ q¾qž|d s°|sZ|sZ|d  d+¡ d,|d
< |W W t  ¡ }	t|	| ƒ|d< |d r\t d|› ¡ nt d|› ¡ z
tj}
W n t	yŽ   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d ròdnd| d¡rd | dg ¡¡ndd W S  t	yV } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S |d  d-¡ d.|d< d/|d
< |W W t  ¡ }	t|	| ƒ|d< |d r²t d|› ¡ nt d|› ¡ z
tj}
W n t	yä   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d rHdnd| d¡rhd | dg ¡¡ndd W S  t	y¬ } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S |d |d |d t|d ƒt|d ƒ t|d ƒ dœ|d0< g }|D ]R}t|ƒ}|d1 	r.| |¡ |d  | d2d3¡¡ n|d  d4|d
 › ¡ qöt||ƒ}zt| fi |¤Ž}W n† t	
yð } zj|d  d5| › d6t|ƒ› ¡ d7|d
< |W  Y d}~W W t  ¡ }	t|	| ƒ|d< |d 	rêt d|› ¡ nt d|› ¡ z
tj}
W n t	
y   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d 
r€dnd| d¡
r d | dg ¡¡ndd W S  t	
yä } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S d}~0 0 zt||d |d r|d nd|d r&|d nd|| d8¡d9}|D ]„}z0t||ƒ}|d sn|d  d:|d
 › ¡ W nL t	y¼ } z2|d  d;| d2d<¡› d=t|ƒ› ¡ W Y d}~n
d}~0 0 q<ttƒ}| |¡ d.|d< d>|d0 d? › d@|d
< t dA| › ¡ W n” t	yœ } zx|d  dBt|ƒ› ¡ dC|d
< t dBt|ƒ› ¡ |W  Y d}~W W t  ¡ }	t|	| ƒ|d< |d r–t d|› ¡ nt d|› ¡ z
tj}
W n t	yÈ   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d r,dnd| d¡rLd | dg ¡¡ndd W S  t	y } z t dt|ƒ› ¡ W Y d}~S d}~0 0 S d}~0 0 W nZ t	yú } z@|d  dDt|ƒ› ¡ dE|d
< t dFt|ƒ› ¡ W Y d}~n
d}~0 0 W t  ¡ }	t|	| ƒ|d< |d r2t d|› ¡ nt d|› ¡ z
tj}
W n t	yd   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d rÈdnd| d¡rèd | dg ¡¡ndd W n: t	y, } z t dt|ƒ› ¡ W Y d}~n
d}~0 0 n2t  ¡ }	t|	| ƒ|d< |d rft d|› ¡ nt d|› ¡ z
tj}
W n t	y˜   d}
Y n0 zŒt
||d | dg ¡¡d | dg ¡¡d | dg ¡¡| t |¡t | dg ¡¡|
|d rüdnd| d¡rd | dg ¡¡ndd W n: t	y` } z t dt|ƒ› ¡ W Y d}~n
d}~0 0 0 |S )Gu˜  
    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_idZ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: ZSYSTEMú;r   r   r   r   ZENVIADOZFALLIDOz; )r   ÚsubjectZrecipients_toZrecipients_ccZrecipients_bccZtemplate_usedÚtemplate_dataZ
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_adjuntosZconfiguracion_adicionalÚ	resultadoZinicio_tiempoZ
fin_tiempor   Zdestinatarios_finalesÚeZ	asunto_bdr;   Ú
validacionZdestinatarios_bdÚtipor5   Zarchivos_validadosr&   Úresultado_validacionÚdatos_templateÚcuerpo_htmlÚmsgZresultado_adjuntoÚmail© rP   ú8/var/www/html/src/App/Utilities_module/MailManagement.pyÚenviar_correo_universal   sÂ   ÷ 

 õ
*€ Ï
 


 õ
*€ Û




o


 õ
*€ ò



P


 õ
*‘K


 õ
*–"ü



.


 õ
*³ú


@
	


 õ
*Ø,


 õ
.á


 õ
,rR   c              
   C   s:  t | tƒsddddœS |  d¡}|  dd¡}|s<dd|dœS z¼|dkrtj |¡rztj |¡rzt |tj¡rzd	d
ddœW S dd|› ddœW S nf|dkràddl	}|j
 |¡}|jdv rÊ|jrÊd	dddœW S dd|› ddœW S ndd|› d|dœW S W n< ty4 } z"ddt|ƒ› |dœW  Y d}~S d}~0 0 dS )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   rJ   ÚrutarJ   Ú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Údictr8   ÚosÚpathÚexistsÚisfileÚaccessÚR_OKÚurllib.parseÚparseÚurlparseÚschemeÚnetlocr6   r1   )r&   rS   rJ   ÚurllibÚ
parsed_urlrH   rP   rP   rQ   r?   ú   s(    

&r?   c              
   C   s„  zB|  dd¡}|  d¡}|  dd¡}|  dd¡}|dkrˆt|dƒ"}|  ||| ¡ ¡ W d	  ƒ n1 sl0    Y  d
d|› dœW S |dkr0dd	l}zV|j |¡&}| ¡ }	|  |||	¡ W d	  ƒ n1 sÔ0    Y  d
d|› dœW W S  ty, }
 z"ddt|
ƒ› dœW  Y d	}
~
W S d	}
~
0 0 ndd|› dœW S W n: ty~ }
 z ddt|
ƒ› dœW  Y d	}
~
S d	}
~
0 0 d	S )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
    rJ   rT   rS   r%   Zarchivo_adjuntoÚmimetypezapplication/octet-streamÚrbNTzArchivo local adjuntado: ©r   r   rU   r   zArchivo URL adjuntado: Fz&Error al descargar archivo desde URL: zTipo de archivo no soportado: r-   )	r8   ÚopenÚattachÚreadÚurllib.requestÚrequestÚurlopenr6   r1   )rN   r&   rJ   rS   r%   rg   Úfpre   ÚresponseÚdatarH   rP   rP   rQ   rA   )  s*    
0
,.rA   c                 C   sp   t  ¡ jt  ¡  d¡dd| dd¡› d| dd¡› | dd¡› d| dd¡› d	d
dddœ	}| rl| | ¡ |S )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, %YZIGSAz"Integradora de Servicios AvanzadosÚSCHEMErV   z://ÚHostÚ	localhostz/static/img/logo.pngzsoporte@igsa.comzventas@igsa.comz+52 (999) 123-4567)	u   aÃ±o_actualZfecha_actualZempresaZempresa_completaZurl_baseZlogo_empresaZsoporte_emailZventas_emailZtelefono_principal)r   r/   ÚyearÚstrftimer8   Úupdate)r   r;   Zdatos_completosrP   rP   rQ   r@   S  s    ÷
r@   c                 C   s¼   z~t | ƒ}t| ƒ}| | dd¡| dd¡| d¡| d¡| dd¡t| dg ¡ƒt| d	g ¡ƒt| d
g ¡ƒdœdddœ	}|W S  ty¶ } z ddt|ƒ› dœW  Y d}~S d}~0 0 dS )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   ry   r   Zdestinatarios_por_tipor   r   u   Error al obtener informaciÃ³n: ri   N)r	   r   r8   r>   r6   r1   )r   rI   r   r3   rH   rP   rP   rQ   Úobtener_info_envios  s*    


ýóþrz   c           	   
   C   s†   zHt j}|pi }t||ƒ}t| ƒ}t|fi |¤Ž}||||dddœ}|W S  ty€ } z ddt|ƒ› dœW  Y d}~S d}~0 0 dS )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_enviorL   rC   r   r   FzError al generar preview: ri   N)r   r;   r@   rz   r   r6   r1   )	r   rC   r   r;   rL   r|   rM   ÚpreviewrH   rP   rP   rQ   Úgenerar_preview_correoœ  s$    
ú	þr~   )NNNNNN)N)rZ   r9   ÚloggingZflask_loginr   r   Úflaskr   r   Ú
flask_mailr   r   Z)Consultas_SQL.Utilities.MailManagementSQLr   r	   r
   r   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__r2   rR   r?   rA   r@   rz   r~   rP   rP   rP   rQ   Ú<module>   s,   
      ù
 g/* )