
    Si<                        d Z ddlmZ ddlmZ ddlmZmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZ dd	Z G d
 d      Zy)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                    t        | |dddd      }|dk(  rt        | dz   ddddd      }||fS t        | |dz   dddd      }||fS )z>Rango [start, end) sobre added_date (mes calendario completo).   r      r   )yearmonthstartend_excls       [/var/www/pie360backend.cl/public_html/app/backend/classes/kpi_document_assignments_class.py_month_boundsr      se    T5!Q1-E{D1HaAq!4 (? D%!)Q1a8(?    c                      e Zd Zd	dZddd	 	 	 	 	 	 	 	 	 	 	 d
dZdd	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 	 	 ddZy)KpiDocumentAssignmentsClassc                    || _         y )N)db)selfr#   s     r   __init__z$KpiDocumentAssignmentsClass.__init__$   s	    r   N)professional_id_filterschool_id_filterc          	        	 t        |      }t        |      }|dk  s|dkD  rddg dS t        ||      \  }}	t        j                  t	        t
        j                  dk(  dfd            j                  d      }
t
        j                  j                  d       t
        j                  |k\  t
        j                  |	k  g}|+|j                  t
        j                  t        |      k(         |,|j                  dt
        j                  t        |      k(          | j                  j                  t
        j                   j                  d	      t        j"                  t
        j$                        j                  d
      |
      j&                  | }|y|j)                  t*        t-        t*        j$                  t
        j                   k(  t*        j.                  dk(              j'                  t*        j0                  t        |      k(        }|j3                  t
        j                         }|j5                         }|D cg c]$  }|j                   t        |j                         & }}i }|r| j                  j                  t*              j'                  t*        j$                  j7                  |      t*        j.                  dk(        j5                         D ]G  }|j8                  xs dj;                         xs d|j$                   |t        |j$                        <   I g }|D ]  }t        |j                         }t        |j<                  xs d      }t        |j>                  xs d      }|dkD  rtA        d|z  |z  d      nd}|j                  ||jC                  |d|       |||d        |jE                  d        d|dS c c}w # tF        $ r}dtI        |      g dcY d }~S d }~ww xY w)Nr   r   error   Mes inválidostatusmessagedatar   else_loaded	course_idassigned zCurso #      Y@        )r2   course_namer3   r1   rate_percentc                (    | d   j                         S )Nr7   lowerxs    r   <lambda>z7KpiDocumentAssignmentsClass.by_course.<locals>.<lambda>r       1]#3#9#9#; r   keysuccessr,   r.   )%intr   r   sumr   r   	status_idlabel
added_dateisnotappendprofessional_idinsertperiod_yearr#   queryr2   countidfilterjoinr   r   deleted_status_id	school_idgroup_byallin_r7   stripr3   r1   roundgetsort	Exceptionstr)r$   rM   r   r   r&   r'   ymr   r   loaded_exprfiltersbase_qqrowsr
course_idsnamescoutcidr3   r1   pctes                            r   	by_coursez%KpiDocumentAssignmentsClass.by_course'   sr   E	FD	AE
A1uB")orRR+Aq1OE8((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TWW]]3==CCKP

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

%(',yyuo'F$,"((+ HH;H<'555 U6  	F%#a&"EE	Fs<   %O HO =OO&E%O O 	O3O.(O3.O3)r&   c          	        	 t        |      }t        |      }|dk  s|dkD  rddg dS t        ||      \  }}t        j                  t	        t
        j                  dk(  dfd            j                  d      }	t
        j                  j                  d	      t
        j                  |k\  t
        j                  |k  g}
