
    Si1c                        d dl mZ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 d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z# d dl$m$Z$  eddg      Z%e%jM                  d       edd       edd       ed d       edd       ee       ee      fde'de'de
e'   de
e'   dedefd        Z(e%jM                  d!       ed"d#       ed d$       ed%d       ed"d&       ed"d'       ed"d(       ed"d)       ee       ee      f	de
e'   de
e'   de
e'   d*e
e)   d+e
e)   d,e
e)   d-e
e'   dedefd.       Z*e%jM                  d/       ee       ee      fdedefd0       Z+e%jY                  d1       ee       ee      fd2ededefd3       Z-e%jM                  d4       ed"d5       ee       ee      fde
e'   dedefd6       Z.e%jM                  d7       ee       ee      fdedefd8       Z/e%jY                  d9       ee       ee      fdedefd:       Z0e%jY                  d;       ed"d<d=d>?       ee       ee      fd-e
e'   dedefd@       Z1e%jY                  dA       ee       ee      fd2ededefdB       Z2e%jM                  dC       ee       ee      fdDe'dedefdE       Z3e%ji                  dF       ee       ee      fdDe'd2ededefdG       Z5e%jm                  dH       ee       ee      fdDe'dedefdI       Z6e%jY                  dJ       ed       ee       ee      fdKe'dLededefdM       Z7y")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           	         t        |      j                  | ||xs d|r|dkD  r|nd      }t        |t              r|j	                  d      dk(  rt        d|j	                  d      xs dv rt        j                  nt        j                  d|j	                  d      xs dv rd	nd
|j	                  dd      |j	                  dg       d      S t        t        j                  dd|d      S )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          D/var/www/pie360backend.cl/public_html/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	           
         |r|j                   nd}	|r|j                  nd}
|	rP|
sNt        |      j                  d|	      }t	        |t
              r"t        |      dkD  r|d   j                  d      }
|dn|}|dn|}t        |      j                  |||
|||| | dk7  r| nd|      }t	        |t              r|j                  d      d	k(  rz|j                  d
d      }t	        |t              r|j                         nd}d|v sd|v rt        t        j                  d|g d      S t        t        j                  d|dd      S t        t        j                  dd|d      S )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   sz    /;,**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;M31O++-UW%)Bm)S"..#&="M  11"}dK
 	
 &&4@ r@   z/platform-statusesc                 6   | }|j                  t              j                  t        j                  j	                               j                         }|D cg c]  }|j                  |j                  d }}t        t        j                  dd|d      S c c}w )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7Q144(7D7&&+Zdhi  8s    B/student_itemc           
      p   | j                   dn| j                   }|r|j                  nd }|r|j                  nd }|rP|sNt        |      j	                  d|      }t        |t              r"t        |      dkD  r|d   j                  d      }t        |      j	                  || j                  || j                  | j                  | j                  | j                  | j                        }t        |t               r|j                  d      dk(  rz|j                  dd      }t        |t"              r|j%                         nd	}	d
|	v sd|	v rt'        t(        j*                  d|g d      S t'        t(        j,                  d|d d      S | j                   dnd}
t'        t(        j*                  d|
|d      S )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;M31O++-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                    |r|j                   nd}| | n|r|j                  nd}|rP|sNt        |      j                  d|      }t	        |t
              r"t        |      dkD  r|d   j                  d      }t        |      j                  |      }t	        |t              rC|j                  d      dk(  r/t        t        j                  d|j                  d	d
      dd      S t        t        j                  dd|d      S )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                 <   | r| j                   nd}t        |      j                  |      }t        |t              rC|j                  d      dk(  r/t        t        j                  d|j                  dd      dd	      S t        t        j                  d
d|d	      S )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                    | r| j                   nd }| r| j                  nd }| r| j                  nd }t        |      j	                  |||      }t        |t              rC|j                  d      dk(  r/t        t        j                  d|j                  dd      d d      S t        t        j                  d	d
|d      S )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"(([I^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                 R   |r|j                   nd }|r|j                  nd }|rP|sNt        |      j                  d|      }t	        |t
              r"t        |      dkD  r|d   j                  d      }t        |      }|t        t        j                  ddd d      S t               }|j                         st        t        j                  dd	d d      S | t        |       nt!        j"                         j$                  }|j'                  ||
      }|j                  d      s2t        t        j(                  d|j                  d      xs d|d      S t+        |      j-                  |||      }	t	        |	t.              rC|	j                  d      dk(  r/t        t        j0                  d|	j                  dd      d d      S |	j                  dd      }
