
    eJjM;                       % S r SSK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JrJrJrJrJrJrJr  SS	KJr  S
rSGS jrSHS jrSHS jrSIS jrSJS jrSKS jrSLS jrSMS jr 0 SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$_S%S&_S'S(_S)S*_S+S,_S-S._S/S0_S1S2_S3S4_S5S6S7S8S9S:S;S<S=S>S?S@SA.Er!SB\"SC'         SNSD jr#SOSE jr$gF)Pz`Contexto PIE360 para Informe a la Familia (document_id=7): respaldo si Files/LLM no traen datos.    )annotations)datedatetime)Any)Session)StudentClass)FamilyReportModel)CareerTypeModelCourseModelFamilyMemberModelProfessionalModelProfessionalTeachingCourseModelSchoolModelStudentGuardianModelStudentProfessionalModel)professional_display_fields   c                <    U S L=(       a    [        U 5      [        :H  $ )N)intFAMILIA_DOCUMENT_ID)document_ids    [C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agent_v2_familia_pie360.pyis_familia_documentr      s    d"Ns;'7;N'NN    c                   U (       d  g [        U [        5      (       a  U nOc[        U S5      (       a  U R                  5       nOA[        U 5      R	                  5       S S n[
        R                  " US5      R                  5       n[        R                  " 5       nUR                  UR                  -
  UR                  UR                  4UR                  UR                  4:  -
  nUS:  a  U SUS:w  a  S 3$ S 3$ UR                  UR                  -
  S	-  UR                  -   UR                  -
  nUS:  a  SnU S
US:w  a  S 3$ S 3$ ! [         a     gf = f)N r   
   %Y-%m-%dr   u    año   s   z meses)
isinstancer   hasattrstrstripr   strptimetodayyearmonthday	Exception)bornbdrawr(   yearsmonthss         r   	_calc_ager2      s>   dD!!BT6""Bd)//#CR(C""3
388:B



