a
    0iy                     @   s   d dl m Z  d dlmZ d dlmZ d dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dl m Z  d dlZd dlZd dlmZ d d	lmZ d dlZeeZ d
Z!d
a"d
a#d
a$dZ%dd Z&dS )    )datetime)generate_password_hash)_N)	Blueprintrender_templatejsonifyrequestsession)Flaskrender_template_string)get_companiesget_divisions_by_company'get_departments_by_company_and_divisionget_RequestTypeinsert_user_requestget_Correo_Solicitud_de_altaget_divisions_by_id)MIMEMultipart)MIMEText z7marisol.garcia@igsa.com.mx,markjisol.garcia@igsa.com.mxc           	         s   G fddd t jt jd t t| ddd }| ddd	 }| d
dd }| ddd }| ddd }| ddd }tdt}dd dd dd | jddgd fd d!}d S )"Nc                       s,   e Zd ZdddZd	 fdd	Zdd ZdS )
z(PreRegister_routes.<locals>.EmailServiceNc                 S   sP   |pt jdd| _|p$t jdd| _t jdd| _tt jdd| _d	S )
u   
            Inicializa el servicio de correo electrónico.
            
            Args:
                sender_email (str): Correo electrónico del remitente
                sender_password (str): Contraseña del correo electrónico
            ZEMAIL_SENDERzelephantSyC@igsa.com.mxZEMAIL_PASSWORDz	5lEph@n12ZSMTP_SERVERzsmtp.office365.com	SMTP_PORTiK  N)osenvirongetsender_emailsender_passwordsmtp_serverint	smtp_port)selfr   r    r    $/var/www/html/src/App/PreRegister.py__init__+   s    z1PreRegister_routes.<locals>.EmailService.__init__c              
      s  d}t |}ddd |D }d}t |}ddd |D }d}t |}ddd |D }	|sg }
|r||
|d	 |r|
|d	 |	r|
|	d	 tr|
td	 d
d |
D }|dd}ddddd}||d}|}| |}z|s d W dS t }| j	|d< d||d< ||d< |
t|d t| j| j2}|  || j	| j || W d   n1 s0    Y   dd|  W dS  ty } z" dt|  W Y d}~dS d}~0 0 dS )u  
            Envía una notificación por correo electrónico sobre una nueva solicitud de alta.
            
            Args:
                request_data (dict): Datos de la solicitud
                recipients (list): Lista de correos electrónicos a los que enviar la notificación
                
            Returns:
                bool: True si el correo se envió correctamente, False en caso contrario
               , c                 S   s   g | ]}|d  qS ZCorreosr    .0itemr    r    r!   
<listcomp>F       z[PreRegister_routes.<locals>.EmailService.send_registration_notification.<locals>.<listcomp>   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   J   r*      c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   N   r*   ,c                 S   s   g | ]}|  r|  qS r    stripr'   emailr    r    r!   r)   ^   r*   RequestTypeIDr   #Nueva solicitud de alta de empleadoz#Nueva solicitud de distribuidor EUAu'   Nueva solicitud de distribuidor Canadá'   Nueva solicitud de distribuidor MéxicoEMPLEADODISEUADISCAN   DISMÉXNueva solicitud de altaz*No hay destinatarios para enviar el correoFFromToSubjecthtmlNzCorreo enviado exitosamente a TError al enviar correo: )r   joinextendsplitvar_correo_mexr   _build_email_bodyerrorr   r   attachr   smtplibSMTPr   r   starttlsloginr   send_messageinfo	Exceptionstr)r   request_data
recipientsidcorreos_empvar_correo_empleados
correos_EUvar_correo_norteamerica_EUcorreos_CANvar_correo_norteamerica_CANZ
email_listrequest_typesubject_mappingsubjectTituloZ	html_bodymessageservereloggerr    r!   send_registration_notification8   s^    


