
    &6j1c                        S SK JrJrJrJr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Jr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J r J!r!  S SK"J#r#  S SK$J$r$  \" SS/S9r%\%RM                  S5      \" SSS9\" SSS9\" S SS9\" SSS9\" \5      \" \5      4S\'S\'S\
\'   S\
\'   S\S\4S  jj5       r(\%RM                  S!5      \" S"S#S9\" S S$S9\" S%SS9\" S"S&S9\" S"S'S9\" S"S(S9\" S"S)S9\" \5      \" \5      4	S\
\'   S\
\'   S\
\'   S*\
\)   S+\
\)   S,\
\)   S-\
\'   S\S\4S. jj5       r*\%RM                  S/5      \" \5      \" \5      4S\S\4S0 jj5       r+\%RY                  S15      \" \5      \" \5      4S2\S\S\4S3 jj5       r-\%RM                  S45      \" S"S5S9\" \5      \" \5      4S\
\'   S\S\4S6 jj5       r.\%RM                  S75      \" \5      \" \5      4S\S\4S8 jj5       r/\%RY                  S95      \" \5      \" \5      4S\S\4S: jj5       r0\%RY                  S;5      \" S"S<S=S>S?9\" \5      \" \5      4S-\
\'   S\S\4S@ jj5       r1\%RY                  SA5      \" \5      \" \5      4S2\S\S\4SB jj5       r2\%RM                  SC5      \" \5      \" \5      4SD\'S\S\4SE jj5       r3\%Ri                  SF5      \" \5      \" \5      4SD\'S2\S\S\4SG jj5       r5\%Rm                  SH5      \" \5      \" \5      4SD\'S\S\4SI jj5       r6\%RY                  SJ5      \" S5      \" \5      \" \5      4SK\'SL\S\S\4SM jj5       r7g")N    )	APIRouterDependsstatus
UploadFileFileQuery)JSONResponse)Optional)get_db)Session)	UserLoginStudentListStoreStudentUpdateStudent)StudentClass)get_current_active_user)SchoolClass)InspectionApiClient)_normalize_school_id)CourseModelSchoolModelPlatformStatusModel)Path)datetimez	/studentsStudents)prefixtagsz/by_school_course_with_sen.zID del establecimiento)descriptionzID del cursou   Página (0 = sin paginación)d   u   Registros por página	school_id	course_idpageper_pagesession_userdbc           	         [        U5      R                  U UU=(       d    SU(       a  US:  a  UOSS9n[        U[        5      (       a  UR	                  S5      S:X  a  [        SUR	                  S5      =(       d    S;   a  [        R                  O[        R                  SUR	                  S5      =(       d    S;   a  S	OS
UR	                  SS5      UR	                  S/ 5      S.S9$ [        [        R                  SSUS.S9$ )zuLista estudiantes con NEE o NEET (tipo 1 o 2), ordenados por nombre de la NEE/NEET y luego por nombre del estudiante.r   r   )r    r!   r"   items_per_pager   error
requeridosmessage     Errordatar   r*   r/   status_codecontent   OK)
r   get_by_school_course_with_sen
isinstancedictgetr	   r   HTTP_400_BAD_REQUESTHTTP_500_INTERNAL_SERVER_ERRORHTTP_200_OK)r    r!   r"   r#   r$   r%   results          MC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routes\students.pylist_by_school_course_with_senr?      s    ";;YQ#+1x#	 < F &$FJJx$8G$C7C

S\H]Hcac7d33jp  kP  kP&2vzz)7L7RPR&SsY\ioisist}  @G  jH  RX  R\  R\  ]c  eg  Rh  i
 	
 &&4@     z/listNz,Filtrar por curso (-1 o omitir = no filtrar)u   Página (0-based)   zFiltrar por RUTzFiltrar por nombresu&   Filtrar por número de identificaciónu   Filtrar por año (ej. 2026)rutnamesidentification_numberperiod_yearc	                 
   U(       a  UR                   OSn	U(       a  UR                  OSn
U	(       aX  U
(       dQ  [        U5      R                  SU	S9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      n
Uc  SOUnUc  SOUn[        U5      R                  UUU
UUUU b  U S:w  a  U OSUS9n[	        U[        5      (       a  UR                  S5      S	:X  a}  UR                  S
S5      n[	        U[        5      (       a  UR                  5       OSnSU;   d  SU;   a  [        [        R                  SU/ S.S9$ [        [        R                  SUSS.S9$ [        [        R                  SSUS.S9$ )zaLista estudiantes. Filtro opcional por course_id, rut, names, identification_number, period_year.Nr   r"   customer_ididrA   r"   r'   r    rB   rC   rD   r!   rE   r   r(   r*   r.   r+   no datano se encontraron datosr4   r0   r1     r5   )rH   r    r   get_allr7   listlenr9   r   r8   strlowerr	   r   r<   HTTP_404_NOT_FOUND)r!   r"   r#   rB   rC   rD   rE   r$   r%   rH   r    schools_list
page_valueper_page_valuer=   error_messagelower_messages                    r>   list_studentsrZ   1   s    /;,**K*6&&DI9"2..A;.OlD))c,.?!.C$Q++D1IlJ#+RN"%%%3(4b)d & 	F &$FJJx$8G$C

9g61;M31O1O++-UW%)Bm)S"..#&="M  11"}dK
 	
 &&4@ r@   z/platform-statusesc                 4   U nUR                  [        5      R                  [        R                  R	                  5       5      R                  5       nU Vs/ s H  oDR                  UR                  S.PM     nn[        [        R                  SSUS.S9$ s  snf )z5Listado simple de estados de plataforma para selects.)rI   namer4   z-Platform statuses list retrieved successfullyr0   r1   )
queryr   order_byrI   ascallr\   r	   r   r<   )r$   r%   _rowsrr/   s         r>   list_platform_statusesrd   b   s     	A88'(112E2H2H2L2L2NOSSUD267$Q44($D7&&+Zdhi  8s   "B/student_itemc                    U R                   c  SOU R                   nU(       a  UR                  OS nU(       a  UR                  OS nU(       aX  U(       dQ  [        U5      R	                  SUS9n[        U[        5      (       a#  [        U5      S:  a  US   R                  S5      n[        U5      R	                  UU R                  UU R                  U R                  U R                  U R                  U R                  S9n[        U[         5      (       a  UR                  S5      S:X  a}  UR                  SS5      n[        U["        5      (       a  UR%                  5       OS	n	S
U	;   d  SU	;   a  ['        [(        R*                  SU/ S.S9$ ['        [(        R,                  SUS S.S9$ U R                   c  SOSn
['        [(        R*                  SU
US.S9$ )Nr   rG   rI   rK   r   r(   r*   r.   r+   rL   rM   r4   r0   r1   rN   z-Complete students list retrieved successfullyzStudents retrieved successfully)r"   rH   r    r   rO   r7   rP   rQ   r9   r   r#   rB   rC   rD   r!   rE   r8   rR   rS   r	   r   r<   rT   )rf   r$   r%   rV   rH   r    rU   r=   rX   rY   r*   s              r>   indexrh   q   s   "''/\5F5FJ /;,**K*6&&DI9"2..A;.OlD))c,.?!.C$Q++D1I"%%#,,  *@@(( ,, & 	F &$FJJx$8G$C

9g61;M31O1O++-UW%)Bm)S"..!,  11(
 	
 BNARARAZ=  aBG&&
 r@   z!/counts_by_sen_type_and_pie_yearsz@Filter by school (optional; uses session school if not provided)c                 2   U(       a  UR                   OSnU b  U OU(       a  UR                  OSnU(       aX  U(       dQ  [        U5      R                  SUS9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      n[        U5      R                  US9n[	        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  S	S
5      SS.S9$ [        [        R                  SSUS.S9$ )z
Count of students by course and NEE type, split by years in PIE (one_year / more_than_one_year).
Returns by_course: each course has by_type and totals.
Nr   rG   rI   )r    r   r(   r-   r*   zError fetching countsr0   r1   r4   z#Counts by NEE type and years in PIE)rH   r    r   rO   r7   rP   rQ   r9   r   $get_counts_by_sen_type_and_pie_yearsr8   r	   r   r;   r<   )r    r$   r%   rH   school_id_resolvedrU   r=   s          r>    counts_by_sen_type_and_pie_yearsrl      s    /;,**K&/&;\h,BXBXnr-"2..A;.OlD))c,.?!.C!-a!4!4T!:"BBM_B`F&$FJJx$8G$C==!::i1HI
 	
 &&<
 r@   z+/counts_by_sen_type_and_pie_years_by_schoolc                 @   U (       a  U R                   OSn[        U5      R                  US9n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS5      SS.S	9$ [        [        R                  S
SUS.S	9$ )a  
Same as counts_by_sen_type_and_pie_years but grouped by school (colegio).
Returns by_school: each school has school_id, school_name, by_course (same structure as the other endpoint), total_one_year, total_more_than_one_year.
Schools are filtered by the session customer_id.
N)rH   r   r(   r-   r*   zError fetching counts by schoolr0   r1   r4   z6Counts by NEE type and years in PIE, grouped by school)
rH   r   .get_counts_by_sen_type_and_pie_years_by_schoolr7   r8   r9   r	   r   r;   r<   )r$   r%   rH   r=   s       r>   *counts_by_sen_type_and_pie_years_by_schoolro      s     /;,**K"LLYdLeF&$FJJx$8G$C==!::i1RS
 	
 &&O
 r@   z/totalsc                    U (       a  U R                   OS nU (       a  U R                  OS nU (       a  U R                  OS n[        U5      R	                  X#US9n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS5      S S.S9$ [        [        R                  S	S
US.S9$ )N)rH   r    rol_idr   r(   r-   r*   zError getting totalsr0   r1   r4   z&Students totals retrieved successfully)rH   r    rq   r   
get_totalsr7   r8   r9   r	   r   r;   r<   )r$   r%   rH   r    rq   r=   s         r>   totalsrs      s    .:,**K*6&&DI$0\  dF"(([^d(eF&$FJJx$8G$C==!::i1GH
 	
 &&?
 r@   z/import_from_inspectioni  i4  u8   Año de matrícula (Inspection anio) y period_year local)geler   c                    U(       a  UR                   OS nU(       a  UR                  OS nU(       aX  U(       dQ  [        U5      R                  SUS9n[	        U[
        5      (       a#  [        U5      S:  a  US   R                  S5      n[        U5      nUc  [        [        R                  SSS S.S9$ [        5       nUR                  5       (       d  [        [        R                  SS	S S.S9$ U b  [        U 5      O[         R"                  " 5       R$                  nUR'                  XGS
9nUR                  S5      (       d4  [        [        R(                  SUR                  S5      =(       d    SUS.S9$ [+        U5      R-                  XHU5      n	[	        U	[.        5      (       aA  U	R                  S5      S:X  a,  [        [        R0                  SU	R                  SS5      S S.S9$ U	R                  SS5      n
U	R                  SS5      nU	R                  SS5      nSU
 SU SU S3n[        [        R2                  SUU	S.S9$ )Nr   rG   rI   r,   u:   No se pudo determinar el colegio (school_id) de la sesiónr0   r1   i  zQInspection API not configured (INSPECTION_API_USERNAME / INSPECTION_API_PASSWORD))
colegio_idaniooki  r*   z)Error al obtener alumnos desde Inspectionr   r(   r-   zError al importar estudiantesimportedskippedexcluded_other_schoolu(   Importación de estudiantes finalizada: z	 nuevos, z( omitidos (duplicados o ya existentes), z# filas de otros colegios ignoradas.r4   )rH   r    r   rO   r7   rP   rQ   r9   r   r	   r   r:   r   is_configuredHTTP_503_SERVICE_UNAVAILABLEintr   nowyearfetch_students_listHTTP_502_BAD_GATEWAYr   import_from_inspectionr8   r;   r<   )rE   r$   r%   rH   r    rU   clientrx   remoter=   rz   r{   excludedmsgs                 r>   r   r   	  s7    /;,**K*6&&DI9"2..A;.OlD))c,.?!.C$Q++D1I$Y/I33W
 	
 !"F!!;;n
 	
  +63{HLLN<O<OD''9'HF::d33!::i0_4_
 	
 "44YMF&$FJJx$8G$C==!::i1PQ
 	
 zz*a(HjjA&Gzz115H
28*IgY O))1
2U	W  &&
 r@   z/storec                    U R                  5       nS nU R                  (       aZ  SSKJnJn  U" 5       nUR                  5       (       a4  UR                  UR                  S5      =(       d    S5      nU" X85      nUnOS nU(       a  UR                  OS n	S n
U	(       aQ  [        U5      R                  SU	S9n[        U[        5      (       a#  [        U5      S:  a  US   R                  S5      n
XS'   UR                  SS 5        [        U5      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[         5      (       a  [        U5      OUnU R                  (       a  [        U[         5      (       a  0 UESU0En[#        [$        R(                  SSUS.S9$ )Nr   )r   $merge_inspection_into_student_inputsrD   r+   rG   rI   r    sync_inspectionr   r(   r-   r*   zError creating studentr0   r1   inspection_prefill   zStudent created successfully)r8   r   )app.backend.classes.inspection_api_clientr   r   r}   fetch_student_datar9   rH   r   rO   r7   rP   rQ   popr   storer	   r   r;   HTTP_201_CREATED)rf   r$   r%   student_inputsinspection_prefill_snapshotr   r   inspapi_resrH   r    rU   r=   payload_datas                 r>   r   r   S  s    "&&(N"& ##w"$--n.@.@AX.Y._]_`GA.ZN*1'*.' /;,**KI"2..A;.OlD))c,.?!.C$Q++D1I #,;($/"##N3F&$FJJx$8G$C==!::i1IJ
 	
 $.fd#;#;4<L##
<(F(FZ,Z(<>YZ++5 
 r@   z
/edit/{id}rI   c                    [        U5      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$ [        U[        5      (       a  UR                  S0 5      O0 nU(       a  UR                  S	0 5      O0 nU(       a  UR                  S
5      OS nU(       a  UR                  S5      OS nS nS n	U(       ah  UR                  [        5      R                  [        R                  S:H  [        R                  U:H  5      R                  5       n
U
(       a  U
R                  nU(       aV  UR                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a  UR                  n	[        U[        5      (       aK  UR                  S5      (       a5  US   R                  S	5      (       a  XS   S	   S'   O
SU0US   S	'   XS   S'   [	        [
        R                   SSUS.S9$ )Nr(   r   rN   r*   Student not foundr0   r1   student_dataacademic_infor!   r    r   course_nameschool_namer4   zStudent retrieved successfully)r   r9   r7   r8   r	   r   rT   r]   r   filterdeleted_status_idrI   firstr   r   r   r<   )rI   r$   r%   r=   r   r   r!   r    r   r   courseschools               r>   editr     s   "!!"%F&$VZZ%8%8FJJx<PT[<[11!::g.\&**YH[2\
 	
 6@5M5M6::nb1SUL=IL$$_b9rM2?!!+.TI1=  -4IKK +&--k.K.Kq.PR]R`R`dmRmnttv ,,K +&--knn	.IJPPR ,,K &$FJJ~$>$>.!%%o66EP>"?3MB7Dk6RF>"?30;~}-&&7
 r@   z/update/{id}c                    UR                  SS9n0 n0 n0 n/ SQn/ SQn	UR                  5        H3  u  pX;   a  XU
'   M  X;   a  XU
'   M  U
S:X  a  XS'   M'  U
S:X  d  M/  XS'   M5     U(       a  XeS'   U(       a  XuS'   [        U5      R                  X5      n[	        U[         5      (       aA  UR                  S	5      S
:X  a,  [        [        R                  SUR                  SS5      S S.S9$ [        [        R                  SSUS.S9$ )NT)exclude_unset)rC   father_lastnamemother_lastnamesocial_name	gender_id	born_dateemailrD   phoneaddress	region_id
commune_idnationality_idnative_languageproficiency_native_language_idlanguage_usually_usedproficiency_language_used_id)special_educational_need_idr!   platform_status_idresolution_numbersip_admission_yeardiagnostic_date#psychopedagogical_evaluation_status!psychopedagogical_evaluation_yearrD   rE   personal_datar   r   r(   r-   r*   zError updating studentr0   r1   r4   zStudent updated successfully)
r8   itemsr   updater7   r9   r	   r   r;   r<   )rI   rf   r$   r%   r   mapped_inputsr   r   personal_data_fieldsacademic_fields	field_keyvaluer=   s                r>   r   r     s0    "&&T&:N MMMT	O +002	,',)$)',)$115:12-'+0-( 3 )6o& )6o&"$$R7F&$FJJx$8G$C==!::i1IJ
 	
 &&5
 r@   z/delete/{id}c                    [        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[        5      (       aA  UR                  S5      (       a+  [	        [
        R                  SUR                  S5      S S.S9$ 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$ [	        [
        R                  SS	US.S9$ )
Nr   r(   rN   r*   r   r0   r1   r4   zStudent deleted successfully)	r   r9   r7   r8   r	   r   rT   deleter<   )rI   r$   r%   student_serviceexistingr=   s         r>   r   r     s8   "2&O""2&H(D!!hll8&<&G11#<<	3FG
 	
 (D!!hll7&;&;11#<<0
 	
 ##B'F&$FJJx$8G$C11!::i1DE
 	
 &&5
 r@   z/photo/{student_id}
student_idfilec                 X  #     [        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$ UR                  (       a-  [        UR                  5      R                  R                  5       OS	n/ S
QnXg;  a.  [	        [
        R                  SSSR                  U5       3SS.S9$ [        R                  " 5       R                  S5      nU  SU U 3n	[        S5      n
U
R!                  SSS9  X-  nUR#                  5       I Sh  vN n[%        US5       nUR'                  U5        SSS5        [	        [
        R(                  SSU U	[+        U5      [-        U5      S.S.S9$  N]! , (       d  f       NC= f! [.         a2  n[	        [
        R0                  SS[+        U5       3SS.S9s SnA$ SnAff = f7f)uX   
Sube una foto para un estudiante específico.
Guarda la foto en files/system/students.
r(   r   rN   r*   zEstudiante no encontradoNr0   r1   r+   )z.jpgz.jpegz.pngz.gifz.webpr,   z6Tipo de archivo no permitido. Extensiones permitidas: z, z%Y%m%d%H%M%S_1_1_zfiles/system/studentsT)parentsexist_okwbr   zFoto subida exitosamente)r   filename	file_path	file_sizer-   zError subiendo foto: )r   r9   r7   r8   r	   r   rT   r   r   suffixrS   r:   joinr   r   strftimemkdirreadopenwriter   rR   rQ   	Exceptionr;   )r   r   r$   r%   r   student_resultfile_extensionallowed_extensions	date_hourunique_filename
upload_dirr   r3   fes                  r>   upload_photor   :  s    E
&r*(,,Z8nd++1C1CG1L1LP^PbPbckPlpwPw"55!-11':wn>P>PQZ\v>w   @D}}dmm,3399;RT H3"77!!WX\XaXabtXuWvw   LLN++N;	 (Li[8HI 12
50	 		#)T"aGGG # //5", /!$Y!$W		
 	
	 $"""  
==23q6(;
 	

sy   H*BG+ #H*$A6G+ H*AG+ :G;G+ G:G+ H*G+ 
G($G+ +
H'5'H"H'H*"H''H*)8fastapir   r   r   r   r   r   fastapi.responsesr	   typingr
   app.backend.db.databaser   sqlalchemy.ormr   app.backend.schemasr   r   r   r   !app.backend.classes.student_classr   app.backend.auth.auth_userr    app.backend.classes.school_classr   r   r   "app.backend.classes.teaching_classr   app.backend.db.modelsr   r   r   pathlibr   r   studentsr9   r   r?   rR   rZ   rd   postrh   rl   ro   rs   r   r   r   putr   r   r    r@   r>   <module>r      s    G G *  * " S S : > 8 I C O O  
 
*+3,DE3N;/NO#C5LM%&=>&/ 3- sm	
  	 ,4 
g$T7ef/BC#B4KLt1BC 3HI+0Ck+l!&t9V!W%&=>&/-}-
3-- sm- 
#	-
 C=- $C=- #- - 	- -` 
"#%&=>&/ $ 
s?FG^?_ovw}o~ 7 79 7el 7 7r 
12$T7yz%&=>&/ }   	  3 F 
;<%&=>&/ =< 
y%,-D%EU\]cUd  7  4 
()!&t  LF  "G%&=>&/F#FF 	F *FR 
x &&=>&/777 	7 7r 
l,34K,L\cdj\k 1S 1	 1RY 1 1f 
n &&=>&/	HHH H 		H HT 
 .56M.N^efl^m +s +) +T[ + !+Z 
$% Cy%&=>&/	O
O

O
 O
 		O
 &O
r@   