
    Nic                       d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ  ej                  e      Zd2d3d	Zd
Zd4dZd5dZd6dZd7dZd8dZd9dZ	 d:	 	 	 	 	 	 	 d;dZd<dZd=dZd>dZd?dZd<dZd=dZd>dZ d?dZ!d@dZ"dAdZ#dBdZ$	 	 	 	 	 	 	 	 dCdZ%d9dZ&d9dZ'd9d Z(d=d!Z)d>d"Z*	 	 	 	 	 	 	 	 dDd#Z+d<d$Z,d<d%Z-d<d&Z.dEd'Z/dFd(Z0	 	 	 	 	 	 	 	 	 	 	 	 dGd)Z1dFd*Z2dFd+Z3dFd,Z4dEd-Z5dHd.Z6	 d2	 	 	 	 	 	 	 dId/Z7dFd0Z8d<d1Z9y)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                    t        d      }t        d      }t        d      }|j                  t        d      t        |              |j	                  |       |j	                  |       |S )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       V/var/www/pie360backend.cl/public_html/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                    | j                  t        d            }|y|j                  t        d            }|y|j                  t        d            xs dj                         S )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                   | j                  t        d            }|y |j                  t        d            }||j                  t        d      |       |j                  t        d            }||j                  t        d      |       y y )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                "   | j                  t        d            }|y t        |      D ]d  }|j                  t        d      k(  s9|j                  j	                  d      s7d|j                  j                         v sT|j                  |       f y )Nr   zw:idz}idid)r   r   listtagendswithlowerremove)r    prels      r   _strip_sdt_idr1   6   sj    	"Y-	 B	z2h 66RZBFFOOE$:trvv||~?UIIbMr   c                j   |dk  ry| xs dj                         }|sy|j                         }|j                  d      rd|dz    S |j                  d      rd|dz    S dD ]?  }|j                  |      s	 t        |j	                  d      d         }| ||z  |z    c S  y# t
        $ r Y  yw xY w)	zh
    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)* XkH4q89::;   s   8B%%	B21B2c                    | j                  t        d            D ]4  }t        |      }t        |||      }|st	        ||       t        |       6 y Nw:sdt)iterr   r#   rH   r'   r1   )rootrB   rC   r    rA   news         r   _retag_sdts_in_elementrO   W   sK    yyG% s#&sKB"3,#r   c           	        d}t        |       D ]S  \  }}|j                  t        d      k7  r|j                  t        d            D ]  }t	        |      dk(  s|} n |S n |yd}t        |dz
  dd      D ]^  }| |   j                  t        d      k7  r nAd	j                  d
 | |   j                  t        d            D              }t        |v s\|} n ||dz   }nt        d|dz
        }|}	||	kD  r|	}||	fS )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  <   K   | ]  }|j                   xs d   yw)r   N)text).0ts     r   	<genexpr>z-_find_clone_fragment_range.<locals>.<genexpr>w   s     K!"Ks   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_rangerh   `   s%    Gh' 5997#::bk* 	C$	1	  J7Q;B' A;??bi'wwKx{/?/?5	/JKKd"J QAw{#
Cs{#:r   c                r   t        |       }|dk  ry	 t        t        |            }|j                  j                  }t        |      }t        |      \  }}	||	t        j                  d       yt        ||	dz         D 
cg c]  }
||
   	 }}
||	   }|j                         }|y|j                  |      dz   }t        d|      D ]o  }|D cg c]  }t        |       }}|D ]  }t        |||        t        |      D ]  \  }}|j!                  ||z   |        |d   }|j                  |      dz   }q 	 |j#                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY wc c}
w c c}w # t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)	uX  
    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*   rh   r[   	getparentindexr   rO   rZ   insertsave)	docx_pathn_blocksrows_per_registerpathdocern   r_   rf   rg   ra   fragmentinsert_afterparentidxcopy_ir0   new_elsrd   s                      r   $clone_register_book_section_b_blocksr      s    	?D1}s4y!
 ;;DDzH+H5JE3}^_%*5#'%:;;H;C=L##%F~
