U
    iy                     @   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    NC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\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(}|  || j	| j || W 5 Q R X  dd|  W dS  tk
r } z dt|  W Y dS d}~X Y nX 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   s     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   s        c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   N   s     ,c                 S   s   g | ]}|  r|  qS r    stripr'   emailr    r    r!   r)   ^   s      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htmlzCorreo enviado exitosamente a TError al enviar correo: N)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/Ar1   r   
DivisionIDr   Divisionz()z''z""r2   z-Nueva solicitud de distribuidor Norte Americar3   r4   r9   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>
                        
                    
            r5   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>
                r8   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>
                    r6   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%; ">Cityr7   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   rN   
request_idrW   rb   Z	Division_rc   rX   rY   rZ   r=   r    r    r!   rC      s    s|






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

 


	








z:PreRegister_routes.<locals>.EmailService._build_email_body)NN)N)__name__
__module____qualname__r"   r`   rC   r    r^   r    r!   EmailService*   s   
Sry   )levelz/registrationc               
   S   sp   z*t  } | stdddW S td| g g dW S  tk
rj } z"td|  tddd W Y S d}~X Y nX dS )u]   
        Renderiza la página de registro principal con las compañías disponibles.
        registration.html*   No se encontraron compañías disponibles.rD   )	companies	divisionsdepartmentsz[Error en /registration]: u1   Ocurrió un error inesperado. Intenta más tarde.N)r   r   rL   print)r~   r]   r    r    r!   registration  s    z(PreRegister_routes.<locals>.registrationz"/get_divisions/<string:company_id>c              
   S   sr   z(t | }|s tddidfW S t|W S  tk
rl } z&td|  tddidf W Y S d}~X Y nX dS )uP   
        Obtiene divisiones por compañía ID y las devuelve como JSON.
        rD   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   rL   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   st   z*t | |}|s"tddidfW S t|W S  tk
rn } z&td|  tddidf W Y S d}~X Y nX dS )ui   
        Obtiene departamentos filtrados por compañía y división ID y los devuelve como JSON.
        rD   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   rL   r   )r   division_idr   r]   r    r    r!   get_departments_Preregister  s    

z7PreRegister_routes.<locals>.get_departments_Preregisterz/registrationMXc               
   S   sP   z
t dW S  tk
rJ }  z"td|   t ddd W Y S d} ~ X Y nX 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   rL   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k
r } z"td|  tddd W Y S d}~X Y nX 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   rL   r   )r   r~   r]   r    r    r!   solicitud_de_alta  s"    z-PreRegister_routes.<locals>.solicitud_de_altaz/registrationEXPc               
   S   sP   z
t dW S  tk
rJ }  z"td|   t ddd W Y S d} ~ X Y nX 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k	S )zValidar formato de emailz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$N)rematch)r0   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isdigitrt   )ZphoneZclean_phoner    r    r!   validate_phone   s    z*PreRegister_routes.<locals>.validate_phonec                 S   s4   g }|D ]&}|| ks$t | |  s|| q|S )zValidar campos requeridos)rM   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 ddddddddddddgdd d!d"d#d$d%d&d'g	dd d!d"d#d$d%d&d'g	d(d)d*d+d,d-d.d/d0d1g
d2}||kr>t	dd3ddfW S | || }	|	rrt	dd4
d|	ddfW S |dkr| d st	dd5ddfW S | d st	dd6ddfW S n|d7krd&}
| |
 st	dd8ddfW S d'}| | st	dd6ddfW S nx|dkr| d0 sFt	dd8ddfW S | d1 sht	dd6ddfW S d9}t|| d) st	dd:ddfW S d;d<d<d=d2|}|r| |d>krt	dd?ddfW S |d@dA}|dkrx|| d(d| d.d| d/d| d0d| d*d| d-d| d+d| d,d| d)d| d1d| dBd| d=dCkrjdndDdE nJ|d7kr