*zGPreRegister_routes.<locals>.EmailService.send_registration_notificationc                 S   s  | dd}| dd}| dd}t|}|r^t|dkr^|d d }|dd	d
}ddddd}| |d}|}	d|	 d}
|dkr"|
d| dd d| dd d| dd d| dd d| dd d| dd d| dd d| d d d!| d"| d#d d$7 }
n|
d%| d&d d'| d(d d)| dd d*| d+d d,	7 }
|d-kr|
d.| d/d d07 }
|d1kr|
d2| d3d d07 }
|d4kr|
d5| d3d d07 }
|
d6| d7d d87 }
|
S )9u   
            Construye el cuerpo del correo electrónico en HTML.
            
            Args:
                request_data (dict): Datos de la solicitud
            
            Returns:
                str: Cuerpo del correo en HTML
            	RequestIDzN/Ar2   r   
DivisionIDr   Divisionz()z''z""r3   z-Nueva solicitud de distribuidor Norte Americar4   r5   r:   a<  
            <!DOCTYPE html>
            <html>
            <head>
                <style>
                html, body { 
                margin: 0;
                padding: 0;
                width: 100%;
                font-family: 'Montserrat', sans-serif;
            }
            .container { 
            width: 600px;  /* Ancho fijo en lugar de max-width */
            margin: 0 auto;
            padding: 20px;
            box-sizing: border-box;
            }
            body { 
                display: flex;
                justify-content: center;
                align-items: center;
                flex-direction: column;
                text-align: center;
            }
            .main-content {
                width: 100%;
                max-width: 600px;
                margin: 0 auto;
                text-align: center;
            }
            .title { 
                color: #2a5885; 
                font-size: 16px; 
                margin: 15px 0;
                font-weight: 600;
                text-align: center;
                width: 100%;
            }
            .message { 
                font-size: 12px; 
                margin: 0 auto 15px auto;
                text-align: center;
                max-width: 450px;
            }
            .data-table { 
                width: 100%;
                max-width: 600px;
                margin: 0 auto;
                border-collapse: collapse;
                border-spacing: 0;
                table-layout: fixed; /* Fija el ancho de la tabla */
            }
        
                
            .data-table th { 
                text-align: left; 
                padding: 8px 10px; 
                font-size: 10px; 
                margin: 0;
                line-height: 1.3;
                vertical-align: top;
                width: 10%
                overflow: hidden;
                background-color: #f2f2f2; 
                font-weight: 600;
            }
            .data-table td { 
                text-align: left; 
                padding: 8px 10px; 
                font-size: 10px; 
                margin: 0;
                line-height: 1.3;
                vertical-align: top;
                width: 70%;
                word-wrap: break-word; /* Permite que las palabras se corten */
                overflow-wrap: break-word; /* Para navegadores modernos */
                hyphens: auto; /* Permite guiones para palabras largas */
                word-break: break-word;
            }
                .data-table { 
        width: 100%;      /* Ocupa el 100% del contenedor */
        table-layout: fixed;  /* Crucial para controlar el ancho */
        border-collapse: collapse;
    }
            p {
                font-size: 12px; 
                margin-bottom: 8px; 
                text-align: center;
            }
            .data-table tr { height: auto; margin: 0; padding: 0; }
            .footer { 
                font-size: 10px; 
                color: #777; 
                margin: 15px auto;
                text-align: center;
                width: 100%;
            }
            .color1 { background-color: rgb(192, 197, 228); }
            .color2 { background-color: rgb(238, 238, 241); }
        .color3 { background-color: rgb(238, 238, 241); }
        
        
            td { 
                font-size: 12px;  
                }
                
            th { 
                font-size: 12px;  
                }
                
                
            </style>
            </head>
            <body>
                <div class="container">
                    <h2>u    </h2>
                    <p>Se ha registrado un nuevo usuario en la plataforma de elephant.  Por favor, revise la información .</p>
                    <br>
                    <table>
                        
                    
            r6   a  
                        <tr>
                        <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%; ">Nombre</th>
                            <td class="color1" style="text-align: left; width: 30%;">	FirstName 
