
    Aio3                        S r SSKJr  SSKJrJr  SSKJrJrJrJ	r	J
r
  SSKJrJr  SSKJr  SSKJr  SSKJrJrJrJr  SS	 jrSS
 jr " S S5      rg)u   
Asignaciones documento–estudiante–profesional–curso por período.
Al subir archivo a carpeta (folders), status_id pasa a 1 si coincide tipo/catálogo.
    )annotations)datetimedate)AnyDictListOptionalTuple)and_or_)Session)AppAlertClass)#ProfessionalDocumentAssignmentModelProfessionalTeachingCourseModelStudentAcademicInfoModelStudentModelc                    U (       a  [        U 5      R                  5       (       d  g [        U 5      R                  5       S S n UR                  S5      u  p#n[        [	        U5      [	        U5      [	        U5      5      $ ! [
         a     g f = f)N
   -)strstripsplitr   int	Exception)stymds        lc:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\professional_document_assignment_class.py_parse_deadliner!      so    CFLLNNAsA''#,aCFCFCF++ s   ;B   
BBc                N    U c  g  [        U 5      $ ! [        [        4 a     g f = fN)r   	TypeError
ValueErrorperiod_years    r    _period_intr(   !   s2    ;z" s   
 $$c                      \ rS rSrSS jr        SS jr          SS jrSS.     SS jjr              SS jrSS.     SS	 jjr	S
r
g)#ProfessionalDocumentAssignmentClass*   c                    Xl         g r#   db)selfr.   s     r    __init__,ProfessionalDocumentAssignmentClass.__init__+   s        c               `    [        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  [        R                  [        U5      :H  [        R                  [        U5      :H  5      R                  5       n0 nU GH5  n[        UR                  =(       d    S5      n[        UR                  5      U4n	X;  aP  [        UR                  5      US:  a  UOS/ 0 UR                  (       a  UR                  R                  5       OSS.Xi'   [        UR                  5      n
XU	   S   ;  a  Xi   S   R                  U
5        [        UR                  =(       d    S5      Xi   S   [!        U
5      '   UR                  (       d  GM  Xi   S   (       a  GM  UR                  R                  5       Xi   S'   GM8     [#        UR%                  5       5      nU H  n['        US   5      US'   M     SSU0S	.$ ! [(         a  nS
[!        U5      S/ 0S.s SnA$ SnAff = f)zmDevuelve items agrupados como espera el front (document_type_id, document_id, student_ids, student_statuses).r   N)document_type_iddocument_idstudent_idsstudent_statusesdeadline_atr6   r7   r8   successitemsstatusdataerrorr<   messager=   )r   r.   queryr   filterr'   	course_idprofessional_idalldocument_catalog_idr4   r8   	isoformat
student_idappend	status_idr   listvaluessortedr   )r/   r'   rC   rD   pyrowsbucketsrcatkeysidr:   ites                 r    get_grouped/ProfessionalDocumentAssignmentClass.get_grouped.   s   &	Q[!BAB7CCrI7AAS^S7GG3K__
   >@G!//4151--.4%,/0B0B,C.1Ags4'),.DEMMq}}'>'>'@W[$GL !,,'cl=99L/66s;=@AQPQ=R/0S:===m)D)D23--2I2I2KGL/# & )*E$*2m+<$==!  ('51ABB 	Q%#a&7B-PP	Qs+   FH 
H *AH 
H-H("H-(H-c               8    [        U5      n[        U5      n[        U5      n[        U R                  5      R                  XVUS9  U R                  R	                  [
        5      R                  [
        R                  U:H  [
        R                  U:H  [
        R                  U:H  5      R                  5       n0 n	U Hv  n
[        U
R                  5      [        U
R                  5      [        U
R                  =(       d    S5      4n[        U
R                  =(       d    S5      U
R                  4X'   Mx     U R                  R	                  [
        5      R                  [
        R                  U:H  [
        R                  U:H  [
        R                  U:H  5      R!                  SS9  ["        R$                  " 5       nU GH#  n[        UR'                  S5      =(       d    S5      nUS::  a  M/  UR'                  S5      nUb  [        U5      S:  a  [        U5      OSnUR'                  S5      =(       d    / n[)        U[*        5      (       d  M  [-        UR'                  S	5      5      nU Hs  n [        U5      nUS::  a  M  UUU4nU	R'                  US
5      u  nnUS:X  a  UOSnUS:X  a  UOSn[        UUUUUUUUUUUS9nU R                  R3                  U5        Mu     GM&     U R                  R5                  5         U R                  R	                  [
        5      R                  [
        R                  U:H  [
        R                  U:H  [
        R                  U:H  [
        R                  S:H  5      R7                  5       n[        U R                  5      R9                  UUUUS9  U R                  R;                  5         SSS.$ ! [.        [0        4 a     GMq  f = f! [<         a2  nU R                  R?                  5         S[A        U5      S.s SnA$ SnAff = f)z
Reemplaza asignaciones para (period, course, professional).
Conserva status_id=1 y completed_at si la misma clave (student, type, catalog) sigue en el payload.
r'   rC   rD   r   F)synchronize_sessionr4   r5   Nr6   r8   )r   N   )r'   rC   rD   rH   r4   rF   rJ   r8   completed_at
added_dateupdated_date)r'   rC   rD   pending_countr9   Sincronizado)r<   r@   r>   )!r   r   r.   "delete_alerts_for_assignment_scoperA   r   rB   r'   rC   rD   rE   rH   r4   rF   rJ   r]   deleter   nowget
isinstancerK   r!   r$   r%   addflushcountupsert_scope_summarycommitr   rollbackr   )r/   r'   rC   rD   r:   rN   cidpidexistingold_maprQ   rS   rd   rawdtiddidcatalogsidsdlrT   rH   prev_statusprev_completedstcomprow	pending_nrV   s                               r    sync_replace0ProfessionalDocumentAssignmentClass.sync_replace^   s   Z	:[!Bi.Co&C$''"EEs F 
 AB7CCrI7AASH7GG3N
   SUG1<<(#a.@.@*A3qG\G\Ga`aCbc #AKK$41 5q~~F  GGMM=>EE3??2E3==D3CCsJ ff/,,.C377#56;!<19ggm,&)o#c(Q,#c(Aww}-3!$--$SWW]%;<C!%(X
 "Q %tW5C29++c92M/K(3q(8aB-/1W>$D=$&"%(+#-)-,3"$$&%)#&%(C GGKK$1   J GGMMO AB7CCrI7AASH7GG3N7AAQF	   $''"77 #'	 8  GGNN'NCCY &z2 ! !Z  	:GG%#a&99	:sC   I)O ,O7EO OO OO 
P''PPPNr&   c                   [        U5      nU R                  R                  [        5      R	                  [        R
                  U:H  [        R                  S:H  5      nUb+  UR	                  [        R                  [        U5      :H  5      nUR                  5       nSUS.$ ! [         a  nS[        U5      SS.s SnA$ SnAff = f)zOCuenta asignaciones con status_id=0 (documento pendiente de cargar en carpeta).r   Nr9   )r<   ri   r>   )r<   r@   ri   )r   r.   rA   r   rB   rD   rJ   r'   ri   r   r   )r/   rD   r'   rn   qri   rV   s          r    count_pending1ProfessionalDocumentAssignmentClass.count_pending   s    	Fo&CABII3CCsJ3==BA &HH7CCs;GWW GGIE'%88 	F%#a&1EE	Fs   BB! !
C+B?9C?Cc          
     X   [        U5      nUc  g[        U5      n[        U5      n	[        U5      n
U R                  R                  [        5      R                  [        R                  U:H  [        R                  U
:H  [        R                  S:H  5      nUb:  [        U5      S:  a+  UR                  [        R                  [        U5      :H  5      nUb:  [        U5      S:  a+  UR                  [        R                  [        U5      :H  5      nUR                  [        [        R                  U:H  [        [        R                  S:H  [        R                  U	:H  5      5      5      nUR                  5       nU(       d  g[         R"                  " 5       nU H  nSUl        Xl        Xl        M     US   n[)        U R                  5      R+                  [        UR                  5      [        UR                  5      [        UR                  5      S9  U R                  R-                  5         g)ub   Marca filas pendientes cuando hay archivo en carpeta (mismo catálogo o catálogo 0 + mismo tipo).Nr   r\   rZ   )r(   r   r.   rA   r   rB   r'   rH   rJ   rC   rD   r   rF   r   r4   rE   r   rd   r]   r_   r   #sync_scope_summary_from_assignmentsrk   )r/   r'   rH   rF   r4   rD   rC   rN   dcdtrT   r   rO   rd   rQ   r0s                   r    "mark_completed_after_folder_uploadFProfessionalDocumentAssignmentClass.mark_completed_after_folder_upload   s    %:$%!"*oGGMM=>EE/;;rA/::cA/99Q>
  S^a%7<FF#i.XYA&3+?!+C<LLPSTcPddeAHH3GG2M7KKqP7HHBN
 uuwllnAAK N N  !WdggBBBNN+",,' 2 23 	C 	

 	r2   c               "    [        U5      n[        U5      nU R                  R                  [        5      R                  [        R                  U:H  5      nUb"  UR                  [        R                  U:H  5      n[        UR                  5       5      n[        UR                  [        R                  S:H  5      R                  5       5      nU R                  R                  [        R                  5      R                  [        R                  U:H  [        R                  S:H  5      R                  5       R                  5       nU V	s/ s H&  oR                  c  M  [        U	R                  5      PM(     n
n	[        U
5      nSnU
 H  nU R                  R                  [         5      R#                  [$        [$        R&                  [         R(                  :H  5      R                  [$        R                  U:H  [         R                  S:H  5      nUb+  UR                  [         R                  [+        U5      :H  5      nU[        UR                  5       5      -  nM     SUUUUS.S.$ s  sn	f ! [,         a  nS[+        U5      SS.s SnA$ SnAff = f)	z
Resumen para home del profesional: documentos asignados/cargados (filas PDA),
cursos en professionals_teachings_courses y suma de estudiantes por curso (puede repetir alumno entre cursos).
Nr\   r   r9   )assigned_documentsloaded_documentscourses_assignedstudents_in_coursesr;   r>   r?   )r   r(   r.   rA   r   rB   rD   r'   ri   rJ   r   rC   deleted_status_iddistinctrE   lenr   joinr   rH   idr   r   )r/   rD   r'   rn   rN   q_pdar   r   course_rowsrQ   
course_idsr   r   rm   sqrV   s                   r    
home_stats.ProfessionalDocumentAssignmentClass.home_stats  s   6	Ho&C[)BGGMM"EFMM3CCsJE ~%H%T%TXZ%Z[!$U[[]!3"@JJaOPVVX 
 =GGH3CCsJ3EEJ   5@[Kq;;*#akk*KJ[":"#!GGMM,/T00;;|N V0::cA$66!;  ><#;#;s2w#FGB#s288:6# "" $*<(8(8+>	 ) \:  	H%#a&$GG	Hs7   EI+ 	I&I&6C/I+ &I+ +
J5J	J	Jr-   )r.   r   )r'   r   rC   r   rD   r   returnDict[str, Any])
r'   r   rC   r   rD   r   r:   zList[Dict[str, Any]]r   r   )rD   r   r'   Optional[int]r   r   )r'   r   rH   r   rF   r   r4   r   rD   r   rC   r   r   None)__name__
__module____qualname____firstlineno__r0   rW   r}   r   r   r   __static_attributes__ r2   r    r*   r*   *   s'   .Q .Q 	.Q
 .Q 
.Q`f: f: 	f:
 f: $f: 
f:X &*	F F #	F
 
F,6 #6 	6
 !6 6 '6 !6 
6x &*	@H @H #	@H
 
@H @Hr2   r*   N)r   zOptional[str]r   zOptional[date])r'   r   r   r   )__doc__
__future__r   r   r   typingr   r   r   r	   r
   
sqlalchemyr   r   sqlalchemy.ormr   #app.backend.classes.app_alert_classr   app.backend.db.modelsr   r   r   r   r!   r(   r*   r   r2   r    <module>r      sC    # # 3 3   " = jH jHr2   