
    )j	             	       
   d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZ d dl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mZ d d	lmZ d d
lm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=  e         ee>      Z?e?jF                  j                  e*       e j                  j                  d      e?jF                  d<   e?jF                  d   s eCd       e6j                  e?        ee?      ZEdeE_F         ej                  ej                         e?j                  j                  ej                         d dl7m6Z6mKZKmLZLmMZMmNZNmOZOmPZPmQZQm=Z=mRZRmSZSmTZTmUZUmVZVm8Z8m9Z9m:Z:m;Z;m<Z< eEj                  d        ZXd ZYe?j                  d      d        Z[e?j                  dddg      d        Z\e?j                  d      ed               Z]e?j                  d       ed!               Z^e?j                  d"      e eYe$g      d#                      Z_e?j                  d$ddg      e eYe$e%e&e)g      d%                      Z`e?j                  d&ddg      d'        Zae?j                  d(dg      e eYe$e&e)g      d)                      Zbe?j                  d*      e eYe$e%e&e)g      d+                      Zcd, Zde?j                  d-ddg      e eYe$e%e&e'e)g      d.                      Zee?j                  d/dg      e eYe$e%e&e'e)g      d0                      Zfe?j                  d1      e eYe$e%e&e'e)g      d2                      Zge?j                  d3ddg      e eYe$g      d4                      Zhe?j                  d5ddg      e eYe$e%e&e)g      d6                      Zie?j                  d7dg      e eYe$e%e&e)g      d8                      Zje?j                  d9dg      e eYe$e&g      d:                      Zkd; Zle?j                  d<ddg      e eYe$e&e)g      d=                      Zme?j                  d>dg      ed?               Zne?j                  d@dg      edA               Zoe?j                  dBdg      edC               Zpe?j                  dDdg      edE               Zqe?j                  dFddg      e eYe$e%e)g      dG                      Zre?j                  dHddg      e eYe$e(g      dI                      Zse?j                  dJddg      edK               Zte>dLk(  r/e?j                  e j                  j                  dM      dNk(  O       yy)P    N)generate_evaluation_pdf)datetime)
Flaskrender_templateredirecturl_forflashrequestabortjsonifycurrent_app	send_file)LoginManager	UserMixin
login_userlogout_usercurrent_userlogin_required)	FlaskForm)secure_filename)load_dotenvwraps)or_)IntegrityError)ADMIN_ROLE_IDGERENTE_ROLE_IDSUPERVISOR_ROLE_IDEVALUADO_ROLE_IDTALENTO_HUMANO_ROLE_IDDIRECTOR_ROLE_IDConfig)		LoginFormOdiFormAssignOdiFormEditUserFormSearchUserByCedulaFormAssignLocationFormAssignCursosFormTalentoHumanoObservationFormChangePasswordForm)db)LocalizacionDivisionesGeneralesUnidadesGerenciasGeneralesCoordinacionesUbicacionPersonal
SECRET_KEYz>No SECRET_KEY set for Flask application. Check your .env file.login)level)r,   UserRolAno	TrimestreOdiRangoOdiPersonalr2   CompetenciaCompetenciaPersonalEscala
EvaluacionCursoPersonalr-   r.   r/   r0   r1   c                 R    t         j                  j                  t        |             S )N)r6   querygetint)user_ids    !C:\xampp\htdocs\evaluacion\app.py	load_userrH   /   s    ::>>#g,''    c                       fd}|S )z
    A decorator to restrict access to routes based on user roles.
    `role_ids` should be a list of integer role IDs that are allowed to access the route.
    c                 2     t                fd       }|S )Nc                      t         j                  s t        dd       t        t	        d            S t         j
                  t         j
                  vr t        dd       t        t	        d            S  | i |S )Nu2   Debes iniciar sesión para acceder a esta página.warningr4   u.   No tienes permiso para acceder a esta página.danger	dashboard)r   is_authenticatedr	   r   r   id_rol)argskwargsfrole_idss     rG   decorated_functionz<role_required.<locals>.decorator.<locals>.decorated_function:   sm    00JIV 011 ""*l.A.A.QFQ 455d%f%%rI   r   )rT   rV   rU   s   ` rG   	decoratorz role_required.<locals>.decorator9   s!    	q	& 
	& "!rI    )rU   rW   s   ` rG   role_requiredrY   4   s    
" rI   /c                  r    t         j                  st        t        d            S t        t        d            S )Nr4   rO   )r   rP   r   r   rX   rI   rG   homer\   K   s-    ((())
 GK())rI   z/loginGETPOST)methodsc                  J   t         j                  rt        t        d            S t	               } | j                         rWt        j                  j                  | j                  j                        j                         }|r|j                  | j                  j                        r|j                  r|j                  t         k7  rZt"        j                  j                  |j$                        j                         }|s t'        dd       t        t        d            S t)        |       t'        dd       t*        j,                  j/                  d	      }t        |xs t        d            S |r|j                  st'        d
d       nt'        dd       t1        dd|       S )NrO   )usuarioid_personaluS   No tiene una ubicación asignada. Por favor, contacte con un Gerente/Administrador.rN   r4   u   Inicio de sesión exitoso.successnextu?   Tu cuenta está inactiva. Por favor, contacta al administrador.u"   Usuario o contraseña incorrectos.z
login.htmlu   Iniciar Sesión)titleform)r   rP   r   r   r#   validate_on_submitr6   rC   	filter_byusernamedatafirstcheck_passwordpasswordactiverQ   r   r2   rc   r	   r   r
   rR   rD   r   )rg   user	ubicacion	next_pages       rG   r4   r4   V   s7   $$,--;D zz##DMM,>,>#?EEGD''(:(:;{{m+-33==$JZJZ=[aac	 oqyz#GG$455t.	:((0II=)=>>$++SU]^6A</@tLLrI   z/logoutc                  V    t                t        dd       t        t        d            S )Nu   Has cerrado sesión.infor\   )r   r	   r   r   rX   rI   rG   logoutru   n   s#     M	
 &)GFO$$rI   z
/dashboardc                      t        dd      S )Nzdashboard.html	Dashboardrf   r   rX   rI   rG   rO   rO   u   s     /{CCrI   z/admin_panelc                     t         j                  j                  t        t              j                  t        t        j                  t        j                  k(        j                         } g }| D ]z  \  }}|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   d	       | t#        d|      S )N)	rc   cedulanombreapellidonacionalidadestaturQ   rol_descripcionrj   zadmin_panel.html)personal)r,   sessionrC   r6   r7   joinrQ   allappendrc   r{   r|   r}   r~   r   descripcionra   r   )personal_with_roles
users_datapersonal_userrol_objs       rG   admin_panelr   z   s     ****45S$+++, 
 J"5 w(44#**#**%..)66#**#**&22%--

 
	 -