MiddleNameLastNameSecondLastNameuz  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                        <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left;  width: 10%;">Correo Electrónico</th>
                            <td class="color2" style="text-align: left;  width: 30%;">CorporateEmailut  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left;  width: 10%;">Teléfono</th>
                            <td class="color1" style="text-align: left;  width: 30%;">ContactPhoneu|  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Número de Empleado</th>
                            <td class="color2" style="text-align: left; width: 30%;">EmployeeNumberus  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Compañía</th>
                            <td class="color1" style="text-align: left; width: 30%;">	CompanyIDur  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">División</th>
                            <td class="color2" style="text-align: left; width: 30%;">a  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Puesto</th>
                            <td class="color1" style="text-align: left; width: 30%;">Positionz</td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        
                        
                u  
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left;  width: 10%;">Razón Social</th>
                            <td class="color1" style="text-align: left;  width: 30%;">BusinessNameu  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                    
                    
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Correo Electrónico</th>
                            <td class="color2" style="text-align: left; width: 30%;">ContactEmailur  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Teléfono</th>
                            <td class="color1" style="text-align: left; width: 30%;">a  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                    
                        
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Estado</th>
                            <td class="color2" style="text-align: left; width: 30%;">Statezp</td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                r9   a  
                        <tr>
                        <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left;  width: 10%; ">RFC</th>
                            <td class="color1" style="text-align: left;  width: 30%;">RFCzt</td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                    r7   a  
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Ciudad</th>
                            <td class="color1" style="text-align: left;width: 30%; ">Cityr8   a  
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Ciudad</th>
                            <td class="color1" style="text-align: left; width: 30%;">a  
                        <tr>
                            <th style=" width: 30%;" ></th>
                            <th class="color3" style="text-align: left; width: 10%;">Comentarios</th>
                            <td class="color2" style="text-align: left;   width: 30%;">Commentsu  </td>
                            <th style=" width: 30%;" ></th>
                        </tr>
                    </table>
                    
                    
                    
                    <div class="footer">
                        <p style ="font-size: 8px; ">Este es un correo automático. Por favor no responda a este mensaje.</p>
                    </div>
                </div>
            </body>
            </html>
            )r   r   lenr/   )r   rO   
request_idrX   rc   Z	Division_rd   rY   rZ   r[   r>   r    r    r!   rD      s    s|









")
0




 


	








z:PreRegister_routes.<locals>.EmailService._build_email_body)NN)N)__name__
__module____qualname__r"   ra   rD   r    r_   r    r!   EmailService*   s   
Srz   )levelz/registrationc               
   S   sn   z*t  } | stdddW S td| g g dW S  tyh } z&td|  tdddW  Y d}~S d}~0 0 dS )u]   
        Renderiza la página de registro principal con las compañías disponibles.
        registration.html*   No se encontraron compañías disponibles.rE   )	companies	divisionsdepartmentsz[Error en /registration]: u1   Ocurrió un error inesperado. Intenta más tarde.N)r   r   rM   print)r   r^   r    r    r!   registration  s    z(PreRegister_routes.<locals>.registrationz"/get_divisions/<string:company_id>c              
   S   sp   z(t | }|s tddidfW S t|W S  tyj } z*td|  tddidfW  Y d}~S d}~0 0 dS )uP   
        Obtiene divisiones por compañía ID y las devuelve como JSON.
        rE   u2   No se encontraron divisiones para esta compañía.  z[Error en /get_divisions]: u3   Ocurrió un error inesperado al obtener divisiones.  N)r   r   rM   r   )
company_idr   r^   r    r    r!   get_divisions_Preregister  s    
z5PreRegister_routes.<locals>.get_divisions_Preregisterz9/get_departments/<string:company_id>/<string:division_id>c              
   S   sr   z*t | |}|s"tddidfW S t|W S  tyl } z*td|  tddidfW  Y d}~S d}~0 0 dS )ui   
        Obtiene departamentos filtrados por compañía y división ID y los devuelve como JSON.
        rE   u4   No se encontraron departamentos para esta división.r   z[Error en /get_departments]: u6   Ocurrió un error inesperado al obtener departamentos.r   N)r   r   rM   r   )r   division_idr   r^   r    r    r!   get_departments_Preregister  s    

