
    i                         d dl mZmZmZmZm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eeeef      dee   fdZ G d d	      Zy
)    )OptionalAnyListDictUnion)Session)datetime)FolderModelDocumentModelBirthCertificateDocumentModelHealthEvaluationModelEvaluaResultReportModelperiod_yearreturnc                 F    | yt        |       j                         }|r|S dS )uN   Normaliza período escolar para la columna folders.period_year (string en BD).N)strstrip)r   ss     X/var/www/pie360backend.cl/public_html/app/backend/classes/student_document_file_class.py_folder_period_strr      s+    K A1t    c                      e Zd ZdefdZdedefdZ	 ddeded	ee	ee
f      defd
Zddee   dee   defdZ	 	 	 	 ddedede
dee   dee   dee   d	ee	ee
f      defdZddedee
   defdZ	 ddeded	ee	ee
f      defdZy)FolderClassdbc                     || _         y N)r   )selfr   s     r   __init__zFolderClass.__init__   s	    r   idr   c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|r|j                  t        |dd      t        |dd      |j                  |j                  |j                  t        |dd      t        |dd      xs d|j                  t        |dd      |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      d	S dd	S d
ddS # t        $ r}t        |      }d
|dcY d}~S d}~ww xY w)z1
        Obtiene un documento por su ID.
        	school_idN	course_id	detail_idprofessional_idr   r   %Y-%m-%d %H:%M:%Sr   r!   r"   