CCrI   z/manage_odisc                     t               } t        j                  t        k(  r<t        j
                  j                  t        j                        j                         }nYt        j
                  j                  t        j                        j                  t        j                        j                         }| j                  j                  r| j                         r	 t        j
                  j                  t        j                        j                         }t	        | j                  j                  | j                   j                  t        j                        }t"        j$                  j'                  |       t"        j$                  j)                          t+        dd       t-        t/        d            S t:        j<                  dk(  r@dt:        j>                  v r-t:        j>                  jA                  dtB              }t        j
                  jA                  |      }|rt        j                  t        k(  s|j                  t        j                  k(  r	 tD        j
                  j                  |      j                         rt+        dd       nIt"        j$                  jG                  |       t"        j$                  j)                          t+        dd       nt+        dd       nt+        dd       t-        t/        d            S tI        d| |      S # t0        $ r[}t"        j$                  j3                          t+        d| d       t4        j6                  j9                  d| d	
       Y d }~md }~ww xY w# t0        $ r7}t"        j$                  j3                          t+        d| d       Y d }~d }~ww xY w)Nrb   )r   pesorc   u   ¡ODI añadido exitosamente!rd   manage_odisu   Error al añadir ODI: rN   zError adding ODI: Texc_infor^   deleteodi_id_to_edittypeid_odiuU   No se puede eliminar este ODI porque ya está asignado a personal en una evaluación.rM   u   ¡ODI eliminado exitosamente!Error al eliminar ODI: z)No tienes permiso para eliminar este ODI.zODI no encontrado.zmanage_odis.html)rg   all_odis)%r$   r   rQ   r   r:   rC   order_byr   r   ri   rc   submitrk   rh   r2   rl   r   r,   r   addcommitr	   r   r   	Exceptionrollbackapploggererrorr
   methodrg   rD   rE   r<   r   r   )rg   r   locnew_odieodi_idodi_to_deletes          rG   r   r      s    9D m+99%%coo6::<99&&<3K3K&LUUVYVeVefjjl {{D335	F#))33@X@X3Y__aC ,,11YY^^(44G
 JJNN7#JJ0)<GM233 
6	!h',,&>!!"2!=		f-""m3}7P7PT`TlTl7l
C"((22&2AGGIu  xA  B

))-8

))+=yI
 A8L&1.// ?  	FJJ!*1#.9JJ1!5EE	F* ! CJJ'')3A37BBCs3   CL BN 	N&AM<<N	O-N??Oz/edit_odi/<int:odi_id>c                    t         j                  j                  |       }t        |      }t        j                  j                  |       j                         d u}|j                         r|rB|j                  |j                  _	        |j                  |j                  _	        t        dd       |j                  |       t        j                  j                          t        dd       t!        t#        d            S t%        d|||	      S )
Nobjr   z@No se puede modificar el peso de un ODI que ya ha sido asignado.rN   zODI actualizado exitosamente.rd   r   zedit_odi.html)rg   odiis_assigned)r:   rC   
get_or_404r$   r<   ri   rl   rh   r   rk   r   r	   populate_objr,   r   r   r   r   r   )r   r   rg   r   s       rG   edit_odir      s    
))

v
&CsD ##--V-<BBDDPK $'OOD! XXDIINTV^_#


-y9.//?3KXXrI   z/delete_odi/<int:odi_id>c                 Z   t         j                  j                  |       }	 t        j                  j	                  |j
                        j                         rt        dd       nIt        j                  j                  |       t        j                  j                          t        dd       t#        t%        d            S # t        $ r^}t        j                  j                          t        d| d       t        j                  j!                  d|  d| d	
       Y d }~vd }~ww xY w)Nr   zWNo se puede eliminar el ODI porque tiene asignaciones de ODIs personalizadas asociadas.rN   zODI eliminado exitosamente.rd   r   zError deleting ODI : Tr   r   )r:   rC   r   r<   ri   r   rl   r	   r,   r   r   r   r   r   r   r   r   r   r   )r   r   r   s      rG   
delete_odir      s     ))

v
&CM &&cjj&9??AkmuvJJc"JJ/; GM*++  M


's+X6

.vhb<tLLMs   BC 	D*AD%%D*z/supervisor_pagec                      t        dd      S )Nzsupervisor_page.htmlu   Página de Supervisorrx   ry   rX   rI   rG   supervisor_pager     s     19PQQrI   c                 6
   g }d}|dk7  rZ|dk7  rTt         j                  j                  | ||      j                  t        t         j
                  t        j
                  k(        j                  t        t         j                  t        j                  k(        j                  t         j
                        j                         }|D ]  }	 t        |j                  j                        }t        |j                  j                        }|j!                  |j                  j
                  |j                  j                  ||j                  j                  |d       |||z  z  } g }	d}
|dk7  rZ|dk7  rTt"        j                  j                  | ||      j                  t$        t"        j&                  t$        j&                  k(        j                  t        t"        j                  t        j                  k(        j                  t"        j&                        j                         }|D ]  }	 t        |j                  j                        }t        |j(                  j                        }|	j!                  |j(                  j&                  |j(                  j                  ||j                  j                  |d       |
||z  z  }
 ||
z   }|}d}d}|dk7  r<|dk7  r7|dkD  r2t*        j                  j                  | ||      j-                         d u}|dkD  r|st.        j                  j1                  t.        j2                  dk(        j                  t.        j4                  j7                               j-                         }|r$||j4                  kD  rt        |j4                        }|dkD  rt.        j                  j1                  t.        j8                  |k  t.        j4                  |k\  t.        j4                  j;                  d       z        j-                         }|r|j                  }nd}d }d	}d
}|dk7  ru|dk7  rpt<        j                  j                  | ||      j-                         }|r>|j>                  }|j@                  xs d	}|jB                  r|jB                  jD                  }|tG        t        |      d      |	tG        t        |
      d      tG        t        |      d      |||||d
S # t        $ r d}Y w xY w# t        $ r d}Y w xY w)N        rc   id_anoid_trimestre)idr   r   rango_descripcionrango_valorN/AFr   zFuera de Escala Definida zNo disponible   )
assigned_odistotal_odi_scoreassigned_competenciastotal_competencia_scoretotal_evaluacion_scoreescala_remarkevaluacion_aprobacionevaluacion_observacion
has_courseevaluador_name)$r<   rC   ri   r   r:   r   r;   id_rangor   r   floatrangor   
ValueErrorr   r   r   r>   r=   id_competenciacompetenciarA   rl   r?   filterrequiere_cursomaximodescminimois_r@   
aprobacionobservacion	evaluador	full_nameround)rF   ano_idtrimestre_idr   r   odi_assignments
assignmentrango_valueodi_pesor   r   competencia_assignmentscompetencia_pesor   final_evaluacion_scorer   r   highest_safe_escalamatched_escalar   r   r   existing_evaluacions                          rG   get_evaluado_datar     s   MO|*%++55'RXgs5tDk((CJJ67D,,>?H[''( 	
 * 	6J"#J$4$4$@$@A Z^^001H   nn++)~~99 %/%5%5%A%A*"  {X55O	6  !|*"5";";"E"ERYbh  xD"E  #ED1@@KD^D^^_D+44FGH(778 	 
 2 	FJ"#J$4$4$@$@A  %Z%;%;%@%@A!(( ,,;;)55AA(%/%5%5%A%A**  ${5E'EE#	F  -/FF3M J|*/E/I"((22% 3 
 %'	
 !*$ll11!!U*

(6==%%'
( 	 #9<O<V<V#V%*+>+E+E%F" !,,MM33]]449J9J49PQ
 %' 	
 *66M6M !$N|*(..88% 9 
 %'	 	 $7$B$B!%8%D%D%J"",,!4!>!>!H!H ' !7;!6#(/F)G#K"'.D(Eq"I&!6"8 (   "!"2  "!"s$   
S7.T	7TT	TTz/evaluado_pagec            	      &   t         j                  } t        j                  j	                  t
        j                  t
        j                        j                  t
        j                  j                               j                         }|D cg c]  }|j                  |j                  d }}t        j                  j	                  t        j                  t        j                        j                  t        j                  j                               j                         }|D cg c]  }|j                  |j                  d }}d}d}t        j                  dk(  rt!        t        j"                  j%                  dd            }	t!        t        j"                  j%                  dd            }