z7PreRegister_routes.<locals>.get_departments_Preregisterz/registrationMXc               
   S   sN   z
t dW S  tyH }  z&td|   t dddW  Y d} ~ S d} ~ 0 0 dS )uR   
        Renderiza la página de registro para distribuidores en México.
        zregistrationDistMX.htmlz[Error en /registrationMX]: AccessDened.html'   Ocurrió un error al cargar la página.r~   Nr   rM   r   r^   r    r    r!   registrationMX  s
    
z*PreRegister_routes.<locals>.registrationMXz/solicitud_de_altac               
   S   s   zDt  } t }|s tdddW S | s2tdddW S td|| g g dW S  ty } z&td|  tdddW  Y d}~S d}~0 0 dS )	uS   
        Renderiza la página de registro para hacer la solicitud de alta.
        r|   r}   r~   z$No se encontraron datos disponibles.zsolicitud_de_alta.html)r   RequestTypesr   r   z[Error en /solicitud_de_alta]: N)r   r   r   rM   r   )r   r   r^   r    r    r!   solicitud_de_alta  s"    z-PreRegister_routes.<locals>.solicitud_de_altaz/registrationEXPc               
   S   sN   z
t dW S  tyH }  z&td|   t dddW  Y d} ~ S d} ~ 0 0 dS )uW   
        Renderiza la página de registro para distribuidores internacionales.
        zregistrationDistExport.htmlz[Error en /registrationEXP]: r   r   r~   Nr   r   r    r    r!   registrationEXP  s
    