|| dd| d$d| d%d| d&d| d d| d#d| d!d| d"d| d'd| dFd| d<dCkrdndDdG n|dkr|| dd| dHd| dd| dd| dd| dd| dd| dd| dd| dd| dd| dd| dd| dId| d;dCkrdndDdJ tdK|  t|\}}|rtdL|kr|dLdM nd }|r||dN< z  }g }d}t|}ddOd |D a d	}t|}ddPd |D }d}t|}ddQd |D }t r|dRd t dSD  |r|dTd |dSD  |r|dUd |dSD  tr|dVd tdSD  |||}|rtdW|  ntdX|  W n6 tk
rb } ztdYt|  W 5 d }~X Y nX t	dZ|dW S t	d|ddfW S W nf tk
r } zFtd[t|  dDd l}|  t	dd\
t|dd]f W Y S d }~X Y nX d S )^Nr   RequestTyper5   r#   r$   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   J  s     z;PreRegister_routes.<locals>.submit_form.<locals>.<listcomp>r6   r*   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   P  s     r7   r+   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   V  s     r8   FzTipo de usuario no especificado)successr[   i  ZEMPFirstNameZEMPLastNameZEMPSecondLastNameZEMPCorporateEmailZEMPContactPhoneZEMPEmployeeNumberZEMPCompanyIDZEMPDivisionIDZEMPDepartamentIDZEMPPositionZEMPDirectSupervisorZEMPPermissionTypeZEU_BusinessNameZEU_FiscalAddressZEU_StateZEU_CityZEU_PostalCodeZEU_LegalRepresentativeZEU_PrimaryContactZEU_ContactEmailZEU_ContactPhoneZMX_BusinessNameZMX_RFCZMX_FiscalAddressZMX_StateZMX_CityZMX_PostalCodeZMX_LegalRepresentativeZMX_PrimaryContactZMX_ContactEmailZMX_ContactPhoner4   u   Tipo de usuario no válidozCampos requeridos faltantes: {}u   Email corporativo no válidou   Número de teléfono no válido)r6   r7   u   Email de contacto no válidou-   ^[A-ZÑ&]{3,4}[0-9]{6}[A-V1-9][A-Z1-9][0-9A]$u   RFC no válidoZEMPTermsZEU_TermsZMX_Terms)1trueonTu(   Debe aceptar los términos y condiciones	PENDIENTE)r1   StatusZMX_Comments)r   r   r   Tr   )rn   LegalRepresentativePrimaryContactro   FiscalAddress
PostalCoderp   rr   rq   rj   rs   TermsZEU_Comments)rn   r   r   ro   r   r   rp   rr   rj   rs   r   ZEMPMiddleNameZEMPComments)rd   rf   rg   rh   ri   rj   rk   rl   rb   DepartamentIDrm   DirectSupervisorPermissionTypers   r   zDatos procesados: zID: ra   c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)     s     c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)     s     c                 S   s   g | ]}|d  qS r%   r    r&   r    r    r!   r)   $  s     c                 S   s   g | ]}|  r|  qS r    r-   r/   r    r    r!   r)   '  s      r,   c                 S   s   g | ]}|  r|  qS r    r-   r/   r    r    r!   r)   )  s      c                 S   s   g | ]}|  r|  qS r    r-   r/   r    r    r!   r)   +  s      c                 S   s   g | ]}|  r|  qS r    r-   r/   r    r    r!   r)   -  s      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   )rR   var_correo_norteamericarB   r   formr   r   r?   correos_mexr   formatr   r   updater   r   rA   r@   r`   rL   rM   	traceback	print_exc)r   rW   rP   rQ   rS   rT   rU   rV   r   missingZemail_fieldZphone_fieldZrfc_patternZterms_fieldZprocessed_datar   r[   ru   Zemail_servicerO   
email_sentZemail_errorr]   r   )ry   r   r   r   r    r!   submit_form2  s   
                          










































$

z'PreRegister_routes.<locals>.submit_form)loggingbasicConfigINFO	getLoggerrv   router   )	appr   r   r   r   r   r   r   r   r    )ry   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   rF   r   email.mime.multipartr   email.mime.textr   r   rv   r_   rZ   rR   r   rB   r   r   r    r    r    r!   <module>   s,   $	
