
    J{j>M                       S r SSKJr  SSK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JrJr  \R$                  " S	\R&                  5      rS
r\R$                  " S\R&                  5      r\R$                  " S\R&                  5      r\" 1 Sk5      rSrSrS$S jrS%S jr  S&       S'S jjrS(S)S jjrS(S*S jjr S+S jr!1 Skr"S$S jr#S,S jr$SSSS.           S-S jjr%SSSS.           S.S jjr&SSSS.                 S/S jjr'S(S0S jjr(S1S jr)  S&       S2S jjr*S3S  jr+          S4S! jr,              S5S" jr- S(       S6S# jjr.g)7uD   Resolución de estudiante/documento para generación en chat Agents.    )annotationsN)Any)Session)AgentDocumentTemplateModel)SchoolModelStudentModelStudentPersonalInfoModel)FAMILIA_DOCUMENT_IDbuild_familia_pie360_contextfamilia_pie360_hint_lineszC\b(\d{1,2}[.\s]?\d{3}[.\s]?\d{3}[-\s]?[\dkK]|\d{7,8}[-\s]?[\dkK])\b)Uzgenera el informezgenerar el informezgenera el documentozgenerar el documentozgenera el wordzgenerar el wordzgenera el docxzgenerar el docxzgenera un informezgenerar un informezgenera un documentozgenerar un documentozrealiza el informezrealizar el informezrealiza el documentozrealizar el documentozrealiza un informezrealizar un informezrealiza un documentozrealizar un documentozelabora el informezelaborar el informezelabora el documentozelaborar el documentozredacta el informezredactar el informezredacta el documentozredactar el documentozescribe el informezescribir el informezescribe el documentozescribir el documentozcrea el informezcrear informezcrear el informezcompleta el informezcompletar el informezcompleta el documentozcompletar el documentozfinaliza el informezfinalizar el informezemite el informezemitir el informezconfecciona el informezconfeccionar el informezarma el informezarmar el informezproduce el informezproducir el informezexporta el informezexportar el informezexporta el documentozexportar el documentozdescarga el informezdescargar el informezdescarga el documentozdescargar el documentoznecesito el informeznecesito el documentozquiero el informezquiero el documentozentrega el informezentregar el informezhaz el informezhazme el informezhazme el documentozdame el informezdame el documentozhacer el informezhaz el documentozhacer el documentozprepara el informezpreparar el informezprepara el documentozpreparar el documentozdeja listo el informezdejar listo el informezgenera de nuevozgenerar de nuevozrealiza de nuevozrealizar de nuevozvuelve a generarzvuelve a realizarzregenera el informezregenerar el informea3  \b(genera(r)?|realiza(r)?|elabora(r)?|redacta(r)?|escribe(r)?|crea(r)?|completa(r)?|finaliza(r)?|emite(r)?|confecciona(r)?|arma(r)?|produce(r)?|exporta(r)?|descarga(r)?|prepara(r)?|regenera(r)?|haz(me)?|hacer|dame|entrega(r)?)\s+(el\s+|un\s+|la\s+|los\s+)?(informe|informes|documento|documentos|word|docx)\ba;  ^\s*(genera|generar|realiza|realizar|elabora|elaborar|redacta|redactar|escribe|escribir|crea|crear|completa|completar|finaliza|finalizar|emite|emitir|confecciona|confeccionar|arma|armar|produce|producir|exporta|exportar|descarga|descargar|prepara|preparar|regenera|regenerar|hazme|haz|hacer|dame|entrega|entregar)\b>   nooksiholaokayvalebuenolistothanksgraciasperfecto	entendido   sí
de acuerdo)informe para la familiazinforme a la familiazinforme de familiazinforme familiar   )
psicopedagpsicopedc                    [         R                  " SSU =(       d    SR                  5       5      R                  5       nU$ )Nz[^0-9kK] )resubstripupper)valuecleaneds     WC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_chat_context.pynormalize_rutr'      s/    ff["u{&9&9&;<BBDGN    c                    U (       d  g [         R                  U 5      nU(       a  UR                  S5      R                  5       $ S $ )N   )_RUT_REsearchgroupr"   )textmatchs     r&   extract_rut_from_textr0      s4    NN4 E%*5;;q>!44r(   c                D   U(       a%  UR                  5       (       a  UR                  5       $ [        U 5      nU(       a  U$ [        U=(       d    / 5       HH  nUR                  S5      S:w  a  M  [        UR                  S5      =(       d    S5      nU(       d  MF  Us  $    g )Nroleusercontentr   )r"   r0   reversedget)messagehistoryexplicit_rutfounditems        r&   extract_rut_from_conversationr<      s    
 **,,!!##!'*EB'88Fv%%dhhy&9&?R@5L ( r(   c                    U =(       d    S/nU=(       d    /  H,  nUR                  UR                  S5      =(       d    S5        M.     SR                  U5      $ )Nr   r4   
)appendr6   join)r7   r8   partsr;   s       r&   conversation_blobrB      sF    ]OE2TXXi(.B/ 99Ur(   c                *  ^ AU =(       d    SR                  5       nU(       d  gUR                  5       mT[        ;   a  g[        U4S j[         5       5      (       a  g[
        R                  U5      (       a  g[        R                  U5      (       a  gg)u   
True solo si el mensaje ACTUAL del usuario pide generar el Word.
No usa historial: evita regenerar en cada turno tras un «genera el informe» previo
o por palabras del asistente («informe», «genera», etc.) en mensajes anteriores.
r   Fc              3  ,   >#    U  H	  oT;   v   M     g 7fN ).0hintlows     r&   	<genexpr>,wants_document_generation.<locals>.<genexpr>   s     
5#443;#4   T)	r"   lower_SHORT_NON_GENERATIONany_GENERATION_HINTS_GENERATION_PHRASE_REr,   _GENERATION_START_REr/   )r7   r8   r.   rI   s      @r&   wants_document_generationrS      sw     	Mr  "D
**,C
##

5#4
555##D))!!$''r(   c                   [        U5      n[        U5      S:  a  gU R                  [        R                  [        R
                  5      R                  [        R
                  R                  S5      5      R                  [        R
                  S:g  5      R                  5       nU H*  u  pE[        U=(       d    S5      U:X  d  M  [        U5      s  $    U R                  [        R                  [        R
                  5      R                  [        R
                  R                  S5      5      R                  [        R
                  S:g  5      R                  5       nU H*  u  pE[        U=(       d    S5      U:X  d  M  [        U5      s  $    g)uI   Coincidencia exacta del RUT normalizado. No completa ni recorta dígitos.   Nr   )r'   lenqueryr	   
student_ididentification_numberfilterisnotallintr   id)dbruttargetrowsrX   identificationstudent_rowss          r&   lookup_student_id_by_rutre      s%   3F
6{Q
)446N6d6de	(>>DDTJ	K	(>>"D	E		 	 '+"
-2.&8z?" '+ 	,"D"DE	2288>	?	22b8	9		  '3"
-2.&8z?" '3 r(   >A   deellauncondelhazlaslospdfporr`   unachatcreadamedemedocxparawordahoracreardatosemitefavorfichahacerhazmenuevanuevopuedetodastodosalumnaalumnoemitirgenerapuedesquieroelaboraescribefamiliagenerarinformeprepararealizaredactacompletaelaborarescribirgenerameinformdeinformesnecesitoprepararrealizarredactar	completar	correctos	documento
documentos
estudianteestudiantespsicopedagogicapsicopedagogicoc                    U =(       d    SR                  5       nS H  u  p#UR                  X#5      nM     [        R                  " SSU5      $ )Nr   ))   áa)   ée)   íi)   óo)   úu)   ür   )   ñnz[^a-z0-9\s] )rM   replacer    r!   )r$   rawsrcdsts       r&   
_fold_namer   @  sG    ;B


C kk## 66.#s++r(   c                    [        U =(       d    S5      nUR                  5        Vs/ s H:  n[        U5      S:  d  M  U[        ;  d  M   UR	                  S5      (       a  M8  UPM<     nnUS S $ s  snf )Nr      informrU   )r   splitrV   _NAME_NOISE
startswith)r.   foldedttokenss       r&   extract_name_tokens_from_textr   O  st    
#F Aq6Q; 	
K/ 	
89X8N 	
  
 "1:s   A/A/
A/"A/customer_id	school_idperiod_yearc               `  ^ U R                  [        [        5      R                  [        [        R                  [        R
                  :H  5      n UR                  [        R                  S:H  5      nU(       a,  UR                  [        R                  [        U5      :H  5      nOeU(       a^  UR                  [        [        R                  [        R                  :H  5      R                  [        R                  [        U5      :H  5      n/ nU(       a  [        [        U5      5      OS nUR                  5        GH  u  p[        UR                   =(       d    S5      n
[        UR"                  =(       d    S5      n[        UR$                  =(       d    S5      n[        UR&                  =(       d    S5      nU
 SU SU SU 3R)                  5       m[        U4S jU 5       5      (       d  M  U
R+                  5       nUR+                  5       nUR+                  5       nSnU Ha  nUU;   a  US-  nM  UU;   a  US-  nM  U(       a  US   U:X  a  US-  nM4  UU;   a  US-  nMA  UUR+                  5       ;   a  US	-  nM\  US
-  nMc     U(       a(  [        [-        U	SS5      =(       d    S5      U:X  a  US-  nUR/                  U[        UR
                  5      45        GM     U(       d  g UR1                  S S9  US   u  nn[3        U5      S
:  a  US
   S   U:X  a  g U$ ! [         a     GNf = f)Nr   r   r   c              3  ,   >#    U  H	  oT;   v   M     g 7frE   rF   )rG   r   blobs     r&   rJ   *_score_students_by_name.<locals>.<genexpr>w  s     -f9frL   
   rU      r      r*   r      c                    U S   * U S   4$ )Nr   r*   rF   )xs    r&   <lambda>)_score_students_by_name.<locals>.<lambda>  s    !uadmr(   )key)rW   r	   r   r@   r^   rX   rZ   deleted_status_id	Exceptionr   r]   r   r   strr\   r   namesfather_lastnamemother_lastnamesocial_namer"   r   getattrr?   sortrV   )r_   r   r   r   r   qscoredyear_spersonalstudentr   fathermothersocial
name_partsfather_partsmother_partsscorer   
best_scorebest_idr   s                        @r&   _score_students_by_namer   Y  s    	)<8==loo)A)L)LL	AHH\33q89 HH\++s9~=>	FF;,2H2H HIPP##s;'77
 %'F&1S[!"tFUUW8>>/R0H44:;H44:;H006B7&6(!F84::<-f---[[]
||~||~AL l"

1 2
j
flln$

  c''="=CDNQJEuc("5"56789 %< 
KK+K, )J
6{Q6!9Q<:5N_  s   "L 
L-,L-c                   [        U5      n[        U5      S:  a  gSnU(       a  [        X[        U5      US9nU(       a  U$ U(       a  [        X[        U5      US9$ U(       d
  [        XUS9$ g)zLBusca estudiante por nombre/apellido. Solo si hay un match claramente mejor.r   N)r   r   )r   r   )r   )r   rV   r   r]   )r_   	name_textr   r   r   r   r:   s          r&   lookup_student_id_by_namer     st     +95F
6{QE'#i.k
 &C$4+
 	
 &r{KKr(   c                  U(       a  USS4$ [        U=(       d    S5      nU(       a  [        X5      n	U	c  SUS4$ XS4$ U(       aN  [        U5      R                  5       (       a0  [        U5      R                  5       n
[        X
5      n	U	c  SU
S4$ XS4$ [	        U=(       d    / 5       H^  nUR                  S5      S:w  a  M  [        UR                  S5      =(       d    S5      nU(       d  MF  [        X5      n	U	(       a  XS4s  $   O   U=(       d    SR                  5       =(       d    [        X45      n[        U UUUUS9nU(       a  USS4$ g)	u   
Returns (student_id, rut_used, issue).
Prioridad: ficha (student_id) → RUT → nombre único en el cliente/sede.
issue: None | 'needs_rut' | 'not_found'
Nr   	not_foundr2   r3   r4   r   )NN	needs_rut)r0   re   r   r"   r5   r6   rB   r   )r_   rX   student_rutr7   r8   r   r   r   rut_in_messager:   explicitr;   hist_rutr   by_names                  r&   resolve_student_idr     sM     4%% +7=b9N(<=44d**s;'--//{#))+(6=;..$$ B'88Fv%())<)BC(6D(( ( B%%'N+<W+NI'
G d"""r(   c                    U b  [        U 5      OS nU=(       d    SR                  5       nUS:X  d  SU;   a  gUS:X  d  SU;   a  gg)	Nr      r   u*   el Informe de Evaluación Psicopedagógica   r   zel Informe a la Familiaz
el informe)r]   rM   )document_id
agent_namedocanames       r&   _document_labelr     sK    )5#k
4C2$$&E
byJ%';
ax9%(r(   c                R    U =(       d    SR                  5       =(       d    SnSU S3$ )z4RUT informado que no existe: no adivinar ni generar.r   indicadoz	El RUT **u
  ** es incorrecto: no coincide con ningún estudiante registrado en PIE360.

No identifico al alumno ni genero el informe con ese número. Revisa el RUT (todos los dígitos y el dígito verificador) e inténtalo de nuevo, o abre el chat desde la ficha del estudiante.)r"   )r`   showns     r&   build_invalid_rut_replyr    s/    YB-:E
E7 8 	8r(   c                    [        U =(       d    S5      nSnU(       a  SR                  S U 5       5      nSU S3n[        X5      nSU SU S3$ )	z*Pide el RUT antes de generar el documento.r   r   c              3  @   #    U  H  oR                  5       v   M     g 7frE   )
capitalize)rG   r   s     r&   rJ   &build_ask_rut_reply.<locals>.<genexpr>  s     9&Q,,..&s   z (mencionaste a )z#Para identificar bien al estudiantez y generar u   con todos los datos correctos, indícame el **RUT** con dígito verificador (por ejemplo `12.345.678-9`).

Cuando lo envíes, continúo con la redacción detallada y la generación del documento. También puedes abrir el chat desde la ficha del estudiante.)r   r@   r   )r7   r   r   r   name_bitprettylabels          r&   build_ask_rut_replyr    sg     +7=b9FH9&99%fXQ/K4E .hZ{5' JG 	Gr(   c                :   U R                  [        R                  5      R                  [        R                  U:H  5      R                  [        R                  R                  5       5      R                  5       nU Vs/ s H  n[        US   5      PM     sn$ s  snf )Nr   )
rW   r   r   rZ   agent_idorder_bydocument_nameascr\   r]   )r_   r  rb   rs       r&   agent_template_document_idsr    ss    
+778	*33x?	@	,::>>@	A		 	  $$t!C!It$$$s   =Bc                  ^ U R                  [        5      R                  [        R                  U:H  5      R	                  [        R
                  R                  5       5      R                  5       nU(       d  g [        U5      S:X  a  [        US   R                  5      $ [        X#5      R                  5       m[        U4S j[         5       5      (       d  ST;   al  ST;   af  U H`  nUR
                  =(       d    SR                  5       nSU;   d  [        UR                  5      [        :X  d  MK  [        UR                  5      s  $    [        U4S j[          5       5      (       a`  U HZ  nSUR
                  =(       d    SR                  5       ;   d  [        UR                  5      S	:X  d  ME  [        UR                  5      s  $    g )
Nr*   r   c              3  ,   >#    U  H	  oT;   v   M     g 7frE   rF   rG   hr   s     r&   rJ   $infer_document_id.<locals>.<genexpr>8  s     
,m9mrL   r   r   r   c              3  ,   >#    U  H	  oT;   v   M     g 7frE   rF   r  s     r&   rJ   r  =  s     
.o9orL   r   r   )rW   r   rZ   r  r  r  r  r\   rV   r]   r   rB   rM   rO   _FAMILY_HINTSr
   _PSICOPED_HINTS)r_   r  r7   r8   rb   rownamer   s          @r&   infer_document_idr  &  sR    	+,	*33x?	@	,::>>@	A		 	 
4yA~47&&''W.446D

,m
,,,d1ByTXGXC%%+224DD C$8<O$O3??++  
.o
...Cc//52<<>>#cooBVZ\B\3??++  r(   c               8   [        X5      n[        U5      S:X  a  US   $ U(       a  [        U5      OSnU(       a  Xv;   a  U$ [        XXE5      nU(       a  U$ U=(       d    SR	                  5       n	SU	;   a  gSU	;   a  gU(       a	  U(       d  U$ U(       a  US   $ U$ )	u   
El tipo de documento lo define el AGENTE (su plantilla), no la URL de otra ficha.
Si la URL trae document_id=7 pero el agente es psicopedagógico, se usa 27.
r*   r   Nr   r   r   r   r   )r  rV   r]   r  rM   )
r_   r  r   requested_document_idr7   r8   template_ids	requestedinferredr   s
             r&   resolve_document_id_for_agentr%  D  s     /r<L
<AA.C)*IY. w@H2$$&EUE*<?9	9r(   c                   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  SU S3$ UR
                  =(       d    SR                  5       nUR                  =(       d    SR                  5       nUR                  =(       d    SR                  5       nU SU SU 3R                  5       nUR                  =(       d    SR                  5       nSU=(       d    SU 3 3/n	U(       a  U	R                  SU 35        [        X5      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(       a  U	R                  SU 35        U(       a  U	R                  SU 35        U(       a  U	R                  SU 35         SSKJn  U" U 5      R                  U5      nU=(       d    0 R                  S5      =(       d    0 R                  S5      =(       d    0 nUR                  S5      =(       d    SR                  5       nU(       a  U	R                  SU 35        U	R!                  [#        U
5      5        U	R                  S5        SR%                  U	5      S-   $ ! [         a     NKf = f)Nz&Estudiante identificado en PIE360 (id z).r   r   zEstudiante en PIE360: zid z	RUT/IPE: student_schoolstudent_coursestudent_agezEstablecimiento (PIE360): zCurso (PIE360): zEdad (PIE360): r   )StudentClassstudent_dataacademic_infospecial_educational_need_namezNEE (PIE360): u   DATOS DEL SISTEMA PIE360: si el cuestionario o Files no traen identificación, curso, establecimiento, NEE, profesional o apoderado, usa estos datos (equivalente a consultar la ficha / MCP). No los dejes en blanco.z. .)rW   r	   rZ   rX   firstr   r"   r   r   rY   r?   r   r6   !app.backend.classes.student_classr*  r   extendr   r@   )r_   rX   r   r   r   r   r   fullr`   rA   pieschoolcourseager*  gotacademicnees                     r&   student_identification_hintr:  g  sf    	)*	(33zA	B	 
 7
|2FF^^!r((*E&&,"335F&&,"335FWAfXQvh'--/D))/R
6
6
8C%d&@J<.@%ABCE
y&'
&r
6Cgg&'-2446Fgg&'-2446F77=!'R
.
.
0C1&:;'x01
se,-	B2"":.YBOON39r>>OUSU||;<BIIKLL>#/0 
LL*3/0	LL	L 99Uc!!  s   7BK 
KK)r$   r   returnr   )r.   r   r;  
str | None)NN)r7   r   r8   list[dict[str, str]] | Noner9   r<  r;  r<  rE   )r7   r   r8   r=  r;  r   )r7   r   r8   r=  r;  bool)r_   r   r`   r   r;  
int | None)r.   r   r;  	list[str])r_   r   r   r@  r   r?  r   r?  r   r?  r;  r?  )r_   r   r   r   r   r?  r   r?  r   r?  r;  r?  )r_   r   rX   r?  r   r<  r7   r   r8   r=  r   r?  r   r?  r   r?  r;  z)tuple[int | None, str | None, str | None])r   r?  r   r<  r;  r   )r`   r<  r;  r   )r7   r   r   r?  r   r<  r;  r   )r_   r   r  r   r;  z	list[int])
r_   r   r  r   r7   r   r8   r=  r;  r?  )r_   r   r  r   r   r<  r!  r?  r7   r   r8   r=  r;  r?  )r_   r   rX   r]   r   r?  r;  r   )/__doc__
__future__r   r    typingr   sqlalchemy.ormr   &app.backend.db.models.agents_documentsr   app.backend.db.models.pie_corer   r   r	   'app.backend.utils.agents_familia_pie360r
   r   r   compile
IGNORECASEr+   rP   rQ   rR   	frozensetrN   r  r  r'   r0   r<   rB   rS   re   r   r   r   r   r   r   r   r  r  r  r  r%  r:  rF   r(   r&   <module>rK     s   J " 	  " M ^ ^  **JMM
V r 

Z MM  zz MM	  " & -
5 ,0#(  	&,4CL, # "<<< 	<
 < < <F # " 	
   H # "8#8# 8# 	8#
 8# )8# 8# 8# 8# /8#v	 #!  		,%  )	
 < : :  : 	 :
 & :  : ) :  :L #0"0"0" 0" 		0"r(   