a
    §0i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 zJt  }|std| ” }| | ” | ” }dd |D W W |rP| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |r“| ”  n|r²| ”  0 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   śK/var/www/html/src/Consultas_SQL/SupYCtrol/DataMaster/DMAccessEmployeeSQL.pyŚ
<listcomp>'   s   
÷÷z'get_AccessEmployees.<locals>.<listcomp>z:[Error inesperado] Error obteniendo listado de empleados: N©r   ŚConnectionErrorŚcursorŚexecuteŚfetchallŚcloseŚ	ExceptionŚprint©ŚqueryŚconnr   ŚresultsŚer   r   r   Śget_AccessEmployees	   s0    

öļż
’r(   c                 C   sB  d}z&zĀt  }|std| ” }| || f” | ” }|sVddiW W |rT| ”  S |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d dW W |rŹ| ”  S  ty } z6td|  dt|iW  Y d}~W |r| ”  S d}~0 0 W |r>| ”  n|r<| ”  0 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   Śfetchoner    r!   r"   Śstr)Ś
request_idr$   r%   r   r   r'   r   r   r   Śget_info:   sV    
ęščż
’r9   c               
   C   sø   d} z zJt  }|std| ” }| | ” | ” }dd |D W W |rP| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |r“| ”  n|r²| ”  0 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      ó    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ØzRt  }|std| ” }| || ||f” | ” }dd |D W W |rX| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |r¼| ”  n|rŗ| ”  0 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   “   r=   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,    śż
’rB   c               
   C   sø   d} z zJt  }|std| ” }| | ” | ” }dd |D W W |rP| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |r“| ”  n|r²| ”  0 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   Š   r=   z%get_all_companies.<locals>.<listcomp>u&   [Error] Error obteniendo compaĆ±Ć­as: Nr   r#   r   r   r   Śget_all_companies¼   s,    	
śż
’rC   c              
   C   s¼   d}z¤zNt  }|std| ” }| || f” | ” }dd |D W W |rT| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |rø| ”  n|r¶| ”  0 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   ī   r=   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,    śż
’rD   c              
   C   s¾   d}z¦zPt  }|std| ” }| || |f” | ” }dd |D W W |rV| ”  S  ty } z,td|  g W  Y d}~W |r| ”  S d}~0 0 W |rŗ| ”  n|rø| ”  0 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     r=   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,    śż
’rE   c              
   C   sø   d}z zLt  }|std| ” }| || f” | ” }|d dkW W |rR| ”  S  ty } z*td|  W Y d}~W |r| ”  dS d}~0 0 W |r“| ”  n|r²| ”  0 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: NF)r   r   r   r   r6   r    r!   r"   )Śemailr$   r%   r   r   r'   r   r   r   Ścheck_if_email_exists  s,    łż
’rG   c                 C   sŹ  z²zHt  }|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 |rN| ”  S  ty¢ } z:td|  |r|| ”  W Y d}~W |r| ”  dS d}~0 0 W |rĘ| ”  n|rÄ| ”  0 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_namerF   u6   [Error] Error actualizando informaciĆ³n del empleado: NF)r   r   r   ŚpytzŚtimezoneŚdatetimeŚnowŚstrftimer   r6   Ścommitr    r!   r"   Śrollback)Śdatar%   r   rN   Śreview_dateZquery_requestsZquery_usersZquery_get_user_idZuser_id_rowrL   Zquery_profilesZquery_user_rolesr'   r   r   r   Śupdate_info/  sv    
ž
šżńż
’rV   c              
   C   sÄ   d}|| f}z¤zFt  }|s"td| ” }| ||” | ”  ddiW W |rT| ”  S  ty  } z4td|  dt|iW  Y d}~W |r| ”  S d}~0 0 W |rĄ| ”  n|r¾| ”  0 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   rR   r    r!   r"   r7   )r8   rU   Ś
comentarior$   Śparamsr%   r   r'   r   r   r   Śupdate_user_request_rejected¤  s.    
śż
’rZ   )N)rO   rM   ŚConsultas_SQL.conexionr   r(   r9   r>   rB   rC   rD   rE   rG   rV   rZ   r   r   r   r   Ś<module>   s   1F u