|+|
j                  t
        j                  t        |      k(         |,|
j                  dt
        j                  t        |      k(          | j                  j                  t         j"                  j                  d
      t        j$                  t
        j&                        j                  d      |	      j)                  t
              j+                  t         t-        t         j&                  t
        j.                  k(  t         j0                  dk(              j2                  |
 j5                  t         j"                        }|j7                         }g }|D ]+  }|j"                  }||j                  t        |             - i }|r| j                  j                  t8              j3                  t8        j&                  j;                  |            j7                         D ]G  }|j<                  xs dj?                         xs d|j&                   |t        |j&                        <   I g }|D ]  }|j"                  }|t        |      nd}t        |j@                  xs d      }t        |jB                  xs d      }|dkD  rtE        d|z  |z  d      nd}|dkD  r|jG                  |d|       nd}|j                  |||||d        |jI                  d        d|dS # tJ        $ r}dtM        |      g dcY d	}~S d	}~ww xY w)z>Agrega asignaciones por establecimiento (school_id del curso).r   r   r)   r*   r+   r   r/   r1   NrT   r3   r4   z	Colegio #r5   r6   zSin establecimiento)rT   school_namer3   r1   r8   c                (    | d   j                         S )Nro   r:   r<   s    r   r>   z7KpiDocumentAssignmentsClass.by_school.<locals>.<lambda>   r?   r   r@   rB   rC   )'rD   r   r   rE   r   r   rF   rG   rH   rI   rJ   rK   rL   rM   r#   rN   r   rT   rO   rP   select_fromrR   r   r2   rS   rQ   rU   rV   r   rW   ro   rX   r3   r1   rY   rZ   r[   r\   r]   )r$   rM   r   r   r&   r^   r_   r   r   r`   ra   rc   rd   
school_idsre   sidrg   sri   sid_rawr3   r1   rk   rG   rl   s                            r   	by_schoolz%KpiDocumentAssignmentsClass.by_schoolw   si   H	FD	AE
A1uB")orRR+Aq1OE8((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 0kk?%%c#h/0 %'E{3::;>>;M;Mj;YZ^^` [A()(;'B'B'D'Z)TUTXTXSYHZE#add)$[ )+C ++&-&9c'lqqzzQ/QXX]+=E\eEFNX5q9s=@1W		#3%'89J_

%(',$,"((+  HH;H<'55 	F%#a&"EE	Fs*   %N0 H
N0 3E<N0 0	O9OOOc          	        	 t        |      }t        |      }t        |      }|dk  s|dkD  rddg dS t        ||      \  }	}
t        j                  t	        t
        j                  dk(  dfd            j                  d      }t
        j                  |k(  t
        j                  j                  d       t
        j                  |	k\  t
        j                  |
k  g}|+|j                  t
        j                  t        |      k(         |,|j                  dt
        j                  t        |      k(          | j                  j!                  t
        j                  j                  d	      t        j"                  t
        j$                        j                  d
      |      j&                  | j)                  t
        j                        }|j+                         }|D cg c]$  }|j                  t        |j                        & }}|rt-        | j                  |      ni }g }|D ]  }t        |j                        }t        |j.                  xs d      }t        |j0                  xs d      }|dkD  rt3        d|z  |z  d      nd}|j                  ||j5                  |d|       |||d        |j7                  d        d|dS c c}w # t8        $ r}dt;        |      g dcY d }~S d }~ww xY w)Nr   r   r)   r*   r+   r   r/   r1   rK   r3   r5   r6   zProfesional #)rK   professional_namer3   r1   r8   c                (    | d   j                         S )Nrx   r:   r<   s    r   r>   z=KpiDocumentAssignmentsClass.by_professional.<locals>.<lambda>	  s    1%8#9#?#?#A r   r@   rB   rC   )rD   r   r   rE   r   r   rF   rG   r2   rH   rI   rJ   rK   rL   rM   r#   rN   rO   rP   rQ   rU   rV   r   r3   r1   rY   rZ   r[   r\   r]   )r$   rM   r2   r   r   r&   rj   r^   r_   r   r   r`   ra   rc   rd   re   pids
prof_namesri   pidr3   r1   rk   rl   s                           r   by_professionalz+KpiDocumentAssignmentsClass.by_professional   s   9	Fi.CD	AE
A1uB")orRR+Aq1OE8((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ZqA<M<M<YC))*ZD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<   0K F*K K/KCK K 	K4K/)K4/K4c          
     
   	 t        |      }t        |      }t        |      }|dk  s|dkD  rddg dS t        ||      \  }	}