,,|
$q
(C8$ -*23B8B<33 	BB"2v/@A	Bw' 	'EArMM#'2&	'r{ll<(1,-T A  =tQG < 4  <dAFs;   E FF:F 	E?E::E?	F6F11F6c                    t        | |d      S )z:Compatibilidad: usar clone_register_book_section_b_blocks.   )ru   )r   rs   rt   s     r   (clone_rarpo_observation_blocks_if_neededr      s    /	8WYZZr   c                T   |dk  ry| xs dj                         }|sy|j                         }dD ]?  }|j                  |      s	 t        |j	                  d      d         }| |dz  |z    c S  |dk(  rd	|dz    S |d
k(  rd|dz    S |dk(  rd|dz    S y# t
        $ r Y  yw xY w)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/ 4>>&!b)* XkAo12334 h{Q'((
h{Q'((
g~kAo&''  s   B	B'&B'c                    | j                  t        d            D ]3  }t        |      }t        ||      }|st	        ||       t        |       5 y rJ   )rL   r   r#   r   r'   r1   rM   rB   r    rA   rN   s        r   _retag_pai_sdts_in_elementr      sI    yyG% s#&sK8"3,#r   c                    t        |       D ]Q  \  }}|j                  t        d      k7  r|j                  t        d            D ]  }t	        |      dk(  s|c c S  S y )NrQ   rK   paih_1rZ   r+   r   rL   r#   )r_   ra   rb   r    s       r   _find_pai_table_indexr      s`    h' 5997#::bk* 	C$0	 r   c                   t        |       }|dk  ry	 t        t        |            }|j                  j                  }t        |      }t        |      }|t        j                  d       y||   g}||   }	|	j                         }
|
y|
j                  |	      dz   }t        d|      D ]D  }t        |d         }t        ||       |
j                  ||       |}	|
j                  |	      dz   }F 	 |j!                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)	u   
    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   rj   rk   rl   rm   rn   r*   r   ro   rp   r[   r   r   rq   rr   )rs   rt   rv   rw   rx   rn   r_   r`   ry   rz   r{   r|   r}   new_tbls                 r   clone_pai_support_tablesr      s\   
 	?D1}s4y!
 ;;DDzH#H-G?@!"HG$L##%F~
,,|
$q
(C8$ -8A;'"7F3c7#ll<(1,-T =  7qA6  6a@s/   D 1D9 	D6D11D69	E#EE#c                   |dk  ry| xs dj                         }|sy|dz   }|j                         }d}|D ]  }|dz   }|j                  |      s|t        |      dz   d }|j	                  d      }	t        |	      dk(  r|	d   dk(  r	| d| c S t        |	      dk\  sj|	d   dk(  ss|	d   j                         sdj                  |	dd       }
| d| d|
 c S  y)	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   1rY   )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83C3C3E88E!"I&DXQugQtf--
. r   c                    | j                  t        d            D ]3  }t        |      }t        ||      }|st	        ||       t        |       5 y rJ   )rL   r   r#   r   r'   r1   r   s        r   _retag_raeg_sdts_in_elementr   0  I    yyG% s#'[9"3,#r   c                    t        |       D ]R  \  }}|j                  t        d      k7  r|j                  t        d            D ]  }t	        |      }|dv s|c c S  T y)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_   ra   rb   r    rW   s        r   _find_raeg_table_indexr   9  sf    h' 5997#::bk* 	C %AXX	 r   c                    t        h d      }g }t        d|      D ]F  }| |   }|j                  t        d            D ]"  }t	        |      |v s|j                  |        F H |rt        |      S |S )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_   r`   header_tagshitsrd   chr    s          r   _find_raeg_fragment_start_indexr   E  s}    
 DEKD1g a[772g;' 	C$3A	 3t9)')r   c                    | j                  t        d            D ]V  }|j                  t        d            D ]7  }|j                  t        d            D ]  }t        |      |k(  s|c c c S  9 X y )NrQ   zw:trrK   rL   r   r#   )rM   needletbltrr    s        r   _find_tr_containing_sdt_tagr   U  sm    yyG% ((2f:& 	Bwwr'{+ #C(F2I	
 r   c                b    | j                  t        d            D ]  }t        |      |k(  s y y)NrK   TFr   )rM   r   r    s      r   _element_has_sdt_tagr   ^  s3    yyG% C F* r   c                    dx}}t        |       D ]  \  }}t        ||      s|} n |yt        |t        |             D ]  }t        | |   |      s|} n |y||fS )u]   Rango de elementos del cuerpo entre el primer SDT start_tag y el último end_tag (inclusive).NrS   )rZ   r   r[   r   )r_   	start_tagend_tagrf   rg   ra   r   s          r   _find_activity_fragment_ranger   e  s     EC8$ 2I.E }5#h-( W5C {#:r   c                    t        | dd      S )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                    t        | dd      S )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                    t        | dd      S )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                    |dk  ry| xs dj                         }|sy|j                  dd      }t        |      dk7  s|d   dk7  s|d   dk7  ry|d   }|dz   }| d| d	S )
