
    &6j<                        S r SSKJr  SSKJr  SSKJrJrJrJrJ	r	  SSK
JrJrJrJr  SSKJr  SSKJrJrJrJrJr  SSKJr  SS	 jr " S
 S5      rg)u  
KPI de asignaciones de documentos a especialistas: conteos por curso y por profesional.
Filtro temporal: mes/año calendario sobre `added_date` de professional_document_assignments.
- asignados: filas con added_date en el rango
- cargados: mismas filas con status_id == 1
    )annotationsdatetime)AnyDictListOptionalTuple)and_casefuncliteral)Session)CourseModelDocumentModelDocumentTypeModel#ProfessionalDocumentAssignmentModelSchoolModel)#map_professional_id_to_display_namec                    [        XSSSS5      nUS:X  a  [        U S-   SSSSS5      nX#4$ [        XS-   SSSS5      nX#4$ )z>Rango [start, end) sobre added_date (mes calendario completo).   r      r   )yearmonthstartend_excls       dC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\kpi_document_assignments_class.py_month_boundsr      s]    T!Q1-E{D1HaAq!4 ? D!)Q1a8?    c                      \ rS rSrSS jrSSS.           SS jjrSS.         SS jjrSS.           SS jjrSS.           SS	 jjrS
r	g)KpiDocumentAssignmentsClass#   c                    Xl         g )Ndb)selfr%   s     r   __init__$KpiDocumentAssignmentsClass.__init__$   s    r   N)professional_id_filterschool_id_filterc          	     0    [        U5      n[        U5      nUS:  d  US:  a  SS/ S.$ [        Xg5      u  p[        R                  " [	        [
        R                  S:H  S4SS95      R                  S5      n