t        t        j                  dkD  t        j                  ft        d            }t        t        j                  dkD  t        d      ft        j                        }t        j                  t        t        j                  dk(  dfd            j                  d      }t        j                  |k(  t        j                  j                  d	      t        j                  |	k\  t        j                  |
k  g}|+|j                  t        j                  t        |      k(         |,|j!                  dt        j"                  t        |      k(          | j$                  j'                  |j                  d
      |j                  d      t        j(                  t        j*                        j                  d      |      j,                  | j/                  ||      }|j1                         }t3        |D ch c]8  }t        |j4                  xs d      dkD  s t        |j4                  xs d      : c}      }t3        |D ch c]S  }t        |j4                  xs d      dk(  r5t        |j6                  xs d      dkD  rt        |j6                  xs d      U c}      }i }|r| j$                  j'                  t8              j-                  t8        j*                  j;                  |            j1                         D ]G  }|j<                  xs dj?                         xs d|j*                   |t        |j*                        <   I i }|r| j$                  j'                  t@              j-                  t@        j*                  j;                  |            j1                         D ]G  }|j<                  xs dj?                         xs d|j*                   |t        |j*                        <   I g }|D ]  }t        |j4                  xs d      }t        |j6                  xs d      }t        |jB                  xs d      }t        |jD                  xs d      }|dkD  rtG        d|z  |z  d      nd}|dkD  r|jI                  |d|       }n|dkD  r|jI                  |d|       }nd}|j                  ||||||d        |jK                  d        d|dS c c}w c c}w # tL        $ r}dtO        |      g dcY d	}~S d	}~ww xY w)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   r/   r1   Nbucket_catalog_idbucket_type_idr3   r4   zDocumento #zTipo #r5   r6   zTipo de documento #u   Documento (sin catálogo))document_catalog_iddocument_type_iddocument_namer3   r1   r8   c                (    | d   j                         S )Nr   r:   r<   s    r   r>   z9KpiDocumentAssignmentsClass.by_document.<locals>.<lambda>  s    1_#5#;#;#= r   r@   rB   rC   )(rD   r   r   r   r   r   r   r   rE   rF   rG   r2   rH   rI   rJ   rK   rL   rM   r#   rN   rO   rP   rQ   rU   rV   listr   r   r   rW   documentrX   r   r3   r1   rY   rZ   r[   r\   r]   ) r$   rM   r2   r   r   r&   rj   r^   r_   r   r   bucket_catalogbucket_typer`   ra   rc   rd   re   catalog_idstype_ids	doc_namesd
type_namestri   bcbtr3   r1   rk   dnamerl   s                                    r   by_documentz'KpiDocumentAssignmentsClass.by_document  s   j	Fi.CD	AE
A1uB")orRR+Aq1OE8 "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<b1ADWDWD\[\@]`a@aQ((-A.bK  "1..3!49c!BRBRBWVW>X[\>\ ((-A.H )+IGGMM-0778H8H8L8L[8YZ^^`^A -.JJ,<"+C+C+E+];WXW[W[V\I]Ic!$$i(^
 *,JGGMM"34;;<M<P<P<T<TU]<^_cceZA ./ZZ-=2,D,D,F,YFSTSWSWRX/Js144y)Z
 )+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sI   0T7 HT7 !T-'T-T7 AT2*IT7 -
T7 7	U UUU)r#   r   )rM   Optional[int]r   rD   r   rD   r&   r   r'   r   returnDict[str, Any])
rM   r   r   rD   r   rD   r&   r   r   r   )rM   r   r2   rD   r   rD   r   rD   r&   r   r   r   )__name__
__module____qualname__r%   rm   rv   r}   r    r   r   r!   r!   #   sQ    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r   r!   N)r   rD   r   rD   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   