
    siT                     `    S SK JrJr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5      rg)    )OptionalAnyListDict)Session)datetime)FolderModelDocumentModelBirthCertificateDocumentModelHealthEvaluationModelc                       \ rS rSrS\4S jrS\S\4S jrS\S\S\4S	 jr	SS\
\   S\
\   S\4S jjrS\S\S\S\4S jrSS\S\
\   S\4S jjrS\S\S\4S jrSrg
)FolderClass   dbc                     Xl         g Nr   )selfr   s     aC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\student_document_file_class.py__init__FolderClass.__init__   s        idreturnc           	      0    U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a  UR                  UR                  UR                  UR                  UR                  UR                  (       a  UR                  R                  S5      OSUR                  (       a  UR                  R                  S5      S.$ SS.$ SSS.$ ! [         a  n[        U5      nSUS.s SnA$ SnAff = f)z!
Obtiene un documento por su ID.
%Y-%m-%d %H:%M:%SNr   
student_iddocument_id
version_idfile
added_dateupdated_dateerrorzBNo se encontraron datos para el archivo de documento especificado.statusmessage)r   queryr	   filterr   firstr   r   r    r!   r"   strftimer#   	Exceptionstr)r   r   document_fileeerror_messages        r   getFolderClass.get   s    	A GGMM+6=="$eg  '**"/":":#0#<#<"/":":)..\i\t\t-":":"C"CDW"Xz~`m`z`zM$>$>$G$GH[$\  AE  #*6z{{ 	AFM%-@@	As*   C%C1 (C1 ,C1 1
D;D
DDr   r   c                     U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  [        R                  R                  S5      5      R                  [        R                  R                  5       5      R                  5       nU Vs/ s H  nUR                  UR                  UR
                  UR                  UR                  UR                  UR                  (       a  UR                  R                  S5      OSUR                   (       a  UR                   R                  S5      OSS.PM     sn$ s  snf ! ["         a  nS[%        U5      S.s SnA$ SnAff = f)u   
Obtiene todos los archivos de documento para un estudiante y documento específico.
Solo retorna documentos que tienen archivo (file no null).
Nr   )r   r   r   r    	detail_idr!   r"   r#   r$   r%   )r   r(   r	   r)   r   r   r!   isnotorder_byr    descallr   r4   r"   r+   r#   r,   r-   )r   r   r   document_filesdoc_filer/   s         r   get_by_student_and_document'FolderClass.get_by_student_and_document%   s=   
	!WW]];7>>&&*4'';6  &&t, h{--2245cce	 " !/ !/H #++"*"5"5#+#7#7"*"5"5!)!3!3$MMW_WjWj("5"5">">?R"Spt[c[p[pH$9$9$B$BCV$Wvz	 !/    	!q6 	s1   B,E .B)EE E 
F)E<6F<FNc                     U R                   R                  [        5      nUb"  UR                  [        R                  U:H  5      nUb"  UR                  [        R
                  U:H  5      nUR                  [        R                  R                  5       5      R                  5       nU Vs/ s H  nUR                  UR                  UR
                  UR                  UR                  UR                  (       a  UR                  R                  S5      OSUR                  (       a  UR                  R                  S5      OSS.PM     sn$ s  snf ! [         a  nS[!        U5      S.s SnA$ SnAff = f)z9
Obtiene la lista de archivos de documentos almacenados.
Nr   r   r$   r%   )r   r(   r	   r)   r   r   r6   r   r7   r8   r    r!   r"   r+   r#   r,   r-   )r   r   r   r(   r9   r:   r/   s          r   get_allFolderClass.get_allE   s7   	GGMM+.E%[%;%;z%IJ&[%<%<%KL"^^KNN,?,?,ABFFHN !/ !/H #++"*"5"5#+#7#7"*"5"5$MMW_WjWj("5"5">">?R"Spt[c[p[pH$9$9$B$BCV$Wvz !/    	!q6 	s1   B(E *BEE E 
E2E-'E2-E2	file_pathc           	          US:X  Ga  U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  [        R                  R                  S5      5      R                  5       nU(       ap  X4l        [        R                  " 5       Ul        U R                   R                  5         U R                   R                  U5        SSUR                  UR                  S.$ U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  5      R!                  [        R                  R#                  5       5      R                  5       nU(       ap  X5l        [        R                  " 5       Ul        U R                   R                  5         U R                   R                  U5        SSUR                  UR                  S.$ [        UUSU[        R                  " 5       [        R                  " 5       S9nU R                   R%                  U5        U R                   R                  5         U R                   R                  U5        SSUR                  SS.$ U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  5      R!                  [        R                  R#                  5       5      R                  5       nU(       a  UR                  S-   nOSn[        UUUU[        R                  " 5       [        R                  " 5       S9nU R                   R%                  U5        U R                   R                  5         U R                   R                  U5        SSUR                  US.$ ! [&         a2  nU R                   R)                  5         S	[+        U5      S
.s SnA$ SnAff = f)u   
Almacena un archivo de documento con control de versiones.
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.
   Nsuccess-Archivo de documento actualizado exitosamente)r&   r'   r   r       )r   r   r    r!   r"   r#   z(Archivo de documento creado exitosamenter$   r%   )r   r(   r	   r)   r   r   r!   is_r*   r   nowr#   commitrefreshr   r    r6   r7   addr,   rollbackr-   )	r   r   r   r@   folder_without_filelast_versionnew_document_filenew_version_idr/   s	            r   storeFolderClass.storeg   s#   j	a&*ggmmK&@&G&G**j8++{:$$((.' %'	 $ '/8,7?||~'4GGNN$GGOO$78 #,#R144&9&D&D	  $(77==#=#D#D#..*<#//;>$ h{55::<=eeg !
 $,5)4<LLN1(5 '0'V".//*6*A*A	   -8'1(3'(!*'/||~)1-) $56((9: '0'Q"3"6"6*+	    $ww}}[9@@**j8++{:  (;116689%%'   %1%<%<q%@N%&N %0) +-"'||~!)%! -.  12 (I+.."0	   	GG!q6 	s3   C:O =D O >BO D7O 
P'P<PPc                     U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  SSS.$ Ub  X#l        [        R                  " 5       Ul	        U R                   R                  5         U R                   R                  U5        SSUR                  S.$ ! [         a2  nU R                   R                  5         S[        U5      S.s SnA$ SnAff = f)z.
Actualiza un archivo de documento existente.
r$   z"Archivo de documento no encontrador%   NrC   rD   )r&   r'   r   )r   r(   r	   r)   r   r*   r!   r   rG   r#   rH   rI   r,   rK   r-   )r   r   r@   r.   r/   s        r   updateFolderClass.update   s    	 GGMM+6=="$eg  !%C 
 $%.")1M&GGNNGGOOM* $J#&&   	GG!q6 	s%   AC A'C 
C?'C:4C?:C?document_type_idc                     / n/ nU R                   R                  [        R                  [        R                  [        R
                  5      R                  [        R
                  U:H  5      R                  5       nU Vs/ s H  ofR                  PM     nnU Vs0 s H  ofR                  U_M     nnU(       d  SSSU 3SS/ / S.$ U GH  n	UR                  U	5      n
U
(       a  U
R                  OSnSnU	S:X  Ga  U R                   R                  [        5      R                  [        R                  U:H  5      R                  [        R                  R                  5       5      R                  5       nU(       Ga  U R                   R                  [        5      R                  [        R                  U:H  [        R                  UR                  :H  [        R                   R#                  S5      5      R                  [        R$                  R                  5       5      R                  5       nU R                   R                  [        5      R                  [        R                  U	:H  [        R&                  R)                  S5      5      R                  5       n
U
(       a  U
R                  OSnUR+                  UR                  UR                  U	UUR                  UR,                  (       a  UR,                  OU(       a  UR                   OSU(       a  UR$                  OSUUR,                  UR.                  (       a  UR.                  R1                  S	5      OSUR2                  (       a  UR2                  R1                  S	5      OSS
.5        SnGOU	S:X  GaB  U R                   R                  [4        5      R                  [4        R                  U:H  5      R                  [4        R                  R                  5       5      R                  5       nU(       Ga  U R                   R                  [        5      R                  [        R                  U:H  [        R                  UR                  :H  [        R                   R#                  S5      5      R                  [        R$                  R                  5       5      R                  5       nU R                   R                  [        5      R                  [        R                  U	:H  [        R&                  R)                  S5      5      R                  5       n
U
(       a  U
R                  OSnUR+                  0 SUR                  _SUR                  _SU	_SU_SUR                  _SU(       a  UR                   OS_SU(       a  UR$                  OS_SU_SUR6                  _SUR8                  _SUR:                  (       a  UR:                  R1                  S5      OS_SUR<                  _SUR>                  (       a  UR>                  R1                  S5      OS_SUR@                  (       a  UR@                  R1                  S5      OS_SURB                  _SUR.                  (       a  UR.                  R1                  S	5      OS_SUR2                  (       a  UR2                  R1                  S	5      OS_5        SnGOkU R                   R                  [        R                  [        R                  [        RD                  [        R$                  [        R                  [        R                   [        R.                  [        R2                  [        R
                  [        R                  RG                  S5      5
      RI                  [        [        RD                  [        R                  :H  5      R                  [        R                  U:H  [        RD                  U	:H  [        R&                  R)                  S5      [        R                   R#                  S5      5      R                  [        R$                  R                  5       5      R                  5       nU(       a  US   nUR+                  UR                  UR                  URD                  UR
                  UR$                  UR                  UR                   URJ                  UR.                  (       a  UR.                  R1                  S	5      OSUR2                  (       a  UR2                  R1                  S	5      OSS .
5        SnU(       a  GM  UR+                  U	UU=(       d    S!U	 3US".5        GM     URM                  S# S$9  URM                  S% S$9  S[O        U5      S:  S&[O        U5       S'U S([O        U5       3[O        U5      [O        U5      UUS.nU$ s  snf s  snf ! [P         a  nS)S[S        U5      SSS*.s SnA$ SnAff = f)+u  
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
Retorna todos los documentos encontrados del tipo solicitado y también los que NO tiene.
rC   Fz%No se encontraron documentos de tipo r   )r&   existsr'   totaltotal_missingdatamissingNrE   zCertificado de Nacimientor   )r   r   r   rU   r4   r!   r    document_namebirth_certificater"   r#   TrB   u   Evaluación de Saludr   r   r   rU   r4   r!   r    r\   	full_nameidentification_number	born_datez%Y-%m-%dageevaluation_datereevaluation_date	diagnosisr"   r#   )
r   r   r   rU   r    r4   r!   r\   r"   r#   z
Documento )r   rU   r\   r   c                 &    U R                  SS5      $ Nr   r   r1   xs    r   <lambda>6FolderClass.check_document_existence.<locals>.<lambda>  s    QUU=!-Dr   )keyc                 &    U R                  SS5      $ rf   rg   rh   s    r   rj   rk     s    }a1Hr   zEl estudiante tiene z documento(s) de tipo z
 y faltan r$   )r&   rW   r'   rX   rZ   )*r   r(   r
   r   documentrU   r)   r8   r1   r   r   r6   r7   r*   r	   r4   r!   r5   r    deleted_daterF   appendr]   r"   r+   r#   r   r^   r_   r`   ra   rb   rc   rd   r   labeljoinr\   sortlenr,   r-   )r   r   rU   all_documentsmissing_documentsdocument_recordsdocdocument_id_listdocument_info_dictr   doc_infor\   found
birth_certfolder_recordhealth_evalfolder_recordsresponser/   s                      r   check_document_existence$FolderClass.check_document_existence   s   {	M "  $ww}}  &&..  f..2BBce  3CC2B32BC9I!J9I#&&#+9I!J#'#!FGWFXY%&!   0-11+>5= 1 14 !#!%/L!M!T!T5@@JN"h<??DDFG  "(,k(B(I(I'22j@'11Z]]B',,2248) #(;#9#9#>#>#@A%%'	 & $(77==#?#F#F),,;)66::4@$  %' ! >F(9(9Kf%,,",--*4*?*?+60@)3DND`D`J$@$@  ~Kgtgygy  QUFS-*B*BY]-:1;1M1Makavav**?*?*H*HI\*]  }Aeoe|e|J,C,C,L,LM`,a  CG.  !% !A%"&''--0E"F"M"M-88JF#h477<<>?   #(,k(B(I(I'22j@'11[^^C',,2248) #(;#9#9#>#>#@A%%'	 & $(77==#?#F#F),,;)66::4@$  %' ! >F(9(9Ka%,, . +...(+*@*@. *;. /0@	.
 (. #-M$6$6T. )m-*B*BY]. ,]. ()>)>. 4[5V5V. (WbWlWl)>)>)G)G
)Srv. ";??. .cnc~c~{/J/J/S/ST^/_  EI. 0gr  hE  hE1N1N1W1WXb1c  KO. ()>)>.  )bmbxbx+*@*@*I*IJ]*^  C!." +fqf~f~K,D,D,M,MNa,b  EI#. & !% &*WW]]##..#//#..#--#((#..#00%66%..44_E& d%#//=3C3CC f#..*<#//;>%2266t<#((..t4	
 h#..335ce+ #0 &(6q(9%,,"/"2"2*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.  !% u%,,'2,<)6)TJ{m:T&0	.   0N #DE""'H"I $m,q01#m2D1EE[\l[mmwx{  }N  yO  xP  Q]+!$%6!7%,H OI  D!JJ  	!q6 	sJ   A=g% ?gg% g 0g% bg% Bg% 
g% %
h
/h?h
h
r   )NNr   )__name__
__module____qualname____firstlineno__r   r   intr   r1   r;   r   r>   r-   rP   rS   r   __static_attributes__ r   r   r   r      s    7 Ac Ac A4c  PS @ (3-  Xc]  ^a  Dp p# p# p# pd" "# "# "HE3 E# ERU Er   r   N)typingr   r   r   r   sqlalchemy.ormr   r   app.backend.db.modelsr	   r
   r   r   r   r   r   r   <module>r      s#    , , "  r r{ {r   