|	dk(  s|
dk(  rt'        | |	|
      }t)        |      S t'        | |	|
      }t)        |      S t'        | ||      }t+        dd|||||      S c c}w c c}w )	Nr   descriptionr   r^   r   r   zevaluado_page.htmlu   Página de Evaluación Personal)rf   years
trimestersinitial_ano_idinitial_trimestre_idinitial_data)r   rc   r,   r   rC   r8   r   r   r   r   r   r9   r   ascr
   r   rE   jsonrD   r   r   r   )rF   unique_years_queryyyears_for_dropdownunique_trimesters_queryttrimesters_for_dropdownr   r   selected_ano_idselected_trimestre_idrk   r   s                rG   evaluado_pager     s    &&G ))#**cooF	#//&&(	)	  SeeQ!--Hee !jj..y/E/EyG\G\]	)((,,.	/	  ^uuXYannQ]]Suu N ~~gll..x<= #GLL$4$4^R$H Ib $9R$?$Wo?TUD4=  !/;PQt} %Wn>RSL/ *%1! ? f vs   
 H	% Hz/save_evaluacion_feedbackc            
         t        j                         } t        j                  }t	        | j                  d            }t	        | j                  d            }| j                  d      }| j                  dd      j                         }|t        ddd      d	fS |du r|st        dd
d      d	fS 	 t        j                  j                  |||      j                         }|r0||_        ||_        t        j                  j!                  |       d}n4t        |||g g ||d      }t        j                  j!                  |       d}t        j                  j#                          t        d|d      dfS # t$        $ rF}	t        j                  j'                          t)        d|	        t        ddd      dfcY d }	~	S d }	~	ww xY w)Nr   r   r   r   r   Fu   Aprobación no especificada.)rd   message  u4   La observación es requerida si no está de acuerdo.r   u1   Feedback de evaluación actualizado exitosamente.)rc   r   r   ids_odi_personalids_competencia_personalr   r   	ids_cursou.   Feedback de evaluación guardado exitosamente.T   z"Error saving evaluation feedback: z%Error interno al guardar el feedback.  )r
   get_jsonr   rc   rE   rD   stripr   r@   rC   ri   rl   r   r   r,   r   r   r   r   r   print)
rk   user_personal_idr   r   r   r   r   r   new_evaluacionr   s
             rG   save_evaluacion_feedbackr	    s    D#//(#$Ftxx/0L,'J((="-335K55STUWZZZU;55klmorrr"d(..88(% 9 
 %'	 	 -7*.9+JJNN./IG',)!#)+%'	N JJNN>*FG


4G<=sBB d


21#6755\]^`cccds   3CE7 7	G ;G;GGz-/generate_pdf/<int:ano_id>/<int:trimestre_id>c           
         t        t        j                  | |      }t        j                  j                  |       }t        j                  j                  |      }|rt        |j                        nd}d}t        j                  rt        j                  j                  dk(  rd}t        |t        j                  t        j                  ||j                  dd      |rt        |j                        nd||      }t        dt        j                   d|rt        |j                        nd	 d|rt        |j                        nd
 d      }t        |d|d      S )Nr   r      Caracasr   )rk   colaborador_namecolaborador_cedulaperiodo_descr   ano_descr   	city_nameEvaluacion__year	trimesterz.pdfFzapplication/pdf)as_attachmentdownload_namemimetype)r   r   rc   r8   rC   rD   r9   strr   rq   id_localizacionr   r   r{   ra   r   )	r   r   rk   ano	trimestrer  r  bufferfilenames	            rG   generate_pdfr    s@   
 \55v|LD ))--
C##L1I1:3y,,-LI,"8"8"H"HA"M	 %%//'..!xx 0%8),S__%%!	F [!5!5 6aPSCOO8LY_7``a  AJbefof{f{b|  P[  b\  \`  a  bH"	 rI   z/admin/edit_user/<int:user_id>c                    t         j                  j                  |       }t        |      }t        j
                  dk(  r?t        |j                        |j                  _        |j                  |j                  _        |j                         rDt        d       t        |j                  j                        }t        d| dt        |       d       |dk(  |_        t        d|j                   d	t        |j                         d       |j                  j                  r0|j                  |j                  j                         t        d
       |j                  j                  |_	        	 t        j                   j#                          t        d       t%        d|j&                   d|j(                   dd       t+        t-        d            S t        j
                  dk(  rt        d       |j8                  j;                         D ]  \  }}t        d| d|         t        d|j                  j                   dt        |j                  j                         d       t=        d||      S # t.        $ ru}t        j                   j1                          t        d|        t%        dt        |       d       t2        j4                  j7                  d|  d| d       Y d }~d }~ww xY w)Nr   r]   zCDEBUG: form.validate_on_submit() returned TRUE. Proceeding to save.zIDEBUG: On POST, submitted_estatu_value (after explicit str conversion): 'z	' (Type: )Truez5DEBUG: On POST, user.estatu (calculated for saving): z (Type: z<DEBUG: Password data present, password hash will be updated.z&DEBUG: db.session.commit() successful.Usuario  z actualizado exitosamente.rd   r   z'DEBUG: !!! EXCEPTION DURING DB COMMIT: z Error al actualizar el usuario: rN   zError updating user r   Tr   r^   z&DEBUG: Form validation failed. Errors:z	  Field '': z7DEBUG: On POST (validation failed), form.estatu.data: 'zedit_user.html)rg   rp   )r6   rC   r   r&   r
   r   r  r   rk   rQ   rh   r  r   rn   set_passwordr,   r   r   r	   r|   r}   r   r   r   r   r   r   r   errorsitemsr   )rF   rp   rg   submitted_estatu_valuer   
