
    ξi2                        S SK Jr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  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKrS SKr\" SS/S9r\R9                  S5      \" SSSSS9\" \5      4S\S\S\\   S\4S jj5       r\R?                  S5      \" S5      \" S5      \" S5      \" S5      \" SSSSS9\" \5      4S\S\S\S\\   S\\   S \\   S\\   S\4S! jj5       r \R9                  S"5      \" SSSS#S9\" \5      4S\S\S\\   S\4S$ jj5       r!\R9                  S%5      \" \5      4S&\S\4S' jj5       r"g)(    )	APIRouterstatusDependsQuery
UploadFileFile)JSONResponseFileResponse)FolderClass)StudentClass)	FileClass)get_db)Optional)Session)Path)datetimeNz/foldersFolders)prefixtagsz7/checkDocumentExistence/{student_id}/{document_type_id}i  i4  u7   Año del período escolar (filtra registros en folders))geledescription
student_iddocument_type_idperiod_yeardbc                   #     [        U5      nUR                  XU5      nUR                  S5      S:X  a.  [        [        R
                  SUR                  SS5      SS/ S.S	9$ UR                  S
5      nUc  / nO![        U[        5      (       d  U(       a  U/O/ nUR                  S5      nUc  / nO![        U[        5      (       d  U(       a  U/O/ n[        [        R                  SUR                  S5      UR                  S5      UR                  SS5      UR                  SS5      UUS.S	9$ ! [         a4  n[        [        R
                  SS[        U5       3SS/ S.S	9s SnA$ SnAff = f7f)u  
Verifica si un estudiante ya tiene documentos de un tipo específico.
Busca directamente en la tabla correspondiente según el document_type_id:
- document_type_id = 1: busca en birth_certificate_documents
- document_type_id = 4: busca en health_evaluations
- Otros: busca en folders filtrando por document_type_id
Retorna información sobre la existencia del documento filtrado por student_id y document_type_id.
r   error  messagez*Error verificando existencia del documentoFr   )r   r    existstotaldatastatus_codecontentr#   Nmissing   r!   r"   total_missing)r   r    r!   r"   r)   r#   r'   z,Error verificando existencia del documento: )r   check_document_existencegetr	   r   HTTP_500_INTERNAL_SERVER_ERROR
isinstancelistHTTP_200_OK	Exceptionstr)	r   r   r   r   folder_serviceresultr#   r'   es	            MC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routers\folders.pycheckDocumentExistencer6      sp    (5
$R88Wbc::h7*"AA!%zz)5ab#	 	 zz&!<DD$''!D6rD **Y'?GGT**#*wiG**!::i0 **X.GQ/!'OQ!?"
 	
  

==!!McRSfXV#	
 		


sB   E3AD2 #E3$CD2 1E32
E0<)E+%E0&E3+E00E3z"/upload/{student_id}/{document_id}.u   Año del período escolardocument_idfile	school_id	course_idprofessional_idc                   #     [        U5      nUR                  U 5      n	[        U	[        5      (       ao  U	R                  S5      (       d  U	R                  S5      S:X  aD  [	        [
        R                  SU	R                  S5      =(       d    U	R                  SS5      SS.S9$ S	S
KJn
  UR                  U
5      R                  U
R                  U:H  U
R                  R                  S5      5      R                  5       nU(       d   [	        [
        R                  SSU S3SS.S9$ UR                  nUR                   (       a-  [#        UR                   5      R$                  R'                  5       OSn[(        R*                  " 5       R-                  S5      nU  SU SU SU U 3n[/        U5      nSU 3n UR1                  UU5        [9        U5      nUR;                  U UUUUUUb  [7        U5      OSS9n[        U[        5      (       aS  UR                  S5      S:X  a>   UR=                  U5        [	        [
        R4                  SUR                  SS5      SS.S9$ [	        [
        R>                  SSUR                  S5      UR                  S5      U UUUUR                  U5      UR                   S.S.S9$ ! [2         a2  n[	        [
        R4                  SS[7        U5       3SS.S9s SnA$ SnAff = f!    N= f! [2         aB  nURA                  5         [	        [
        R4                  SS[7        U5       3SS.S9s SnA$ SnAff = f7f)u   
Sube un archivo de documento para un estudiante y documento específico en la tabla folders.
Maneja el control de versiones automáticamente.
r   r     r    zEstudiante no encontradoNr   r    r#   r$   r   )DocumentModelzDocumento con id z no encontrado z%Y%m%d%H%M%S_zsystem/folders/r   zError subiendo archivo: )r   r7   	file_pathr9   r:   r;   r   z1Error guardando registro del archivo de documento   z(Archivo de documento subido exitosamenteid
version_id)rD   rE   r   r7   filenamerB   file_urloriginal_filename)!r   r+   r-   dictr	   r   HTTP_404_NOT_FOUNDapp.backend.db.modelsr?   queryfilterrD   deleted_dateis_firstr   rF   r   suffixlowerr   nowstrftimer   uploadr0   r,   r1   r   storedeleteHTTP_201_CREATEDrollback)r   r7   r8   r9   r:   r;   r   r   student_servicestudent_resultr?   document_infor   file_extension	date_hourunique_filenamefile_serviceremote_pathupload_errorr2   store_resultr4   s                         r5   upload_documentrd   ^   s^    (r
&r*(,,Z8nd++1C1CG1L1LP^PbPbckPlpwPw"55!-11':wn>P>PQZ\v>w   	8/66+&&**40
 %' 	
 "55!!2;-~N   )99 @D}}dmm,3399;RT LLN++N;	 (L+a8H7I9+VdUef !}''89	k2 %R%++!#%+,7,CK( , 
 lD))l.>.>x.HG.S##K0  "AA!+//	;no   //E&**40"."2"2<"@",#. /!, , 0 0 =)-	
 	
K  	"AA!!9#l:K9LM  	48  	

==5c!fX>
 	
	
s   MBL  #M$BL  %M&BL  6J: AL  !K9 2+L  MAL  9M:
K6'K1+K6,L  0M1K66L  9K=;L   
M
7MMMMMz /list/{student_id}/{document_id}u6   Año del período escolar (solo versiones de ese año)c           	        #     [        U5      nUR                  XUb  [        U5      OSS9n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS5      / S.S	9$ [        [        R                  S
S[        U5       S3[        U5      US.S	9$ ! [         a2  n[        [        R                  SS[        U5       3/ S.S	9s SnA$ SnAff = f7f)z
Lista los registros de folders filtrados por student_id y document_id.
Retorna todos los registros ordenados por version_id descendente.
N)r   r   r   r   r    zError listando documentosr>   r$   r(   zSe encontraron z documento(s))r   r    r"   r#   zError listando documentos: )r   get_by_student_and_documentr1   r-   rI   r+   r	   r   r,   r/   lenr0   )r   r7   r   r   r2   r3   r4   s          r5   list_foldersrh      s     "
$R;;[E\[1Abf < 
 fd##

8(<(G"AA!%zz)5PQ  **,S[MGV	
 	
  
==8QA
 	

sA   C5A>B6 C52B6 5C56
C2 'C-'C2(C5-C22C5z/download/{id}rD   c           	      t  #     [        U5      nUR                  U 5      n[        U[        5      (       aA  UR                  S5      S:X  a,  [	        [
        R                  SUR                  SS5      SS.S9$ UR                  S	5      nU(       d  [	        [
        R                  SS
SS.S9$ [        U5      R                  n[        S5      U-  nUR                  5       (       dW  [        S5      UR                  S	5      -  nUR                  5       (       a  UnO"[	        [
        R                  SSU SU 3SS.S9$ [        R                  " [        U5      5      u  pxU(       d  SnUn	[        [        U5      U	US9$ ! [         a2  n
[	        [
        R                  SS[        U
5       3SS.S9s Sn
A
$ Sn
A
ff = f7f)z]
Descarga un documento de folders por su ID.
El archivo debe estar en files/system/students/
r   r   r=   r    zDocumento no encontradoNr>   r$   r8   z%El registro no tiene archivo asociadozfiles/system/studentszArchivo no encontrado: z. Buscando en: zapplication/octet-stream)pathrF   
media_typer   zError descargando archivo: )r   r+   r-   rI   r	   r   rJ   r   namer!   	mimetypes
guess_typer1   r
   r0   r,   )rD   r   r2   r3   rF   rB   file_path_altrk   rA   download_filenamer4   s              r5   download_documentrq     s    E
$R##B'fd##

8(<(G"55!%zz)5NO   ::f%"55!F   >&& 01H<	!! !89FJJv<NNM##%%)	# & 9 9"%%<XJoV_U`#a $  ",,S^<
3J %Y&!
 	
  
==8QA
 	

sZ   F8A1E9 5F863E9 )F8*BE9 8F89?E9 8F89
F5'F0*F5+F80F55F8)#fastapir   r   r   r   r   r   fastapi.responsesr	   r
   /app.backend.classes.student_document_file_classr   !app.backend.classes.student_classr   app.backend.classes.files_classr   app.backend.db.databaser   typingr   sqlalchemy.ormr   pathlibr   r   uuidrm   foldersr+   intr6   postrd   rh   rq        r5   <module>r      s   G G 8 G : 5 *  "    


 	FG "'M	" &/H
H
H
 #H
 	H
 HH
T 	23 Cy$T{$T{%*4[!&/	" &/E
E
E
 E
 }	E

 }E
 c]E
 #E
 	E
 4E
N 	/0 "'L	" &/1
1
1
 #1
 	1
 11
f 	 &/M
M
M
 M
r   