uC   Prototipo rafcf_1_1, …, rafcnir_1_1. Clon k>=1 → rafcf_2_1, …r3   Nr   r:   rY      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                    | j                  t        d            D ]3  }t        |      }t        ||      }|st	        ||       t        |       5 y rJ   )rL   r   r#   r   r'   r1   r   s        r   _retag_rafc_sdts_in_elementr     r   r   c                   t        |       }|dk  ry	 t        t        |            }|j                  j                  }t        |      } ||      \  }	}
|	|
t        j                  d|       yt        |	|
dz         D cg c]  }||   	 }}||
   }|j                         }|y|j                  |      dz   }t        d|      D ]  }|j                  |t                      |dz  }|D cg c]  }t        |       }}|D ]  }t        ||        t!        |      D ]  \  }}|j                  ||z   |        |d   }|j                  |      dz   } 	 |j#                  t        |             y# t        $ r"}t        j                  d|||       Y d }~yd }~ww xY wc c}w c c}w # t        $ r"}t        j                  d|||       Y d }~yd }~ww xY w)Nr3   T   %s: no se abrió %s: %sFu-   %s: no se encontró el fragmento de plantillar;      %s: save falló %s: %s)r   r   r   rj   rk   rl   rm   rn   r*   r[   ro   rp   rq   r   r   r   rZ   rr   )rs   rt   find_fragment
log_prefixrv   rw   rx   rn   r_   	start_idxend_idxra   ry   rz   r{   r|   r}   r0   r~   rd   s                       r   _clone_iv_activity_blocksr     s    	?D1}s4y!
 ;;DDzH&x0IwGOF
S%*9gk%BCCHCG$L##%F~
,,|
$q
(C8$ 	-c:<=q*23B8B<33 	4B'F3	4w' 	'EArMM#'2&	'r{ll<(1,	-T E  0*dAF D 4  /T1Es;   E1 ?F+F$F) 1	F:FF)	G2GGc                &    t        | |t        d      S )uA   
    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                &    t        | |t        d      S )uA   
    IV comunidad: duplica bloque (tceef_*_1 … tceer_*_1).
    
clone_tcee)r   r   r   s     r   &clone_course_community_activity_blocksr     r   r   c                &    t        | |t        d      S )uY   
    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                l    | syd| d| }| j                  |      r| dt        |        d| d| z   S y)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     N    az*F
||F>c&k\"qax%@@@r   c                   t        |       }|dk  ry	 t        t        |            }|dk(  rdnd| d}|j                  j                  }t        ||      }|t        j                  d	|       y|j                         }	|	|	j                  t        d
      k7  rt        j                  d       y|	j                  |      }
|
dz   }t        d|dz         D ]v  }t        |      }|j                  t        d            D ]5  }t!        |      }t#        ||d|      }|st%        ||       t'        |       7 |	j)                  ||       |dz  }x 	 |j+                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)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:tblrY   rK   u   expand_raeg: save falló %s: %sr   r   r   rj   rk   rl   rm   rn   r   ro   r+   r   rp   r[   r   rL   r#   r   r'   r1   rq   rr   rs   r   n_rowsrv   rw   rx   r   rn   tr_elr   r|   	insert_atrnew_trr    rA   r%   s                    r   expand_raeg_intervention_rowsr    s   
 	?D{s4y!
 *Q.\gl^24NF;;D'f5E}DfM
//
C
{cggG,?@
))E
CaI1fqj! 	%;;r'{+ 	#C"3'C3Cq!LG&sG4c"	# 	

9f%Q		T E  94C>  8$B/   E) F )	F2FF	G F;;G c                   t        |       }|dk  ry	 t        t        |            }| d| d}|j                  j                  }	t        |	|      }
|
t        j                  d||       y|
j                         }||j                  t        d	      k7  rt        j                  d
|       y|j                  |
      }|dz   }t        d|dz         D ]v  }t        |
      }|j                  t        d            D ]5  }t!        |      }t#        ||d|      }|st%        ||       t'        |       7 |j)                  ||       |dz  }x 	 |j+                  t        |             y# t        $ r"}t        j                  d|||       Y d}~yd}~ww xY w# t        $ r"}t        j                  d|||       Y d}~yd}~ww xY w)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:tblrY   rK   r   r   )rs   r   r   name_tag_prefixr   rv   rw   rx   r   rn   r  r   r|   r  r  r  r    rA   r%   s                      r   expand_participant_table_rowsr	  #  s    	?D{s4y!
   ,r2F;;D'f5E};ZP
//
C
{cggG,6
C
))E
CaI1fqj! 	%;;r'{+ 	#C"3'C3Cq!LG&sG4c"	# 	