RWW$eii(@BHHbffCU(UV19WE!#!<==!<==**rww&",u{{:RXXEA:Ffkd:;;r:;; s%   C-E 8E <A
E E 
EEc                z   U (       d  g [        U [        5      (       a  U R                  S5      $ [        U S5      (       a  U R                  S5      $ [	        U 5      R                  5       S S n[        R                  " US5      R                  S5      $ ! [         a    [	        U 5      R                  5       s $ f = f)Nr   z%d/%m/%Ystrftimer   r   )	r#   r   r4   r$   r%   r&   r   r'   r,   )r-   r/   s     r   _fmt_birth_dater5   6   s    !dD!!==,,4$$==,,$ioo$  j1:::FF !4y  !s   %B !B AB #B:9B:c                    U(       d  gU R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       a#  UR
                  =(       d    SR                  5       $ S$ )Nr   )queryr
   filteridfirstcareer_typer&   )dbcareer_type_idrows      r   _career_labelr?   D   sT    
((?
#
*
*?+=+=+O
P
V
V
XC.1COO!r((*9r9r   c                   UR                   =(       d    S SUR                  =(       d    S SUR                  =(       d    S 3R                  5       nSnUR                  (       a  U R                  [        5      R                  [        R                  UR                  :H  5      R                  5       nU(       a4  UR                  (       a#  UR                  =(       d    SR                  5       nUUUR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UUS.
$ )Nr    )
person_full_namereceiver_full_nameperson_identification_numberreceiver_identification_numberperson_phonereceiver_phoneperson_emailreceiver_emailperson_relation_studentreceiver_relationship)namesfather_lastnamemother_lastnamer&   family_member_idr7   r   r8   r9   r:   family_memberidentification_numbercelphoneemail)r<   gfullrelationfms        r   _guardian_from_rowrX   K   s>   ggm_Aa//526a8I8I8OR7PQWWYDHXX'(//0A0D0DHZHZ0Z[aac"""((.B557H ")*)@)@)FB(M(M(O+,+B+B+Hb*O*O*Q)r002::+224B--/77=b//1#+!) r   c                   U(       d  0 $ U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  0 $ [        X5      n[        U [        USS 5      5      nUR                  =(       d    SR                  5       nUR                  =(       d    SR                  5       nU SU 3R                  S5      nUUR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UUUUUS.
$ )Nr=   r    / )
professional_idprofessional_full_nameprofessional_social_name"professional_identification_numberprofessional_rutprofessional_roleprofessional_job_positionprofessional_phoneprofessional_emailprofessional_phone_email)r7   r   r8   r9   r:   r   r?   getattrphoner&   rS   	full_namerut)r<   r[   profdisplayrolerf   rS   contacts           r   _professional_from_idrm   `   s   	88%&--.?.B.Bo.UV\\^D	)"3GWT+;TBCD]] b'')E]] b'')Es5'"((/G*#*#4#4#:"A"A"C%,%6%6%<"$C$C$E/6{{/@b.G.G.I$[[.B557!%)##$+ r   c                   U R                  [        5      R                  [        R                  U:H  5      R	                  [        R
                  R                  5       5      R                  5       nU(       d  0 $ 0 n0 SUR                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  _S	UR                  _S
UR                  _SUR                  _SUR                  _SUR                   _SUR                   _SUR"                  _SUR"                  _SUR$                  _UR$                  UR&                  UR(                  UR*                  UR,                  UR.                  S.EnUR1                  5        H4  u  pV[3        U=(       d    S5      R5                  5       nU(       d  M0  XsU'   M6     UR6                  (       a  [9        UR6                  5      US'   UR;                  SS5      nUR;                  SS5      n	U(       d  U	(       a  U SU	 3R5                  S5      US'   U$ )Nstudent_full_namestudent_identification_numberstudent_coursestudent_schoolrB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   person_presencereceiver_presence_ofr\   )r]   r^   r`   rb   rc   evaluation_typer   r[   rb   rc   rZ   rd   )r7   r	   r8   
student_idorder_byr9   descr:   ro   rp   rq   rr   rC   rE   rG   rI   rK   rt   r]   r^   r`   rb   rc   ru   itemsr%   r&   r[   r   get)
r<   rv   reportoutmappingkeyvaltextphems
             r   _family_report_snapshotr   y   so   
"#	!,,
:	;	#&&++-	.		  	CV55')M)M 	&// 	&//	
 	F55 	f77 	'(M(M 	)&*O*O 	-- 	&// 	-- 	&// 	"6#?#? 	 !=!= 	666  	 ; ;!" 	!&"A"A#$ %+$C$C.4.W.W#55$77$77!11/G2 MMO39"~##%4H $ !$V%;%;!<	%r	*B	%r	*B	R-/DB4.*>*>u*E&'Jr   c                   SU0n[        X5      nUR                  5        H  u  pEU(       d  M  XRU'   M     [        U 5      R                  U5      n[	        U[
        5      (       Ga  UR                  S5      (       Ga  US   nUR                  S5      =(       d    0 nUR                  S5      =(       d    0 n	UR                  S5      =(       d    SR                  5       n
UR                  S5      =(       d    SR                  5       nUR                  S5      =(       d    SR                  5       nU
 S	U S	U 3R                  5       nUR                  S
U5        UR                  SU5        UR                  SUR                  S5      =(       d    SR                  5       5        UR                  S5      =(       d    UR                  S5      =(       d    SR                  5       nUR                  SU5        UR                  SU5        UR                  S5      nU(       aQ  UR                  S[        U5      5        UR                  S[        U5      5        UR                  S[        U5      5        UR                  SUR                  S5      5        UR                  SU	R                  S5      5        UR                  SUR                  S5      5        UR                  S5      nU(       a  UR                  S5      (       d  U R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a7  UR                  (       a&  UR                  =(       d    SR                  5       US'   U	R                  S5      nU(       a  UR                  S5      (       d  U R                  [         5      R                  [         R"                  S:H  [         R                  U:H  5      R                  5       nU(       a7  UR$                  (       a&  UR$                  =(       d    SR                  5       US'   U R                  [&        5      R                  [&        R(                  U:H  5      R+                  [&        R                  R-                  5       5      R                  5       nU(       aJ  [/        U U5      nUR                  5        H*  u  pEU(       d  M  UR                  U5      (       a  M&  XRU'   M,     UR                  S5      nU(       d  U R                  [0        5      R                  [0        R(                  U:H  [0        R2                  R5                  S5      5      R+                  [0        R                  R-                  5       5      R                  5       nU(       a  UR6                  nU(       d  UR                  S5      (       a  U R                  [8        5      R                  [8        R:                  US   :H  [8        R"                  S:H  5      R+                  [8        R                  R-                  5       5      R                  5       nU(       a  UR6                  nU(       a`  UR                  S5      (       dJ  [=        U U5      nUR                  5        H*  u  pEU(       d  M  UR                  U5      (       a  M&  XRU'   M,     U$ )u   
Datos de ficha PIE360 para Informe Familia.
Orden de respaldo: estudiante → apoderado (student_guardians) → profesional (students_professionals / curso).
rv   student_datapersonal_dataacademic_inforL   r   rM   rN   rA   student_fullnamero   student_social_namesocial_namerQ   rp   	born_datestudent_birth_datestudent_born_datestudent_age	school_id	course_idperiod_yearrr   rq   r   r[   Nr\   )r   ry   r   rz   r#   dictr&   
setdefaultr5   r2   r7   r   r8   r9   r:   school_namer   deleted_status_idcourse_namer   rv   rw   rx   rX   r   deleted_dateis_r[   r   r   rm   )r<   rv   ctxfr_snapr~   r   student_resultsdpersonalacademicrL   fathermotherrU   rh   r-   r   schoolr   courseguardiang_dataprof_idspptc	prof_datas                             r   build_familia_pie360_contextr      s   
 (4C%b5GMMO3H $ ""%))*5N.$''N,>,>~,N,NN+66/*0b66/*0bg&,"335,,017R>>@,,017R>>@&6(+113)40*D1,x||M/J/Pb.W.W.YZ||34]?V8W][]ddf.46<||K(NN/1FGNN.0EFNN=)D/:{BFF;$78{HLL$=>}bff]&;<FF;'	SWW%566XXk*11+..I2MNTTVF&,,)/););)Ar(H(H(J$%LL-	SWW%566%55:KNNi<WX 
 &,,)/););)Ar(H(H(J$% 	%&	$//:=	>	&))..0	1		  #B1HCs3773<<C ' ''"34GHH-.V(33zA(5599$? X.116689UW 	 ((Gsww{++HH45V/99S=MM/AAQF X588==?@UW 	 ))Gsww788)"g6	!)HCs3773<<C * Jr   ro   )ro   r   r   )r   rp   )rp   rQ   r   )r   r   r   )r   r   r   )r   rq   )rq   rr   )rr   r\   )r\   r]   r]   )r]   r\   r^   )r^   r_   r`   )r`   ra   ra   )ra   r`   rb   )rb   rc   )rc   rd   )rd   rB   )rB   rC   )rC   rB   )rD   rE   )rE   rD   )rF   rG   )rG   rF   )rH   rI   )rI   rH   )rJ   rK   )rK   rJ   )rs   rt   )rt   rs   )ru   )rC   rD   rE   rF   rG   rH   rI   rJ   rK   rs   rt   ru   zdict[str, tuple[str, ...]]_FAMILIA_PIE360_FALLBACKc                j   [        U 5      n[        R                  5        H  u  p4UR                  U5      =(       d    SR	                  5       (       a  M4  U HU  nUR                  U5      nUc  M  [        U5      R	                  5       (       d  M9  [        U5      R	                  5       X#'     M     M     U$ )u:   Archivos/LLM primero; PIE360 solo completa campos vacíos.r   )r   r   ry   rz   r&   r%   )merged
pie360_ctxr|   
target_keysourcessrcr   s          r   'merge_pie360_fallback_into_replacementsr   :  s    
 v,C7==?
GGJ%2,,..C..%C3s8>>#3#3"%c(.."2	   @ Jr   c                h   / nU R                  S5      =(       d    U R                  S5      =(       d    SR                  5       (       aR  UR                  SU R                  S5      =(       d    U R                  S5      =(       d    SR                  5        35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S	5      =(       d    SR                  5       nU(       a  UR                  S
U 35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S5      =(       d    SR                  5       nU(       a  UR                  SU 35        U R                  S5      =(       d    SR                  5       n	U	(       a  UR                  SU	 35        U$ )uE   Líneas breves para el system prompt del chat (solo informe familia).rB   rC   r   zApoderado/a (PIE360): rD   zRUT apoderado (PIE360): rF   u   Teléfono apoderado (PIE360): rH   zEmail apoderado (PIE360): r\   zProfesional (PIE360): r^   zRUT profesional (PIE360): r`   zCargo/especialidad (PIE360): rb   u    Teléfono profesional (PIE360): rc   zEmail profesional (PIE360): )rz   r&   append)
r   linesg_rutg_phoneg_emailri   p_rutrk   p_phonep_emails
             r   familia_pie360_hint_linesr   K  s   E)*Xjnn=Q.RXVX__aa$12`jnnEY6Z`^`ggijl	
 ^^:;ArHHJE/w78~~n-3::<G5gY?@~~n-3::<G1';<NN34:AACD-dV45^^@AGRNNPE1%9:NN./52<<>D4TF;<~~239r@@BG7yAB~~239r@@BG3G9=>Lr   N)r   
int | Nonereturnbool)r-   r   r   r%   )r<   r   r=   r   r   r%   )r<   r   rT   r   r   dict[str, str])r<   r   r[   r   r   r   )r<   r   rv   r   r   r   )r<   r   rv   r   r   dict[str, Any])r   r   r   r   r   r   )r   r   r   z	list[str])%__doc__
__future__r   r   r   typingr   sqlalchemy.ormr   !app.backend.classes.student_classr   app.backend.db.modelsr	   app.backend.db.models.pie_corer
   r   r   r   r   r   r   r   &app.backend.utils.professional_displayr   r   r   r2   r5   r?   rX   rm   r   r   r   __annotations__r   r    r   r   <module>r      s   f " #  " : 3	 	 	 O O.!:*2-`cN'8B'83'8 $%_'8 E	'8
 D'8 #'8 )'8 )'8 T'8  V'8 ) +'8 K'8   !S!'8" 1#'8$ 1%'8&  =''8( B)'8* E%' 7868SQBG+M'8 4 'T " r   