
    i6                     `    S SK r S SKrS SKJr  S rS rS rS rS rS r	S	 r
S
 rS rSS jrg)    N)get_connectionc                     Sn  [        5       nU(       d  [        S5      eUR                  5       nUR                  U 5        UR	                  5       nU Vs/ s H*  nUS   US   US   US   US   US   US	   US
   US   S.	PM,     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)zCObtiene los empleados pendientes de aprobar desde la base de datos.ah  
    SELECT
        UserRequests.RequestID,
        UserRequests.FirstName,
        UserRequests.LastName,
        Division.Division,
        Departament.Departament,
        UserRequests.Position,
        UserRequests.DirectSupervisor,
        UserRequests.PermissionType,
        FORMAT(UserRequests.CreatedAt, 'dd-MM-yyyy HH:mm') AS CreatedAt
    FROM UserRequests
    LEFT JOIN
        Division ON UserRequests.DivisionID = Division.DivisionID
    LEFT JOIN
        Departament ON UserRequests.DepartamentID = Departament.DepartamentID
    WHERE (RequestTypeID = 'EMPLEADO')
        AND Status = 'PENDIENTE'
    4   No se pudo establecer conexión con la base de datosr                           )		RequestID	FirstNameLastNameDivisionDepartamentPositionDirectSupervisorPermissionType	CreatedAtz:[Error inesperado] Error obteniendo listado de empleados: Nr   ConnectionErrorcursorexecutefetchallclose	Exceptionprintqueryconnr   resultsrowes         uC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\SupYCtrol\DataMaster\DMAccessEmployeeSQL.pyget_AccessEmployeesr&   	   s   E&!"XYYu//# %
& %c %(F$'F$'F$'F$'F$'F$'F$'F$'F
 %
&  JJL !
&  J1#NO	JJL 	 JJL sB   AB& 1B!B& !B& &
C"0C?C" C% C""C% %C?c                    Sn [        5       nU(       d  [        S5      eUR                  5       nUR                  X45        UR	                  5       nU(       d  SS0U(       a  UR                  5         $ $ 0 SUS   _SUS   _S	US
   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS   _SUS    _S!US"   _S#US$   _U(       a  UR                  5         $ $ ! [         a=  n[        S%U 35        S[        U5      0s S&nAW(       a  UR                  5         $ $ S&nAff = f! W(       a  UR                  5         f f = f)'uA   Obtiene la información completa de un empleado por su RequestID.a$  
    SELECT
        FORMAT(UserRequests.CreatedAt, 'dd-MM-yyyy HH:mm') AS CreatedAt,
        FirstName,
        MiddleName,
        LastName,
        SecondLastName,
        RequestType,
        Position,
        DirectSupervisor,
        PermissionType,
        CorporateEmail,
        ContactPhone,
        EmployeeNumber,
        Company,
        Division,
        Departament,
        Comments
    FROM
        UserRequests
    LEFT JOIN 
        RequestType ON UserRequests.RequestTypeID = RequestType.RequestTypeID
    LEFT JOIN 
        Company ON UserRequests.CompanyID = Company.CompanyID
    LEFT JOIN 
        Division ON UserRequests.DivisionID = Division.DivisionID
    LEFT JOIN 
        Departament ON UserRequests.DepartamentID = Departament.DepartamentID
    WHERE RequestID = ?    
    r   errorzEmpleado no encontrador   r   r   r   
MiddleNamer   r   r   SecondLastNamer	   RequestTyper
   r   r   r   r   r   r   CorporateEmail	   ContactPhone
   EmployeeNumber   Company   r      r      Comments   u4   [Error] Error obteniendo información del empleado: N)	r   r   r   r   fetchoner   r   r   str)
request_idr    r!   r   r#   r$   s         r%   get_infor;   :   s   E<$!"XYYum,oo562 JJL /
Q
Q
 #a&
 A	

 c!f
 3q6
 A
 A
 c!f
 c!f
 CG
 c"g
 s2w
 B
 3r7
  B!
. JJL 	  !DQCHIQ  JJL 	! JJL s7   AC/ 5A!C/ /
D69D1D6D9 1D66D9 9Ec                     Sn  [        5       nU(       d  [        S5      eUR                  5       nUR                  U 5        UR	                  5       nU Vs/ s H  oDS   US   S.PM     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)z2Obtiene todos los tipos de formulario disponibles.zy
    SELECT
        RequestTypeID,
        RequestType
    FROM
        RequestType
    ORDER BY
        RequestType
    r   r   r   idnamez.[Error] Error obteniendo tipos de formulario: Nr   r   s         r%   get_all_request_typesr@      s    E!"XYYu//#:AB'31vs1v.'B
 JJL  C >qcBC	JJL 	 JJL B   AB	 B)B	 B	 	
CC "C#C  CC C"c                    Sn [        5       nU(       d  [        S5      eUR                  5       nUR                  X0X45        UR	                  5       nU Vs/ s H  owS   US   S.PM     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)uE   Obtiene los roles filtrados por compañía, división y departamento.z
    SELECT
        RoleID,
        RoleName
    FROM
        Roles
    WHERE
        CompanyID = ? AND
        DivisionID = ? AND
        DepartamentID = ?
    ORDER BY
        RoleName
    r   r   r   r=   z*[Error] Error obteniendo roles filtrados: Nr   )	
company_iddivision_iddepartament_idr    r!   r   r"   r#   r$   s	            r%   get_roles_by_filtersrF      s    E!"XYYu;GH//#:AB'31vs1v.'B
 JJL  C :1#>?	JJL 	 JJL B   AB B+B B 
CC$C%C
 CC
 
C$c                     Sn  [        5       nU(       d  [        S5      eUR                  5       nUR                  U 5        UR	                  5       nU Vs/ s H  oDS   US   S.PM     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)u*   Obtiene todas las compañías disponibles.zi
    SELECT
        CompanyID,
        Company
    FROM
        Company
    ORDER BY
        Company
    r   r   r   r=   u&   [Error] Error obteniendo compañías: Nr   r   s         r%   get_all_companiesrI      s    E!"XYYu//#:AB'31vs1v.'B
 JJL  C 6qc:;	JJL 	 JJL rA   c                    Sn [        5       nU(       d  [        S5      eUR                  5       nUR                  X45        UR	                  5       nU Vs/ s H  oUS   US   S.PM     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)u7   Obtiene las divisiones para una compañía específica.z
    SELECT
        DivisionID,
        Division
    FROM
        Division
    WHERE
        CompanyID = ?
    ORDER BY
        Division
    r   r   r   r=   z%[Error] Error obteniendo divisiones: Nr   )rC   r    r!   r   r"   r#   r$   s          r%   get_divisions_by_companyrK      s    
E!"XYYum,//#:AB'31vs1v.'B
 JJL  C 5aS9:	JJL 	 JJL sB   AB
 B*B
 B
 

CC#C$C	 CC	 	C#c                    Sn [        5       nU(       d  [        S5      eUR                  5       nUR                  X U45        UR	                  5       nU Vs/ s H  ofS   US   S.PM     snU(       a  UR                  5         $ $ s  snf ! [         a2  n[        SU 35        / s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)uG   Obtiene los departamentos para una compañía y división específicas.z
    SELECT
        DepartamentID,
        Departament
    FROM
        Departament
    WHERE
        CompanyID = ? AND
        DivisionID = ?
    ORDER BY
        Departament
    r   r   r   r=   z([Error] Error obteniendo departamentos: Nr   )rC   rD   r    r!   r   r"   r#   r$   s           r%   get_departments_by_divisionrM      s    E!"XYYu;78//#:AB'31vs1v.'B
 JJL  C 8<=	JJL 	 JJL rG   c                    Sn [        5       nU(       d  [        S5      eUR                  5       nUR                  X45        UR	                  5       nUS   S:  U(       a  UR                  5         $ $ ! [         a0  n[        SU 35         SnAW(       a  UR                  5         ggSnAff = f! W(       a  UR                  5         f f = f)u?   Verifica si un correo electrónico ya existe en la tabla Users.zE
    SELECT COUNT(*) AS count
    FROM Users
    WHERE Email = ?
    r   r   z/[Error] Error verificando si el correo existe: NF)r   r   r   r   r8   r   r   r   )emailr    r!   r   r#   r$   s         r%   check_if_email_existsrP     s    E
!"XYYuh'oo 1vz JJL   ?sCDJJL 
 JJL s*   AA2 2
B,<B'
B/ 'B,,B/ /C	c                     [        5       nU(       d  [        S5      eUR                  5       n[        R                  " S5      n[
        R
                  R                  U5      R                  S5      nSnUR                  XTU S   45        SnUR                  UU S   U S   45        S	nUR                  U5        UR                  5       nUS
   n	Sn
UR                  U
U	U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   U S   45        SnUR                  XU S   45        UR                  5         U	U S    SU S    3U S   S.U(       a  UR                  5         $ $ ! [         aG  n[        SU 35        W(       a  UR                  5          SnAU(       a  UR                  5         ggSnAff = f! W(       a  UR                  5         f f = f)u  
Actualiza la información de un empleado en las tablas UserRequests, Users, Profiles y UserRoles.

Proceso:
1. Actualiza el estado y fecha de revisión en UserRequests
2. Crea un nuevo usuario en la tabla Users
3. Obtiene el UserID generado automáticamente
4. Crea un nuevo perfil en la tabla Profiles con los datos del modal
5. Asocia el usuario con el rol seleccionado en la tabla UserRoles
r   zAmerica/Mexico_Cityz%Y-%m-%d %H:%M:%Sz
        UPDATE UserRequests
        SET 
            Status = 'APROBADO',
            ReviewDate = ?
        WHERE 
            RequestID = ?
        r   zP
        INSERT INTO Users (RequestTypeID, Email)
        VALUES (?, ?)
        RequestTypeIDr,   z-
        SELECT @@IDENTITY AS UserID
        r   a  
        INSERT INTO Profiles (
            UserID,
            RequestID,
            RequestTypeID,
            FirstName,
            MiddleName,
            LastName,
            SecondLastName,
            EmployeeNumber,
            Position,
            DirectSupervisor,
            PermissionType,
            Email,
            ContactPhone,
            CompanyID,
            DivisionID,
            DepartamentID
        )
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        r   r)   r   r*   r0   r   r   r   r.   	CompanyID
DivisionIDDepartamentIDzN
        INSERT INTO UserRoles (UserID, RoleID)
        VALUES (?, ?)
        RoleID )user_id	full_namerO   u6   [Error] Error actualizando información del empleado: NF)r   r   r   pytztimezonedatetimenowstrftimer   r8   commitr   r   r   rollback)datar!   r   r[   review_datequery_requestsquery_usersquery_get_user_iduser_id_rowrX   query_profilesquery_user_rolesr$   s                r%   update_infori   /  s.   h!"XYY==!67''++H5>>?RS 	~T+5F'GH 	{!!"%
 	 	()oo'a.* 	~!!"!"#$!"!" !!(
 	( 	'4>)BC  -.aZ0@/AB*+
 JJL   FqcJKMMOJJL  JJL s*   EE3 3
G=%F?"G ?GG G!c                    SnX4n [        5       nU(       d  [        S5      eUR                  5       nUR                  X45        UR	                  5         SS0U(       a  UR                  5         $ $ ! [         a=  n[        SU 35        S[        U5      0s SnAW(       a  UR                  5         $ $ SnAff = f! W(       a  UR                  5         f f = f)u   
Actualiza el estado a RECHAZADO y fecha de revisión en UserRequests.
El comentario (motivo del rechazo) no se guarda en la base de datos,
solo se usa para el correo electrónico.
z|
    UPDATE UserRequests
    SET 
        Status = 'RECHAZADO',
        ReviewDate = ?
    WHERE 
        RequestID = ?
    r   messagez!Solicitud rechazada correctamentez@[Error SQL] Error actualizando estado de solicitud a RECHAZADO: r(   N)	r   r   r   r   r_   r   r   r   r9   )r:   rb   
comentarior    paramsr!   r   r$   s           r%   update_user_request_rejectedrn     s    E &F!"XYYu%>?
 JJL 	  !PQRPSTUQ  JJL 	! JJL s0   AA0 0
B7:B2B7B: 2B77B: :C)N)r\   rZ   Consultas_SQL.conexionr   r&   r;   r@   rF   rI   rK   rM   rP   ri   rn        r%   <module>rr      sH   
   1/bDL8@8<>4sjrq   