
    75jPB                       % S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
Jr  SSKJrJrJrJrJr  \R$                  " \5      r\S   rS	rS
\S'   \" S \ 5       5      r\" S \ 5       5      rSS jrS S jrS!S jrS"S jrSS.           S#S jjrS$S jr             S%S jr!        S&S jr"SS.       S'S jjr# S(     S)S jjr$S*S jr%S*S jr&Sr'S*S jr(g)+zNRelleno de family_report.docx ministerial con tablas planas (sin campos Word).    )annotationsN)deepcopy)Path)AnyLiteral)_KEY_ALIASES_NARRATIVE_SLOT_KEYS_get_cell_element_iter_cell_paragraphs_resolve_replacement)replaceappend)!)      r   student_full_namer   )r   r   r   student_identification_numberr   )r      r   student_social_namer   )r   r   r   student_birth_dater   )r      r   student_ager   )r   r   r   student_courser   )r   r      student_schoolr   )r   r   r   professional_full_namer   )r   r      "professional_identification_numberr   )r   r   r   professional_social_namer   )r   r   r   professional_job_positionr   )r   r   r   professional_phoner   )r   r   r   professional_emailr   )r   r   r   "professional_delivered_date_informr   )r   
   r   person_full_namer   )r   r#   r   person_identification_numberr   )r      r   receiver_social_namer   )r   r&   r   person_phoner   )r      r   person_emailr   )r   r   r   applied_instrumentsr   )r   r   r   
