ó
    *Ä–jÔg  ã                  ó  • % S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSKJ	r	  SSK
JrJrJr  SSKJ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JrJrJrJr  SSKJ r   Sr!\	" S5      r"SSSSSSSSSSSSS.r#S\$S'   Sr%Sr&S r'S!r(S"r)Sr*S#r+S$r,S%r-S&r.1 S'kr/\R`                  " S(5      r1\R`                  " S)5      r2S*1r31 S+kr4S,S-S.S/S0.r5S1r6STSUS2 jjr7SVS3 jr8\%\&S44       SWS5 jjr9SXS6 jr:SYS7 jr;S8 r<SZS9 jr=SZS: jr>S[S; jr?S\S< jr@S]S= jrAS^S> jrBSXS? jrCSXS@ jrDS]SA jrES_SB jrFS`SC jrGSaSD jrHSbSE jrIScSF jrJSdSG jrKSaSH jrLSeSI jrMSfSJ jrNSgSK jrOShSL jrPSiSM jrQSjSN jrRSkSO jrSSlSP jrTSmSnSQ jjrUSoSR jrV  Sp           SqSS jjrWg)rui  ExportaciÃ³n a Word del Formulario Ãšnico de RevaluaciÃ³n (documento 6).

Las plantillas oficiales `fur*_formulario.docx` traen un content control por cada
campo del formulario ministerial, etiquetado con la clave semÃ¡ntica del
`formData` del frontend (`full_name`, `nee_maintained__si`,
`participating_professionals[0].profession_id`, ...). AquÃ­ se resuelven esos
valores desde `fur_forms` y se escriben en una copia de la plantilla.

