
    i}$                        d Z ddlmZ ddl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mZ dZdd	Z G d
 d      Zy)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                x   | j                  d      xs i }|j                  d      xs dj                         |j                  d      xs dj                         |j                  d      xs dj                         g}dj                  d |D              j                         }|xs d| j                  d	       S )
Npersonal_datanames father_lastnamemother_lastname c              3  &   K   | ]	  }|s|  y wN ).0ps     ]/var/www/pie360backend.cl/public_html/app/backend/classes/kpi_documentation_progress_class.py	<genexpr>z!_student_label.<locals>.<genexpr>   s     *!A*s   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                  h    e Zd ZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 d	dZ	 	 	 	 	 	 d
dZ	 	 	 	 	 	 	 	 ddZy)KpiDocumentationProgressClassc                    || _         y r   )db)selfr)   s     r   __init__z&KpiDocumentationProgressClass.__init__"   s	    r%   c                   t        | j                        }|j                  ddt        |      t        |            }t	        |t
              r|j                  d      dk(  rg S t	        |t              sg S g }|D ]o  }t	        |t
              r|j                  d      %|j                  d      xs i }|j                  d      }|N	 t        |      dk  r^	 |j                  |       q |S # t        $ r Y w xY w)	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*   r/   r0   strawoutxacademicnee_ids	            r   _students_for_coursez2KpiDocumentationProgressClass._students_for_course%   s    $''"jj)nK(	  
 c4 SWWX%6'%AI#t$I$& 	Aa&!%%+*=uu_-3H\\"?@F~v;!# $ JJqM	 
  s   C--	C98C9c                  	 t        |      }| j                  j                  t              j	                  t        j
                  t        |      k(  t        j                  dk(        j                  t        j                  j                               j                         }t        | j                        }g }|D ](  }t        |j                        }| j                  ||      }	t        |	      }
d}d}|	D ]  }t        |d         }|j                  |t         |      }t#        |t$              r|j'                  d      dk(  rM|t        |j'                  d      xs d      z  }|t        |j'                  d      xs d      z  } ||z   }|dkD  rt)        d|z  |z  d      nd	}|j                  xs d
j+                         xs d| }|j-                  |||
||||d       + d|dS # t.        $ r}dt1        |      g dcY d}~S d}~ww xY w)zXUna fila por curso del colegio: totales de docs cargados / faltantes (tipo transversal).r   r   r1   r2   totaltotal_missing      Y@r           r   Curso #)r/   course_namestudent_countloadedmissingexpected_totalrate_percentsuccessr1   datar1   messagerQ   N)r6   r)   queryr   filter	school_iddeleted_status_idorder_byrI   ascallr
   r   rB   lencheck_document_existenceDOCUMENT_SECTION_TRANSVERSALr7   r8   r   roundr   r;   r:   str)r*   rV   r0   pycoursesfolderr>   ccidstudents
n_studentstotal_loadedrE   r    sidrexpected_slotsratecnamees                       r   	by_coursez'KpiDocumentationProgressClass.by_courseD   s    0	F[!Bk*--Y?A^A^bcAcd+115578	  !)F(*C !!$$i44S"= ]
  !# FCc$i.C7792A "!T*quuX'/I  Cg(;!$<<L!S)?)D1%EEMF ".!= &) %,.?C 
 ,"335H73%

%(',)3".#0*8(,
/!F (55 	F%#a&"EE	Fs   G'G* *	H3HHHc                  	 t        |      }t        |D ch c]  }|t        |      dkD  st        |      ! c}      }g }|D ]C  }| j                  j                  t              j                  t        j                  |k(        j                         }|r%|j                  xs dj                         xs
 d| nd| }	| j                  ||      }