9f%Q		T E  0*dAF>  /T1Es/   E& F &	F/FF	F?F::F?c                     t        | ||dd      S )z+IV familia: rafcne_*, rafcnia_*, rafcnit_*.rafcneexpand_rafc_partr	  rs   r   r   s      r   expand_rafc_participant_rowsr  X  s    (L&(Tfggr   c                     t        | ||dd      S )z*IV comunidad: tceen_*, tceeap_*, tceete_*.tceenexpand_tcee_partr  r  s      r   expand_tcee_participant_rowsr  ]  s    (L&'Seffr   c                     t        | ||dd      S )z$V acta: arn_*, arpa_*, arr_*, art_*.arnexpand_arn_partr  r  s      r   expand_arn_participant_rowsr  b  s    (L&%Qbccr   c                l    | syd| d| }| j                  |      r| dt        |        d| d| z   S y)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                .   | j                  t        d            }|t        d      }| j                  d|       |j                  t        d            }|t        d      }|j	                  |       |j                  t        d      t        |             y)uT   Espacio antes del párrafo (equivalente visual a margin-top sobre la fila de tabla).r   Nr   r   r   )r   r   r   rq   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                n   |syt        |       }	 t        t        |            }|j                  j                  }|D ]  }d| }t        ||      }	|	t        j                  d|       -d}
|	j                  t        d            D ](  }|j                  t        d            D ]  }|}
 n |
( n |
wt        |
|        	 |j                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w# t        $ r!}t        j                  d	||       Y d}~yd}~ww xY w)
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   rj   rk   rl   rm   rn   r   findallr   rL   r  rr   )rs   row_indices_1basedr   rv   rw   rx   rn   r  r   r  first_ptcr   s                r   -apply_learning_achievement_period_top_spacingr#  ~  s=    	?Ds4y!
 ;;D DA3+D&9=NNDfM--6
+ 	BWWRY'  "	 ,WlCD T 5  94C.  8$Bs/   C D
 	D&DD
	D4D//D4c                   t        |       }|dk  ry	 t        t        |            }|dk(  rdnd| d}|j                  j                  }t        ||      }|t        j                  d	|       y|j                         }	|	|	j                  t        d
      k7  rt        j                  d       y|	j                  |      }
|
dz   }t        d|dz         D ]v  }t        |      }|j                  t        d            D ]5  }t!        |      }t#        ||d|      }|st%        ||       t'        |       7 |	j)                  ||       |dz  }x 	 |j+                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)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:tblrY   rK   u   expand_rla: save falló %s: %s)r   r   r   rj   rk   rl   rm   rn   r   ro   r+   r   rp   r[   r   rL   r#   r  r'   r1   rq   rr   r   s                    r    expand_learning_achievement_rowsr'    s   
 	?D{s4y!
 )A-[VL>3LF;;D'f5E}CVL
//
C
{cggG,>?
))E
CaI1fqj! 	%;;r'{+ 	#C"3'C23aKG&sG4c"	# 	

9f%Q		T E  8$B>  7qAr  c                   t        |       }|dk  ry	 t        t        |            }|j                  j                  }t        |      }t        |      }|t        j                  d       yt        ||      }t        ||dz         D 	cg c]  }	||	   	 }
}	||   }|j                         }|y|j                  |      dz   }t        d|      D ]  }|j                  |t                      |dz  }|
D cg c]  }t!        |       }}|D ]  }t#        ||        t%        |      D ]  \  }}|j                  ||z   |        |d   }|j                  |      dz   } 	 |j'                  t        |             y# t        $ r!}t        j                  d||       Y d}~yd}~ww xY wc c}	w c c}w # t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)	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   rj   rk   rl   rm   rn   r*   r   r   r[   ro   rp   rq   r   r   r   rZ   rr   )rs   rt   rv   rw   rx   rn   r_   r`   r   ra   ry   rz   r{   r|   r}   r0   r~   rd   s                     r   "clone_course_record_support_tablesr)    s   
 	?D1}s4y!
 ;;DDzH$X.GNO/'BI%*9gk%BCCHCG$L##%F~
,,|
$q
(C8$ 	-c:<=q*23B8B<33 	4B'F3	4w' 	'EArMM#'2&	'r{ll<(1,	-T G  8$B D 4  7qAs;   E: F'4F,F1 :	F$FF$1	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   )rs   
str | Pathrt   r>   ru   r>   r*  bool)rs   r.  rt   r>   r*  r/  )rA   r   rB   r>   r*  r,  )rB   r>   r*  r+  )r_   r*   r*  z
int | None)r_   r*   r`   r>   r*  r>   )r   r   )r   r   r*  r/  )r_   r*   r   r   r   r   r*  r-  )rs   r.  rt   r>   r   r   r*  r/  )
rA   r   r   r>   r   r>   r   r>   r*  r,  )rs   r.  r   r>   r   r>   r*  r/  )rs   r.  r   r>   r   r>   r  r   r   r   r*  r/  )r   r>   r*  r+  )rs   r.  r   z	list[int]r   r>   r*  r/  ):__doc__
__future__r   loggingcopyr   pathlibr   docxr   	docx.oxmlr   docx.oxml.nsr   	getLogger__name__rk   r   r]   r#   r'   r1   rH   rO   rh   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   