Las casillas se conservan siempre visibles: sin marcar quedan como un cuadro
vacÃ­o y marcadas como un cuadro negro relleno, igual que si una persona las
hubiera marcado en Word.
é    )ÚannotationsN)ÚdateÚdatetime)ÚPath)ÚAnyÚMappingÚOptional)ÚDocument)ÚWD_ALIGN_PARAGRAPH)ÚOxmlElementÚ	parse_xml)Úqn)ÚSession)ÚCareerTypeModelÚCourseModelÚSchoolModelÚStudentAcademicInfoModelÚStudentPersonalInfoModel)Ú#map_professional_id_to_display_namez4http://schemas.microsoft.com/office/word/2010/wordmlzfiles/original_student_fileszfur1_tel_formulario.docxzfur2_dep_formulario.docxzfur3_tda_formulario.docxzfur4_ci_t_formulario.docxzfur5_ci_p_formulario.docxzfur6_dm_formulario.docxzfur7_dv_formulario.docxzfur8_da_formulario.docxzfur9_dmu_formulario.docxzfur10_tea_formulario.docxzfur11_dstc_formulario.docx)ÚtelÚtel_tlÚdeaÚtdahÚneetÚneepÚdiscapacidad_motoraÚdiscapacidad_visualÚdiscapacidad_auditivaÚdiscapacidad_multipleÚteaÚdisfasiazdict[str, str]ÚFUR_TEMPLATE_BY_VARIANTÚArialÚ18Ú000000é<   z	MS Gothicu   â– u   â˜�Ú25A0Ú2610>   Ú1ÚxÚsiÚyesÚtrueÚcheckedÚmarcadoz^(\d{4})-(\d{2})-(\d{2})z^([A-Za-z0-9_]+)(?:\[(\d+)\])?$Úprofessional_id>   Úprofession_idÚcareer_type_idÚprofession_specialty_idzCoordinador/a PIEzDocente de aulazProfesional de apoyoÚOtro)é   é   é   é   )'úw:rStyleúw:rFontszw:bzw:bCszw:izw:iCszw:capszw:smallCapszw:strikez	w:dstrikez	w:outlinezw:shadowzw:embossz	w:imprintz	w:noProofzw:snapToGridzw:vanishzw:webHiddenúw:colorz	w:spacingzw:wzw:kernz
w:positionúw:szúw:szCszw:highlightzw:uzw:effectzw:bdrzw:shdz	w:fitTextzw:vertAlignzw:rtlúw:cszw:emzw:langzw:eastAsianLayoutzw:specVanishzw:oMathc                óx   • U R                  [        S5      5      nUc  [        S5      nU R                  X5        U$ )u5   Devuelve el `w:rPr` de `parent`, creÃ¡ndolo si falta.úw:rPr)Úfindr   r   Úinsert)ÚparentÚpositionÚrprs      Ú$app/backend\utils\fur_docx_export.pyÚ
ensure_rprrG   †   s4   € à
�+‰+”b˜“kÓ
"€CØ
�{Ü˜'Ó"ˆØ�‰�hÔ$Ø€Jó    c                ó^  • U R                  [        U5      5       H  nU R                  U5        M     [        U5      n[        R                  U5      nU  HC  n[        US   H3  nUR                  [        U5      :X  d  M  UR                  U5        Us  s  $    ME     U R                  U5        U$ ©N)	Úfindallr   Úremover   Ú
_RPR_ORDERÚindexÚtagÚaddpreviousÚappend)rE   ÚnameÚexistingÚelementrN   ÚchildÚ	candidates          rF   Ú_insert_orderedrW   �   s�   € Ø—K‘K¤ 4£Ö)ˆØ�
‰
�8Öñ *ä˜$Ó€GÜ×Ñ˜TÓ"€EÛˆÜ# E FÓ+ˆIØ�y‰yœB˜y›MÕ)Ø×!Ñ! 'Ô*Ø”ó ,ñ ð
 ‡J�JˆwÔØ€NrH   Fc                ó   • [        U S5      n/ SQnU(       a  UR                  S5        U H  nUR                  [        U5      U5        M      U(       d1  UR	                  [        S5      5      b  UR
                  [        S5      	 S H6  nUR	                  [        U5      5      c  M   UR
                  [        U5      	 M8     U(       a-  S H'  n[        X5      R                  [        S5      U5        M)     [        U S5      R                  [        S5      [        5        U R                  [        S	5      5       HS  nUR	                  [        S5      5      =(       d    S
R                  5       n	SU	;   d  SU	;   d  MB  U R                  U5        MU     g)u¾   Fija tipografÃ­a, tamaÃ±o y color del campo (por defecto Arial 9 negro).

`east_asia` se usa en las casillas, cuyo sÃ­mbolo se dibuja con la tipografÃ­a
CJK declarada por el propio control.
r:   )zw:asciizw:hAnsir>   z
w:eastAsiaN)zw:asciiThemezw:hAnsiThemez	w:cstheme)r<   r=   úw:valr;   r9   Ú ÚmarcadordeposicinÚplaceholdertext)
rW   rQ   Úsetr   ÚgetÚattribÚFUR_FIELD_FONT_COLORrK   ÚlowerrL   )
rE   Ú	font_nameÚhalf_pointsÚ	east_asiaÚfontsÚ
attributesÚattrrR   ÚstyleÚvalues
             rF   Úapply_field_fontrj   �   s/  € ô ˜C Ó,€EÚ/€JÞØ×Ñ˜,Ô'ÛˆØ�	‰	”"�T“(˜IÖ&ñ æ˜Ÿ™¤2 lÓ#3Ó4Ñ@Ø�L‰Lœ˜LÓ)Ð*Û=ˆØ�9‰9”R˜“XÓÓ*Ø—‘œR ›XÒ&ñ >ö Û&ˆDÜ˜CÓ&×*Ñ*¬2¨g«;¸ÖDñ 'ä�C˜Ó#×'Ñ'¬¨7«Ô5IÔJð —‘œR 
›^Ö,ˆØ—‘œ2˜g›;Ó'×-¨2×4Ñ4Ó6ˆØ %Ó'Ð+<ÀÕ+EØ�J‰J�uÖò -rH   c                ó,   • [        U [        [        SS9  g )NT©rd   )rj   ÚFUR_CHECKBOX_FONTÚFUR_CHECKBOX_HALF_POINTS)rE   s    rF   Úapply_checkbox_fontro   ¿   s   € Ü�SÔ+Ô-EÐQUÓVrH   c                ó   • S[          SU  3$ )NÚ{Ú})ÚW14_NS)rR   s    rF   Ú_w14rt   Ã   s   € Ø”ˆx�r˜$˜Ð Ð rH   c                ó�   • U  H@  nUR                   [        S5      :X  d"  UR                   R                  S5      (       d  M>  Us  $    g )NÚcheckboxz	}checkbox)rO   rt   Úendswith)Úsdt_prrU   s     rF   Ú_find_checkboxry   Ç   s;   € ÛˆØ�9‰9œ˜ZÓ(Ó(¨E¯I©I×,>Ñ,>¸{×,KÓ,KØŠLñ ð rH   c                ó   • [        U 5      S L$ rJ   )ry   )rx   s    rF   Úis_checkbox_controlr{   Î   s   € Ü˜&Ó!¨Ð-Ð-rH   c                ód  ^• [        U 5      nUc  gS[        4S[        44 HŒ  u  mn[        U4S jU 5       S5      nUc3  [	        ST S[
         SU S	[         S
3	5      nUR                  U5        MR  UR                  [        S5      U5        UR                  [        S5      [        5        MŽ     g)uØ   Deja el estado marcado como cuadro negro relleno y el vacÃ­o como cuadro.

Se aplica sobre el propio control, asÃ­ el sÃ­mbolo es el mismo cuando el
sistema marca la casilla y cuando alguien la marca a mano en Word.
NFÚcheckedStateÚuncheckedStatec              3  óp   >#   • U  H+  oR                   R                  S T-   5      (       d  M'  Uv •  M-     g7f©rr   N©rO   rw   ©Ú.0rU   rR   s     €rF   Ú	<genexpr>Ú,normalize_checkbox_states.<locals>.<genexpr>à   s&   øé € ÐK¢�u¯I©I×,>Ñ,>¸sÀT¹z×,J�U‰U¢ùó   ƒ&6­	6z<w14:z xmlns:w14="z" w14:val="z" w14:font="z"/>ÚvalÚfontT)
ry   ÚFUR_CHECKED_STATE_HEXÚFUR_UNCHECKED_STATE_HEXÚnextr   rs   rm   rQ   r]   rt   )rx   rv   Ú	hex_valuerT   rR   s       @rF   Únormalize_checkbox_statesr�   Ò   sÄ   ø€ ô ˜fÓ%€HØÑØà	Ô.Ð/Ø	Ô2Ð3ó‰ˆˆiô ÜK¡ÓKØó
ˆð ‰?ÜØ˜�v˜\¬&¨ð 2Ø%˜; lÔ3DÐ2EÀSðJóˆGð �O‰O˜GÔ$ÙØ�‰”D˜“K Ô+Ø�‰”D˜“LÔ"3Ö4ñ!ð" rH   c                ó˜  ^• [        U 5      nU(       a  SOSmU(       a  [        O[        nUc  U[        4$ [	        U4S jU 5       S5      nUc  U[        4$ UR                  [        S5      5      =(       d    [        nUR                  [        S5      5      =(       d    Sn [        [        US5      5      U4$ ! [         a    X54s $ f = f)	uG   SÃ­mbolo y tipografÃ­a declarados por el control para el estado pedido.r}   r~   Nc              3  óp   >#   • U  H+  oR                   R                  S T-   5      (       d  M'  Uv •  M-     g7fr€   r�   r‚   s     €rF   r„   Ú _state_symbol.<locals>.<genexpr>ö   s&   øé € ÐR¢x˜e·9±9×3EÑ3EÀcÈDÁj×3Q—E‘E¢xùr†   rˆ   r‡   rZ   é   )
ry   ÚFUR_CHECKED_CHARÚFUR_UNCHECKED_CHARrm   r‹   r^   rt   ÚchrÚintÚ
ValueError)rx   r.   rv   ÚfallbackrT   rˆ   ÚrawrR   s          @rF   Ú_state_symbolr™   ï   s¹   ø€ ä˜fÓ%€HÞ$‰>Ð*:€DÞ#*ÕÔ0B€HØÑØÔ*Ð*Ð*ÜÔR¡xÓRÐTXÓY€GØ�ØÔ*Ð*Ð*Ø�;‰;”t˜F“|Ó$×9Ô(9€DØ
�+‰+”d˜5“kÓ
"×
( b€CðÜ”3�s˜B“<Ó  $Ð&Ð&øÜó Øˆ~Òðús   Â"B9 Â9C	ÃC	c                ó†   • U R                  [        S5      5      nUc  / $ [        UR                  [        S5      5      5      $ )Núw:sdtContentzw:r)rA   r   ÚlistÚiter)ÚsdtÚcontents     rF   Ú_content_runsr      s7   € Ø�h‰h”r˜.Ó)Ó*€GØ�Øˆ	Ü�—‘œR ›YÓ'Ó(Ð(rH   c                óØ  • [        U 5       H/  nUR                  [        S5      :w  d  M  U R                  U5        M1     U=(       d    SR	                  SS5      R	                  SS5      R                  S5      n[        U5       Hc  u  pEU(       a  U R                  [        S5      5        [        S5      nUR                  [        S5      S	5        XVl
        U R                  U5        Me     g
)uH   Deja el run con un Ãºnico texto; los saltos de lÃ­nea se vuelven `w:br`.r@   rZ   z
Ú
Úzw:brzw:tz	xml:spaceÚpreserveN)rœ   rO   r   rL   ÚreplaceÚsplitÚ	enumeraterQ   r   r]   Útext)Úrunr¨   rU   ÚlinesrN   ÚlineÚnodes          rF   Ú_write_run_textr­     s®   € ä�c–ˆØ�9‰9œ˜7›Õ#Ø�J‰J�uÖñ ð �Z�R× Ñ  ¨Ó.×6Ñ6°t¸TÓB×HÑHÈÓN€EÜ  Ö'‰ˆÞØ�J‰J”{ 6Ó*Ô+Ü˜5Ó!ˆØ�‰”�K“ *Ô-ØŒ	Ø�
‰
�4Öò (rH   c                óÈ  • [        U5      nUc  g [        S U 5       S 5      nUc%  [        S[         S35      nUR	                  SU5        UR                  [        S5      U(       a  SOS5        [        X5      u  pV[        U 5      nU(       d  g US   n[        [        U5      U[        SS	9  [        X…5        US
S   H"  n	U	R                  5       R                  U	5        M$     g )Nc              3  óh   #   • U  H(  oR                   R                  S 5      (       d  M$  Uv •  M*     g7f)z}checkedNr�   )rƒ   rU   s     rF   r„   Ú&_set_checkbox_state.<locals>.<genexpr>  s!   é € ÐUª( ·i±i×6HÑ6HÈ×6T—u‘uª(ùs   ‚#2©	2z<w14:checked xmlns:w14="z" w14:val="0"/>r   r‡   r)   Ú0Trl   r5   )ry   r‹   r   rs   rB   r]   rt   r™   r    rj   rG   rn   r­   Ú	getparentrL   )
rž   rx   r.   rv   Ú
checked_elÚsymbolrˆ   Úrunsr©   Úextras
             rF   Ú_set_checkbox_stater·     sÌ   € Ü˜fÓ%€HØÑØÜÑU©(ÓUÐW[Ó\€JØÑÜÐ!9¼&¸ÀÐQÓRˆ
Ø�‰˜˜:Ô&Ø‡N�N”4˜“;¦w¡°CÔ8ä  Ó1�L€FÜ˜Ó€DÞØØ
ˆq‰'€CÜ”Z “_ dÔ,DÐPTÒUÜ�CÔ Ø�a�b“ˆØ�‰Ó× Ñ  Ö'ò rH   c                ó:  • U R                  [        S5      5      nUc  g[        UR                  [        S5      5      5      nU(       dT  U nUbG  UR                  [        S5      :w  a.  UR                  5       nUb  UR                  [        S5      :w  a  M.  Ub  U/O/ nU Hy  nUR                  5       n[        R                  Ul	        UR                  [        S5      5      nUc  MG  UR                  [        S5      5      (       d  Mh  UR                  U5        M{     g)uÙ   Justifica los pÃ¡rrafos del control.

Solo se aplica a los textos redactados: en un valor de una sola lÃ­nea la
justificaciÃ³n no estira nada y moverÃ­a a la izquierda lo que la plantilla
centra (RUN, fechas, curso).
r›   Nzw:pzw:indz	w:hanging)rA   r   rœ   r�   rO   r²   Úget_or_add_pPrr   ÚJUSTIFYÚjc_valr^   rL   )rž   rŸ   Ú
paragraphsÚancestorÚ	paragraphÚp_prÚindents          rF   Ú_justify_paragraphsrÁ   ,  sã   € ð �h‰h”r˜.Ó)Ó*€GØ�ØÜ�g—l‘l¤2 e£9Ó-Ó.€JÞàˆØÑ" x§|¡|´r¸%³yÓ'@Ø×)Ñ)Ó+ˆHð Ñ" x§|¡|´r¸%³yÕ'@à#+Ñ#7�h‘Z¸Rˆ
Ûˆ	Ø×'Ñ'Ó)ˆÜ(×0Ñ0ˆŒð —‘œ2˜g›;Ó'ˆØÓ &§*¡*¬R°«_×"=Ó"=Ø�K‰K˜Öò  rH   c                ó  • U R                  [        S5      5      nUb  UR                  [        S5      5      OSnUnU nUc7  Ub4  UR                  [        S5      :X  a  UnOUR                  5       nUc  Ub  M4  Uc  gUR                  [        S5      5      nUc  [	        S5      nUR                  SU5        UR                  [        S5      5      nUc  [	        S5      nUR                  U5        UR                  [        S5      S5        g)	uÎ   Deja el texto de la celda arriba.

Algunos controles envuelven la celda completa (`sdtContent/tc`). Si Word
hereda alineaciÃ³n vertical al centro o abajo, un pÃ¡rrafo largo parece
'colgado' a media altura.
r›   Nzw:tczw:tcPrr   zw:vAlignrY   Útop)rA   r   rO   r²   r   rB   rQ   r]   )rž   ÚcellÚwrappedr¬   ÚcurrentÚtc_prÚaligns          rF   Ú_align_cell_toprÉ   G  sî   € ð �8‰8”B�~Ó&Ó'€DØ'+Ñ'7ˆd�i‰iœ˜6›
Ô#¸T€GØ€DØ€GØ
‰,˜7Ñ.Ø�;‰;œ"˜V›*Ó$ØˆDØØ×#Ñ#Ó%ˆð	 ‰,˜7Ó.ð
 �|ØØ�I‰I”b˜“lÓ#€EØ�}Ü˜HÓ%ˆØ�‰�A�uÔØ�J‰J”r˜*“~Ó&€EØ�}Ü˜JÓ'ˆØ�‰�UÔØ	‡I�IŒb�‹k˜5Õ!rH   c                óš  • UR                  [        S5      5       H  nUR                  U5        M     [        U 5      nU(       d  g US   n[	        [        U5      5        [        XR5        USS   H"  nUR                  5       R                  U5        M$     U(       a  [        U 5        [        U5      [        :¼  d  SU;   a  [        U 5        g g )Nzw:showingPlcHdrr   r5   r¢   )rK   r   rL   r    rj   rG   r­   r²   rÉ   ÚlenÚFUR_JUSTIFY_MIN_CHARSrÁ   )rž   rx   r¨   Úplaceholderrµ   r©   r¶   s          rF   Ú_set_control_textrÎ   d  s¤   € Ø—~‘~¤bÐ):Ó&;Ö<ˆØ�‰�kÖ"ñ =ä˜Ó€DÞØØ
ˆq‰'€CÜ”Z “_Ô%Ü�CÔØ�a�b“ˆØ�‰Ó× Ñ  Ö'ñ æÜ˜ÔÜ
ˆ4ƒyÔ)Ó)¨T°T«\Ü˜CÕ ð .:rH   c                óf  • SnSnU R                   R                  R                  [        S5      5       Hø  nUR	                  [        S5      5      nUc  M"  UR	                  [        S5      5      nUc  MA  UR                  [        S5      5      =(       d    SR                  5       n[        UR                  [        S5      5      S5      SLnU(       a(  US	:X  a"  UR                  [        S5      S
5        US-  nMÇ  U(       a  MÐ  US:X  d  MØ  UR                  [        S5      S	5        US-  nMú     X-   $ )u¬  Relaja la altura fija solo en filas que tienen campos.

Las plantillas ministeriales usan `hRule="exact"` para dos cosas distintas:
recortar el texto que no cabe (problema en RUN y correos) y mantener
encabezados de secciÃ³n como una franja delgada. Esos encabezados traen
varios pÃ¡rrafos vacÃ­os; si se pasa a `atLeast`, Word agranda la fila y el
tÃ­tulo queda pegado arriba de un recuadro vacÃ­o (p. ej. AVANCES EDUCATIVOS).
r   zw:trzw:trPrNz
w:trHeightzw:hRulerZ   úw:sdtÚexactÚatLeastr5   Úatleast)	rT   Úbodyr�   r   rA   r^   ra   r‹   r]   )ÚdocumentÚrelaxedÚrestoredÚrowÚtr_prÚheightÚruleÚ	has_fields           rF   Úrelax_fixed_row_heightsrÝ   u  sü   € ð €GØ€HØ×Ñ×$Ñ$×)Ñ)¬"¨V«*Ö5ˆØ—‘œ˜H›Ó&ˆØ‰=ÙØ—‘œB˜|Ó,Ó-ˆØ‰>ÙØ—
‘
œ2˜i›=Ó)×/¨R×6Ñ6Ó8ˆÜ˜Ÿ™¤" W£+Ó.°Ó5¸TÐAˆ	Þ˜ ›Ø�J‰J”r˜)“} iÔ0Ø�q‰LŠGß�˜t yÕ0Ø�J‰J”r˜)“} gÔ.Ø˜‰MŠHñ 6ð ÑÐrH   c              #  óŒ  #   • U R                   R                  /nU R                   Hq  nUR                  UR                  UR
                  UR                  UR                  UR                  4 H&  n[        USS5      nUc  M  UR                  U5        M(     Ms     U H¢  nUR                  [        S5      5       H�  nUR                  [        S5      5      nUc  M"  UR                  [        S5      5      nUb1  UR                  [        S5      5      =(       d    SR                  5       OSn	U	(       d  M{  XgU	4v •  Mƒ     M¤     g7f)zARecorre los `w:sdt` del cuerpo, encabezados y pies del documento.Ú_elementNrÐ   zw:sdtPrzw:tagrY   rZ   )rT   rÔ   ÚsectionsÚheaderÚfirst_page_headerÚeven_page_headerÚfooterÚfirst_page_footerÚeven_page_footerÚgetattrrQ   r�   r   rA   r^   Ústrip)
rÕ   ÚrootsÚsectionÚpartrT   Úrootrž   rx   Útag_elrO   s
             rF   Úiter_content_controlsrî   ’  s  é € à×Ñ×"Ñ"Ð#€EØ×$Ô$ˆà�N‰NØ×%Ñ%Ø×$Ñ$Ø�N‰NØ×%Ñ%Ø×$Ñ$ó
ˆDô ˜d J°Ó5ˆGØÓ"Ø—‘˜WÖ%ó
ñ %ó ˆØ—9‘9œR ›[Ö)ˆCØ—X‘Xœb ›mÓ,ˆFØ‰~ÙØ—[‘[¤ G£Ó-ˆFØ=CÑ=O�6—:‘:œb ›kÓ*×0¨b×7Ñ7Ô9ÐUWˆCÞÙØ˜sÐ"Ô"ó *ò ùs   ‚A<EÂCEc                ó  • [        U b  U OS5      R                  5       R                  5       n[        R                  " SU5      nSR                  S U 5       5      n[        R                  " SSU5      R                  S5      $ )NrZ   ÚNFKDc              3  ó^   #   • U  H#  n[         R                  " U5      S :w  d  M  Uv •  M%     g7f)ÚMnN)ÚunicodedataÚcategory)rƒ   Úchars     rF   r„   Ú_normalize.<locals>.<genexpr>³  s$   é € ÐO¢D˜D¬K×,@Ò,@ÀÓ,FÈ$Ñ,N—4‘4¢Dùs   ‚-¤	-z
[^a-z0-9]+Ú_)Ústrrè   ra   ró   Ú	normalizeÚjoinÚreÚsub)ri   r¨   s     rF   Ú
_normalizerý   °  si   € Ü˜Ñ)‰u¨rÓ2×8Ñ8Ó:×@Ñ@ÓB€DÜ× Ò  ¨Ó.€DØ�7‰7ÑO¡DÓOÓO€DÜ�6Š6�-  dÓ+×1Ñ1°#Ó6Ð6rH   c                óœ  • U nUR                  S5       H´  n[        R                  U5      nUc    g [        U[        5      (       d    g UR                  UR                  S5      5      nUR                  S5      nUbG  [        U[        [        45      (       d    g [        U5      nSUs=::  a  [        U5      :  a  O  OX&   OS nUb  M´    g    U$ )NÚ.r5   r6   r   )r¦   Ú_PATH_SEGMENTÚmatchÚ
isinstancer   r^   Úgrouprœ   Útupler•   rË   )ÚdataÚpathrÆ   r˜   ÚmatchedrN   rD   s          rF   Ú_lookupr  ·  s²   € Ø€GØ�z‰z˜#ŽˆÜ×%Ñ% cÓ*ˆØ‰?ÙÜ˜'¤7×+Ñ+ÙØ—+‘+˜gŸm™m¨AÓ.Ó/ˆØ—‘˜aÓ ˆØÑÜ˜g¬¬e }×5Ñ5ÙÜ˜5“zˆHØ+,°Õ+G¼3¸w»<Ö+G�gÒ'ÈTˆGØ‹?Ùñ ð €NrH   c                ó¨   • [        U [        5      (       a  U $ U c  g[        U [        [        45      (       a  [        U 5      $ [	        U 5      [
        ;   $ )NF)r  Úboolr•   Úfloatrý   Ú_TRUE_WORDS)ri   s    rF   Ú_as_boolr  Ë  sG   € Ü�%œ×ÑØˆØ�}ØÜ�%œ#œu˜×&Ñ&Ü�E‹{ÐÜ�eÓ¤Ñ+Ð+rH   c                ó¬  ^• U R                  S5      u  p#mU(       a  U(       d  [        [        X5      5      $ [        X5      nUc  [        [        X5      5      $ [        U[        5      (       a  U=(       a    [        T5      [        ;   $ [        U[        [        [        45      (       a  [        U4S jU 5       5      $ [        U5      [        T5      :H  $ )uÈ   Resuelve el estado de una casilla a partir de su etiqueta semÃ¡ntica.

`clave` se lee como booleano y `clave__valor` como opciÃ³n de un grupo
(`nee_maintained__si`, `revaluation_type__proceso`, ...).
Ú__c              3  óR   >#   • U  H  n[        U5      [        T5      :H  v •  M     g 7frJ   )rý   )rƒ   ÚitemÚexpecteds     €rF   r„   Ú&checkbox_is_checked.<locals>.<genexpr>ä  s    øé € ÐNÊÀ”:˜dÓ#¤z°(Ó';Ö;Êùs   ƒ$')Ú
rpartitionr  r  r  r
  rý   r  rœ   r  r]   Úany)rO   r  ÚkeyÚ	separatorri   r  s        @rF   Úcheckbox_is_checkedr  Õ  s¨   ø€ ð  #Ÿ~™~¨dÓ3Ñ€C�HÞžCÜœ Ó*Ó+Ð+Ü�DÓ€EØ�}Üœ Ó*Ó+Ð+Ü�%œ×ÑØ×<œ HÓ-´Ñ<Ð<Ü�%œ$¤¤sÐ+×,Ñ,ÜÔNÉÓNÓNÐNÜ�eÓ¤
¨8Ó 4Ñ4Ð4rH   c                ó6  • [        U [        [        45      (       a  U R                  S5      $ [	        U 5      R                  5       n[        R                  U5      nU(       a7  UR                  S5       SUR                  S5       SUR                  S5       3$ U$ )Nz%d/%m/%Yr7   Ú/r6   r5   )	r  r   r   Ústrftimerø   rè   Ú	_ISO_DATEr  r  )ri   r¨   r  s      rF   Ú_format_dater  è  s€   € Ü�%œ(¤DÐ)×*Ñ*Ø�~‰~˜jÓ)Ð)Üˆu‹:×ÑÓ€DÜ�o‰o˜dÓ#€GÞØ—-‘- Ó"Ð# 1 W§]¡]°1Ó%5Ð$6°a¸¿¹ÀaÓ8HÐ7IÐJÐJØ€KrH   c                óæ   • [        X5      nUc  g[        U[        5      (       a  U(       a  S$ S$ [        U[        [        [
        45      (       a  SR                  S U 5       5      $ [        U5      $ )NrZ   u   SÃ­ÚNoz, c              3  ó”   #   • U  H>  n[        U5      R                  5       (       d  M#  [        U5      R                  5       v •  M@     g 7frJ   )rø   rè   )rƒ   r  s     rF   r„   Úcontrol_text.<locals>.<genexpr>ù  s.   é € ÐR²u¨tÄÀDÃ	ÇÁ×@QÓ*œ˜T›Ÿ™×*Ð*²uùs
   ‚"A¨ A)r  r  r
  rœ   r  r]   rú   r  )rO   r  ri   s      rF   Úcontrol_textr"  ò  sb   € Ü�DÓ€EØ�}ØÜ�%œ×ÑÞˆuÐ' 4Ð'Ü�%œ$¤¤sÐ+×,Ñ,Ø�y‰yÑR±uÓRÓRÐRÜ˜ÓÐrH   c           	     óH  • [        U [        [        45      (       a=  [        U [        5      (       a  [        U [        5      (       d  U OU R                  5       nO’[        R	                  [        U =(       d    S5      R                  5       5      nU(       d  g[        [        UR                  S5      5      [        UR                  S5      5      [        UR                  S5      5      5      n[        R                  " 5       nUR                  UR                  -
  nUR                  UR                  -
  nUR                  UR                  :  a  US-  nUS:  a
  US-  nUS-  nUS:  a  gUS:X  a  US:X  a  S$ U S3$ US:X  a  S	OU S
3nUS:X  a  U$ US:X  a  SOU S3nU SU 3$ )NrZ   r5   r6   r7   r   é   z1 mesz mesesu   1 aÃ±ou    aÃ±osÚ )r  r   r   r  r  rø   rè   r•   r  ÚtodayÚyearÚmonthÚday)ÚbornÚbirthr  r&  ÚyearsÚmonthsÚ	year_textÚ
month_texts           rF   Ú_calculate_ager0     sk  € Ü�$œ¤4Ð(×)Ñ)Ü" 4¬×.Ñ.´zÀ$Ì×7QÑ7Q‘ÐW[×W`ÑW`ÓWb‰ä—/‘/¤# d§j¨b£/×"7Ñ"7Ó"9Ó:ˆÞØÜ”S˜Ÿ™ qÓ)Ó*¬C°·±¸aÓ0@Ó,AÄ3ÀwÇ}Á}ÐUVÓGWÓCXÓYˆÜ�JŠJ‹L€EØ�J‰J˜Ÿ™Ñ#€EØ�[‰[˜5Ÿ;™;Ñ&€FØ‡y�y�5—9‘9ÓØ�!‰ˆØ�ƒzØ�‰
ˆØ�"‰ˆØˆqƒyØØ�ƒzØ  A›+ˆwÐ<¨f¨X°VÐ+<Ð<Ø! Q›J‘¨u¨g°VÐ,<€IØ�ƒ{ØÐØ" a›K‘°¨x°vÐ->€JØˆ[˜˜*˜Ð&Ð&rH   c                óD  • U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU R                  [
        5      R                  [
        R                  U:H  5      R	                  5       n0 nUbØ  SR                  S UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       UR                  =(       d    SR                  5       4 5       5      nXTS'   UR                  =(       d    SR                  5       US'   [        UR                  5      US'   [        UR                  5      US'   Ub‡  UR                  (       av  U R                  [         5      R                  [         R"                  UR                  :H  5      R	                  5       nUb&  UR$                  =(       d    SR                  5       US'   UR'                  5        VVs0 s H  u  pxU(       d  M  Xx_M     snn$ s  snnf )	zADatos que el formulario muestra como solo lectura desde la ficha.r%  c              3  ó8   #   • U  H  nU(       d  M  Uv •  M     g 7frJ   © )rƒ   rë   s     rF   r„   Ú*_student_identification.<locals>.<genexpr>)  s"   é € ð 
ò�ô
 ÷ ‰Dòùs   ‚‘	rZ   Ú	full_nameÚidentification_numberÚ	born_dateÚageÚcurrent_course)Úqueryr   ÚfilterÚ
student_idÚfirstr   rú   Únamesrè   Úfather_lastnameÚmother_lastnamer6  r  r7  r0  Ú	course_idr   ÚidÚcourse_nameÚitems)	Údbr<  ÚpersonalÚacademicÚoutr5  Úcourser  ri   s	            rF   Ú_student_identificationrJ    s¯  € ð 	�‰Ô)Ó*ß	‰Ô(×3Ñ3°zÑAÓ	Bß	‰‹ð ð 	�‰Ô)Ó*ß	‰Ô(×3Ñ3°zÑAÓ	Bß	‰‹ð ð
 €CØÑØ—H‘Hñ 
ð —‘×% 2×,Ñ,Ó.Ø×)Ñ)×/¨R×6Ñ6Ó8Ø×)Ñ)×/¨R×6Ñ6Ó8ñó
ó 
ˆ	ð %ˆKÑØ(0×(FÑ(F×(LÈ"×'SÑ'SÓ'UˆÐ#Ñ$Ü'¨×(:Ñ(:Ó;ˆˆKÑÜ# H×$6Ñ$6Ó7ˆˆE‰
ØÑ × 2× 2Ø—‘œ+Ó&×-Ñ-¬k¯n©nÀ×@RÑ@RÑ.RÓS×YÑYÓ[ˆØÑØ%+×%7Ñ%7×%=¸2×$DÑ$DÓ$FˆCÐ Ñ!Ø),¯©¬Ô>ª™:˜3¼‹JˆCŠJ©Ò>Ð>ùÓ>s   ÈHÈHc                óš  • U(       d  0 $ U R                  [        5      R                  [        R                  U:H  5      R	                  5       nUc  0 $ UR
                  =(       d    SR                  5       UR                  =(       d    SR                  5       S.nUR                  5        VVs0 s H  u  pEU(       d  M  XE_M     snn$ s  snnf )NrZ   )Úestablishment_nameÚdirector_name)	r:  r   r;  rB  r=  Úschool_namerè   rM  rD  )rE  Ú	school_idÚschoolrH  r  ri   s         rF   Ú_school_identificationrQ  =  sœ   € ÞØˆ	Ø�X‰X”kÓ"×)Ñ)¬+¯.©.¸IÑ*EÓF×LÑLÓN€FØ�~Øˆ	à%×1Ñ1×7°R×>Ñ>Ó@Ø ×.Ñ.×4°"×;Ñ;Ó=ñ€Cð *-¯©¬Ô>ª™:˜3¼‹JˆCŠJ©Ò>Ð>ùÓ>s   Â,CÂ=Cc                óL  • U(       d  0 $ U R                  [        5      R                  [        R                  R	                  U5      5      R                  5       nU Vs0 s H:  n[        UR                  5      UR                  =(       d    SR                  5       _M<     sn$ s  snf ©NrZ   )	r:  r   r;  rB  Úin_Úallr•   Úcareer_typerè   )rE  ÚidsÚrowsrØ   s       rF   Ú_career_type_namesrY  J  st   € ÞØˆ	Ø�8‰8”OÓ$×+Ñ+¬O×,>Ñ,>×,BÑ,BÀ3Ó,GÓH×LÑLÓN€DÙDHÓIÂD¸SŒC�—‘‹K˜#Ÿ/™/×/¨R×6Ñ6Ó8Ò8ÁDÑIÐIùÒIs   ÁAB!c                óÚ  • [        U [        5      (       aŽ  U R                  5        Hy  u  p4[        U[        [        [        45      (       a  [        XAU5        M3   [        U5      nU[        ;   a  UR                  U5        M\  U[        ;   d  Mh  UR                  U5        M{     g [        U [        [        45      (       a  U  H  n[        XaU5        M     g g ! [        [        4 a     MÃ  f = frJ   )r  r   rD  rœ   r  Ú_collect_idsr•   Ú	TypeErrorr–   Ú_PROFESSIONAL_ID_KEYSÚaddÚ_CAREER_TYPE_ID_KEYS)r¬   Úprofessional_idsÚ
career_idsr  ri   Únumericr  s          rF   r[  r[  Q  sÃ   € Ü�$œ× Ñ ØŸ*™*ž,‰JˆCÜ˜%¤'¬4´Ð!7×8Ñ8Ü˜U°jÔAÙðÜ˜e›*�ð Ô+Ó+Ø ×$Ñ$ WÖ-ØÔ,Õ,Ø—‘˜wÖ'ò 'ô 
�Dœ4¤˜-×	(Ñ	(ÛˆDÜ˜°Ö<ò ð 
)øô œzÐ*ó Úðús   ÁCÃC*Ã)C*c                óŒ  • [        U [        5      (       aÕ  0 nU R                  5        H½  u  pE[        U[        [        [        45      (       a  [        XQU5      X4'   M5   [        U5      nU[        ;   a  UR                  U5      =(       d    UX4'   Mi  U[        ;   a  UR                  U5      =(       d    UX4'   M‘  US:X  a"  [        R                  U5      =(       d    UX4'   M¹  XSU'   M¿     U$ [        U [        [        45      (       a  U  Vs/ s H  n[        XqU5      PM     sn$ U $ ! [        [        4 a	    XSU'    GM  f = fs  snf )NÚposition_id)r  r   rD  rœ   r  Ú_replace_idsr•   r\  r–   r]  r^   r_  Ú_POSITION_LABELS)r¬   ÚprofessionalsÚcareersrH  r  ri   rb  r  s           rF   re  re  d  s  € Ü�$œ× Ñ Ø ˆØŸ*™*ž,‰JˆCÜ˜%¤'¬4´Ð!7×8Ñ8Ü'¨¸gÓF�‘ÙðÜ˜e›*�ð Ô+Ó+Ø(×,Ñ,¨WÓ5×>¸�“ØÔ,Ó,Ø"Ÿ;™; wÓ/×8°5�“Ø˜Ó%Ü+×/Ñ/°Ó8×A¸E�“à �C“ñ! 'ð" ˆ
Ü�$œœu˜×&Ñ&ÙGKÓLÂt¸t”˜T°'Ö:ÁtÑLÐLØ€Køô œzÐ*ó Ø �C‘Ûðüò Ms   ÁD%Ä
EÄ%D>Ä=D>c                ór  • [        5       n[        5       n[        X#U5        [        U [        U5      5      n[	        X5      n[        [        U5      XV5      n[        X5      nUR                  [        XR                  S5      5      5        UR                  5        HA  u  pš[        UR                  U	5      =(       d    S5      R                  5       (       a  M=  X§U	'   MC     [        UR                  S5      =(       d    S5      R                  5       (       d"  [        R                  " 5       R                   US'   U$ )zBAplana el registro FUR y resuelve IDs, cursos y datos de la ficha.rO  rZ   Úcurrent_year)r]   r[  r   ÚsortedrY  re  ÚdictrJ  ÚupdaterQ  r^   rD  rø   rè   r   r&  r'  )rE  r<  Ú
fur_recordr`  ra  rg  rh  r  Údefaultsr  ri   s              rF   Úbuild_fur_datarp  ~  sç   € ä!$£ÐÜ›5€JÜ�¨zÔ:Ü7¸¼FÐCSÓ<TÓU€MÜ  Ó0€GÜœ˜ZÓ(¨-ÓA€Dä& rÓ6€HØ‡O�OÔ*¨2¯~©~¸kÓ/JÓKÔLØ—n‘nÖ&‰
ˆÜ�4—8‘8˜C“=×& BÓ'×-Ñ-×/Ó/Ø�‹Iñ 'ô ˆt�x‰x˜Ó'×-¨2Ó.×4Ñ4×6Ñ6Ü#Ÿzšz›|×0Ñ0ˆˆ^ÑØ€KrH   c                ó    • [         R                  [        U =(       d    S5      R                  5       5      nU(       d  g U=(       d    [        U-  $ rS  )r"   r^   rø   rè   ÚTEMPLATES_DIRECTORY)Úfur_variantÚbase_directoryÚfilenames      rF   Úresolve_template_pathrv  ”  s<   € Ü&×*Ñ*¬3¨{×/@¸bÓ+A×+GÑ+GÓ+IÓJ€HÞØØ×1Ô1°XÑ=Ð=rH   c           
     ó\  • [        [        U 5      5      n/ n/ n/ n[        U5      n[        U5       Hƒ  u  p‰n
[	        U	5      (       a<  [        U	5        [        X¡5      n[        X‰U5        U(       a  UR                  U
5        MR  [        X¡5      n[        X‰U5        U(       a  UOUR                  U
5        M…     UR                  R                  SSS9  UR                  [        U5      5        S[        U5      UR                  [        U5      [        U5      [        U5      U[!        U5      S.$ )z;Escribe `data` en los content controls de la plantilla FUR.T)ÚparentsÚexist_okÚsuccess)ÚstatusÚ	file_pathru  Útext_filledÚ
text_emptyÚcheckboxes_checkedÚrelaxed_rowsÚ
empty_tags)r
   rø   rÝ   rî   r{   r�   r  r·   rQ   r"  rÎ   rC   ÚmkdirÚsaverR   rË   rk  )Útemplate_pathr  Úoutput_pathrÕ   ÚfilledÚemptyr.   r€  rž   rx   rO   Ústater¨   s                rF   Úfill_fur_docxr‰  ›  s  € äœ˜MÓ*Ó+€HØ€FØ€EØ€GÜ*¨8Ó4€Lä1°(Ö;Ñˆ�SÜ˜v×&Ñ&Ü% fÔ-Ü'¨Ó2ˆEÜ ¨UÔ3ÞØ—‘˜sÔ#ÙÜ˜CÓ&ˆÜ˜# tÔ,Þ‰˜U×*Ñ*¨3Ö/ñ <ð ×Ñ×Ñ T°DÐÑ9Ø‡M�M”#�kÓ"Ô#àÜ˜Ó%Ø×$Ñ$Ü˜6“{Ü˜%“jÜ! '›lØ$Ü˜U“mñ	ð 	rH   c           	     ó  • [        UR                  S5      =(       d    S5      R                  5       n[        XT5      nUc	  SSU S3S.$ UR	                  5       (       d  SSUR
                   3S.$ [        XU5      n[        R                  " S	S
[        UR                  S5      =(       d    SU 35      5      R                  S
5      SS n[        U5      SU S
U S
[        R                  " 5       R                  SS  S3-  n	[        XgU	5      $ )zEGenera el Word del FUR a partir del registro guardado en `fur_forms`.rs  rZ   NÚerrorz2No hay plantilla oficial asociada al tipo de FUR 'z'.)r{  Úmessageu&   No se encontrÃ³ la plantilla del FUR: z[^\w-]+r÷   r5  Úestudiante_é(   Úfur_é   z.docx)rø   r^   rè   rv  Úis_filerR   rp  rû   rü   r   ÚuuidÚuuid4Úhexr‰  )
rE  r<  rn  Úoutput_directoryÚtemplates_directoryrs  r„  r  Ú	safe_namer…  s
             rF   Úgenerate_fur_docxr˜  ½  s  € ô �j—n‘n ]Ó3×9°rÓ:×@Ñ@ÓB€KÜ)¨+ÓK€MØÑàØKÈKÈ=ÐXZÐ[ñ
ð 	
ð × Ñ ×"Ñ"àØ?À×@RÑ@RÐ?SÐTñ
ð 	
ô
 ˜"¨*Ó5€DÜ—’�z 3¬¨D¯H©H°[Ó,A×,_À{ÐS]ÐR^ÐE_Ó(`Óa×gÑgÐhkÓlÐmpÐnpÐq€IÜÐ'Ó(¨T°+°¸aÀ	¸{È!ÌDÏJÊJËL×L\ÑL\Ð]_Ð^_ÐL`ÐKaÐafÐ+gÑg€KÜ˜¨kÓ:Ð:rH   )r   )rD   r•   )rR   rø   )rb   rø   rc   rø   rd   r
  ÚreturnÚNone)r™  rš  )rR   rø   r™  rø   )r™  r
  )r.   r
  r™  ztuple[str, str])r™  rœ   )r¨   rø   r™  rš  )r.   r
  r™  rš  )rÕ   r
   r™  r•   )rÕ   r
   )ri   r   r™  rø   )r  úMapping[str, Any]r  rø   r™  r   )ri   r   r™  r
  )rO   rø   r  r›  r™  r
  )rO   rø   r  r›  r™  rø   )r*  r   r™  rø   )rE  r   r<  r•   r™  údict[str, Any])rE  r   rO  zOptional[int]r™  rœ  )rE  r   rW  úset[int]r™  zdict[int, str])r¬   r   r`  r�  ra  r�  r™  rš  )r¬   r   rg  úMapping[int, str]rh  rž  r™  r   )rE  r   r<  r•   rn  r›  r™  rœ  rJ   )rs  zOptional[str]rt  úOptional[Path]r™  rŸ  )r„  r   r  r›  r…  r   r™  rœ  )zfiles/system/studentsN)rE  r   r<  r•   rn  r›  r•  rø   r–  rŸ  r™  rœ  )XÚ__doc__Ú
__future__r   rû   ró   r’  r   r   Úpathlibr   Útypingr   r   r	   Údocxr
   Údocx.enum.textr   Ú	docx.oxmlr   r   Údocx.oxml.nsr   Úsqlalchemy.ormr   Úapp.backend.db.modelsr   r   r   r   r   Ú&app.backend.utils.professional_displayr   rs   rr  r"   Ú__annotations__ÚFUR_FIELD_FONT_NAMEÚFUR_FIELD_FONT_HALF_POINTSr`   rÌ   rm   rn   r’   r“   r‰   rŠ   r  Úcompiler  r   r]  r_  rf  rM   rG   rW   rj   ro   rt   ry   r{   r�   r™   r    r­   r·   rÁ   rÉ   rÎ   rÝ   rî   rý   r  r  r  r  r"  r0  rJ  rQ  rY  r[  re  rp  rv  r‰  r˜  r3  rH   rF   Ú<module>r¯     s4  ðòõ #ã 	Û Û ß #Ý ß )Ñ )å Ý -ß ,Ý Ý "÷õ õ Wà	?€áÐ9Ó:Ð ð &Ø(Ø%Ø&Ø'Ø'Ø4Ø4Ø6Ø7Ø&Ø,ñ+Ð ˜ó ð Ð Ø!Ð ØÐ ð Ð àÐ ð  Ð ØÐ ØÐ ØÐ Ø Ð âC€Ø�JŠJÐ2Ó3€	Ø—
’
Ð=Ó>€à*Ð+Ð ÚUÐ àØØØñ	Ð ð(€
ö\ôð  )Ø1Øð	àðð ðð ð	ð
 
õôDWô!òô.ôô:ô$)ôô(ô* ô6"ô:!ô"ô:#ô<7ôô(,ô5ô&ôô'ô6?ôD
?ôJô=ô&ô4ö,>ôðL 4Ø*.ð;Øð;àð;ð "ð;ð ð	;ð
 (ð;ð ö;rH   