field_namer'  s          rG   	edit_userr+    s    ::  )DD!D~~t{{+;; ST "%T[[%5%5!6YZpYqqz{  AW  |X  {Y  YZ  [  	\ .7Edkk]RZ[_`d`k`k[lZmmnop==dmm001PQkk&&		SJJ:;HT[[M4==/9STV_`GM233 >>V#:;&*kk&7&7&9 ;"
F	*S9:;KDKKL\L\K]]fgklplwlwl|l|g}f~~  A  B+$TBB  	SJJ!;A3?@4SVH=xHJJ3G9BqcBTRR		Ss   /A#I5 5	K3>A+K..K3z/assign_odic                     t               } t        j                  dk(  r3d| j                  _        d| j
                  _        d| j                  _        t        j                  j                  t        j                        j                         }t        j                  t        k(  r<t        j                  j!                  t        j"                        j%                         }nt        j                  j'                  t)        t        j                  t        j                  k(  t        j*                  j-                  g d                  j!                  t        j"                        j%                         }t.        j0                  j3                  dt        j                   dt5        |       d       t6        j                  j!                  t6        j8                        j%                         }g }|rt:        t<        t>        g}t        j                  t<        k(  rt:        t<        g}t@        j                  j-                  |      t@        j                  t        j                  k7  t@        jB                  dk(  g}|jD                  d	k(  r-|jG                  t        jH                  |jH                  k(         n,|jG                  t        jD                  |jD                  k(         tK        jL                  j                  t@              jO                  t        t@        j                  t        j                  k(        j&                  | j!                  t@        jP                  t@        jR                        j%                         }d
g|D cg c]7  }|j                  |jP                   d|jR                   d|jT                   df9 c}z   | j                  _+        tX        j                  j!                  tX        j"                        j%                         }|D 	cg c]  }	|	jZ                  |	j"                  d }
}	| j]                         r| j                  j                  }| j
                  j                  }| j                  j                  }|s t_        dd       ta        tc        d            S te        |      }d}d}d}	 t        jf                  ji                  d      D ch c],  }|jk                         jm                         s"te        |      . }}d}|rtJ        jL                  j                  tJ        jn                  jq                  t        jr                              j'                  t        j*                  j-                  |            ju                         xs d}|dk7  r(t_        d| dd       ta        tc        d|||            S tv        j                  j                  |||      j%                         }|D ci c]  }|j*                  | }}|D ]  }t        jf                  jy                  d|       }|rte        |      dk(  rDt_        d| dd       tJ        jL                  j{                          ta        tc        d            c S te        |      }||v r"||   }|jZ                  |k7  s||_-        |d	z  }tw        |||||      }tJ        jL                  j}                  |       |d	z  } |D ].  }||vstJ        jL                  j                  ||          |d	z  }0 t        jf                  ji                  d      D ch c],  }|jk                         jm                         s"te        |      . }}t        j                  j                  |||      j%                         }|D ci c]  }|j8                  | } }|D ]  }!t        jf                  jy                  d|!       }|s(te        |      dk7  s7te        |      }|!| v r"| |!   }|jZ                  |k7  s[||_-        |d	z  }ht        ||!|||      }"tJ        jL                  j}                  |"       |d	z  } | D ].  }#|#|vstJ        jL                  j                  | |#          |d	z  }0 tJ        jL                  j                          tv        j                  j                  |||      j%                         D cg c]  }|j                   }$}t        j                  j                  |||      j%                         D %cg c]  }%|%j                   }&}%t        j                  j                  |||      j                         }'|'s.t        |||d      }'tJ        jL                  j}                  |'       t        j                  |'_E        |$|'_F        |&|'_G        tJ        jL                  j                          t_        d | d!| d"| d#d$       ta        tc        d|||            S t        d(| |||
)      S c c}w c c}	w c c}w c c}w c c}w c c}w c c}w c c}%w # t        $ ro}tJ        jL                  j{                          t.        j0                  j                  d%| d&       t_        d'| d       ta        tc        d            cY d }~S d }~ww xY w)*Nr]   r   rb   )r  r      User z	 fetched z ODIs (Own + Universals)Tr  )r   --- Selecciona un Evaluado ---r$   (C.I.: r!  )r   r   z"Por favor, selecciona un evaluado.rN   
assign_odir   odi_ids2   u]   Error: El peso total de los ODI debe ser exactamente 50. El total actual de tu selección es .r   r   personal_idr   
odi_rango_u   Rango inválido para ODI )rc   r   r   r   r   competencia_idscompetencia_rango_)rc   r   r   r   r   )rc   r   r   r  u   Asignación completada: z	 nuevas, z actualizadas, z eliminadas.rd   zError in assign_odi: r   u"   Error al procesar la asignación: zassign_odi.html)rg   r   all_competencias
all_rangos)Kr%   r
   r   r   rk   r   r6  r2   rC   ri   r   rc   rl   rQ   r   r:   r   r   r   r   r   r   in_r   r   rt   lenr=   r   r   r   r   r6   r   r  r   id_unidadesr,   r   r   r|   r}   r{   choicesr;   r   rh   r	   r   r   rE   rg   getlistr  isdigitfuncsumr   scalarr<   rD   r   r   r   r>   r   id_odi_personalid_competencia_personalr@   id_evaluadorr   r   r   r   r   )(rg   current_user_locationr   r:  evaluados_for_dropdownallowed_rolesbase_filterr   r;  rall_rangos_serializedr   r   personal_id_strr6  assignments_madeassignments_updatedassignments_deletedxsubmitted_odi_ids
total_pesoexisting_odi_assignmentsaexisting_odi_mapr   rango_id_strrango_iditemnew_aeidsubmitted_comp_idsexisting_comp_assignmentsexisting_comp_mapcidnew_cecidcurrent_odi_idsccurrent_comp_idseval_records(                                           rG   r1  r1  H  s	    ?D~~!# "-33==,JbJb=ciik m+99%%coo6::< 99##<#;#;;

y)

 (3??
#CCE 	 	

% 8 893x=/Qijk"((11+2L2LMQQS  )+=O"44-/ABM KKOOM* 8 88KK4
 !00A50<<@U@a@aab 0@@DYDiDiij!#!1!1$!7!<!<=NPTP`P`du  eB  eB  QB  "C  "J  "J"

(4;;
.ssu 	 !GGh~cd188*Aajj\RSRZRZQ[[\0] ^ @D %%e&7&78<<>J]ghXY!**Q]]Shh  !!((--**//6AGL122/*f	3181E1Ei1P hATUT[T[T]TeTeTgQ h h J ZZ--bggkk#((.CDKKCJJNN[lLmnuuw|{|
Ru  wA  vB  BC  D  FN  OVR^lw xyy'2'8'8'B'B'\ (C (ce % 6NN!NN+ *&||//*VH0EF#s<'8A'=5fXQ?JJJ'')#GL$9::|,--+F3D}}0(0+q0+'KW]lx  DL  MEJJNN5)$)$!*$ ( -//JJ%%&6s&;<'1,'- 3:,,2F2FGX2Y!qQ]^]d]d]f]n]n]p#a&!q!q(;(A(A(K(K'\ )L )ce & ?X X!1!11!4 X X) .&||//2DSE0JKC$5$:"<0H//05==H4,4DM/14/ 3\_hn  ~J  U]  !^

u-(A-(. * -11JJ%%&7&=>'1,'-
 JJ ;F:K:K:U:Ubmv|  LX:U  ;Y  ;]  ;]  ;_  `Qq00  `O  `CVC\C\CfCfs~  HN  ]iCf  Dj  Dn  Dn  Dp   qa 9 9   q   q %**44'\ 5 eg  ( +!!- 	 

{+ (4'?'?K$+:K(3CK0JJ,-=,>iH[G\\kl  lA  AM  N  PY  ZGLlhwxyy ,4(]m  {P  Q  Qy  @ i& !i  O4 "r !Y2 `  q4  	3JJ!JJ4QC84H6qc:HEGL122		3s   ?<h h$7!i #h)<h)	B:i 4i 8h.A<i 	#i -Ai :A
i #h3(h356i +h8?+i +i :#i Ai +A9i $h=74i +i>Ci )i 	j?A$j:4j?:j?z/get_assigned_odisc            	         t         j                  j                  dt              } t         j                  j                  dt              }t         j                  j                  dt              }t	        | ||g      st        ddi      dfS 	 t        j                  j                  | ||      j                  t        j                  t        j                        t        j                  t        j                              j	                         }g }|D ]i  }|j                  |j                  |j                  j                   |j                  j"                  |j$                  |j                  j                   d	       k t        |      S # t&        $ r1}t)        j*                  d
|        t        ddi      dfcY d }~S d }~ww xY w)Nr6  r   r   r   r   u)   Parámetros incompletos para buscar ODIs.r   r   )r   odi_descripcionr   rY  r   zError fetching assigned ODIs: z'Error interno al cargar ODIs asignados.r  )r
   rR   rD   rE   r   r   r<   rC   ri   optionsr,   
