U
    âøi6  ã                   @   sr   d dl Z d dlZd dlmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„ZdS )é    N)Úget_connectionc               
   C   sš   d} z‚z@tƒ }|stdƒ‚| ¡ }| | ¡ | ¡ }dd„ |D ƒW W ¢BS  tk
r‚ } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |r”|  ¡  X dS )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 datosc                 S   sH   g | ]@}|d  |d |d |d |d |d |d |d |d d	œ	‘qS )
r   é   é   é   é   é   é   é   é   )	Ú	RequestIDÚ	FirstNameÚLastNameÚDivisionÚDepartamentÚPositionÚDirectSupervisorÚPermissionTypeÚ	CreatedAt© ©Ú.0Úrowr   r   úuC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\SupYCtrol\DataMaster\DMAccessEmployeeSQL.pyÚ
<listcomp>'   s   
÷÷z'get_AccessEmployees.<locals>.<listcomp>z:[Error inesperado] Error obteniendo listado de empleados: N©Úcloser   ÚConnectionErrorÚcursorÚexecuteÚfetchallÚ	ExceptionÚprint©ÚqueryÚconnr   ÚresultsÚer   r   r   Úget_AccessEmployees	   s     

ö"r(   c                 C   s  d} zúz®tƒ }|stdƒ‚| ¡ }| || f¡ | ¡ }|sLddiW W ¢¸S |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d dœW W ¢LS  tk
 rü } z&td|› ƒ dt|ƒi W Y ¢W ¢S d}~X Y nX W 5 |r|  ¡  X dS )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   r   r   r	   r
   r   é	   é
   é   é   é   é   é   )r   r   Ú
MiddleNamer   ÚSecondLastNameZRequestTyper   r   r   ÚCorporateEmailÚContactPhoneÚEmployeeNumberZCompanyr   r   ZCommentsu4   [Error] Error obteniendo informaciÃ³n del empleado: N)	r   r   r   r   r   Úfetchoner!   r"   Ústr)Ú
request_idr$   r%   r   r   r'   r   r   r   Úget_info:   s@    ð*r9   c               
   C   sš   d} z‚z@tƒ }|stdƒ‚| ¡ }| | ¡ | ¡ }dd„ |D ƒW W ¢BS  tk
r‚ } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |r”|  ¡  X dS )z2Obtiene todos los tipos de formulario disponibles.zy
    SELECT
        RequestTypeID,
        RequestType
    FROM
        RequestType
    ORDER BY
        RequestType
    r   c                 S   s   g | ]}|d  |d dœ‘qS ©r   r   )ÚidÚnamer   r   r   r   r   r   ”   s     z)get_all_request_types.<locals>.<listcomp>z.[Error] Error obteniendo tipos de formulario: Nr   r#   r   r   r   Úget_all_request_types€   s    	
"r=   c              
   C   s¢   d}zŠzHtƒ }|stdƒ‚| ¡ }| || ||f¡ | ¡ }dd„ |D ƒW W ¢BS  tk
rŠ } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |rœ|  ¡  X dS )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   c                 S   s   g | ]}|d  |d dœ‘qS r:   r   r   r   r   r   r   ´   s     z(get_roles_by_filters.<locals>.<listcomp>z*[Error] Error obteniendo roles filtrados: Nr   )Ú
company_idÚdivision_idÚdepartament_idr$   r%   r   r&   r'   r   r   r   Úget_roles_by_filtersœ   s    "rA   c               
   C   sš   d} z‚z@tƒ }|stdƒ‚| ¡ }| | ¡ | ¡ }dd„ |D ƒW W ¢BS  tk
r‚ } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |r”|  ¡  X dS )u*   Obtiene todas las compaÃ±Ã­as disponibles.zi
    SELECT
        CompanyID,
        Company
    FROM
        Company
    ORDER BY
        Company
    r   c                 S   s   g | ]}|d  |d dœ‘qS r:   r   r   r   r   r   r   Ð   s     z%get_all_companies.<locals>.<listcomp>u&   [Error] Error obteniendo compaÃ±Ã­as: Nr   r#   r   r   r   Úget_all_companies¼   s    	