student_iddocument_id
version_idr#   r$   filer   
added_dateupdated_dateerrorzBNo se encontraron datos para el archivo de documento especificado.statusmessage)r   queryr
   filterr   firstgetattrr'   r(   r)   r*   r+   strftimer,   	Exceptionr   )r   r   document_fileeerror_messages        r   getzFolderClass.get   s=   	A GGMM+6=="$eg  '**!(T!J!(T!J"/":":#0#<#<"/":":!(T!J'.}>OQR'S'XWX)..#*=-#N\i\t\t-":":"C"CDW"Xz~`m`z`zM$>$>$G$GH[$\  AE  #*6z{{ 	AFM%-@@	As*   DD" D" D" "	E+E :E ENr'   r(   r   c                    	 | j                   j                  t              j                  t        j                  |k(  t        j
                  |k(  t        j                  j                  d            }t        |      }|"|j                  t        j                  |k(        }|j                  t        j                  j                               j                         }|D cg c]  }|j                  t        |dd      t        |dd      |j                  |j
                  |j                  t        |dd      t        |dd      xs d|j                  t        |dd      |j                   r|j                   j#                  d      nd|j$                  r|j$                  j#                  d      ndd	 c}S c c}w # t&        $ r}d
t)        |      dcY d}~S d}~ww xY w)u   
        Obtiene todos los archivos de documento para un estudiante y documento específico.
        Solo retorna documentos que tienen archivo (file no null).
        Si period_year está definido, solo versiones de ese año escolar.
        Nr!   r"   r#   r$   r   r   r%   r&   r-   r.   )r   r1   r
   r2   r'   r(   r*   isnotr   r   order_byr)   descallr   r4   r+   r5   r,   r6   r   )	r   r'   r(   r   qpydocument_filesdoc_filer8   s	            r   get_by_student_and_documentz'FolderClass.get_by_student_and_document8   s   !	k*11&&*4'';6  &&t,A
 $K0B~HH[44:;ZZ(>(>(C(C(EFJJLN" !/  #++!(;!E!(;!E"*"5"5#+#7#7"*"5"5!(;!E'.x9JA'N'SRS$MM#*8]D#IW_WjWj("5"5">">?R"Spt[c[p[pH$9$9$B$BCV$Wvz  $  	!q6 	s1   CF8 CF30F8 3F8 8	GGGGc                 J   	 | j                   j                  t              }|"|j                  t        j                  |k(        }|"|j                  t        j
                  |k(        }|j                  t        j                  j                               j                         }|D cg c]  }|j                  t        |dd      t        |dd      |j                  |j
                  |j                  t        |dd      t        |dd      xs d|j                  t        |dd      |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      ndd	 c}S c c}w # t         $ r}d
t#        |      dcY d}~S d}~ww xY w)zI
        Obtiene la lista de archivos de documentos almacenados.
        Nr!   r"   r#   r$   r   r   r%   r&   r-   r.   )r   r1   r
   r2   r'   r(   r=   r   r>   r?   r4   r)   r*   r+   r5   r,   r6   r   )r   r'   r(   r1   rB   rC   r8   s          r   get_allzFolderClass.get_allf   ss   !	GGMM+.E%[%;%;z%IJ&[%<%<%KL"^^KNN,?,?,ABFFHN" !/  #++!(;!E!(;!E"*"5"5#+#7#7"*"5"5!(;!E'.x9JA'N'SRS$MM#*8]D#IW_WjWj("5"5">">?R"Spt[c[p[pH$9$9$B$BCV$Wvz  $  	!q6 	s1   B&F (CE<9F <F 	F"
FF"F"	file_pathr!   r"   r$   c                 J	   |dn
t        |      }t        |      }		 |dk(  r| j                  j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  j                  d            }
|	"|
j                  t        j                  |	k(        }
|
j                         }|ry||_        |	|	|_
        t        j                         |_        | j                  j                          | j                  j!                  |       dd|j"                  |j$                  dS | j                  j                  t              j                  t        j                  |k(  t        j                  |k(        }|	"|j                  t        j                  |	k(        }|j'                  t        j$                  j)                               j                         }|ry||_        |	|	|_
        t        j                         |_        | j                  j                          | j                  j!                  |       dd|j"                  |j$                  dS t	        ||||dd|||	t        j                         t        j                         d      }| j                  j+                  |       | j                  j                          | j                  j!                  |       dd	|j"                  ddS | j                  j                  t              j                  t        j                  |k(  t        j                  |k(        }|	"|j                  t        j                  |	k(        }|j'                  t        j$                  j)                               j                         }|r|j$                  dz   }nd}t	        |||||d|||	t        j                         t        j                         d      }| j                  j+                  |       | j                  j                          | j                  j!                  |       dd	|j"                  |dS # t,        $ r2}| j                  j/                          d
t1        |      dcY d}~S d}~ww xY w)u<  
        Almacena un archivo de documento con control de versiones.
        Si professional_id no viene del frontend se usa 0.
        Para health evaluations (document_id = 4), actualiza el registro existente con file vacío,
        o actualiza la versión más reciente si no hay ninguno con file vacío.
        Nr      success-Archivo de documento actualizado exitosamente)r/   r0   r   r)      )r!   r"   r'   r(   r)   r#   r$   r*   r   r+   r,   deleted_datez(Archivo de documento creado exitosamenter-   r.   )intr   r   r1   r
   r2   r'   r(   r*   is_r   r3   r	   nowr,   commitrefreshr   r)   r=   r>   addr6   rollbackr   )r   r'   r(   rG   r!   r"   r$   r   pro_idrA   q_emptyfolder_without_fileq_lvlast_versionnew_document_filenew_version_idr8   s                    r   storezFolderClass.store   s     &-33G,C	a''--4;;**j8++{:$$((.
 >%nn[-D-D-JKG&-mmo#&/8',~:<+77?||~'4GGNN$GGOO$78 #,#R144&9&D&D	   77==5<<#..*<#//;>D ~#{{;+B+Bb+HI#'==1G1G1L1L1N#O#U#U#WL#,5)>79L44<LLN1(5 '0'V".//*6*A*A	   -8&/&/'1(3'(&*,2!*(*'/||~)1)--) $56((9: '0'Q"3"6"6*+	   ww}}[188**j8++{: >;;{'>'>"'DED#}}[-C-C-H-H-JKQQS  %1%<%<q%@N%&N %0'') +-"$*" "'||~!)!%%! -.  12 (I+.."0	   	GG!q6 	s3   D#Q'  D*Q' +BQ' EQ' '	R"0'RR"R"c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS |||_        t        j                         |_	        | j                   j                          | j                   j                  |       dd|j                  dS # t        $ r2}| j                   j                          dt        |      dcY d}~S d}~ww xY w)z>
        Actualiza un archivo de documento existente.
        r-   z"Archivo de documento no encontrador.   NrJ   rK   )r/   r0   r   )r   r1   r
   r2   r   r3   r*   r	   rP   r,   rQ   rR   r6   rT   r   )r   r   rG   r7   r8   s        r   updatezFolderClass.update$  s    	 GGMM+6=="$eg  !%C 
 $%.")1M&GGNNGGOOM* $J#&&   	GG!q6 	s%   AB= A&B= =	C8'C3-C83C8document_type_idc                 #   	 t        |      }g }g }| j                  j                  t        j                  t        j
                  t        j                        j                  t        j                  |k(        j                         }|D cg c]  }|j                   }	}|D ci c]  }|j                  | }
}|	sddd| ddg g dS |	D ]z  }|
j                  |      }|r|j
                  nd}d}|dk(  r| j                  j                  t              j                  t        j                  |k(        j                  t        j                  j                               j                         }d}|r| j                  j                  t              j                  t        j                  |k(  t        j                   |j                  k(  t        j"                  j%                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }|s| j                  j                  t              j                  t        j                  |k(  t        j*                  |k(  t        j"                  j%                  d      t        j,                  j/                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }n| j                  j                  t              j                  t        j                  |k(  t        j*                  |k(  t        j"                  j%                  d      t        j,                  j/                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }| j                  j                  t              j                  t        j                  |k(  t        j,                  j/                  d            j                         }|r|j
                  nd}|r~|j1                  |r|j                  n|j                  ||||r|j                  n|j                   |j"                  |j(                  ||r|j2                  nd|r'|j4                  r|j4                  j7                  d	      n(|j4                  r|j4                  j7                  d	      nd|r'|j8                  r|j8                  j7                  d	      n(|j8                  r|j8                  j7                  d	      ndd
       d}nk|dk(  r$| j                  j                  t:              j                  t:        j                  |k(        j                  t:        j                  j                               j                         }|
r| j                  j                  t              j                  t        j                  |k(  t        j                   |j                  k(  t        j"                  j%                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }|s| j                  j                  t              j                  t        j                  |k(  t        j*                  |k(  t        j"                  j%                  d      t        j,                  j/                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }| j                  j                  t              j                  t        j                  |k(  t        j,                  j/                  d            j                         }|r|j
                  nd}|ra|j1                  i d|j                  d|j                  d|d|d|j                  d|j"                  d|j(                  d|d|j<                  d|j>                  d|j@                  r|j@                  j7                  d      ndd|jB                  d|jD                  r|jD                  j7                  d      ndd|jF                  r|jF                  j7                  d      ndd|jH                  d|j4                  r|j4                  j7                  d	      ndd|j8                  r|j8                  j7                  d	      nd       d}nA|d k(  r| j                  j                  tJ              j                  tJ        j                  |k(        j                  tJ        j                  j                               j                         }d}|r| j                  j                  t              j                  t        j                  |k(  t        j                   |j                  k(  t        j"                  j%                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }|s|r| j                  j                  t              j                  t        j                  |k(  t        j*                  |k(  t        j"                  j%                  d      t        j,                  j/                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }|s| j                  j                  t              j                  t        j                  |k(  t        j*                  |k(  t        j"                  j%                  d      t        j,                  j/                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }| j                  j                  t              j                  t        j                  |k(  t        j,                  j/                  d            j                         }|r|j
                  nd!}|r|j1                  |r|j                  n|j                  ||||r|j                  n|j                   |r|jL                  xs d"jO                         nd|j"                  |j(                  ||j4                  r|j4                  j7                  d	      nd|j8                  r|j8                  j7                  d	      ndd#       d}n| j                  j                  t        j                  t        jP                  t        jR                  t        j                  t        j*                  t        j(                  t        j                   t        j"                  t        j4                  t        j8                  t        j                  t        j
                  jU                  d            jW                  t        t        j*                  t        j                  k(        j                  t        j                  |k(  t        j*                  |k(  t        j,                  j/                  d      t        j"                  j%                  d            }|"|j                  t        j&                  |k(        }|j                  t        j(                  j                               j                         }|r|d   }|j1                  |j                  tY        |d$d      tY        |d%d      |j                  |j*                  |j                  |j(                  |j                   |j"                  |jZ                  |j4                  r|j4                  j7                  d	      nd|j8                  r|j8                  j7                  d	      ndd&       d}|r^|j1                  |||xs d'| |d(       } |j]                  d) *       |j]                  d+ *       dt_        |      dkD  d,t_        |       d-| d.t_        |       t_        |      t_        |      ||d}|S c c}w c c}w # t`        $ r}d/dtc        |      ddd0cY d}~S d}~ww xY w)1uJ  
        Verifica si un estudiante ya tiene documentos de un tipo específico.
        Busca TODOS los document_id que pertenecen al document_type_id solicitado en la tabla documents,
        y luego busca en cada tabla correspondiente:
        - document_id = 1: busca en birth_certificate_documents
        - document_id = 4: busca en health_evaluations
        - Otros: busca en folders
        Si period_year está definido, las búsquedas en folders se filtran por ese año.
        Retorna todos los documentos encontrados del tipo solicitado y también los que NO tiene.
        rJ   Fz%No se encontraron documentos de tipo r   )r/   existsr0   totaltotal_missingdatamissingNrL   zCertificado de Nacimientor%   )r   r'   r(   r_   r#   r*   r)   document_namebirth_certificater+   r,   TrI   u   Evaluación de Saludr   r'   r(   r_   r#   r*   r)   rf   	full_nameidentification_number	born_datez%Y-%m-%dageevaluation_datereevaluation_date	diagnosisr+   r,   *   z Informes Resultado Prueba Evalua )r   r'   r(   r_   r#   titler*   r)   rf   r+   r,   r!   r"   )r   r!   r"   r'   r(   r_   r)   r#   r*   rf   r+   r,   z
Documento )r(   r_   rf   r'   c                 &    | j                  dd      S Nr(   r   r:   xs    r   <lambda>z6FolderClass.check_document_existence.<locals>.<lambda>x  s    QUU=!-D r   )keyc                 &    | j                  dd      S rs   rt   ru   s    r   rw   z6FolderClass.check_document_existence.<locals>.<lambda>y  s    }a1H r   zEl estudiante tiene z documento(s) de tipo z
 y faltan r-   )r/   ra   r0   rb   rd   )2r   r   r1   r   r   documentr_   r2   r?   r:   r   r'   r=   r>   r3   r
   r#   r*   r<   r   r)   r(   rM   rO   appendrg   r+   r5   r,   r   rh   ri   rj   rk   rl   rm   rn   r   rq   r   r!   r"   labeljoinr4   rf   sortlenr6   r   )r   r'   r_   r   rA   all_documentsmissing_documentsdocument_recordsdocdocument_id_listdocument_info_dictr(   doc_inforf   found
birth_certfolder_recordfqfq_fallbackhealth_evalhqhq_fallbackevalua_reporthq_fbfbfolder_qfolder_recordsresponser8   s                                r   check_document_existencez$FolderClass.check_document_existenceH  s    w	#K0BM "  $ww}}  &&..  f..2BBce  3CC3CC9I!J##&&#+!J!J#'#!FGWFXY%&!   0 -11+>5= 1 14 !#!%/L!M!T!T5@@JN"h<??DDFG  %)M!!WW]];7>>'22j@'11Z]]B',,2248
 >!#;+B+Bb+H!IB(*K4J4J4O4O4Q(R(X(X(Z,*.''--*D*K*K + 6 6* D + 7 7; F + 0 0 6 6t < + 8 8 < <T B	+K  "~.9.@.@AXAX\^A^._,7,@,@AWAWA\A\A^,_,e,e,gM '+ggmmK&@&G&G'22j@'33{B',,2248'4488>	' >*5*<*<[=T=TXZ=Z*[K(3(<(<[=S=S=X=X=Z([(a(a(c  $ww}}];BB%((K7%2266t<  eg  :BH$5$5GbM %%,,3=*--=CSCS*4+60@:D-JaJa$1$6$6*7*B*B-:Q[1M1Mae $.*2G2G !+ 5 5 > >?R S[h[s[s!9!9!B!BCV!Wy} $.*2I2I !+ 7 7 @ @AT U]j]w]w!;!;!D!DEX!Y  ~B%. * !% !A%"&''--0E"F"M"M-88JF#h477<<>?   #!WW]];7>>'22j@'11[^^C',,2248
 >!#;+B+Bb+H!IB(*K4J4J4O4O4Q(R(X(X(Z,*.''--*D*K*K + 6 6* D + 7 7; F + 0 0 6 6t < + 8 8 < <T B	+K  "~.9.@.@AXAX\^A^._,7,@,@AWAWA\A\A^,_,e,e,gM $(77==#?#F#F),,;)66::4@$  %' ! >F(9(9Ka ))00 2 $knn2 ,k.D.D2 !.{2 !34D	2
 !,[^^2 !'(:(:2 !-m.F.F2 !02 !,[-B-B2 !89Z9Z2 !,[f[p[p[-B-B-K-KJ-Wvz2 !&{2 !2gr  hC  hC;3N3N3W3WXb3c  IM2 !4kv  lI  lI[5R5R5[5[\f5g  OS2 !,[-B-B2  !-fqf|f|k.D.D.M.MNa.b  CG!2" +fqf~f~K,D,D,M,MNa,b  EI#2 & !% !B&&=> 7 B Bj PQ!"9"<"<"A"A"CD	 " %)M$!WW]];7>>'22j@'11]5E5EE',,2248
 >!#;+B+Bb+H!IB(*K4J4J4O4O4Q(R(X(X(Z(] $k : A A'22j@'33{B',,2248'4488>	! >$)LL1H1HB1N$OE(-{7M7M7R7R7T(U([([(](!WW]];7>>'22j@'33{B',,2248'4488>	 >!#;+B+Bb+H!IB(*K4J4J4O4O4Q(R(X(X(Z#ww}}];BB%((K7%2266t<  eg  :BH$5$5GiM$%,,:Gm&6&6]M]M].8/:4DAN]-=-=TaTkTkP]-*=*=*C)J)J)Lcg(5(:(:.;.F.F1>#0#;#; /<.F.F.O.OPc.d%)#0#=#= 1>0J0J0S0STg0h%)& !%  $ww}}##--#--#..#//#..#--#((#..#00%66%..44_E  d%#//=3C3CC f#..*<#//;>%2266t<#((..t4	! , ~#+??;3J3Jb3P#Q%-%6%6{7M7M7R7R7T%U%Y%Y%[N &(6q(9%,,"/"2"2)0T)R)0T)R*7*B*B+8+D+D0=0N0N*7*B*B)6)@)@$1$6$6-:-H-Hdqd|d|-*B*B*K*KL_*`  CGhu  iC  iCM,F,F,O,OPc,d  IM.  !% %,,'2,<)6)TJ{m:T&0	. uD #DE""'H"I $m,q01#m2D1EE[\l[mmwx{  }N  yO  xP  Q]+!$%6!7%,H O  D!J@	  	!q6 	s]   BAF= 
AF3AF= #AF87AF= AAAF= D(B
AF= F3
AF= F=	AG!GAGGAG!GAG!r   )NN)NNNN)__name__
__module____qualname__r   r   rN   r   r:   r   r   r   rD   rF   r\   r^   r    r   r   r   r      sl   7 Ac Ac AF 26	,, , eCHo.	,
 
,\%(3- %Xc] %^a %X $(#')-15UU U 	U
 C=U C=U "#U eCHo.U 
Un" "# "# "P 26	GG G eCHo.	G
 
Gr   r   N)typingr   r   r   r   r   sqlalchemy.ormr   r	   app.backend.db.modelsr
   r   r   r   r   rN   r   r   r   r   r   r   <module>r      sK    3 3 "  HU38_$= (3- z	 z	r   