|	j                  dd      }|	j                  dd      }d|
 d| d| d}t        t        j2                  d||	d      S )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   	  s/    /;,**K*6&&DI9"2..A;.OlD)c,.?!.C$Q++D1I$Y/I33W
 	
 !"F!;;n
 	
  +63{HLLN<O<OD''94'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                 l   | j                         }d }| j                  rQddlm}m}  |       }|j                         r0|j                  |j                  d      xs d      } |||      }|}nd }|r|j                  nd }	d }
|	rNt        |      j                  d|	      }t        |t              r"t        |      dkD  r|d   j                  d      }
|
|d<   |j                  dd        t        |      j!                  |      }t        |t               rC|j                  d	      d
k(  r/t#        t$        j&                  d|j                  dd      d d      S t        |t               rt        |      n|}| j                  rt        |t               ri |d|i}t#        t$        j(                  dd|d      S )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.RYZN*1'*.' /;,**KI"2..A;.OlD)c,.?!.C$Q++D1I #,N;($/"##N3F&$FJJx$8G$C==!::i1IJ
 	
 $.fd#;4<L##
<(FZ,Z(<>YZ++5 
 r@   z
/edit/{id}rI   c                 H   t        |      j                  |       }t        |t              rg|j                  d      s|j                  d      dk(  rBt	        t
        j                  d|j                  d      xs |j                  dd      d d      S t        |t              r|j                  di       ni }|r|j                  d	i       ni }|r|j                  d
      nd }|r|j                  d      nd }d }d }	|rc|j                  t              j                  t        j                  dk(  t        j                  |k(        j                         }
|
r|
j                  }|rQ|j                  t              j                  t        j                  |k(        j                         }|r|j                  }	t        |t              rC|j                  d      r2|d   j                  d	      r||d   d	   d<   n
d|i|d   d	<   |	|d   d<   t	        t
        j                   dd|d      S )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%8FJJx<PT[<[11!::g.\&**YH[2\
 	
 6@5M6::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6EPF>"?3MB7Dk6RF>"?30;~}-&&7
 r@   z/update/{id}c                    |j                  d      }i }i }i }g d}g d}	|j                         D ]/  \  }
}|
|v r|||
<   |
|	v r|||
<   |
dk(  r||d<   %|
dk(  s+||d<   1 |r||d<   |r||d<   t        |      j                  | |      }t	        |t               rC|j                  d	      d
k(  r/t        t        j                  d|j                  dd      d d      S t        t        j                  dd|d      S )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     sG    "&&T&:N MMMT	O +002 1	5,,',M)$/)',M)$115:M12-'+0M-(1 )6o& )6o&"$$R7F&$FJJx$8G$C==!::i1IJ
 	
 &&5
 r@   z/delete/{id}c                    t        |      }|j                  |       }t        |t              rC|j                  d      dk(  r/t	        t
        j                  d|j                  dd      d d      S t        |t              r?|j                  d      r.t	        t
        j                  d|j                  d      d d      S |j                  |       }t        |t              rC|j                  d      dk(  r/t	        t
        j                  d|j                  dd      d d      S t	        t
        j                  dd	|d      S )
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     s,   "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                 >  K   	 t        |      }|j                  |       }t        |t              rg|j                  d      s|j                  d      dk(  rBt	        t
        j                  d|j                  d      xs |j                  dd      dd      S |j                  r-t        |j                        j                  j                         nd	}g d
}||vr1t	        t
        j                  dddj                  |       dd      S t        j                         j                  d      }|  d| | }	t        d      }
|
j!                  dd       |
|	z  }|j#                          d{   }t%        |d      5 }|j'                  |       ddd       t	        t
        j(                  dd| |	t+        |      t-        |      dd      S 7 `# 1 sw Y   AxY w# t.        $ r5}t	        t
        j0                  ddt+        |       dd      cY d}~S d}~ww xY ww)ud   
    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+1C1CG1LP^PbPbckPlpwPw"55!-11':wn>P>PQZ\v>w   @D}}dmm,3399;RT H!3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A3G 
HA"G -G.G >G=G HG GG 	H%*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@   