|
j                  d      dk(  r|
j                  d      xs g ng }|s|j                  ||	ddddd	d
       t        d |D              }t        d |D              }t        d |D              }||z   }|dkD  rt        d|z  |z  d      nd	}|j                  ||	|||||d
       F |j                  d        d|dS c c}w # t         $ r}dt#        |      g dcY d}~S d}~ww xY w)ue   Una fila por establecimiento: suma de todos los cursos (documentación transversal, alumnos con NEE).Nr   r   z	Colegio #)rV   r0   r1   rO   rQ   rG   )rV   school_namerJ   rK   rL   rM   rN   c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)rJ   r   Nr6   r   r   ri   s     r   r   z:KpiDocumentationProgressClass.by_school.<locals>.<genexpr>   s#     "R3quu_'='B#C"R   (*c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)rK   r   Nrr   rs   s     r   r   z:KpiDocumentationProgressClass.by_school.<locals>.<genexpr>   s"      IqQUU8_%9!: Irt   c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)rL   r   Nrr   rs   s     r   r   z:KpiDocumentationProgressClass.by_school.<locals>.<genexpr>   s#     !K#aeeI&6&;!"<!Krt   rF   r   c                H    | j                  d      xs dj                         S )Nrp   r   )r   lowerr?   s    r   <lambda>z9KpiDocumentationProgressClass.by_school.<locals>.<lambda>   s    AEE-$8$>B#E#E#G r%   keyrP   r2   rR   )r6   sortedr)   rT   r   rU   r   firstrp   r   rn   r   r;   sumr^   sortr:   r_   )r*   
school_idsr0   r`   sidsr>   rh   schsnameresrowstot_students
tot_loadedtot_missingexpectedrk   rm   s                     r   	by_schoolz'KpiDocumentationProgressClass.by_school}   s   5	F[!B*UQ#a&ST*#a&UVC(*C +GGMM+.VKNNc12UW   __*113H3%7H$SE* 
 nnsn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s8   F) F$F$F$E)F) $F) )	G2G GGc          
        	 t        |      }t        |      }| j                  j                  t              j	                  t        j
                  |k(  t        j                  t        |      k(  t        j                  dk(        j                         }|sddddS | j                  ||      }t        | j                        }g }	|D ]  }
t        |
d         }|j                  |t        |      }t        |t              r|j                  d      dk(  rMt        |j                  d      xs d      }t        |j                  d	      xs d      }||z   }|dkD  rt!        d
|z  |z  d      nd}|	j#                  |t%        |
      ||||d        |	j'                  d        |j(                  xs dj+                         xs d| }d|||	ddS # t,        $ r}dt/        |      ddcY d}~S d}~ww xY w)zADetalle por estudiante del curso (torta: cargados vs pendientes).r   r2   zCurso no encontradoNrR   r   r1   rD   rE   rF   r   rG   )
student_idstudent_namerK   rL   r   rN   c                0    | d   xs dj                         S )Nr   r   )rx   ry   s    r   rz   z?KpiDocumentationProgressClass.students_detail.<locals>.<lambda>   s    Q~%6%<"$C$C$E r%   r{   r   rH   rO   )r/   rI   re   rP   )r6   r)   rT   r   rU   r   rV   rW   r~   rB   r
   r\   r]   r7   r8   r   r^   r;   r$   r   rI   r   r:   r_   )r*   rV   r/   r0   rd   r`   rc   re   rb   r   r    rh   ri   rK   rL   r   pctrl   rm   s                      r   students_detailz-KpiDocumentationProgressClass.students_detail   s   9	Hi.C[!Bk*NNc)))S^;11Q6
   %4   00b9H )F)+D #d)n335r a&155?g+EQUU7^0q1aeeO49:!G+=E\eEFNX5q9s&)(6s(;"(#*$,(+	, IIEIF]](b//1Dwse_E#!$#( $   	H%#a&$GG	Hs%   BG D5G 	G2G-'G2-G2N)r)   r   )r/   r6   r0   r6   returnzList[Dict[str, Any]])rV   r6   r0   r6   r   Dict[str, Any])r   z	List[int]r0   r6   r   r   )rV   r6   r/   r6   r0   r6   r   r   )__name__
__module____qualname__r+   rB   rn   r   r   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   r_   )__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   r]   r$   r'   r   r%   r   <module>r      s<    # , , " : G :  ! 2[H [Hr%   