"rB   c              
   C   sž   d}z†zDtƒ }|stdƒ‚| ¡ }| || f¡ | ¡ }dd„ |D ƒW W ¢BS  tk
r† } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |r˜|  ¡  X dS )u7   Obtiene las divisiones para una compaÃ±Ã­a especÃ­fica.z
    SELECT
        DivisionID,
        Division
    FROM
        Division
    WHERE
        CompanyID = ?
    ORDER BY
        Division
    r   c                 S   s   g | ]}|d  |d dœ‘qS r:   r   r   r   r   r   r   î   s     z,get_divisions_by_company.<locals>.<listcomp>z%[Error] Error obteniendo divisiones: Nr   )r>   r$   r%   r   r&   r'   r   r   r   Úget_divisions_by_companyØ   s    "rC   c              
   C   s    d}zˆzFtƒ }|stdƒ‚| ¡ }| || |f¡ | ¡ }dd„ |D ƒW W ¢BS  tk
rˆ } ztd|› ƒ g  W Y ¢W ¢S d}~X Y nX W 5 |rš|  ¡  X dS )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   c                 S   s   g | ]}|d  |d dœ‘qS r:   r   r   r   r   r   r     s     z/get_departments_by_division.<locals>.<listcomp>z([Error] Error obteniendo departamentos: Nr   )r>   r?   r$   r%   r   r&   r'   r   r   r   Úget_departments_by_divisionö   s    "rD   c              
   C   sš   d}z‚zBtƒ }|stdƒ‚| ¡ }| || f¡ | ¡ }|d dkW W ¢@S  tk
r‚ } ztd|› ƒ W Y ¢W ¢dS d}~X Y nX W 5 |r”|  ¡  X dS )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: FN)r   r   r   r   r   r6   r!   r"   )Úemailr$   r%   r   r   r'   r   r   r   Úcheck_if_email_exists  s     rF   c                 C   s¦  zŽz<tƒ }|stdƒ‚| ¡ }t d¡}tj |¡ d¡}d}| 	||| d f¡ d}| 	|| d | d f¡ d	}| 	|¡ | 
¡ }|d
 }	d}
| 	|
|	| d | d | d | d | d | d | d | d | d | d | d | d | d | d | d f¡ d}| 	||	| d f¡ | ¡  |	| d › d| d › | d dœW W ¢PS  tk
rŒ } z*td|› ƒ |rr| ¡  W Y ¢W ¢dS d}~X Y nX W 5 |r |  ¡  X dS )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 (?, ?)
        ZRequestTypeIDr3   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   r1   r   r2   r5   r   r   r   r4   Ú	CompanyIDÚ
DivisionIDÚDepartamentIDzN
        INSERT INTO UserRoles (UserID, RoleID)
        VALUES (?, ?)
        ZRoleIDú )Úuser_idZ	full_namerE   u6   [Error] Error actualizando informaciÃ³n del empleado: FN)r   r   r   r   ÚpytzÚtimezoneÚdatetimeÚnowÚstrftimer   r6   Úcommitr!   r"   Úrollback)Údatar%   r   rM   Úreview_dateZquery_requestsZquery_usersZquery_get_user_idZuser_id_rowrK   Zquery_profilesZquery_user_rolesr'   r   r   r   Úupdate_info/  sf    
þ
ðý rU   c              
   C   s¦   d}|| f}z†z<tƒ }|s"tdƒ‚| ¡ }| ||¡ | ¡  ddiW W ¢JS  tk
rŽ } z&td|› ƒ dt|ƒi W Y ¢W ¢S d}~X Y nX W 5 |r |  ¡  X dS )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   rQ   r!   r"   r7   )r8   rT   Ú
comentarior$   Úparamsr%   r   r'   r   r   r   Úupdate_user_request_rejected¤  s    *rY   )N)rN   rL   ÚConsultas_SQL.conexionr   r(   r9   r=   rA   rB   rC   rD   rF   rU   rY   r   r   r   r   Ú<module>   s   1F u