diagnosticr   )r      r   pedagogical_strengthsr   )r   r-   r   pedagogical_support_needsr   )r   r#   r   social_affective_strengthsr   )r   r#   r   social_affective_support_needsr   )r   r&   r   collaborative_workr   )r   r)   r   home_based_descriptionr   )r      r   school_family_agreementsr   )r      r   evaluation_date_1r   )r   r6   r   evaluation_date_2r   )r   r6      evaluation_date_3r   )r   r6   r-   evaluation_date_4r   )r   r6   	   evaluation_date_5r   /tuple[tuple[int, int, int, str, FillMode], ...]FAMILIA_TABLA_SLOTSc              #  :   #    U  H  oS    S;   d  M  Uv   M     g7f)r   )r   r   N .0ss     \C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agent_familia_tabla_fill.py	<genexpr>rF   ;   s     *\6IqTU[^116I   	c              #  :   #    U  H  oS    S:X  d  M  Uv   M     g7f)r   r   NrA   rB   s     rE   rF   rF   <   s     %R1DA!PQ	aa1DrG   c                `    SSK Jn  SSKJn  U" [	        U 5      5      n[        UR                  R                  R                  U" S5      5      5      (       a  gUR                  R                  R                  U" S5      5       H(  nUR                  (       d  M  SUR                  ;   d  M(    g   UR                  R                  R                  U" S5      5      n[        U5      S	:w  a  gS
R                  S US   R                  U" S5      5       5       5      nSU;   $ ! [         a     gf = f)z<Plantilla ministerial actual: 5 tablas, sin SDT ni FORMTEXT.r   Documentqnzw:sdtFzw:instrTextFORMTEXTw:tblr    c              3  J   #    U  H  oR                   =(       d    S v   M     g7frP   NtextrC   ts     rE   rF   4docx_is_familia_ministerial_tabla.<locals>.<genexpr>N   s     G/F!2/F   !#r   w:tu   IDENTIFICACIÓN DEL ESTUDIANTE)docxrK   docx.oxml.nsrM   stranyelementbodyiterrT   findalllenjoin	Exception)pathrK   rM   docinstrtblsheaders          rE   !docx_is_familia_ministerial_tablarj   ?   s    !#s4y!s{{$$R[122[[%%**2m+<=EzzzjEJJ6 > {{''74t9>GtAw||BuI/FGG/699 s0   AD  =D  D  ,D  .<D  +4D   
D-,D-c                \    SR                  S U R                  U" S5      5       5       5      $ )NrP   c              3  J   #    U  H  oR                   =(       d    S v   M     g7frR   rS   rU   s     rE   rF   "_paragraph_text.<locals>.<genexpr>U   s     >)=A66<R<)=rX   rY   )rc   r`   )p_elrM   s     rE   _paragraph_textro   T   s$    77>2e9)=>>>    c                z    [        U 5       H,  nUR                  U" S5      :X  d  M  U R                  U5        M.     g )Nw:r)listtagremove)rn   rM   childs      rE   _clear_paragraph_runsrw   X   s,    d995	!KK rp   c                6   U" S5      nUb  UR                  [        U5      5        U" S5      nXl        UR                  S5      (       d  UR	                  S5      (       a  UR                  U" S5      S5        UR                  U5        U R                  U5        g )Nrr   rY    z	xml:spacepreserve)r   r   rT   
startswithendswithset)rn   rT   rM   OxmlElementref_r_prrwts          rE   _append_run_textr   ^   sw    EA	(#$	U	BGst}}S11
r+
+HHRLKKNrp   r   modec               z   U=(       d    SR                  5       nU(       d  gU R                  U" S5      5      nS nU(       aH  US   R                  U" S5      5       H*  nUR                  U" S5      5      n	U	c  M  [	        U	5      n  O   US:X  a  U(       a  [        US   U5      R                  5       n
U
(       af  S nUSS   H%  n[        X5      R                  5       (       a  M#  Un  O   Uc  U" S5      nU R                  U5        O[        X5        [        XX#U5        g	U(       aT  [        US   U5      R                  5       nU(       a0  [        U5      (       d   [        US   U5        [        US   XRX75        g	U H  nU R                  U5        M     U" S5      n[        XX#U5        U R                  U5        g	)
NrP   Fw:pr   rr   zw:rPrr   r   T)stripra   r`   findr   ro   r   rw   r   _is_label_likeru   )tc_elvaluerM   r~   r   rT   
paragraphsr   r   rprlabeltargetrn   existingnew_ps                  rE   _set_cell_plain_textr   j   s    KR Dr%y)JHA##BuI.A&&G%C#C=	 / xJ
1r288:F"12&t06688!F ' ~$U+V$%f1V2HE ":a="5;;=N844!*Q-4Z]DkLT EU"8<	LLrp   c                    U  Vs/ s H  oR                  5       (       d  M  UPM     nn[        U5      S:  a  g[        S U 5       5      nU[        U5      -  S:  $ s  snf )Nr   Tc              3  R   #    U  H  oR                  5       (       d  M  S v   M     g7f)r   N)isupper)rC   cs     rE   rF   !_is_label_like.<locals>.<genexpr>   s     27aiik7s   '	'g      ?)isalpharb   sum)rT   r   lettersuppers       rE   r   r      sT    .$Q))+q$G.
7|a2722ECL D((	 /s
   AAc           	        [        5       n/ nU Hl  u  pxpnXxU	4nX;   a  M  UR                  U5        [        XXU5      nUc  M5  [        X5      nU(       d  MI  [	        XX4US9(       d  M[  UR                  U
5        Mn     U$ )Nr   )r}   addr
   r   r   r   )rf   slotsreplacementsrM   r~   seenfilled_keys	table_idxrow_idxcol_idxkeyr   slotr   r   s                  rE   _fill_tabla_slot_rowsr      s     '*eDK27.	G$G,<!#'BG=$S7bDIIs# 38 rp   c           	     Z   SSK Jn  SSKJn  SSKJn  SSKJnJn  [        U 5      n [        U5      nU R                  5       UR                  5       :w  a  SSKnUR                  X5        [        U5      (       d  SSS	.$ / n	U" U 5      n
U
(       d  U" U5      n
U
(       a3  U" XU5      nU	R                  UR                  S
5      =(       d    / 5        O8SSKJn  U" XU5      nU	R                  UR                  S
5      =(       d    / 5        U" [#        U5      5      nSnU	R                  [%        XXU5      5        U	R                  [%        U[&        XU5      5        UR)                  [#        U5      5        U
(       a  SOSn[*        R-                  SU[/        U	5      UR0                  5        SXS.$ )z4Rellena informe familia ministerial (tablas planas).r   rJ   r~   rL   )(fill_familia_identification_placeholders%list_familia_placeholder_keys_in_pathNerrorz,No es plantilla ministerial de tablas planas)statusmessager   )%fill_familia_identification_only_docxrA   zplaceholders+hybridcoordinatesz#Tabla familia (%s): %d campos en %ssuccess)r   r   r   )rZ   rK   	docx.oxmlr~   r[   rM   0app.backend.utils.agent_familia_placeholder_fillr   r   r   resolveshutilcopy2rj   extendgetr   r\   r   FAMILIA_TABLA_NARRATIVE_SLOTSsaveloggerinforb   name)template_pathr   output_pathrK   r~   rM   r   r   r   r   placeholder_keys	id_resultr   rf   id_slotsr   s                   rE   fill_familia_tabla_cellsr      s    %
 'M{#K+"5"5"77]0,[99!.\]]K<]K@M<
	 	9==7=2>	
 :
	 	9==7=2>
3{#
$C ACH,SLkZ[c#@,T_` HHS$4 -D
KK-K	  JJrp   )r   c               "   SSK Jn  SSKJn  SSKJn  SSKJnJnJ	nJ
n	  [        U 5      n
U(       a  [        U5      OSnU(       aI  UR                  5       (       a4  U" U5      (       a'  U	" XU5      nU(       a  [        [        U5      5      $ S/$ U" [        U
5      5      nSSKJnJn  UR#                  5        VVs0 s H  u  nnX;   d  M  UU_M     nnnU" UU5      nUR%                  [        U
5      5        [        [        U5      5      $ s  snnf )	zs
Reaplica tablas 1-2 tras GPT.
Si la plantilla usa {{...}}, restaura desde plantilla (el output ya no tiene tags).
r   rJ   r   rL   )FAMILIA_IDENTIFICATION_KEYSdocx_has_familia_placeholders$list_familia_placeholder_keys_in_doc,restore_familia_identification_from_templateNtemplate_restore)r   "fill_familia_identification_tables)rZ   rK   r   r~   r[   rM   r   r   r   r   r   r   is_filesortedr}   r\   r   itemsr   )	docx_pathr   r   rK   r~   rM   r   r   r   r   re   tplrestoredrf   r   kvid_replacementsfilleds                      rE   "refill_familia_identification_onlyr     s     %  	?D!.$}
DC
s{{}}!>s!C!C?<X(0vc(m$J7I6JJ
3t9
C
 )5(:(:(<a(<1@`tq!t(<Oa/_EFHHSY#f+ bs   :D
Dc                0   SSK Jn  SSKJn  SSKJn  SSKJn  U" [        U 5      5      nU" U5      u  pxU(       a  SO
U(       a  SOSn	U	c  g[        US	SX5      n
U
c  gU
R                  U" S
5      5       H  nUR                  (       d  M  SUR                  ;   a>  UR                  R                  SSS5      Ul        UR                  [        U 5      5          gUR                  R                  5       S;   d  M    g   UR                  [        U 5      5        g)uG   Marca ingreso o reevaluación reemplazando ☐ por x en la fila MOTIVO.r   rJ   r   rL   )_evaluation_type_flagsr   r   Nr   rY   u   ☐x)r   X)rZ   rK   r   r~   r[   rM   'app.backend.utils.agent_familia_prefillr   r\   r
   r`   rT   r   r   r   )r   student_contextrK   r~   rM   r   rf   is_admission	is_reevalcolr   r   s               rE   #fix_familia_motivo_evaluacion_tablar   +  s    
 %N
3y>
"C4_EL!y!dC
{c1a1E}jjE#wwBGGggooeS!4BGHHS^$77==?j( $ HHS^rp   c                |   SSK Jn  SSKJn  SSKJn  SSKJn  U" [        U 5      5      n[         VVVV	V
s1 s H  u  pgpn
U
S:X  d  M  XgU4iM     nn	nnnn
[         H  u  pgpn[        XVXxU5      nUc  M  XgU4U;   n[        [        X5      5       H  u  nnU(       a  US:X  a  M  UR                  U" S5      5       HR  nUR                  U" S5      5      nUc  M  UR                  =(       d    S	R!                  5       (       d  MI  U" UX25        MT     M     M     UR#                  [        U 5      5        g s  sn
n	nnnf )
Nr   rJ   r   rL   )_apply_arial_10_to_runr   rr   rY   rP   )rZ   rK   r   r~   r[   rM   r   r   r\   r?   r
   	enumerater   r`   r   rT   r   r   )r   rK   r~   rM   r   rf   r   r   r   _keyr   append_slots_moder   
skip_firstpirn   r   r   s                      rE   apply_familia_arial_10_to_tablar   M  s   %N
3y>
"C 8K7J3It8 	&W%7J   5H0	G5!#'BG='2lB
!"7"BCHBbAgYYr%y)VVBuI&>rww}"&;&;&=&=*1b> * D 5H HHS^'s   D5D5c                  ^" SSK Jn  SSKJn  SSKJm"  SSKJnJnJ	nJ
n  U" [        U 5      5      n[         VV	V
VVs1 s H  u  ppnUS:X  d  M  XU
4iM     nnn
n	nn[         VVVVVs1 s H  u  pnnnU[        ;   d  M  XU4iM     nnnnnnU GH2  u  pn
[        XxXT"5      nUc  M  UR                  T"" S5      5      nU(       d  M9  XU
4U;   n[!        U5       VVs/ s H  u  nnU(       a  US:X  a  M  UPM     nnn/ nSnU H  n[#        UT"5      R%                  5       nU(       a  U" U5      (       a  M3  ['        U"4S	 jUR                  T"" S
5      5       5       5      (       a  SnUR)                  U" UT"5      5        M~  [*        R,                  " SU5       H-  nUR%                  5       nU(       d  M  UR/                  U5        M/     M     U(       aE  [1        U5      S:  d  U(       a/  U H  nUR3                  U5        M     U H  nU" UUT"US 5        M     [!        UR                  T"" S5      5      5       H  u  n nU(       a  U S:X  a  M  [#        UT"5      R%                  5       nU(       a  U" U5      (       a  ME  UR5                  T"" S5      5      n!U!c  U" S5      n!UR7                  SU!5        U" U!T"U5        M     GM5     UR9                  [        U 5      5        g s  snnn
n	nf s  snnnnnf s  snnf )Nr   rJ   r   rL   )_append_narrative_paragraph!_apply_narrative_paragraph_format_is_label_paragraph_split_paragraph_segmentsr   r   Fc              3  T   >#    U  H  oR                  T" S 5      5      SLv   M     g7f)zw:brN)r   )rC   r   rM   s     rE   rF   2compact_familia_tabla_narrative.<locals>.<genexpr>  s#     S;Ra66"V*%T1;Rs   %(rr   Tz\n\s*\nr   w:pPr)rZ   rK   r   r~   r[   rM   r   r   r   r   r   r\   r?   r	   r
   ra   r   ro   r   r]   r   resplitr   rb   ru   r   insertr   )#r   rK   r~   r   r   r   r   rf   r   r   r   r   r   r   tiricir   r   narrative_slotsr   r   
skip_labelipbody_paragraphssegmentshas_brrn   rT   blocksegr   pprrM   s#                                     @rE   compact_familia_tabla_narrativer  k  s   %  3y>
"C 8K7J3It8 	&W%7J   ':&9"BBU&& 	&9   (7#	G!#'BG=]]2e9-
'2lB
#J/
/$!Q
qAvA/ 	 
 !#D"4,224D.t44S4<<5	;RSSS 9$ CDXXj$7E!KKMEu . 8 $ X*f'T" (+E3KN   "%--5	":;HBbAg"4,224D.t44))BwK(C{!'*As#-c2{C <E (7\ HHS^s

s#   K"K")K+ K+K46K4)r   r   r-   r#   r&   r)   r4   r6   c           
     
   SSK Jn  SSKJn  SSKJn  SSKJn  [        U 5      (       d  gU" [        U 5      5      nUR                  R                  R                  U" S5      5      n[        U5       GH  u  pxUR                  U" S5      5       HW  n	U	R                  U" S	5      5      n
U
c  M  [        U
R                  U" S
5      5      5       H  nU
R!                  U5        M     MY     US:X  a  UR                  U" S5      5      n["         H  nU[%        U5      :  a  M  X   R                  U" S	5      5      n
U
b8  [        U
R                  U" S5      5      5       H  nU
R!                  U5        M     X   R                  U" S5      5       HW  nUR                  U" S5      5      nUc  M  [        UR                  U" S5      5      5       H  nUR!                  U5        M     MY     M     UR'                  U" S5      5       H^  nUR                  U" S5      5       H@  nUR                  U" S5      5      nUc  U" S5      nUR)                  SU5        U" UX25        MB     M`     GM     UR+                  [        U 5      5        g)u   
Permite que el contenido narrativo fluya entre páginas sin huecos en blanco:
quita keepNext/keepLines/pageBreakBefore, cantSplit y alturas fijas de fila.
r   rJ   r   rL   )!_clear_paragraph_pagination_locksNrO   zw:trzw:trPrzw:cantSplitr   z
w:trHeightzw:tczw:tcPrzw:vAlignr   r   )rZ   rK   r   r~   r[   rM   r   r  rj   r\   r^   r_   ra   r   r   rs   ru   #FAMILIA_TABLA_NARRATIVE_ROW_INDICESrb   r`   r   r   )r   rK   r~   rM   r  rf   rh   tbl_idxtbl_eltr_eltr_prelrowsr   r   tc_prrn   r   s                     rE   relax_familia_tabla_layoutr    s   
 %Y,Y77
3y>
"C;;##BwK0D$T?^^BvJ/EJJr(|,E u}}R->?@BLL$ A 0 a<>>"V*-D>c$i'**2h<8$"5==L1A#BCR( D!]222f:>E!JJr(|4E} "5==J#@AR( B	 ? ? [[F,Ebi0ii7,;%g.CKK3'1#rG 1 -/ +> HHS^rp   )re   r   returnbool)rn   r   rM   r   r  r\   )rn   r   rM   r   r  None)rn   r   rT   r\   rM   r   r~   r   r   z
Any | Noner  r  )r   r   r   r\   rM   r   r~   r   r   FillModer  r  )rT   r\   r  r  )rf   r   r   r>   r   dict[str, str]rM   r   r~   r   r  	list[str])r   
str | Pathr   r  r   r  r  zdict[str, Any])r   r   r   r  r   zPath | Noner  r  )N)r   r   r   zdict[str, Any] | Noner  r  )r   r   r  r  ))__doc__
__future__r   loggingr   copyr   pathlibr   typingr   r   (app.backend.utils.agent_familia_formtextr   r	   r
   r   r   	getLogger__name__r   r  r?   __annotations__tuple"FAMILIA_TABLA_IDENTIFICATION_SLOTSr   rj   ro   rw   r   r   r   r   r   r   r   r   r  r  r  rA   rp   rE   <module>r      s   T "  	     
		8	$&'"H D "H &+*\6I*\%\ " %%R1D%R R *?	$ 222 	2 	2 2 
2j)	: ! 		
  2@K@K @K @K 	@KN "&	%% % 	%
 %T .2* 
D<FT 'D #0rp   