
    5ic                    t   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  SSKJr  \R                  " \5      rS2S3S	 jjrS
rS4S jrS5S jrS6S jrS7S jrS8S jrS9S jr S:       S;S jjr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 jr S?S jr!S@S jr"SAS jr#SBS jr$        SCS jr%S9S jr&S9S jr'S9S  jr(S=S! jr)S>S" jr*        SDS# jr+S<S$ jr,S<S% jr-S<S& jr.SES' jr/SFS( jr0            SGS) jr1SFS* jr2SFS+ jr3SFS, jr4SES- jr5SHS. jr6 S2       SIS/ jjr7SFS0 jr8S<S1 jr9g)Ju   
Clonación OOXML del bloque de registro por asignatura (cuadro observaciones + tabla rarpf_*).
El párrafo largo «Registro de acciones realizadas por el profesor…» no se duplica; solo una vez en la plantilla.
    )annotationsN)deepcopy)Path)Document)OxmlElement)qnc                    [        S5      n[        S5      n[        S5      nUR                  [        S5      [        U 5      5        UR	                  U5        UR	                  U5        U$ )ud   Párrafo vacío con espacio superior (twips = 1/20 pt; 480 ≈ 24 pt) para separar bloques clonados.w:pw:pPr	w:spacingw:before)r   setr   strappend)twips_beforepp_prspacings       _C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\docx_register_book_layout.py_empty_paragraph_spacing_beforer      sS    EAwD+&GKK:L 12KKHHTNH    z/Registro de acciones realizadas por el profesorc                    U R                  [        S5      5      nUc  gUR                  [        S5      5      nUc  gUR                  [        S5      5      =(       d    SR                  5       $ )Nw:sdtPr w:tagw:val)findr   getstrip)sdtsdt_prtag_els      r   _get_sdt_tag_valr#       sW    XXbm$F~[[G%F~JJr'{#)r0022r   c                "   U R                  [        S5      5      nUc  g UR                  [        S5      5      nUb  UR                  [        S5      U5        UR                  [        S5      5      nUb  UR                  [        S5      U5        g g )Nr   r   r   zw:alias)r   r   r   )r    new_valr!   r"   alias_els        r   _set_sdt_tag_and_aliasr'   *   su    XXbm$F~[[G%F

2g;({{2i=)HR['* r   c                <   U R                  [        S5      5      nUc  g [        U5       Ho  nUR                  [        S5      :X  dB  UR                  R	                  S5      (       d  M>  SUR                  R                  5       ;   d  M^  UR                  U5        Mq     g )Nr   zw:idz}idid)r   r   listtagendswithlowerremove)r    prels      r   _strip_sdt_idr1   6   sh    	"Y-	 B	z2h66RZBFFOOE$:$:trvv||~?UIIbM r   c                   US:  a  gU =(       d    SR                  5       nU(       d  gUR                  5       nUR                  S5      (       a  SUS-    3$ UR                  S5      (       a  SUS-    3$ S HD  nUR                  U5      (       d  M   [        UR	                  S5      S   5      nU X-  U-    3s  $    g! [
         a       gf = f)	z`
Prototipo = bloque 0 (rarpo_1, rarpf_1..). Clon k (1..N-1) -> rarpo_{k+1}, rarpf_{k*rows + i}.
   Nr   rarpo_rarpas_)rarpf_rarphp_rarpad_rarpnfd__r   r-   
startswithintsplit
ValueError)oldblock_indexrows_perollowprefixns          r   _map_tag_for_block_clonerH   ?   s     Q
)			B
((*C
~~ha())
~~i  q)**>>>&!!b)* Xk4q89:: ?   s   C  
CCc                    U R                  [        S5      5       H9  n[        U5      n[        XAU5      nU(       d  M#  [	        X55        [        U5        M;     g Nw:sdt)iterr   r#   rH   r'   r1   )rootrB   rC   r    rA   news         r   _retag_sdts_in_elementrO   W   sD    yyG%s#&sB3"3,# &r   c           	        Sn[        U 5       HY  u  p#UR                  [        S5      :w  a  M   UR                  [        S5      5       H  n[	        U5      S:X  d  M  Un  O   Uc  MY    O   Uc  gSn[        US-
  SS5       H`  nX   R                  [        S5      :w  a    ODS	R                  S
 X   R                  [        S5      5       5       5      n[        U;   d  M^  Un  O   Ub  US-   nO[        SUS-
  5      nUn	X:  a  U	nX4$ )u   
Rango inclusivo [start, end] de lo que se CLONA por cada asignatura extra.

No incluye el párrafo largo «Registro de acciones realizadas por el profesor…»
(b)/c)); solo lo que va después hasta la tabla con rarpf_1 (p. ej. párrafo vacío + tabla).
Nw:tblrK   rarpf_1NNr3   r;   r
   r   c              3  J   #    U  H  oR                   =(       d    S v   M     g7f)r   N)text).0ts     r   	<genexpr>-_find_clone_fragment_range.<locals>.<genexpr>w   s     K/J!"/Js   !#zw:tr      )		enumerater+   r   rL   r#   rangejoin_HEADER_SNIPPETmax)
childrentbl_idxichildr    
header_idxjfullstartends
             r   _find_clone_fragment_rangeri   `   s    Gh'997#::bk*C$	1 +  ( J7Q;B';??bi'wwKx{/?/?5	/JKKd"J ( QAw{#
C{:r   c                   [        U 5      nUS::  a  g [        [        U5      5      nUR                  R                  n[        U5      n[        U5      u  pUb  U	c  [        R                  S5        g[        XS-   5       V
s/ s H  oU
   PM	     nn
Xy   nUR                  5       nUc  gUR                  U5      S-   n[        SU5       Hv  nU Vs/ s H  n[        U5      PM     nnU H  n[        UX5        M     [        U5       H  u  nnUR!                  UU-   U5        M     US   nUR                  U5      S-   nMx      UR#                  [        U5      5        g! [         a   n[        R                  SX55         SnAgSnAff = fs  sn
f s  snf ! [         a   n[        R                  SX55         SnAgSnAff = f)	uD  
Duplica el bloque completo (texto b) + tabla con controles rarpo/rarp*) N veces.

El prototipo en plantilla debe incluir la tabla donde está `rarpf_1` y el párrafo
previo con «Registro de acciones realizadas por el profesor…».

:param n_blocks: Número de bloques finales deseados (p. ej. una asignatura por bloque).
r3   Tu$   clone_section_b: no se abrió %s: %sNFuE   clone_section_b: no se encontró tabla con rarpf_1 / encabezado II b)r;   u#   clone_section_b: save falló %s: %s)r   r   r   	Exceptionloggerwarningelementbodyr*   ri   r\   	getparentindexr   rO   r[   insertsave)	docx_pathn_blocksrows_per_registerpathdocero   r`   rg   rh   rb   fragmentinsert_afterparentidxcopy_ir0   new_elsre   s                      r   $clone_register_book_section_b_blocksr      s    	?D1}s4y!
 ;;DDzH+H5JE}^_%*5'%:;%:%:H;=L##%F~
,,|
$q
(C8$*23(B8B<(3B"2vA w'EArMM#'2& (r{ll<(1, %T A  =tG < 4  <dFs;   E  FFF  
F
*FF

G!F<<Gc                    [        XSS9$ )z:Compatibilidad: usar clone_register_book_section_b_blocks.   )rv   )r   rt   ru   s     r   (clone_rarpo_observation_blocks_if_neededr      s    /	WYZZr   c                   US:  a  gU =(       d    SR                  5       nU(       d  gUR                  5       nS HE  nUR                  U5      (       d  M   [        UR	                  S5      S   5      nU US-  U-    3s  $    US:X  a  S	US-    3$ US
:X  a  SUS-    3$ US:X  a  SUS-    3$ g! [
         a       gf = f)z\Prototipo bloque 0: paih_1..5, paie_1, paio_1, aer_1, paifi_*, paift_*. Clon block_index>=1.r3   Nr   )paih_paifi_paift_r:   r;      paie_1paie_paio_1paio_aer_1aer_r<   )rA   rB   rD   rE   rF   rG   s         r   _map_pai_table_clone_tagr      s    Q
)			B
((*C/>>&!!b)* XkAo1233 0 h{Q'((
h{Q'((
g~kAo&''  s   B//
B=<B=c                    U R                  [        S5      5       H8  n[        U5      n[        X15      nU(       d  M"  [	        X$5        [        U5        M:     g rJ   )rL   r   r#   r   r'   r1   rM   rB   r    rA   rN   s        r   _retag_pai_sdts_in_elementr      sB    yyG%s#&s83"3,# &r   c                    [        U 5       HV  u  pUR                  [        S5      :w  a  M   UR                  [        S5      5       H  n[	        U5      S:X  d  M  Us  s  $    MX     g )NrQ   rK   paih_1r[   r+   r   rL   r#   )r`   rb   rc   r    s       r   _find_pai_table_indexr      sT    h'997#::bk*C$0 + ( r   c                   [        U 5      nUS::  a  g [        [        U5      5      nUR                  R                  n[        U5      n[        U5      nUc  [        R                  S5        gXg   /nXg   n	U	R                  5       n
U
c  gU
R                  U	5      S-   n[        SU5       HC  n[        US   5      n[        X5        U
R                  X5        Un	U
R                  U	5      S-   nME      UR!                  [        U5      5        g! [         a   n[        R                  SX$5         SnAgSnAff = f! [         a   n[        R                  SX$5         SnAgSnAff = f)	uw   
Duplica solo la tabla del PAI (controles paih_1..5, paie_1, …), sin el párrafo
«4. Plan de Apoyo Individual…».
r3   Tu   clone_pai: no se abrió %s: %sNFz&clone_pai: no hay tabla con tag paih_1r   u   clone_pai: save falló %s: %s)r   r   r   rk   rl   rm   rn   ro   r*   r   rp   rq   r\   r   r   rr   rs   )rt   ru   rw   rx   ry   ro   r`   ra   rz   r{   r|   r}   r~   new_tbls                 r   clone_pai_support_tablesr      sK   
 	?D1}s4y!
 ;;DDzH#H-G?@!"H$L##%F~
,,|
$q
(C8$8A;'"73c#ll<(1, %T =  7A6  6@s/   D 2D: 
D7D22D7:
E$EE$c                   US:  a  gU =(       d    SR                  5       nU(       d  gUS-   nUR                  5       nSnU H  nUS-   nUR                  U5      (       d  M   U[        U5      S-   S nUR	                  S5      n	[        U	5      S:X  a  U	S   S:X  a	  U SU 3s  $ [        U	5      S:  d  Mt  U	S   S:X  d  M  U	S   R                  5       (       d  M  SR                  U	SS 5      n
U SU SU
 3s  $    g)	u   
Prototipo bloque 1: raegee_1, raegeop_1_1, raegef_1_1, raegel_1_1, raegear_1_1, raegep_1_1 (profesional), …
Clon k (>=1) → raegef_2_1, …  (raegeop antes que raegep en la tupla de prefijos).
r3   Nr   )raegearraegeeraegefraegelraegeoaraegeopraegepr:   r   1rZ   )r   r-   r=   lenr?   isdigitr]   )rA   rB   rD   new_brE   prefixesrF   pfxrestpartstails              r   _map_raeg_table_clone_tagr     s   
 Q
)			B!OE
((*CXHsl~~c""#f+/#$

3u:?uQx3XQug&&u:?uQx3583C3C3E3E88E!"I&DXQugQtf--  r   c                    U R                  [        S5      5       H8  n[        U5      n[        X15      nU(       d  M"  [	        X$5        [        U5        M:     g rJ   )rL   r   r#   r   r'   r1   r   s        r   _retag_raeg_sdts_in_elementr   0  B    yyG%s#'93"3,# &r   c                    [        U 5       HX  u  pUR                  [        S5      :w  a  M   UR                  [        S5      5       H  n[	        U5      nUS;   d  M  Us  s  $    MZ     g)zFPlantilla: filas de datos usan raegef_1_1 / raegear_1_1 (no raegef_1).rQ   rK   )	raegear_1raegef_1raegear_1_1
raegef_1_1
raegep_1_1Nr   )r`   rb   rc   r    rW   s        r   _find_raeg_table_indexr   9  sZ    h'997#::bk*C %AXX + ( r   c                    [        1 Sk5      n/ n[        SU5       HK  nX   nUR                  [        S5      5       H&  n[	        U5      U;   d  M  UR                  U5          MI     MM     U(       a  [        U5      $ U$ )u   
Inicio del bloque «registro de apoyos» en el cuerpo: w:p o w:tbl con raegee_1 / raegeoa_1 / raegeop_1_1
*antes* de la tabla de filas (raegef_1_1). Si solo se clona la tabla de datos, raegee_2 no existe.
>   raegee_1	raegeoa_1raegeop_1_1r   rK   )	frozensetr\   rL   r   r#   r   min)r`   ra   header_tagshitsre   chr    s          r   _find_raeg_fragment_start_indexr   E  sq    
 DEKD1g[772g;'C$3A (  3t9)')r   c                    U R                  [        S5      5       H\  nUR                  [        S5      5       H;  nUR                  [        S5      5       H  n[        U5      U:X  d  M  Us  s  s  $    M=     M^     g )NrQ   zw:trrK   rL   r   r#   )rM   needletbltrr    s        r   _find_tr_containing_sdt_tagr   U  s^    yyG%((2f:&Bwwr'{+#C(F2I , ' &
 r   c                h    U R                  [        S5      5       H  n[        U5      U:X  d  M    g   g)NrK   TFr   )rM   r   r    s      r   _element_has_sdt_tagr   ^  s.    yyG%C F* & r   c                    S=p4[        U 5       H  u  pV[        Xa5      (       d  M  Un  O   Uc  g[        U[        U 5      5       H  n[        X   U5      (       d  M  Un  O   Uc  gX44$ )u]   Rango de elementos del cuerpo entre el primer SDT start_tag y el último end_tag (inclusive).NrS   )r[   r   r\   r   )r`   	start_tagend_tagrg   rh   rb   r   s          r   _find_activity_fragment_ranger   e  sx     E8$..E % }5#h-(W55C ) {:r   c                    [        U SS5      $ )u   
IV «Trabajo con la familia…»: párrafo Fecha (rafcf_1_1) + tablas participantes
y campos a)–d) hasta rafcnir_1_1 (inclusive en el cuerpo del documento).
	rafcf_1_1rafcnir_1_1r   r`   s    r   _find_rafc_fragment_ranger   {  s    
 );NNr   c                    [        U SS5      $ )u<   IV «Trabajo con la comunidad…»: tceef_1_1 … tceer_1_1.	tceef_1_1	tceer_1_1r   r   s    r   _find_tcee_fragment_ranger     s    (;LLr   c                    [        U SS5      $ )u9   V Acta de reuniones (section other): arf_1_1 … arc_1_1.arf_1_1arc_1_1r   r   s    r   _find_ar_fragment_ranger     s    (9iHHr   c                    US:  a  gU =(       d    SR                  5       nU(       d  gUR                  SS5      n[        U5      S:w  d  US   S:w  d	  US   S:w  a  gUS   nUS-   nU SU S	3$ )
uC   Prototipo rafcf_1_1, …, rafcnir_1_1. Clon k>=1 → rafcf_2_1, …r3   Nr   r:   rZ      r   r   _1)r   rsplitr   )rA   rB   rD   r   rF   r   s         r   _map_rafc_block_clone_tagr     s{    Q
)			BIIc1E
5zQ%(c/U1X_1XF!OEXQugR  r   c                    U R                  [        S5      5       H8  n[        U5      n[        X15      nU(       d  M"  [	        X$5        [        U5        M:     g rJ   )rL   r   r#   r   r'   r1   r   s        r   _retag_rafc_sdts_in_elementr     r   r   c                   [        U 5      nUS::  a  g [        [        U5      5      nUR                  R                  n[        U5      nU" U5      u  pU	b  U
c  [        R                  SU5        g[        XS-   5       Vs/ s H  oU   PM	     nnX   nUR                  5       nUc  gUR                  U5      S-   n[        SU5       H  nUR                  U[        5       5        US-  nU Vs/ s H  n[        U5      PM     nnU H  n[        UU5        M     [!        U5       H  u  nnUR                  UU-   U5        M     US   nUR                  U5      S-   nM      UR#                  [        U5      5        g! [         a!  n[        R                  SX4U5         S nAgS nAff = fs  snf s  snf ! [         a!  n[        R                  SX4U5         S nAgS nAff = f)Nr3   T   %s: no se abrió %s: %sFu-   %s: no se encontró el fragmento de plantillar;      %s: save falló %s: %s)r   r   r   rk   rl   rm   rn   ro   r*   r\   rp   rq   rr   r   r   r   r[   rs   )rt   ru   find_fragment
log_prefixrw   rx   ry   ro   r`   	start_idxend_idxrb   rz   r{   r|   r}   r~   r0   r   re   s                       r   _clone_iv_activity_blocksr     s    	?D1}s4y!
 ;;DDzH&x0IGOF
S%*9k%BC%B%BHC$L##%F~
,,|
$q
(C8$c:<=q*23(B8B<(3B'F3 w'EArMM#'2& (r{ll<(1, %T E  0*AF D 4  /1Es;   E=  F+.F0"F5 =
F(F##F(5
G ?GG c                $    [        X[        S5      $ )u9   
IV familia: duplica bloque (rafcf_*_1 … rafcnir_*_1).

clone_rafc)r   r   r   s     r   #clone_course_activity_record_blocksr          %Y:SUabbr   c                $    [        X[        S5      $ )u9   
IV comunidad: duplica bloque (tceef_*_1 … tceer_*_1).

clone_tcee)r   r   r   s     r   &clone_course_community_activity_blocksr     r   r   c                $    [        X[        S5      $ )uQ   
V Acta de reuniones: duplica bloque (arf_*_1 … arc_*_1), datos section=other.
clone_ar)r   r   r   s     r    clone_course_acta_reunion_blocksr     s     %Y:QS]^^r   c                    U (       d  gSU SU 3nU R                  U5      (       a  U S[        U5      *  SU SU 3-   $ g)u5   raegef_1_1 → raegef_1_2; raegef_2_1 → raegef_2_2.Nr:   r,   r   rA   block_1basedfrom_rowto_rowsuffixs        r   _retag_raeg_duplicate_row_tagr     Q    az*F
||F>c&k\"qax%@@@r   c                   [        U 5      nUS::  a  g [        [        U5      5      nUS:X  a  SOSU S3nUR                  R                  n[        Xv5      nUc  [        R                  S	U5        gUR                  5       n	U	b  U	R                  [        S
5      :w  a  [        R                  S5        gU	R                  U5      n
U
S-   n[        SUS-   5       H}  n[        U5      nUR                  [        S5      5       H;  n[!        U5      n[#        XSU5      nU(       d  M$  [%        UU5        ['        U5        M=     U	R)                  X5        US-  nM      UR+                  [        U5      5        g! [         a   n[        R                  SX55         SnAgSnAff = f! [         a   n[        R                  SX55         SnAgSnAff = f)u   
Duplica la fila de datos (tags raegef_*/raegel_*/raegear_*/raegep_* …) dentro de la tabla del bloque,
para varias intervenciones: raegef_1_2, raegef_1_3, … o raegef_2_2, …
r3   Tu    expand_raeg: no se abrió %s: %sNFr   raegef_r   z+expand_raeg: fila no encontrada para tag %srQ   z&expand_raeg: padre de fila no es w:tblrZ   rK   u   expand_raeg: save falló %s: %sr   r   r   rk   rl   rm   rn   ro   r   rp   r+   r   rq   r\   r   rL   r#   r   r'   r1   rr   rs   rt   r   n_rowsrw   rx   ry   r   ro   tr_elr   r}   	insert_atrnew_trr    rA   r%   s                    r   expand_raeg_intervention_rowsr    s   
 	?D{s4y!
 *Q.\gl^24NF;;D'5E}DfM
//
C
{cggG,?@
))E
CaI1fqj!%;;r'{+C"3'C3Cq!LGw&sG4c" , 	

9%Q	 "T E  94C>  8$B/   E5 F" 5
F?FF"
G,GGc                   [        U 5      nUS::  a  g [        [        U5      5      nU SU S3nUR                  R                  n	[        X5      n
U
c  [        R                  SXH5        gU
R                  5       nUb  UR                  [        S	5      :w  a  [        R                  S
U5        gUR                  U
5      nUS-   n[        SUS-   5       H~  n[        U
5      nUR                  [        S5      5       H<  n[!        U5      n[#        UUSU5      nU(       d  M%  [%        UU5        ['        U5        M>     UR)                  X5        US-  nM      UR+                  [        U5      5        g! [         a!  n[        R                  SXEU5         SnAgSnAff = f! [         a!  n[        R                  SXEU5         SnAgSnAff = f)z
Tabla de participantes: una fila por asistente. name_tag_prefix = 'rafcne' | 'tceen'
(columnas del mismo tr: rafcnia/rafcnit o tceeap/tceete).
r3   Tr   NFr:   r   z"%s: fila no encontrada para tag %srQ   z%s: padre de fila no es w:tblrZ   rK   r   r   )rt   r   r  name_tag_prefixr   rw   rx   ry   r   ro   r  r   r}   r  r  r  r    rA   r%   s                      r   expand_participant_table_rowsr
  #  s    	?D{s4y!
   ,r2F;;D'5E};ZP
//
C
{cggG,6
C
))E
CaI1fqj!%;;r'{+C"3'C3Cq!LGw&sG4c" , 	

9%Q	 "T E  0*AF>  /1Es/   E1 F 1
F;FF
G
)GG
c                    [        XUSS5      $ )z+IV familia: rafcne_*, rafcnia_*, rafcnit_*.rafcneexpand_rafc_partr
  rt   r   r  s      r   expand_rafc_participant_rowsr  X  s    (&(Tfggr   c                    [        XUSS5      $ )z*IV comunidad: tceen_*, tceeap_*, tceete_*.tceenexpand_tcee_partr  r  s      r   expand_tcee_participant_rowsr  ]  s    (&'Seffr   c                    [        XUSS5      $ )z$V acta: arn_*, arpa_*, arr_*, art_*.arnexpand_arn_partr  r  s      r   expand_arn_participant_rowsr  b  s    (&%Qbccr   c                    U (       d  gSU SU 3nU R                  U5      (       a  U S[        U5      *  SU SU 3-   $ g)uF   rlane_1_1 → rlane_1_2; rllr_1_1 → rllr_1_2; rlcs_1_1 → rlcs_1_2.Nr:   r   r   s        r   _retag_rla_duplicate_row_tagr  g  r   r   c                2   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      [        U5      5        g)uT   Espacio antes del párrafo (equivalente visual a margin-top sobre la fila de tabla).r   Nr   r   r   )r   r   r   rr   r   r   r   )p_elr   r   r   s       r    _ensure_paragraph_spacing_beforer  q  su    99R[!D|7#Atii;(Gk*GKK:L 12r   c                   U(       d  g[        U 5      n [        [        U5      5      nUR                  R                  nU H  nSU 3n[        Xh5      n	U	c  [        R                  SU5        M.  Sn
U	R                  [        S5      5       H+  nUR                  [        S5      5       H  nUn
  O   U
c  M+    O   U
c  M~  [        X5        M      UR                  [        U5      5        g! [         a   n[        R                  SX55         SnAgSnAff = f! [         a   n[        R                  S	X55         SnAgSnAff = f)
u   
Añade espacio superior a la primera fila de cada nuevo período (sin filas vacías).
row_indices_1based: índices de fila del tag rlane_1_k (p. ej. primera fila del 2do y 3er período).
Tu    rla_spacing: no se abrió %s: %sNFrlane_1_z'rla_spacing: fila no encontrada para %szw:tcr
   u   rla_spacing: save falló %s: %s)r   r   r   rk   rl   rm   rn   ro   r   findallr   rL   r  rs   )rt   row_indices_1basedr   rw   rx   ry   ro   r  r   r  first_ptcr   s                r   -apply_learning_achievement_period_top_spacingr$  ~  s$    	?Ds4y!
 ;;DA3+D9=NNDfM--6
+BWWRY' ( " , ,WC   T 5  94C.  8$Bs/   C* D *
D4DD
E!D<<Ec                   [        U 5      nUS::  a  g [        [        U5      5      nUS:X  a  SOSU S3nUR                  R                  n[        Xv5      nUc  [        R                  S	U5        gUR                  5       n	U	b  U	R                  [        S
5      :w  a  [        R                  S5        gU	R                  U5      n
U
S-   n[        SUS-   5       H}  n[        U5      nUR                  [        S5      5       H;  n[!        U5      n[#        XSU5      nU(       d  M$  [%        UU5        ['        U5        M=     U	R)                  X5        US-  nM      UR+                  [        U5      5        g! [         a   n[        R                  SX55         SnAgSnAff = f! [         a   n[        R                  SX55         SnAgSnAff = f)u   
Sección «3. Registro de logros de aprendizaje»: duplica la fila de la tabla
(tags rlane_*, rllr_*, rlcs_*) para varias filas de datos: rlane_1_2, rllr_1_2, …
r3   Tu   expand_rla: no se abrió %s: %sNF	rlane_1_1rlane_r   z*expand_rla: fila no encontrada para tag %srQ   z%expand_rla: padre de fila no es w:tblrZ   rK   u   expand_rla: save falló %s: %s)r   r   r   rk   rl   rm   rn   ro   r   rp   r+   r   rq   r\   r   rL   r#   r  r'   r1   rr   rs   r   s                    r    expand_learning_achievement_rowsr(    s   
 	?D{s4y!
 )A-[VL>3LF;;D'5E}CVL
//
C
{cggG,>?
))E
CaI1fqj!%;;r'{+C"3'C23aKGw&sG4c" , 	

9%Q	 "T E  8$B>  7Ar  c                   [        U 5      nUS::  a  g [        [        U5      5      nUR                  R                  n[        U5      n[        U5      nUc  [        R                  S5        g[        Xg5      n[        XS-   5       V	s/ s H  oU	   PM	     n
n	Xg   nUR                  5       nUc  gUR                  U5      S-   n[        SU5       H  nUR                  U[        5       5        US-  nU
 Vs/ s H  n[!        U5      PM     nnU H  n[#        X5        M     [%        U5       H  u  nnUR                  UU-   U5        M     US   nUR                  U5      S-   nM      UR'                  [        U5      5        g! [         a   n[        R                  SX$5         SnAgSnAff = fs  sn	f s  snf ! [         a   n[        R                  SX$5         SnAgSnAff = f)	u   
Sección «2. Registro de apoyos…»: duplica el bloque completo (párrafos con nombre/objetivos + tabla),
no solo la tabla, para que existan raegee_2, raegeop_2_1, etc.
r3   Tu   clone_raeg: no se abrió %s: %sNFz5clone_raeg: no hay tabla con tag raegear_1 / raegef_1r;   u   clone_raeg: save falló %s: %s)r   r   r   rk   rl   rm   rn   ro   r*   r   r   r\   rp   rq   rr   r   r   r   r[   rs   )rt   ru   rw   rx   ry   ro   r`   ra   r   rb   rz   r{   r|   r}   r~   r0   r   re   s                     r   "clone_course_record_support_tablesr*    s   
 	?D1}s4y!
 ;;DDzH$X.GNO/BI%*9k%BC%B%BHC$L##%F~
,,|
$q
(C8$c:<=q*23(B8B<(3B'3 w'EArMM#'2& (r{ll<(1, %T G  8$B D 4  7As;   F F16F6)F; 
F.F))F.;
G%G  G%)i  )r   r>   returnr   )r+  r   )r%   r   r+  None)r+  r,  )rA   r   rB   r>   rC   r>   r+  
str | None)rB   r>   rC   r>   r+  r,  )r`   r*   r+  tuple[int | None, int | None])r   )rt   
str | Pathru   r>   rv   r>   r+  bool)rt   r/  ru   r>   r+  r0  )rA   r   rB   r>   r+  r-  )rB   r>   r+  r,  )r`   r*   r+  z
int | None)r`   r*   ra   r>   r+  r>   )r   r   )r   r   r+  r0  )r`   r*   r   r   r   r   r+  r.  )rt   r/  ru   r>   r   r   r+  r0  )
rA   r   r   r>   r   r>   r   r>   r+  r-  )rt   r/  r   r>   r  r>   r+  r0  )rt   r/  r   r>   r  r>   r	  r   r   r   r+  r0  )r   r>   r+  r,  )rt   r/  r!  z	list[int]r   r>   r+  r0  ):__doc__
__future__r   loggingcopyr   pathlibr   docxr   	docx.oxmlr   docx.oxml.nsr   	getLogger__name__rl   r   r^   r#   r'   r1   rH   rO   ri   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  r  r  r  r  r$  r(  r*   r   r   <module>r<     s  
 #     ! 			8	$ D3	+0"P  222 2 
	2j[
0(V6	*   #	,OM
I
!--- 	-
 
-`cc_,^222 2 	2
 2 
2jh
g
d

3  ((!( ( 
	(V,^-r   