
    ԁIjR,                    \   % S r SSKJr  SSKrSSKrSSKrSSK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  SSKJrJr  \R&                  " \5      rS	rS
S
S
SSSSSSSSSSSSS.rS\S'   SS jr      SS jrSS jrS S jrS!S jrS"S jr S#         S$S jjr S#       S%S jjr g)&z:Relleno seguro de plantilla Informe Familia para Agent v2.    )annotationsN)Path)Any)DocumentsClass)'merge_pie360_fallback_into_replacements)FAMILIA_IDENTIFICATION_SDT_TAGS_NARRATIVE_KEYS)u+   Haz clic o pulse aquí para escribir texto.z Click or tap here to enter text.student_full_namestudent_identification_numberstudent_birth_datestudent_agestudent_coursestudent_schoolprofessional_full_nameperson_full_name)	full_namestudent_namenombreidentification_numberstudent_rutrutipe
birth_datestudent_born_dateagecourseschoolprofessional_nameperson_namereceiver_full_namedict[str, str]FAMILIA_CONTENT_CONTROL_ALIASESc                ,   U =(       d    SR                  5       R                  5       n[        R                  " SU5      nSR	                  S U 5       5      n[
        R                  " SSU5      n[
        R                  " SSU5      R                  S5      $ )N NFKDc              3  ^   #    U  H#  n[         R                  " U5      S :w  d  M  Uv   M%     g7f)MnN)unicodedatacategory).0cs     YC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agent_v2_familia_fill.py	<genexpr>!_normalize_key.<locals>.<genexpr>2   s$     @1a 4 4Q 74 ?1s   -	-z
[^a-z0-9]+_z_+)striplowerr(   	normalizejoinresub)keyts     r,   _normalize_keyr8   /   ss    	!!#Afa(A
@1@@A
}c1%A66%a &&s++    c                8   0 nU R                  5        HE  u  p4Uc  M
  [        U5      R                  5       (       d  M*  [        U5      R                  5       X#'   MG     UR                  S5      =(       d    SR                  5       nUR                  S5      =(       d    SR                  5       n0 nU(       a  UR	                  UUUS.5        U(       a  UR	                  UUUUS.5        UR                  5        H  u  p4UR                  X45        M     [        X!5      $ )z:Combina campos del LLM con datos del estudiante en PIE360.student_fullnamer$   r   )r
   r   r   )r   r   r   r   )itemsstrr0   getupdate
setdefaultr   )
llm_fieldsstudent_ctxmergedr6   valuer   r   defaultss           r,   merge_familia_replacementsrF   7   s    
  F &&(
U!1!1!3!3e***,FK ) !34:AACI??239r
@
@
BC!H%.& )	
 14),"		
 nn&