joinedloadr   r   r   r   r   r   r   r   loggingr   )r6  r   r   r   resultsassignr   s          rG   get_assigned_odisrn    s|    ,,""=s";K\\hS1F<<##N#=LV\23!LMNPSSSR#))33#% 4 
 'MM+//*MM+++,
 #% 	 # 	FNN --#)::#9#9"JJOO"OO%+\\%=%= 	 w R6qc:;!JKLcQQRs   C<F 	G&G :G Gz/get_assigned_competenciasc            	         t         j                  j                  dt              } t         j                  j                  dt              }t         j                  j                  dt              }t	        | ||g      st        ddi      dfS 	 t        j                  j                  | ||      j                  t        j                  t        j                        t        j                  t        j                              j                  t        j                        j	                         }g }|D ]i  }|j!                  |j                  |j                  j"                  |j                  j$                  |j&                  |j                  j"                  d	       k t        |      S # t(        $ r1}t+        j,                  d
|        t        ddi      dfcY d }~S d }~ww xY w)Nr6  r   r   r   r   u1   Parámetros incompletos para buscar competencias.r   r   )competencia_idcompetencia_descripcionr   rY  r   z&Error fetching assigned competencias: z/Error interno al cargar competencias asignadas.r  )r
   rR   rD   rE   r   r   r>   rC   ri   ri  r,   rj  r   r   r   r   r   r   r   r   r   rk  r   )r6  r   r   r   rl  rm  r   s          rG   get_assigned_competenciasrr  $  s    ,,""=s";K\\hS1F<<##N#=LV\23!TUVX[[[Z 3 9 9 C C#% !D !
 'MM-99:MM-334
 (&55
6ssu 	 + 	FNN"("7"7+1+=+=+I+I$*$6$6$;$;"OO%+\\%=%= 	 w Z>qcBC!RSTVYYYZs   DF( (	G"1&GG"G"c                     t        d|  d       t        | t              st        d       yd| v xr6 | j                  dd      d   j	                         t
        j                  d   v }t        d|  d	|        |S )
Nz#DEBUG: Checking allowed_file for: ''z%DEBUG: Filename is not a string type.Fr4  r  ALLOWED_EXTENSIONSzDEBUG: Is 'z' allowed? )r  
isinstancer  rsplitlowerr   config)r  
is_alloweds     rG   allowed_filer{  I  s    	/z
;<h$56 `a(+113{7I7IJ^7__ 	KzZL
9:rI   z/assign_cursosc                  J   t               } t        j                  j                  t        j                  j                               j                         }dg|D cg c]  }|j                  |j                  f c}z   | j                  _        t        j                  j                  t        j                        j                         }dg|D cg c]  }|j                  |j                  f c}z   | j                  _        t        j                  j                  t        j                        j                         }g }|s?t!        dd       t"        j$                  j'                  dt        j                   d       nt(        t*        t,        g}t        j.                  t*        k(  rt(        t*        g}t0        j.                  j3                  |      t0        j                  t        j                  k7  t0        j4                  dk(  g}|j6                  d	k(  r-|j9                  t        j:                  |j:                  k(         n,|j9                  t        j6                  |j6                  k(         t=        j>                  j                  t0              jA                  t        t0        j                  t        j                  k(        jB                  | j                  t0        jD                  t0        jF                        j                         }	|	}d
g|D 
cg c]7  }
|
j                  |
jD                   d|
jF                   d|
jH                   df9 c}
z   | jJ                  _        | jM                         rE| j                  jN                  }| j                  jN                  }| jJ                  jN                  }|dk(  s
|dk(  s|dk(  r t!        dd       tQ        tS        d            S tT        j                  j                  |||      j                         }|D ci c]  }|jV                  | }}tY               }tZ        j\                  D ]d  }|j_                  d      s	 |ja                  d      }tc        |      dk(  r0|d   je                         r|jg                  ti        |d                f d}tm        |jo                               D ]<  \  }}||vs	 d }|jp                  rXtr        jt                  jA                  tv        jx                  d   tr        jt                  j{                  |jp                              }|rWtr        jt                  j}                  |      r8ts        j~                  |       t"        j$                  j                  d|        n|jp                  r	 t<        j>                  j                  |       t!        d|j                   dd       t"        j$                  j                  d| d| d       |d	z  }? d}d}tZ        j\                  j                         D ]  }|j_                  d      s	 |j                  dd%      }tZ        j\                  j                  |      }d&| }tZ        j                  j                  |      }d }|r}|j                  d%k7  rmt        |j                        rtr        jt                  j                  t        |j                              \  } }!t        j                         j                  d'      }"|  d|" |! }#tr        jt                  jA                  tv        jx                  d   |#      }$	 |j                  |$       tr        jt                  jA                  tv        j                  d(      }%tr        jt                  j                  |$|%      j                  tr        j                  d)      }nFt"        j$                  j'                  d,|j                          t!        d-|j                   d.d        |je                         rAti        |      }'|'|v r||'   }(d/})|(j                  |k7  r	||(_        d})|r|(jp                  rtr        jt                  jA                  tv        j                  d(|(jp                        }*tr        jt                  j}                  |*      r8	 ts        j~                  |*       t"        j$                  j                  d0|*        ||(_8        d})|)rt<        j>                  jg                  |(       |d	z  }t!        d| d2d       nt"        j$                  j'                  d3|' d4       t!        d5|' d6d        @|st!        d7d        P|st!        d8| d9d        tU        |||||:      }+t<        j>                  jg                  |+       t!        d;| d<d=       t"        j$                  j                  d>| d| d       |d	z  } 	 t<        j>                  j                          t        |||g      rlg },|dkD  r|,j9                  | dC       |dkD  r|,j9                  | dD       |dkD  r|,j9                  | dE       t!        dFdjA                  |,      z   d=       nt!        dGd       tQ        tS        d|||M            S tZ        j                  j                  dNdth        O      }tZ        j                  j                  dPdth        O      }tZ        j                  j                  dQdth        O      }|| j                  _'        || j                  _'        || jJ                  _'        t        dR| S      S c c}w c c}w c c}
w c c}w # tj        $ r Y Bw xY w# t        $ rL}t!        d|j                   d| d        t"        j$                  j                  d!| d"|        Y d }~d }~wt        $ rL}t!        d#|j                   d| d       t"        j$                  j                  d$| d"|        Y d }~gd }~ww xY w# t        $ rN}&t"        j$                  j                  d*| d"|&        t!        d+|j                   d|& d       d }Y d }&~&qd }&~&ww xY w# t        $ r0}t"        j$                  j                  d1|* d"|        Y d }~d }~ww xY w# t        $ r[}t!        d?xs  d@| d       t"        j$                  j                  dA|xs  dBt        j                   d"|        Y d }~d }~ww xY w# t        $ rn}t<        j>                  j                          t!        dH| d       t"        j$                  j                  dI| dJt        j                   d"|        Y d }~d }~wt        $ rn}t<        j>                  j                          t!        dK| d       t"        j$                  j                  dL| dJt        j                   d"|        Y d }~}d }~ww xY w)TN)r   u   --- Selecciona un Año ---)r   z--- Selecciona un Trimestre ---rb   u   Error: No se encontró su información de ubicación. No se pueden cargar los evaluados. Por favor, contacte a un administrador.rN   r.  z@ has no location info. No evaluados will be loaded for dropdown.Tr  )r   r/  r$  r0  r!  r   u:   Por favor, selecciona Año, Trimestre y Evaluado válidos.assign_cursosr   curso_desc_r  r-  r   UPLOAD_FOLDERzDeleted file: zCurso 'z' eliminado.rt   zDeleted CursoPersonal ID z for Personal ID r4  z&Error al eliminar archivo para curso 'r%  rM   z)Error deleting file for CursoPersonal ID r   zError al eliminar curso 'z Error deleting CursoPersonal ID r   curso_file_z%Y%m%d%H%M%SstaticrZ   zError saving file for course zError al guardar el archivo 'z*Attempted upload of disallowed file type: z#Tipo de archivo no permitido para "z". Solo se permiten PDFs.FzRemoved old file: zError removing old file z' actualizado.zSubmitted existing course ID z3 not found in existing DB records. Skipping update.zError: Curso existente con ID z# no encontrado en la base de datos.u8   Error: La descripción es requerida para un nuevo curso.zDAdvertencia: Se recomienda adjuntar un archivo para el nuevo curso 'z'.)r   path_to_filerc   r   r   zNuevo curso 'u   ' añadido.rd   zAdded new CursoPersonal: zError al procesar curso "z": zError processing course 'z' for user u    cursos nuevos añadidos.z cursos actualizados.z cursos eliminados.u#   ¡Operación de cursos completada! zENo se realizaron cambios en los cursos para el evaluado seleccionado.z)Error de integridad de la base de datos: z'Integrity error saving cursos for user z by supervisor z%Error general al guardar los cursos: z%General error saving cursos for user r5  r   r   r   r6  zassign_cursos.html)rg   )Zr)   r8   rC   r   r   r   r   r   r?  r9   r   r2   ri   r   rc   rl   r	   r   r   rM   r   r   r   rQ   r6   r<  r   r  r   r>  r,   r   r   r   r|   r}   r{   r6  rh   rk   r   r   rA   id_cursosetr
   rg   
startswithsplitr=  rA  r   rE   r   listr(  r  ospathr   ry  basenameexistsremovert   r   OSErrorr   r   keysreplacerD   filesr  r{  splitextr   r   nowstrftimesave	root_pathrelpathsepr   anyr   r   rR   r   )-rg   anosr  r   r  rH  rI  rJ  rK  evaluados_queryevaluador   r   r6  existing_cursosrd  existing_curso_idspresent_curso_ids_on_submitkeypartscursos_deleted_countexisting_id	curso_objfile_to_delete_pathr   cursos_added_countcursos_updated_countcourse_identifierr   file_keyuploaded_filepath_to_store_in_dbfilename_baseext	timestampnew_filenameabsolute_save_pathstatic_folder_absolutesave_ecurso_idcurso_to_updatehas_updatesold_absolute_path	new_cursomessage_partss-                                                rG   r}  r}  T  s$    D 99coo224599;D<=DHISCJJ8IJDKK )))*@*@AEEGJ!G Hbl mU^)"8"8):O:O!P m!nD .33==,JbJb=ciik   Q  S[  	\

U<#;#;"<<|}~)+=O"44-/ABM KKOOM* 8 88KK4
 !00A50<<@U@a@aab 0@@DYDiDiij****40556GIYIY]n]z]zIz{  C  C

(4;;
.ssu 	 "1 EF Lb   c  @H!5!5(//9J!HL]L]K^^fgogvgvfwwx7y z   c cD  !!((--&&++Q;,!+{a/?NPXYGO455 (--77#% 8 
 #%	 	
 6EEajj!mEE&)e#<< 	C~~m,IIcNE5zQ58+;+;+=377E!HF	  !&*+=+C+C+E&F 	\"K"==\*.' --.0ggll;;M;Mo;^`b`g`g`p`pqz  rH  rH  aI  /J+*rww~~>Q/R		"56

.9L8M(NO"//JJ%%i0GI$9$9#:,GPJJOO&?}L]^i]jjk$lm(A-(!	\0  <<$$& [	OC~~m,YO(+M2(F%"),,"2"23"7K!,->,?@H$+MM$5$5h$?M*.'$)?)?2)E'(>(>?131A1A/R_RhRhBi1j.M3(0(?(?(OI.;_Ai[+NL13k>P>PQ`>aco1p.	; - 2 23E F9;kF[F[]e9f 668ggooFXZp6q6y6yz|  {A  {A  CF  7G 3  JJ..1[\i\r\r[s/tu!$GH^H^G__x"y  |E  F(002#&'8#9#'99.@.JO*/K  /::kI>I ;.2  3#2#?#?8:[EZEZ\dfu  gC  gC  9D$5')ww~~6G'H)r,.II6G,H,/JJOO>PQbPc<d,e @S <.2* "

 ? 4 9 4 %}N&KV T  JJ..1Nxj  YL  0M  N!$B8*Lo"pr{|$  +!$\_hi$2!$hithuuw"x  {D  E$1(3)<(3#))5%	 

y1k]+F	R

*CK=Pabmanno(pq*a/*o[	O~	BJJ&(<>RST "%)=+?+?CUBVVo@p+q'!+]-A-AEYDZZoBp-q'!+]-A-AEYDZZmBn-o;chh}>UUW`a]_ef '--9,79 : 	:
 \\h4F<<##NAC#@L,,""=!#">KDKK)D'D/d;;A J !nD  c" F " ,  eB9CXCXBYY\]^\_`bklJJ$$'PQ\P]]_`a_b%cdd  \5i6K6K5LCPQsSU]^JJ$$'G}TVWXVY%Z[[\8 $- ; #

 0 03PQbPcceflem1n o %(EmF\F\E]]`ag`h&iks t6: 3;< 07 )r,/JJ,<,<?WXiWjjlmnlo=p,q,q)rJ ! O5k6VEV5WWZ[\Z]^`hiJJ$$'@AaPa@bbmnz  oG  oG  nH  HJ  KL  JM  &N  O  OO$  	DJJ!=aSA8LJJF{mSbcoc{c{b||~  @A  B  C  D  D 	BJJ!9!=xHJJD[MQ`amayay`zz|}~|  A  B  B	Bs   m*m/<m4m9Am>D0nDsA=p9C,s 7r7A3s,s<A<s<B$t6 >	n
n	p6Aop6*Ap11p69	rArsrs	s%ssss	t3At..t36	x"?A#v((x"4A#xx"z/get_personal_cursosc                  P   t        j                         } | j                  d      }| j                  d      }| j                  d      }t        d| d| d|        t	        |||g      st        d       t        dd	i      d
fS 	 t        j                  j                  |||      j	                         }t        dt        |       d       g }|D ]P  }d }|j                  rt        d|j                        }|j                  |j                  |j                  |d       R t        dt        |       d       t        d|i      S # t        $ rS}t         j"                  j%                  d|        t        d|        t        dt'        |      d      dfcY d }~S d }~ww xY w)Nr6  r   r   z:DEBUG: AJAX call to /get_personal_cursos for Personal ID: z, Ano: z, Trimestre: z3DEBUG: Missing parameters for /get_personal_cursos.r   zMissing parametersr   r   zDEBUG: Found z  courses in DB for AJAX request.r  )r  )r  r   r  zDEBUG: Prepared z courses for JSON response.cursosz!Error fetching personal courses: z&DEBUG: Error in /get_personal_cursos: zError fetching data)r   detailsr  )r
   r  rD   r  r   r   rA   rC   ri   r=  r  r   r   r  r   r   r   r   r   r  )	rk   r6  r   r   r  cursos_datacursofile_urlr   s	            rG   get_personal_cursosr  @  s    D((=)KXXhF88N+L	F{mSZ[aZbbop|o}
~V\23CD!567<<Q$$..#% / 
 #%	 	
 	c&k]*JKL 		EH!!"8e6H6HI!NN$00 (  		 	 [!1 22MNO+.// Q

<QC@A6qc:;!63q6JKSPPQs    CE	 		F%AF F% F%z/get_unidades/<int:div_id>c                 $   | dk(  rt        g       S t        j                  j                  | d      j	                  t        j
                        j                         }t        |D cg c]  }|j
                  |j                  d c}      S c c}w )zJReturns Unidades (Gerencias Generales) for a given DivisionesGenerales id.r   Tid_divisiones_generalesvalidor   )r   r/   rC   ri   r   r>  r   r|   )div_idrl  rL  s      rG   get_unidadesr  j  so     {r{nn&&vd&S\\]e]q]qrvvxGGTq1==BTUUT   & Bz(/get_gerencias_generales/<int:unidad_id>c                 $   | dk(  rt        g       S t        j                  j                  | d      j	                  t        j
                        j                         }t        |D cg c]  }|j
                  |j                  d c}      S c c}w )uI   Returns GerenciasGenerales (Gerencias de Línea) for a given Unidades id.r   Tr>  r  r   )r   r0   rC   ri   r   id_gerencias_generalesr   r|   )	unidad_idrl  rL  s      rG   get_gerencias_generalesr  t  s     A~r{ &&00Yt0T]]^p  _H  _H  I  M  M  OGW^_RS133AHHM_``_r  z%/get_coordinaciones/<int:gerencia_id>c                 $   | dk(  rt        g       S t        j                  j                  | d      j	                  t        j
                        j                         }t        |D cg c]  }|j
                  |j                  d c}      S c c}w )z9Returns Coordinaciones for a given GerenciasGenerales id.r   Tr  r  r   )r   r1   rC   ri   r   id_coordinacionesr   r|   )gerencia_idrl  rL  s      rG   get_coordinacionesr  ~  s     ar{"",,KX\,]ffgu  hH  hH  I  M  M  OGRYZQ1..qxxHZ[[Zr  z/gerente_pagec                  f   t               } t               }t        dft        dft        dfg|j
                  _        d }t        j                  dk(  r]t        j                  j                  d      rt        j                  j                  dt              }	 t        t        j                  j                  dd            }t        t        j                  j                  d	d            }t        t        j                  j                  d
d            }t        t        j                  j                  dd            }|dk7  rp|j                  xj                  t        j                  j                  |d      j!                         D cg c]  }|j                  |j"                  f c}z  c_        |dk7  rp|j$                  xj                  t&        j                  j                  |d      j!                         D 	cg c]  }	|	j$                  |	j"                  f c}	z  c_        |dk7  rp|j(                  xj                  t*        j                  j                  |d      j!                         D 
cg c]  }
|
j(                  |
j"                  f c}
z  c_        |j/                         rt0        j                  j                  |      }|r	 |j
                  j2                  |_        |j4                  j2                  xs d }|j6                  j2                  }|j                  j2                  }|j$                  j2                  }|j(                  j2                  }|dk7  r	d x}x}x}}n,|r|dk7  r|nd }|r|dk7  r|nd }|r|dk7  r|nd }|r|dk7  r|nd }t8        j                  j                  |      j;                         }|r$||_        ||_        ||_        ||_        ||_        n0t9        ||||||      }t<        j>                  jA                  |       t<        j>                  jC                          tE        dd       tG        tI        d            S dt        j                  v rt        j                  j                  dt              }t8        j                  j                  |      }|rJ	 t<        j>                  jM                  |       t<        j>                  jC                          tE        dd       tG        tI        d            S | jO                         rt0        j                  j                  tQ        | jR                  j2                              j;                         }|r8|}|j
                  |j
                  _        tE        d|j"                   dd       ntE        dd       t8        j                  jU                  t=        jV                  t8        jX                              j!                         }t[        d | |||d!"      S c c}w c c}	w c c}
w # t,        $ r Y w xY w# t,        $ r7}t<        j>                  jK                          tE        d| d       Y d }~d }~ww xY w# t,        $ r8}t<        j>                  jK                          tE        d| d       Y d }~d }~ww xY w)#NEvaluado
SupervisorGerenter^   user_id_to_assignr   r  r   r>  r  r  Tr  r  r  r  rb   )rc   r  r  r>  r  r  u4   Configuración de usuario actualizada correctamente.rd   gerente_pagezError al guardar: rN   	remove_idu.   Ubicación de usuario eliminada correctamente.u   Error al eliminar ubicación: )r{   r#  z encontrado.rt   zUsuario no encontrado.zgerente_page.htmlu   Gestión de Ubicaciones)search_formassign_form
found_usercurrent_locationsrf   ).r'   r(   r   r   r   rQ   r?  r
   r   rg   rD   rE   r>  r/   rC   ri   r   r|   r  r0   r  r1   r   validater6   rk   r  r  r2   rl   r,   r   r   r   r	   r   r   r   r   rh   r  r{   ri  rj  user_details_in_ubicacionr   )r  r  r  rF   r  uni_idger_idcoord_idugrd  user_to_updateloc_valdiv_valuni_valger_val	coord_valexisting_locnew_locr   r  loc_to_removerp   r  s                           rG   r  r    s    )*K$&K 
:&	\*	)$"K J~~<</0ll&&':&EGgll../H!LMgll..}a@Agll../GKLw||//0CQGHQ;++33!)!9!9RXae!9!f!j!j!l8 18 3 Q;66>>!3!9!9!C!CPV_c!C!d!h!h!jC 11188<C > q=1199!/!5!5!?!?W]fj!?!k!o!o!q> ,,ahh7> 9 ##%!%!8!+B0;0B0B0G0G-#.#>#>#C#C#Kt#.#F#F#K#K#.#:#:#?#?#.#E#E#J#J$/$A$A$F$F	 #a<FJJGJgJ)3:AwSWG3:AwSWG3:AwSWG5>9PQ>	W[I (9'>'>'H'HU\'H']'c'c'e'DKL8DKL@DKL4DKL?DML:&7,3078?,37>2;'G JJNN73

))+TV_`'(?@@ GLL(((3(?I-3377	BMJJJ%%m4JJ%%'JIV GN344 ++-::''s;3E3E3J3J/K'LRRTD!
*.++""'\:FC.9)//77
'AAB	ce  .'2'2&0->!:< <{8
C
>  ^ % B

++- 21#6AAB ! JJJ''):1#>IIJsq   C0X X&AX <XAX 1X
X FX, 0A	Y/ X 	X)(X),	Y,5-Y''Y,/	Z08-Z++Z0z/talento_humanoc                     t         j                  dk(  r/t               } | j                  t         j                         | j                         rt         j                  j                  d      }| j                  j                  }|rb|r`t        j                  j                  |      }|r2||_        t        j                  j                          t        dd       nUt        dd       nHt        dd       n;| j                  j!                         D ]  \  }}|D ]  }t        d	| d
| d          t#        t%        d            S t        j                  j                  t        t&        j(                  t*        j,                  t.        j,                        j1                  t&        t        j2                  t&        j2                  k(        j1                  t*        t        j4                  t*        j4                  k(        j1                  t.        t        j6                  t.        j6                  k(        j9                  t        j:                  dk(        j=                         }g }|D ]1  \  }}	}
}g }d}|j>                  rt@        j                  j9                  t@        jB                  jE                  |j>                              j=                         }|D ]  }	 tG        |jH                  j,                        }|jN                  jP                  |z  }|jS                  |jN                  j,                  |jN                  jP                  ||jH                  j,                  d       ||z  } g }d}|jT                  rtV        j                  j9                  tV        jX                  jE                  |jT                              j=                         }|D ]  }	 tG        |jH                  j,                        }|jZ                  jP                  |z  }|jS                  |jZ                  j,                  |jZ                  jP                  ||jH                  j,                  d       ||z  } ||z   }|}t\        j                  j_                  |j2                  |j4                  |j6                        ja                         d u}d}|dkD  r|stb        j                  j9                  tb        jd                  dk(        jg                  tb        jh                  jk                               ja                         }|r&||jh                  kD  rtG        |jh                        }d}|jS                  ||	|
|||tm        tG        |      d      tm        tG        |      d      ||d
       4 |D ci c])  }|d   jn                  t        |d   j                        + }}tq        d|d|      S # tJ        tL        f$ r d}Y w xY w# tJ        tL        f$ r d}Y w xY wc c}w )Nr^   )formdataevaluacion_idu5   Observación de Talento Humano guardada exitosamente.rd   u   Evaluación no encontrada.r   u/   Datos incompletos para guardar la observación.zError en el campo 'r%  talento_humanoFr   )r   r   scorer   r   r   Tr   )

evaluacionpersonal_nameano_nametrimestre_nameodi_detailscomp_detailstotal_scorefinal_scorer   	is_cappedr  )observacion_thztalento_humano_page.htmlu   Página de Talento Humano)disapproved_evaluacionesrf   forms)9r
   r   r*   processrg   rh   rD   r  rk   r@   rC   r,   r   r   r	   r'  r(  r   r   r6   r|   r8   r   r9   r   rc   r   r   r   r   r   r   r<   rE  r<  r   r   r   AttributeErrorr   r   r   r   r>   rF  r   rA   ri   rl   r?   r   r   r   r   r   id_evaluacionr   )rg   r  r   r  fieldr'  r   disapproved_evaluaciones_rawr  r  r  r  r  r   odi_personal_assignmentsr   r   r  r  total_comp_scorecomp_personal_assignmentsr   r   r   r  r   	eval_dictr  s                               rG   r  r    s    ~~+-gll+""$#LL,,_=M--22K'--11-@
0;J-JJ%%'QS\]6@GQ!%!2!2!4 Lv# LE/wc%A7KLL  0122 $&::#3#3	$
 d4''4+;+;;<	T#z  CJJ./	T)Z,,	0F0FFGVJ!!U*+CCE !  "?[ G;
M8^&&'2'8'8'?'?@[@[@_@_`j`{`{@|'}  (B  (B  (D$6 )
&"'
(8(8(D(D"EK #++k9""#->>#=#=&NN//")3)9)9)E)E	$   5() ..(;(A(A(H(HI\ItItIxIx  zD  z]  z]  J^  )_  )c  )c  )e%7 *
&"'
(8(8(D(D"EK #..33kA###-#9#9#E#E&2277")3)9)9)E)E	%  !E) * "13C!C!7 #((22"..$$#00 3 
 %'	
 	!A%j"(,,"5"5%%.#hv}}))+,UUW   #'=@S@Z@Z'Z)./B/I/I)J& 	 ''$* ,&( '=!>B '=!>B$")
 	yGR Zr  s  MVY|$224P`ijv`w  aG  aG  5H  H  sE  s"!9)	 E #N3 &"%K&& #N3 &"%K&Z ss*   WW/.XW,+W,/XXz/change_passwordc                     t               } t        }| j                         rd	 |j                  | j                  j
                         t        j                  j                          t        dd       t        t        d            S t        dd|| 	      S # t        $ r7}t        j                  j                          t        d| d       Y d}~Jd}~ww xY w)
zK
    Allows the currently logged-in user to change their own password.
    ue   ¡Contraseña actualizada exitosamente! Usa tu nueva contraseña la próxima vez que inicies sesión.rd   rO   u$   Error al actualizar la contraseña: rN   Nzchange_password.htmlu   Cambiar Contraseña)rf   rp   rg   )r+   r   rh   r&  rn   rk   r,   r   r   r	   r   r   r   r   r   )rg   user_to_editr   s      rG   change_passwordr    s     DL 		H%%dmm&8&89JJy  |E  FGK011 1!6 , $& &  	HJJ!8<hGG	Hs   A"B 	C-CC__main__FLASK_DEBUGr"  )debug)vr  rk  pdf_generatorr   r   flaskr   r   r   r   r	   r
   r   r   r   r   flask_loginr   r   r   r   r   r   	flask_wtfr   werkzeug.utilsr   dotenvr   	functoolsr   
sqlalchemyr   sqlalchemy.excr   ry  r   r   r   r   r    r!   r"   r  r#   r$   r%   r&   r'   r(   r)   r*   r+   
extensionsr,   modelsr-   r.   r/   r0   r1   r2   __name__r   from_objectenvironrD   r   init_applogin_manager
login_viewbasicConfigINFOr   setLevelr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   user_loaderrH   rY   router\   r4   ru   rO   r   r   r   r   r   r   r   r	  r  r+  r1  rn  rr  r{  r}  r  r  r  r  r  r  r  runrX   rI   rG   <module>r"     s   	  1  s s s f f  *    ) J  J  J r  r  r  u u  Ho 

  v  ::>>,7

< 
zz,
U
VV C S!"    ',, ' 

  GLL ! s  s  s  s  s  s ( (. 3* * 8eV_-M .M. 9%  %
 <D  D >D    D2 >E6?30BDTUV< W  4<~ #eV_=Y >Y, %x813CDE, F  9,& 0BDTUVR W  Rwt eV_50BDTVfgh/ i  6/f &90BDTVfgh0d i  :0df :;0BDTVfgh  i  < F +eV_E,C    F,C\ =5&/20BDTUVoQ W  3oQf %10BDTUVR W  2RF '%9123Z 4  :ZD eV_513CDEf< F  6f<R !F84$Q  5$QP '%9V  :V 5wGa  Ha 2UGD\  E\ ?UFO40@AB{< C  5{<| ufo6567v 8  7vp v7&  8&4 zGG"**../69G: rI   