z+PreRegister_routes.<locals>.registrationEXPformsc                 S   s   d}t || duS )zValidar formato de emailz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$N)rematch)r1   patternr    r    r!   validate_email  s    z*PreRegister_routes.<locals>.validate_emailc                 S   s"   t dd| }| o t|dkS )u+   Validar formato de teléfono más permisivoz[\s\-\(\)\.]r      )r   subisdigitru   )ZphoneZclean_phoner    r    r!   validate_phone   s    z*PreRegister_routes.<locals>.validate_phonec                 S   s4   g }|D ]&}|| vs$t | |  s|| q|S )zValidar campos requeridos)rN   r/   append)datarequired_fieldsZmissing_fieldsfieldr    r    r!   validate_required_fields(  s
    z4PreRegister_routes.<locals>.validate_required_fieldsz/submit-formPOST)methodsc                     s  da dadaz<tj} | d}|dkrJd}t|}ddd |D a n`|dkrtd	}t|}dd
d |D }n6|dkrd}t|}ddd |D }n|dkrta|st	ddddfW S g dg dg dg dd}||vrt	ddddfW S | || }	|	r0t	dd
d|	ddfW S |dkr| d s\t	ddddfW S | d sPt	ddddfW S n|dv rd}
| |
 st	ddddfW S d }| | sPt	ddddfW S nx|dkrP| d! st	ddddfW S | d" s&t	ddddfW S d#}t|| d$ sPt	dd%ddfW S d&d'd'd(d|}|r| |d)vrt	dd*ddfW S |d+d,}|dkr6|| d-d| d.d| d/d| d!d| d0d| d1d| d2d| d3d| d$d| d"d| d4d| d(d5v r(dnd6d7 nJ|dv r|| d8d| d9d| d:d| dd| d;d| d<d| d=d| d>d| d d| d?d| d'd5v rdnd6d@ n|dkr|| dAd| dBd| dCd| dDd| dd| dd| dEd| dFd| dGd| dHd| dId| dJd| dKd| dLd| d&d5v rvdnd6dM tdN|  t|\}}|r4dO|v r|dOdP nd }|r||dQ< z  }g }d}t|}ddRd |D a d	}t|}ddSd |D }d}t|}ddTd |D }t rX|dUd t dVD  |rx|dWd |dVD  |r|dXd |dVD  tr|dYd tdVD  |||}|rtdZ|  ntd[|  W n8 ty" } ztd\t|  W Y d }~n
d }~0 0 t	d]|dW S t	d|ddfW S W nd ty } zJtd^t|  d6d l}|  t	dd_
t|dd`fW  Y d }~S d }~0 0 d S )aNr   RequestTyper6   r#   r$   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   J  r*   z;PreRegister_routes.<locals>.submit_form.<locals>.<listcomp>r7   r+   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   P  r*   r8   r,   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   V  r*   r9   FzTipo de usuario no especificado)successr\   i  )EMPFirstNameEMPLastNameEMPSecondLastNameEMPCorporateEmailEMPContactPhoneEMPEmployeeNumberEMPCompanyIDEMPDivisionIDEMPDepartamentIDEMPPositionEMPDirectSupervisorEMPPermissionType)	EU_BusinessNameEU_FiscalAddressEU_StateEU_CityEU_PostalCodeEU_LegalRepresentativeEU_PrimaryContactEU_ContactEmailEU_ContactPhone)
MX_BusinessNameMX_RFCMX_FiscalAddressMX_StateMX_CityMX_PostalCodeMX_LegalRepresentativeMX_PrimaryContactMX_ContactEmailMX_ContactPhoner5   u   Tipo de usuario no válidozCampos requeridos faltantes: {}r   u   Email corporativo no válidor   u   Número de teléfono no válido)r7   r8   r   u   Email de contacto no válidor   r   r   u-   ^[A-ZÑ&]{3,4}[0-9]{6}[A-V1-9][A-Z1-9][0-9A]$r   u   RFC no válidoZEMPTermsZEU_TermsZMX_Terms)1trueonTu(   Debe aceptar los términos y condiciones	PENDIENTE)r2   Statusr   r   r   r   r   r   r   ZMX_Comments)r   r   r   Tr   )ro   LegalRepresentativePrimaryContactrp   FiscalAddress
PostalCoderq   rs   rr   rk   rt   Termsr   r   r   r   r   r   r   ZEU_Comments)ro   r   r   rp   r   r   rq   rs   rk   rt   r   r   ZEMPMiddleNamer   r   r   r   r   r   r   r   r   ZEMPComments)re   rg   rh   ri   rj   rk   rl   rm   rc   DepartamentIDrn   DirectSupervisorPermissionTypert   r   zDatos procesados: zID: rb   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)     r*   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)     r*   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   $  r*   c                 S   s   g | ]}|  r|  qS r    r.   r0   r    r    r!   r)   '  r*   r-   c                 S   s   g | ]}|  r|  qS r    r.   r0   r    r    r!   r)   )  r*   c                 S   s   g | ]}|  r|  qS r    r.   r0   r    r    r!   r)   +  r*   c                 S   s   g | ]}|  r|  qS r    r.   r0   r    r    r!   r)   -  r*   u6   Correo de notificación enviado para la solicitud ID: z2No se pudo enviar el correo para la solicitud ID: r?   TzError en submit_form: z#Error al procesar el formulario: {}r   )rS   var_correo_norteamericarC   r   formr   r   r@   correos_mexr   formatr   r   updater   r   rB   rA   ra   rM   rN   	traceback	print_exc)r   rX   rQ   rR   rT   rU   rV   rW   r   missingZemail_fieldZphone_fieldZrfc_patternZterms_fieldZprocessed_datar   r\   rv   Zemail_servicerP   
email_sentZemail_errorr^   r   )rz   r   r   r   r    r!   submit_form2  s   










































(

z'PreRegister_routes.<locals>.submit_form)loggingbasicConfigINFO	getLoggerrw   router   )	appr   r   r   r   r   r   r   r   r    )rz   r`   r   r   r   r!   PreRegister_routes)   s0       








r   )'r   Zwerkzeug.securityr   flask_babelr   r   pyodbcr   flaskr   r   r   r   r	   r
   r   ZConsultas_SQL.registrationr   r   r   r   r   r   r   rG   r   email.mime.multipartr   email.mime.textr   r   rw   r`   r[   rS   r   rC   r   r   r    r    r    r!   <module>   s,   $	