#% ' 36GGr9   c                 J   [        [        5      n U R                  [        5        U R                  [        R                  5       5        U R                  [        R                  5       5        U R                  1 Sk5         SSKJn  U H  Gt p#nU R                  U5        M      SSKJnJn  U H  Gt p#U R                  U5        M     UR                  5        H'  u  p7U R                  U5        U R                  U5        M)     U $ ! [         a     Nnf = f! [         a     U $ f = f)uH   Claves conocidas del informe familia (vacías si el LLM no las entrega).>(   r   r   r   primary	born_dater   r   
evaluation
substituteperson_emailperson_phonereevaluationguardian_typereceiver_emailreceiver_phoneevaluation_dateevaluation_typeperson_presenceevaluation_date_1evaluation_date_2evaluation_date_3evaluation_date_4evaluation_date_5professional_roleperson_presence_ofperson_social_nameprofessional_emailprofessional_phoner    student_social_namereceiver_presence_ofreceiver_social_namereport_delivery_datehas_power_of_attorneyr   receiver_relationshipperson_relation_studentprofessional_social_namereceiver_identification_number"professional_delivered_date_informr   )FAMILIA_TABLA_SLOTS)FAMILIA_FORMTEXT_SLOTS_KEY_ALIASES)setr   r?   r	   r"   keysvalues+app.backend.utils.familia_report_tabla_fillri   addImportError)app.backend.utils.familia_report_formtextrj   rk   r<   )rm   ri   r/   r6   _moderj   rk   aliasess           r,   _all_familia_field_keysru   ^   s    89DKK KK/4467KK/6689KK)	
+XS1NQUHHSM 2	b-GQHHSM .(..0LCHHSMKK  1
 K    Ks%   ?#D #AD 
DD
D"!D"c                T    [        U 5      n[        5        H  nX!;  d  M
  SX'   M     U$ )uR   Asegura clave → '' para que campos sin dato no conserven el placeholder de Word.r$   )dictru   )rC   outr6   s      r,   #ensure_familia_replacement_defaultsry      s+    
v,C&(>CH ) Jr9   c                L    U R                  5       (       a  U R                  5       R                  S:  a  g[        R                  " U S5       nUR                  5       b
   S S S 5        gSUR                  5       ;   sS S S 5        $ ! , (       d  f       g = f! [         a     gf = f)Nd   Frz[Content_Types].xml)is_filestatst_sizezipfileZipFiletestzipnamelist	Exception)pathzfs     r,   validate_docxr      s~    ||~~!4!4s!:__T3'2zz|' (' )BKKM9 (''  s@   3B B B B )B;	B 
BB B 
B#"B#c                    SSK Jn  SSKJn  SSKJn  SSKJnJn  U" [        U 5      5      nU" XuXU5      nUR                  [        U 5      5        SUS.$ )Nr   )Document)OxmlElement)qn)ri   _fill_tabla_slot_rowssuccess)statusfilled_keys)docxr   	docx.oxmlr   docx.oxml.nsr   ro   ri   r   r=   save)	output_pathreplacementsr   r   r   ri   r   docfilleds	            r,   _fill_tabla_ministerialr      sG    %f
3{#
$C"3\{[FHHS77r9   c           
         U R                  5       (       d  SSS.$ UR                  R                  SSS9  [        R                  " X5        [        [        X#=(       d    0 5      5      n SSKJnJ	n  SSK
JnJnJn	  U(       a  U" U5      (       a
  U" XU5      nOU	(       a  U	" U5      (       a  [        X5      nOl[!        ["        5      nU H  nUR%                  ['        U5      U5        M      [(        R*                  " [-        U5      U[-        U5      [/        [0        5      USSS
9nUR3                  S5      S:X  a  U$ [5        XU5        [7        U5      (       d  SSS.$ SS[-        U5      UR8                  S.$ ! [         a    S	nS	nS	n	S	n
 GNf = f)zQ
Copia la plantilla subida por el agente y la rellena sin romper controles Word.
errorzPlantilla no encontrada.)r   messageT)parentsexist_okr   )docx_has_legacy_formtextfill_familia_formtext_fields)ri   r   !docx_is_familia_ministerial_tablaN)remove_literal_stringscontent_control_tag_aliasespreserve_empty_content_controlscheckbox_unchecked_blankr   u=   El Word generado quedó corrupto. Revise la plantilla subida.r   z&Documento DOCX rellenado correctamente)r   r   	file_pathfilename)r}   parentmkdirshutilcopy2ry   rF   rr   r   r   ro   ri   r   r   rq   r   rw   r"   r@   r8   r   fill_docx_formr=   list_WORD_PLACEHOLDERSr>   _apply_familia_postprocessr   name)template_pathr   r   student_contextrC   r   r   ri   r   r   fill_familia_tabla_fieldsresult
cc_aliasesr6   s                 r,   fill_familia_templater      s      ""!.HIITD9
LL,0"<1FBGF)	
	
 	
  $<[$I$I-m[Q	*/PQ\/]/](=9:
C!!."5s;   ..#'(:#;(2,0%)
 zz(w&{VD%%V
 	
 ;%$$	 M  )#' '+$,0)$(!	)s   )E7 7FFc                   [        U=(       d    0 5      nU(       a  UR                  U5         SSKJnJnJnJnJnJn	J	n
   U" U 5         U" X5         SSKJn  SSKJn  U" U 5      (       d  U" U 5      (       a  U
" X5         U" U 5         U" U 5         U" U 5         U	" U 5        g ! [         a     g f = f! [         a   n[        R                  SU5         S nANS nAff = f! [         a   n[        R                  SU5         S nANS nAff = f! [         a   n[        R                  SU5         S nANS nAff = f! [         a   n[        R                  SU5         S nANS nAff = f! [         a   n[        R                  S	U5         S nANS nAff = f! [         a!  n[        R                  S
U5         S nAGN!S nAff = f! [         a   n[        R                  SU5         S nAg S nAff = f)Nr   )apply_familia_arial_10_font$apply_familia_justify_sdt_paragraphsapply_familia_checkbox_statesclear_word_form_placeholders!compact_familia_narrative_spacing%ensure_familia_checkbox_boxes_visible!fix_familia_motivo_evaluacion_rowz%compact_familia_narrative_spacing: %sz!apply_familia_checkbox_states: %s)r   )r   z%fix_familia_motivo_evaluacion_row: %szapply_familia_arial_10_font: %sz(apply_familia_justify_sdt_paragraphs: %sz clear_word_form_placeholders: %sz)ensure_familia_checkbox_boxes_visible: %s)rw   r?   (app.backend.utils.familia_report_prefillr   r   r   r   r   r   r   rq   r   loggerwarningrr   r   ro   r   )r   r   r   checkbox_ctxr   r   r   r   r   r   r   excr   r   s                 r,   r   r     s   
 $((=2#>LL)	
 	
 	
E)+6A%k@
EVa,[99=UVa=b=b-kH?#K0H,[9@$[1I-k:O  
  E>DDE
  A:C@@A  E>DDE
  ?8#>>?
  HA3GGH
  @93??@
  IBCHHIs   B& B6 
C# .D D= E* F G &
B32B36
C  CC #
D-DD
D:D55D:=
E'E""E'*
F4FF
G!F==G
G/G**G/)r6   r=   returnr=   )rA   r!   rB   dict[str, Any]r   r!   )r   zset[str])rC   r!   r   r!   )r   r   r   bool)r   r   r   r!   r   r   )N)
r   r   r   r   r   r!   r   dict[str, Any] | Noner   r   )r   r   r   r   r   zdict[str, str] | Noner   None)!__doc__
__future__r   loggingr4   r   r(   r   pathlibr   typingr   #app.backend.classes.documents_classr   )app.backend.utils.agent_v2_familia_pie360r   r   r   r	   	getLogger__name__r   r   r"   __annotations__r8   rF   ru   ry   r   r   r   r    r9   r,   <module>r      s4   @ "  	      > ]
 
		8	$  %'!<2**&-1%,3  &,$H$H$H $HNCL	
8" .2	HHH !H +	H
 H\ +/<I<I*<I (<I 
	<Ir9   