[
        R                  R                  S 5      [
        R                  U:  [
        R                  U	:  /nUb+  UR                  [
        R                  [        U5      :H  5        Ub,  UR                  S[
        R                  [        U5      :H  5        U R                  R                  [
        R                   R                  S	5      [        R"                  " [
        R$                  5      R                  S
5      U
5      R&                  " U6 nUby  UR)                  [*        [-        [*        R$                  [
        R                   :H  [*        R.                  S:H  5      5      R'                  [*        R0                  [        U5      :H  5      nUR3                  [
        R                   5      nUR5                  5       nU Vs/ s H&  oR                   c  M  [        UR                   5      PM(     nn0 nU(       a  U R                  R                  [*        5      R'                  [*        R$                  R7                  U5      [*        R.                  S:H  5      R5                  5        HR  nUR8                  =(       d    SR;                  5       =(       d    SUR$                   3U[        UR$                  5      '   MT     / nU H  n[        UR                   5      n[        UR<                  =(       d    S5      n[        UR>                  =(       d    S5      nUS:  a  [A        SU-  U-  S5      OSnUR                  UURC                  USU 35      UUUS.5        M     URE                  S S9  SUS.$ s  snf ! [F         a  nS[I        U5      / S.s S nA$ S nAff = f)Nr   r   error   Mes inválidostatusmessagedatar   else_loaded	course_idassigned zCurso #      Y@        )r5   course_namer6   r4   rate_percentc                (    U S   R                  5       $ )Nr:   lowerxs    r   <lambda>7KpiDocumentAssignmentsClass.by_course.<locals>.<lambda>r       1]#3#9#9#;r   keysuccessr/   r1   )%intr   r   sumr   r   	status_idlabel
added_dateisnotappendprofessional_idinsertperiod_yearr%   queryr5   countidfilterjoinr   r   deleted_status_id	school_idgroup_byallin_r:   stripr6   r4   roundgetsort	Exceptionstr)r&   rQ   r   r   r)   r*   ymr   r   loaded_exprfiltersbase_qqrowsr
course_idsnamescoutcidr6   r4   pctes                            r   	by_course%KpiDocumentAssignmentsClass.by_course'   sm   E	FD	AE
A1uB")orRR+A1OE((9CCqH!LTUVeHo 
 4>>DDTJ3>>%G3>>IG
 &17GG3OeKff &q"E"Q"QUXYdUe"efWW]]3==CCKP

>AABHHT f	 	F  +#*M*W*WW#55: &..#6F2GGH   C M MNA557D48TDqKK*#akk*DJT$&EGGMM+.VKNN..z:K<Y<Y]^<^_SU 
 )*(;'B'B'D'X'RSRVRVQWHXE#add)$	 )+C!++&qzzQ/QXX]+=E\eEFNX5q9s

%(',yyuo'F$,"((+  HH;H<'555 U6  	F%#a&"EE	Fs<   'O2 HO2 ?O-O-,F O2 -O2 2
P<P
PP)r)   c          	         [        U5      n[        U5      nUS:  d  US:  a  SS/ S.$ [        XV5      u  px[        R                  " [	        [
        R                  S:H  S4SS95      R                  S5      n	[
        R                  R                  S	5      [
        R                  U:  [
        R                  U:  /n
Ub+  U
R                  [
        R                  [        U5      :H  5        Ub,  U
R                  S[
        R                  [        U5      :H  5        U R                  R                  [         R"                  R                  S
5      [        R$                  " [
        R&                  5      R                  S5      U	5      R)                  [
        5      R+                  [         [-        [         R&                  [
        R.                  :H  [         R0                  S:H  5      5      R2                  " U
6 R5                  [         R"                  5      nUR7                  5       n/ nU H.  nUR"                  nUc  M  UR                  [        U5      5        M0     0 nU(       a  U R                  R                  [8        5      R3                  [8        R&                  R;                  U5      5      R7                  5        HR  nUR<                  =(       d    SR?                  5       =(       d    SUR&                   3U[        UR&                  5      '   MT     / nU H  nUR"                  nUb  [        U5      OSn[        UR@                  =(       d    S5      n[        URB                  =(       d    S5      nUS:  a  [E        SU-  U-  S5      OSnUS:  a  URG                  USU 35      OSnUR                  UUUUUS.5        M     URI                  S S9  SUS.$ ! [J         a  nS[M        U5      / S.s S	nA$ S	nAff = f)z>Agrega asignaciones por establecimiento (school_id del curso).r   r   r,   r-   r.   r   r2   r4   NrX   r6   r7   z	Colegio #r8   r9   zSin establecimiento)rX   school_namer6   r4   r;   c                (    U S   R                  5       $ )Nrt   r=   r?   s    r   rA   7KpiDocumentAssignmentsClass.by_school.<locals>.<lambda>   rC   r   rD   rF   rG   )'rH   r   r   rI   r   r   rJ   rK   rL   rM   rN   rO   rP   rQ   r%   rR   r   rX   rS   rT   select_fromrV   r   r5   rW   rU   rY   rZ   r   r[   rt   r\   r6   r4   r]   r^   r_   r`   ra   )r&   rQ   r   r   r)   rb   rc   r   r   rd   re   rg   rh   
school_idsri   sidrk   srm   sid_rawr6   r4   ro   rK   rp   s                            r   	by_school%KpiDocumentAssignmentsClass.by_schoolw   s[   H	FD	AE
A1uB")orRR+A1OE((9CCqH!LTUVeHo 
 4>>DDTJ3>>%G3>>IG
 &17GG3OeKff &q"E"Q"QUXYdUe"ef ))//<JJBEEFLLZX
 @A#*M*W*WW#55:  !" +//0 $ 557DJkk?%%c#h/  %'E{3::;>>;M;Mj;YZ^^`A()(;'B'B'D'Z)TUTXTXSYHZE#add)$ a )+C++&-&9c'lqqzzQ/QXX]+=E\eEFNX5q9s=@1W		#3%'89J_

%(',$,"((+   HH;H<'55 	F%#a&"EE	Fs*   'O HO 6FO 
O5O0*O50O5c          	         [        U5      n[        U5      n[        U5      nUS:  d  US:  a  SS/ S.$ [        Xx5      u  p[        R                  " [	        [
        R                  S:H  S4SS95      R                  S5      n[
        R                  U:H  [
        R                  R                  S 5      [
        R                  U	:  [
        R                  U
:  /nUb+  UR                  [
        R                  [        U5      :H  5        Ub,  UR                  S[
        R                  [        U5      :H  5        U R                  R!                  [
        R                  R                  S	5      [        R"                  " [
        R$                  5      R                  S
5      U5      R&                  " U6 R)                  [
        R                  5      nUR+                  5       nU Vs/ s H&  oR                  c  M  [        UR                  5      PM(     nnU(       a  [-        U R                  U5      O0 n/ nU H  n[        UR                  5      n[        UR.                  =(       d    S5      n[        UR0                  =(       d    S5      nUS:  a  [3        SU-  U-  S5      OSnUR                  UUR5                  USU 35      UUUS.5        M     UR7                  S S9  SUS.$ s  snf ! [8         a  nS[;        U5      / S.s S nA$ S nAff = f)Nr   r   r,   r-   r.   r   r2   r4   rO   r6   r8   r9   zProfesional #)rO   professional_namer6   r4   r;   c                (    U S   R                  5       $ )Nr   r=   r?   s    r   rA   =KpiDocumentAssignmentsClass.by_professional.<locals>.<lambda>	  s    1%8#9#?#?#Ar   rD   rF   rG   )rH   r   r   rI   r   r   rJ   rK   r5   rL   rM   rN   rO   rP   rQ   r%   rR   rS   rT   rU   rY   rZ   r   r6   r4   r]   r^   r_   r`   ra   )r&   rQ   r5   r   r   r)   rn   rb   rc   r   r   rd   re   rg   rh   ri   pids
prof_namesrm   pidr6   r4   ro   rp   s                           r   by_professional+KpiDocumentAssignmentsClass.by_professional   s   9	Fi.CD	AE
A1uB")orRR+A1OE((9CCqH!LTUVeHo 
 4==D3>>DDTJ3>>%G3>>I	G &17GG3OeKff &q"E"Q"QUXYdUe"ef 7GGMMN_`JJBEEFLLZX
 
 !" =MMN  557D48ZDq<M<M*C))*DDZ_c)LTWWVZ)[ikJ(*C!++,qzzQ/QXX]+=E\eEFNX5q9s

+.-7^^C=QTPUAV-W$,"((+  HHAHB'55' [(  	F%#a&"EE	Fs<   2K& F)K& K!2K!CK& !K& &
L	0L>L	L	c          
     l    [        U5      n[        U5      n[        U5      nUS:  d  US:  a  SS/ S.$ [        Xx5      u  p[        [        R                  S:  [        R                  4[        S5      S9n[        [        R                  S:  [        S5      4[        R                  S9n[        R                  " [        [        R                  S:H  S4SS95      R                  S5      n[        R                  U:H  [        R                  R                  S	5      [        R                  U	:  [        R                  U
:  /nUb+  UR                  [        R                  [        U5      :H  5        Ub,  UR!                  S[        R"                  [        U5      :H  5        U R$                  R'                  UR                  S
5      UR                  S5      [        R(                  " [        R*                  5      R                  S5      U5      R,                  " U6 R/                  X5      nUR1                  5       n[3        U Vs1 s HE  n[        UR4                  =(       d    S5      S:  d  M'  [        UR4                  =(       d    S5      iMG     sn5      n[3        U Vs1 s Hi  n[        UR4                  =(       d    S5      S:X  d  M'  [        UR6                  =(       d    S5      S:  d  MK  [        UR6                  =(       d    S5      iMk     sn5      n0 nU(       a  U R$                  R'                  [8        5      R-                  [8        R*                  R;                  U5      5      R1                  5        HR  nUR<                  =(       d    SR?                  5       =(       d    SUR*                   3U[        UR*                  5      '   MT     0 nU(       a  U R$                  R'                  [@        5      R-                  [@        R*                  R;                  U5      5      R1                  5        HR  nUR<                  =(       d    SR?                  5       =(       d    SUR*                   3U[        UR*                  5      '   MT     / nU H  n[        UR4                  =(       d    S5      n[        UR6                  =(       d    S5      n[        URB                  =(       d    S5      n[        URD                  =(       d    S5      nUS:  a  [G        SU-  U-  S5      OSnUS:  a  URI                  USU 35      nOUS:  a  URI                  USU 35      nOSnUR                  UUUUUUS.5        M     URK                  S S9  SUS.$ s  snf s  snf ! [L         a  nS[O        U5      / S.s S	nA$ S	nAff = f)u   
Por tipo de documento (catálogo `documents` o `document_types` si no hay catálogo).
Agrupa por document_catalog_id cuando es > 0; si no, por document_type_id.
r   r   r,   r-   r.   r   r2   r4   Nbucket_catalog_idbucket_type_idr6   r7   zDocumento #zTipo #r8   r9   zTipo de documento #u   Documento (sin catálogo))document_catalog_iddocument_type_iddocument_namer6   r4   r;   c                (    U S   R                  5       $ )Nr   r=   r?   s    r   rA   9KpiDocumentAssignmentsClass.by_document.<locals>.<lambda>  s    1_#5#;#;#=r   rD   rF   rG   )(rH   r   r   r   r   r   r   r   rI   rJ   rK   r5   rL   rM   rN   rO   rP   rQ   r%   rR   rS   rT   rU   rY   rZ   listr   r   r   r[   documentr\   r   r6   r4   r]   r^   r_   r`   ra   ) r&   rQ   r5   r   r   r)   rn   rb   rc   r   r   bucket_catalogbucket_typerd   re   rg   rh   ri   catalog_idstype_ids	doc_namesd
type_namestrm   bcbtr6   r4   ro   dnamerp   s                                    r   by_document'KpiDocumentAssignmentsClass.by_document  s   j	Fi.CD	AE
A1uB")orRR+A1OE "7KKaO7KK ajN 4HH1LgVWjY9JJK
 ((9CCqH!LTUVeHo 
 4==D3>>DDTJ3>>%G3>>I	G &17GG123 &7CCs;GWW "(()<=%%&67JJBEEFLLZX	  !" .6  557D8<b1ADWDWD\[\@]`a@a.Q((-A.bK  "!1..3!49 />A!BRBRBWVW>X[\>\ /C((-A.!H )+IGGMM-0778H8H8L8L[8YZ^^`  -.JJ,<"+C+C+E+];WXW[W[V\I]Ic!$$i( a *,JGGMM"34;;<M<P<P<T<TU]<^_cce  ./ZZ-=2,D,D,F,YFSTSWSWRX/Js144y) f )+C,,12)).Q/qzzQ/QXX]+=E\eEFNX5q9s6%MM"B4.@AE!V&NN21DRD/IJE7E

/1,.).$,"((+	 . HH=H>'55c c^  	F%#a&"EE	FsT   2V H
V ?&V)"VV &V V)"VI:V 
V 
V3V.(V3.V3r$   )r%   r   )rQ   Optional[int]r   rH   r   rH   r)   r   r*   r   returnDict[str, Any])
rQ   r   r   rH   r   rH   r)   r   r   r   )rQ   r   r5   rH   r   rH   r   rH   r)   r   r   r   )
__name__
__module____qualname____firstlineno__r'   rq   r|   r   r   __static_attributes__ r   r   r!   r!   #   sX    15*.NF #NF 	NF
 NF !.NF (NF 
NFl 15QF #QF 	QF
 QF !.QF 
QFt 15BF #BF 	BF
 BF BF !.BF 
BFV 15wF #wF 	wF
 wF wF !.wF 
wF wFr   r!   N)r   rH   r   rH   r   zTuple[datetime, datetime])__doc__
__future__r   r   typingr   r   r   r	   r
   
sqlalchemyr   r   r   r   sqlalchemy.ormr   app.backend.db.modelsr   r   r   r   r   &app.backend.utils.professional_displayr   r   r!   r   r   r   <module>r      sD    #  3 3 0 0 "  WbF bFr   