
    &6jy%                        S r SSKJr  SSKJrJrJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJrJr  SrSS	 jr " S
 S5      rg)u_  
KPI: avance de documentación transversal (document_type_id = 1 en catálogo `documents`).

Por estudiante: cuenta documentos cargados vs faltantes en carpeta / tablas asociadas
(misma lógica que FolderClass.check_document_existence para ese tipo).
Agregado por curso: suma de cargados y faltantes de todos los estudiantes del curso en el período.
    )annotations)AnyDictListOptional)Session)StudentClass)FolderClass)CourseModelSchoolModel   c                   U R                  S5      =(       d    0 nUR                  S5      =(       d    SR                  5       UR                  S5      =(       d    SR                  5       UR                  S5      =(       d    SR                  5       /nSR                  S U 5       5      R                  5       nU=(       d    SU R                  S	5       3$ )
Npersonal_datanames father_lastnamemother_lastname c              3  6   #    U  H  o(       d  M  Uv   M     g 7fN ).0ps     fC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\kpi_documentation_progress_class.py	<genexpr>!_student_label.<locals>.<genexpr>   s     *u!AAus   
	zEstudiante #id)getstripjoin)rowpdpartsnames       r   _student_labelr%      s    		!	'RB		B%%'	!	"	(b//1	!	"	(b//1E
 88*u**002D1\#''$-11    c                  z    \ rS rSrS	S jr      S
S jr      SS jr      SS jr        SS jrSr	g)KpiDocumentationProgressClass!   c                    Xl         g r   db)selfr,   s     r   __init__&KpiDocumentationProgressClass.__init__"   s    r&   c                0   [        U R                  5      nUR                  SS[        U5      [        U5      S9n[	        U[
        5      (       a  UR                  S5      S:X  a  / $ [	        U[        5      (       d  / $ / nU H  n[	        U[
        5      (       a  UR                  S5      c  M,  UR                  S5      =(       d    0 nUR                  S5      nUc  M\   [        U5      S::  a  Mn   UR                  U5        M     U$ ! [         a     M  f = f)	Nr   i  )pageitems_per_page	course_idperiod_yearstatuserrorr   academic_infospecial_educational_need_id)
r	   r,   get_allint
isinstancedictr   list	Exceptionappend)	r-   r3   r4   strawoutxacademicnee_ids	            r   _students_for_course2KpiDocumentationProgressClass._students_for_course%   s    $''"jj)nK(	  
 c4  SWWX%6'%AI#t$$I$&Aa&&!%%+*=uu_-3H\\"?@F~v;!# $ JJqM  
  s   D
DDc               \    [        U5      nU R                  R                  [        5      R	                  [        R
                  [        U5      :H  [        R                  S:H  5      R                  [        R                  R                  5       5      R                  5       n[        U R                  5      n/ nU GHE  n[        UR                  5      nU R                  X5      n	[        U	5      n
SnSnU	 H  n[        US   5      nUR                  U[         U5      n[#        U[$        5      (       a  UR'                  S5      S:X  a  MT  U[        UR'                  S5      =(       d    S5      -  nU[        UR'                  S5      =(       d    S5      -  nM     X-   nUS:  a  [)        SU-  U-  S5      OS	nUR                  =(       d    S
R+                  5       =(       d    SU 3nUR-                  UUU
UUUUS.5        GMH     SUS.$ ! [.         a  nS[1        U5      / S.s SnA$ SnAff = f)zXUna fila por curso del colegio: totales de docs cargados / faltantes (tipo transversal).r   r   r5   r6   totaltotal_missing      Y@r           r   Curso #)r3   course_namestudent_countloadedmissingexpected_totalrate_percentsuccessr5   datar5   messagerV   N)r:   r,   queryr   filter	school_iddeleted_status_idorder_byrN   ascallr
   r   rF   lencheck_document_existenceDOCUMENT_SECTION_TRANSVERSALr;   r<   r   roundr   r?   r>   str)r-   r[   r4   pycoursesfolderrB   ccidstudents
n_studentstotal_loadedrJ   r!   sidrexpected_slotsratecnamees                       r   	by_course'KpiDocumentationProgressClass.by_courseD   s   0	F[!Bk*--Y?A^A^bcAcd+115578	  !)F(*C!$$i44S= ]
  !#Cc$i.C7792A "!T**quuX'/I  Cg(;!$<<L!S)?)D1%EEM $ ".!= &) %,.?C 
 ,"335H73%

%(',)3".#0*8(,
/ F (55 	F%#a&"EE	Fs   HH 
H+H& H+&H+c                   [        U5      n[        U Vs1 s H#  oDc  M  [        U5      S:  d  M  [        U5      iM%     sn5      n/ nU GH[  nU R                  R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a/  UR                  =(       d    SR                  5       =(       d    SU 3OSU 3n	U R                  XsS9n
U
R                  S5      S:X  a  U
R                  S5      =(       d    / O/ nU(       d  UR                  UU	SSSSS	S
.5        M  [        S U 5       5      n[        S U 5       5      n[        S U 5       5      nX-   nUS:  a  [        SU-  U-  S5      OS	nUR                  UU	UUUUUS
.5        GM^     UR                  S S9  SUS.$ s  snf ! [          a  nS[#        U5      / S.s SnA$ SnAff = f)ue   Una fila por establecimiento: suma de todos los cursos (documentación transversal, alumnos con NEE).Nr   r   z	Colegio #)r[   r4   r5   rT   rV   rL   )r[   school_namerO   rP   rQ   rR   rS   c              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)rO   r   Nr:   r   r   rn   s     r   r   :KpiDocumentationProgressClass.by_school.<locals>.<genexpr>   s&     "RT3quu_'='B#C#CT   02c              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)rP   r   Nrx   ry   s     r   r   rz      s%      IDqQUU8_%9!:!:Dr{   c              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)rQ   r   Nrx   ry   s     r   r   rz      s&     !Kd#aeeI&6&;!"<"<dr{   rK   r   c                R    U R                  S5      =(       d    SR                  5       $ )Nrv   r   )r   lowerrC   s    r   <lambda>9KpiDocumentationProgressClass.by_school.<locals>.<lambda>   s    AEE-$8$>B#E#E#Gr&   keyrU   r6   rW   )r:   sortedr,   rY   r   rZ   r   firstrv   r   rs   r   r?   sumrc   sortr>   rd   )r-   
school_idsr4   re   sidsrB   rm   schsnameresrowstot_students
tot_loadedtot_missingexpectedrp   rr   s                     r   	by_school'KpiDocumentationProgressClass.by_school}   s   5	F[!B*U*Q&#a&ST*&#a&*UVC(*CGGMM+.VKNNc12UW   __*113H3%7H$SE* 
 nnsnC030AY0Nswwv,"TVJJ),+0-.&''(./,/
 ""RT"RR  ID II
!!Kd!KK%3?G!|E%*,x7;QT  

%(',)5",#.*2(,
C Z HHGHH'55c Vd  	F%#a&"EE	Fs9   G G G G  E?G  G 
G(G#G(#G(c          
     (    [        U5      n[        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  [        R                  [        U5      :H  [        R                  S:H  5      R                  5       nU(       d  SSSS.$ U R                  XE5      n[        U R                  5      n/ n	U H  n
[        U
S   5      nUR                  U[        U5      n[        U[        5      (       a  UR                  S5      S:X  a  MT  [        UR                  S5      =(       d    S5      n[        UR                  S	5      =(       d    S5      nX-   nUS:  a  [!        S
U-  U-  S5      OSnU	R#                  U[%        U
5      UUUUS.5        M     U	R'                  S S9  UR(                  =(       d    SR+                  5       =(       d    SU 3nSUUU	S.S.$ ! [,         a  nS[/        U5      SS.s SnA$ SnAff = f)zADetalle por estudiante del curso (torta: cargados vs pendientes).r   r6   zCurso no encontradoNrW   r   r5   rI   rJ   rK   r   rL   )
student_idstudent_namerP   rQ   r   rS   c                :    U S   =(       d    SR                  5       $ )Nr   r   )r   r   s    r   r   ?KpiDocumentationProgressClass.students_detail.<locals>.<lambda>   s    Q~%6%<"$C$C$Er&   r   r   rM   rT   )r3   rN   rj   rU   )r:   r,   rY   r   rZ   r   r[   r\   r   rF   r
   ra   rb   r;   r<   r   rc   r?   r%   r   rN   r   r>   rd   )r-   r[   r3   r4   ri   re   rh   rj   rg   r   r!   rm   rn   rP   rQ   r   pctrq   rr   s                      r   students_detail-KpiDocumentationProgressClass.students_detail   s   9	Hi.C[!Bk*NNc)))S^;11Q6
   %4   009H )F)+D#d)n335r a&&155?g+EQUU7^0q1aeeO49:!+=E\eEFNX5q9s&)(6s(;"(#*$,(+	  , IIEIF]](b//1Dwse_E#!$#( $   	H%#a&$GG	Hs%   BG. EG. .
H8HHHr+   N)r,   r   )r3   r:   r4   r:   returnzList[Dict[str, Any]])r[   r:   r4   r:   r   Dict[str, Any])r   z	List[int]r4   r:   r   r   )r[   r:   r3   r:   r4   r:   r   r   )
__name__
__module____qualname____firstlineno__r.   rF   rs   r   r   __static_attributes__r   r&   r   r(   r(   !   s    +.	>7F 7F 	7F
 
7Fr<F <F 	<F
 
<F|AH AH 	AH
 AH 
AHr&   r(   N)r!   r   r   rd   )__doc__
__future__r   typingr   r   r   r   sqlalchemy.ormr   !app.backend.classes.student_classr	   /app.backend.classes.student_document_file_classr
   app.backend.db.modelsr   r   rb   r%   r(   r   r&   r   <module>r      s<    # , , " : G :  ! 2[H [Hr&   