
    ivv              	       ^   S r SSKrSSKrSSKJr  \R                  R                  \R                  R                  \R                  R                  \R                  R                  \5      5      5      5        SSK	J
r
  SSKJr  SSKrSSKrSSKrSSKrSSKJr   " S S\5      r " S	 S
5      rg)z
Recuperar_formulariosYpdf.py

Script de prueba para generar PDFs de formularios desde el backend
sin necesidad de pasar por la API Flask.
    N)datetime)get_connection)FPDF)Pathc                   N   ^  \ rS rSrSrU 4S jrS rS rS rS
S jr	S r
S	rU =r$ )PDF   z=
Clase personalizada para PDF con identidad corporativa IGSA
c                 0   > [         TU ]  5         SU l        g )N )super__init__form_id)self	__class__s    {C:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Operaciones_Module\Ingenieria\Cotiz\FormularioPDFService.pyr   PDF.__init__   s        c           	          U R                  SSS5        U R                  SSS5        U R                  SSS5        U R                  SS	S
SSSS5        U R	                  S5        g)u3   Encabezado de cada página con colores corporativosArialB   [            r      u   Información de Formulario   C   Nset_fontset_fill_colorset_text_colorcelllnr   s    r   header
PDF.header!   sZ    gsB'BS)Cc*		!R5q!S!D
r   c                     U R                  S5        U R                  SSS5        U R                  SSS5        U R                  SSSU R	                  5        S	3SSS
5        g)u   Pie de páginair   I   f   r   
   u   Página z/{nb}r   N)set_yr!   r#   r$   page_nor&   s    r   footer
PDF.footer)   sU    

3gsA&Cc*		!R8DLLN#37;Q3Gr   c           	          U R                  SSS5        U R                  SSS5        U R                  SSS5        U R                  SS	USS
SS
5        U R	                  S5        g)u4   Crea un título de sección con colores corporativosr   r      .   \      r   r   r-   r   L   Nr    )r   titulos     r   seccion_tituloPDF.seccion_titulo0   sY    gsB'BC(Cc*		!RAsA.
r   c           	      &   U R                  SSS5        U R                  " U6   U R                  SSS5        U R                  SSUSS	S
S5        U R                  SSS5        U R                  SSS5        U R                  S	S[	        U5      SSS
5        g)z+Crea una fila de datos con etiqueta y valorr   r   r-   r4   r5   r6   <   r   r   r7   r   3   N)r!   r"   r#   r$   str)r   etiquetavalorbg_colors       r   
fila_datosPDF.fila_datos8   s    gsB'X&BC(		"b(Aq#q1gr2&BB'		!RUQ3/r   c                 V   SnU R                   U R                  -
  U R                  -
  U-
  nU R                  5       nU R	                  U R                  U5        U R                  SSS5        U R                  SSS5        U R                  SS	S
5        U R                  US[        U5      S-   SSS5        U R	                  U R                  U-   U5        U R                  SSS5        U R                  SSS5        U R                  SSS5        U R                  US[        U5      SSS5        g)z^
Crea una fila con pregunta y respuesta en formato simplificado
con colores corporativos IGSA
F   r   r   r-            r4   r5   r6      :r   r7   Tr   r   r>   N)
wl_marginr_marginget_yset_xyr!   r"   r#   
multi_cellr?   )r   pregunta	respuestaancho_preguntaancho_respuesta	y_inicials         r   fila_pregunta_respuestaPDF.fila_pregunta_respuestaC   s   
 &&4==04==@>QJJL	 	DMM9-gsB'Cc*BC(3x=3+>3M 	DMMN2I>gr2&Cc*BB'C	NAsDIr   )r   )rG   rH   rI   )__name__
__module____qualname____firstlineno____doc__r   r'   r0   r:   rC   rW   __static_attributes____classcell__)r   s   @r   r   r      s.    H	0J Jr   r   c            
           \ rS rSrSr\S\S\4S j5       r\SS j5       r	\S 5       r
\SS\4S	 jj5       r\S
\S\4S j5       r\SS\S\S\S\4S jj5       r\S\S\S\4S j5       r\SS\4S jj5       rSrg)FormularioPDFServicer5   zB
Servicio para generar PDFs de formularios desde la base de datos
r   returnc                    [        SU  35        Sn [        5        nUR                  5        nUR                  X45        UR	                  5       nU(       d   [        SU  35         SSS5        SSS5        g[        S[        U5       S35        US   nUS   US   US	   US
   US   US   US   / S.n[        S[        U5       S35        [        US5       HR  u  pxUS   US   US   US   S.n	US   R                  U	5        US-  S:X  d  M7  [        SU S[        U5       S35        MT     [        S[        US   5       35        UsSSS5        sSSS5        $ ! , (       d  f       O= f SSS5        g! , (       d  f       g= f! [         a,  n
[        SU
 35        SSK	nUR                  5          Sn
A
gSn
A
ff = f)z
Obtiene los datos del formulario desde la base de datos

Args:
    form_id (str): ID del formulario (ej: '1002-1-FormGral')
    
Returns:
    dict: Diccionario con los datos del formulario o None si no existe
u!   🔍 Buscando datos para FormID: u  
        SELECT 
            fh.FormID,
            fh.CreatedAt,
            COALESCE(NULLIF(RTRIM(LTRIM(fh.CreatedBy)), ''), 'Sin información') AS CreatedBy,
            COALESCE(NULLIF(RTRIM(LTRIM(qt.FrontES)), ''), 'Sin información') AS FrontES,
            COALESCE(NULLIF(RTRIM(LTRIM(fd.Question)), ''), 'Sin información') AS Question,
            COALESCE(NULLIF(RTRIM(LTRIM(fd.TypeQuestion)), ''), 'Sin información') AS TypeQuestion,
            COALESCE(NULLIF(RTRIM(LTRIM(fd.Answer)), ''), 'Sin información') AS Answer,
            COALESCE(NULLIF(RTRIM(LTRIM(p.Email)), ''), 'Sin información') AS Email,
            COALESCE(NULLIF(RTRIM(LTRIM(p.ContactPhone)), ''), 'Sin información') AS ContactPhone,
            COALESCE(NULLIF(RTRIM(LTRIM(p.FirstName)), ''), 'Sin información') AS FirstName,
            fd.FormLineID
        FROM 
            Q_SpQ_FormsHead fh
        INNER JOIN Q_QuotationType qt ON fh.QuotationTypeID = qt.QuotationTypeID
        LEFT JOIN Q_SpQ_FormsDetail fd ON fh.FormID = fd.FormID
        LEFT JOIN Profiles p ON fh.UserID = p.UserID
        WHERE 
            fh.FormID = ?
        ORDER BY 
            fd.FormLineID
        u)   ❌ No se encontraron datos para FormID: N   ✅ Se encontraron z registros (preguntas)r   r   r8   r   rJ   r+   	   )FormID	CreatedAt	CreatedByFrontESEmailContactPhone	FirstName	preguntasu   📝 Procesando z preguntas:r-            )
FormLineIDQuestionTypeQuestionAnswerrn   u      ↳ Procesadas /z preguntas...u#   ✅ Total de preguntas capturadas: u)   ❌ Error al consultar la base de datos: )printr   cursorexecutefetchalllen	enumerateappend	Exception	traceback	print_exc)r   queryconnrx   rowsprimera_filadatosidxrowrR   er   s               r   obtener_datos_formulario-FormularioPDFService.obtener_datos_formularioa   s    	1';<02	!T[[]fNN5*5!??,D I'ST# # "! /D	{:PQR $(7L #/q/%1!_%1!_#/?!-a(4Q%1!_%'	E ,SYK{CD$-dA$6*-b'(+A,/F&)!f	$ k*11(; 7a<!$6se1SYK}"UV %7 ?E+DV@W?XYZ U #] "!"]] "!!Z  	=aSAB!		sj   
F E79E&E7.F 7BE:E		E7	F 
E*	&E7.F 7
FF F 
F>"F99F>c                 t   [         R                  R                  [         R                  R                  [        5      5      n[         R                  R                  X5      n[         R                  R                  U5      (       d&  [         R                  " U5        [        SU 35        U$ [        SU 35        U$ )uB   
Crea el directorio donde se guardarán los reportes si no existe
   📁 Directorio creado: u"   📁 Usando directorio existente: )	ospathdirnameabspath__file__joinexistsmakedirsrw   )directorio_base
script_dirruta_reportess      r   crear_directorio_reportes.FormularioPDFService.crear_directorio_reportes   s    
 WW__RWW__X%>?
ZAww~~m,,KK&,]O<=  6}oFGr   c                 \    [         R                  " 5       nUS:X  a  [        R                  " U 5        O;US:X  a  [        R                  " SU  S35        O[        R                  " SU  S35        [	        S5        g	! [
         a&  n[	        SU 35        [	        SU  35         S	nAg	S	nAff = f)
zF
Abre el archivo PDF generado con el visor predeterminado del sistema
WindowsDarwinzopen ""z
xdg-open "u%   📄 Archivo abierto automáticamenteu6   ⚠️  No se pudo abrir el archivo automáticamente: z%   Puedes abrirlo manualmente desde: N)platformsystemr   	startfilerw   r~   )ruta_archivosistemar   s      r   abrir_archivo"FormularioPDFService.abrir_archivo   s    
	Joo'G)#\*H$		F<.23		J|nA679; 	JJ1#NO9,HII	Js   A8A; ;
B+B&&B+Nc           
      
   [        S5        [        S5        [        S5        [        SU  35        [        5         [        R                  U 5      nU(       d  [        S5        g[        R                  S5      nUc=  [        R
                  " 5       R                  S5      nSU R                  S	S
5       S
U S3n[        R                  R                  XA5      n[        SU 35        [        SU 35        [        5          [        S5        [        5       nXl        UR                  5         UR                  5         UR                  SSS5        UR!                  SSS5        UR#                  SSSSS5        UR%                  S5        [        S5        UR'                  S5        UR)                  SUS   S5        UR)                  S[+        US   5      S5        UR)                  SUS    S5        UR)                  S!US"   S5        UR%                  S5        [        S#5        UR'                  S$5        UR)                  S%US&   S5        UR)                  S'US(   S5        UR)                  S)US*   S5        UR%                  S5        [        S+[-        US,   5       S-35        UR'                  S.5        UR%                  S/5        [/        US,   S05       HD  u  pUS-  S:X  a  [        S1U S2[-        US,   5       S335        UR1                  U	S4   U	S5   5        MF     [        S1[-        US,   5       S2[-        US,   5       S635        [        S75        UR%                  S5        UR                  SS8S95        UR!                  SSS5        [        R
                  " 5       R                  S:5      n
UR3                  SSS;U
 3SS0S5        [        5         [        S<5        UR5                  U5        [        R                  R7                  U5      (       a>  [        R                  R9                  U5      S=-  n[        S>5        [        S?US@ SA35        O[        SB5        g[        5         [        S5        [        SC5        [        S5        [        SDU 35        [        SEU 35        [        SFU 35        [        S5        U(       a  [        5         [        R;                  U5        U$ ! [<         a  n[        5         [        S5        [        SG5        [        S5        [        SH[?        U5      R@                   35        [        SIU 35        [        5         [        SJ5        SSK!nURE                  5         [        S5         SnAgSnAff = f)Ku7  
Genera un PDF del formulario especificado

Args:
    form_id (str): ID del formulario (ej: '1001-1')
    nombre_archivo (str, optional): Nombre del archivo PDF
    abrir_al_finalizar (bool): Si es True, abre el PDF automáticamente
    
Returns:
    str: Ruta completa del archivo generado o None si hay error
P================================================================================u)   🚀 INICIANDO GENERACIÓN DE REPORTE PDF   📋 FormID solicitado: 3   ❌ No se pudieron obtener los datos del formularioNreportes%Y%m%d_%H%M%Sformulario_-_.pdfu   💾 Nombre del archivo: u   📂 Ubicación completa:    📝 Generando documento PDF...r   r   r-   r,   r   rp   u`   Bienvenido. Módulo para Información del formulario, diseñado para el área comercial de IGSA.r   r+   /      ↳ Agregando información del formulario...Datos de la OportunidadForm ID:rg   rY      Fecha de Creación:rh   Creado Por:ri   Tipo de Formulario:rj   ,      ↳ Agregando información del usuario...   Información del UsuarioNombre:rm   Email:rk   
   Teléfono:rl         ↳ Procesando rn    preguntas y respuestas...Detalles del Formularior8   r            • Procesadas rv   
 preguntasrs   ru       preguntas ✓/      ↳ Agregando información de generación...r*   rf   %d/%m/%Y %H:%M:%SReporte generado el    💾 Guardando archivo PDF...   u!   ✅ Archivo guardado exitosamenteu   📏 Tamaño del archivo: .2fz KB(   ❌ ERROR: El archivo no se pudo guardar#   ✨ PROCESO COMPLETADO EXITOSAMENTEu   📄 Archivo generado: u   📂 Ubicación: u   🔗 Ruta completa: u   ❌ ERROR INESPERADOzTipo de error: z
Detalles: zStack trace completo:)#rw   rb   r   r   r   nowstrftimereplacer   r   r   r   r   alias_nb_pagesadd_pager!   r#   rQ   r%   r:   rC   r?   r{   r|   rW   r$   outputr   getsizer   r~   typerZ   r   r   )r   nombre_archivoabrir_al_finalizarr   directorio_reportes	timestampruta_completapdfr   rR   	fecha_gen
   tamaño_kbr   r   s                 r   generar_pdf FormularioPDFService.generar_pdf   s    	h9:h(	23 %==gFGH 3LLZX ! //@I*7??3+D*EQykQUVN %8I).)9:;*=/:;]	34%C!K LLN LL"b)sC-NN1a  "D  FG  IL  MFF1I CD89NN:uXHNN0#eK6H2I?[NN=%*<oNNN0%	2BOTFF1I @A9:NN9eK&8/JNN8U7^_ENN<~)>PFF1I &s5+='>&??YZ[89FF1I!*5+=q!A8q=1#aE+<N8O7PPZ[\++HZ,@(8BTU	 "B )#eK.@*A)B!CkHZD[C\\jkl CDFF1ILL#q)sC- //0CDIHHQ29+>1cJG 12JJ}%ww~~m,,WW__];dB
9;2:c2B#FG@BG(O78(O+N+;<=%&9%:;<(89(O!$22=A   	G(O()(OODG$4$4#567Jqc"#G)*!(O	s!   =MS BS 
U<$BU77U<docs_idc           	      ~   [        SU  35        Sn [        5        nUR                  5        nUR                  X45        UR	                  5       nU(       d"  [        SU  35        / sSSS5        sSSS5        $ / nU H+  nUS   US   US   US   US	   S
.nUR                  U5        M-     [        S[        U5       S35        UsSSS5        sSSS5        $ ! , (       d  f       O= f SSS5        g! , (       d  f       g= f! [         a.  n[        SU 35        SSKn	U	R                  5         / s SnA$ SnAff = f)u   
Obtiene los archivos adjuntos asociados al DocsID desde Q_SpQ_DocsDetail

Args:
    docs_id (int): ID del documento
    
Returns:
    list: Lista de diccionarios con información de los archivos
u-   🔍 Buscando archivos adjuntos para DocsID: a#  
        SELECT 
            DocLineID,
            DocsID,
            DocLine,
            RTRIM(LTRIM(Title)) AS Title,
            RTRIM(LTRIM(Ruta)) AS Ruta
        FROM 
            Q_SpQ_DocsDetail
        WHERE 
            DocsID = ?
        ORDER BY 
            DocLineID
        u<      ℹ️  No se encontraron archivos adjuntos para DocsID: Nr   r   r8   r   ro   )	DocLineIDDocsIDDocLineTitleRutare    archivo(s) adjunto(s)u*   ❌ Error al consultar archivos adjuntos: )
rw   r   rx   ry   rz   r}   r{   r~   r   r   )
r   r   r   rx   r   archivosr   archivor   r   s
             r   obtener_archivos_adjuntos.FormularioPDFService.obtener_archivos_adjuntosk  s1    	=gYGH	!T[[]fNN5*5!??,D \]d\efg! #] "!  "H#),Q&)!f'*1v%(V$'F# !0  $ /H>TUV#) #] "!"]] "!!.  	>qcBC!I		sj   
D C39C&	C3/	D 9AC	C3	D 
C&	"C3*D 3
D=D D 
D<#D71D<7D<ruta_origendirectorio_destinor   c                    SSK nSSKJnJn   U R	                  S5      =(       d    U R	                  S5      nU(       Ga  Uc7  U" U 5      nU" [
        R                  R                  UR                  5      5      n[        U5      U-  n[        S5        UR                  " U SSS	9n	U	R                  5         [        US
5       n
U	R                  SS9 H  nU(       d  M  U
R                  U5        M     SSS5        UR                  5       (       a;  UR!                  5       R"                  S-  n[        SU SUS S35        [%        U5      $ [        S5        g[        U 5      nUR                  5       (       d  [        SU  35        gUc  UR&                  n[        U5      U-  n[(        R*                  " X5        [        SU 35        [%        U5      $ ! , (       d  f       N= f! UR,                  R.                   a  n[        SU 35         SnAgSnAf[0         a,  n[        SU 35        SSKnUR5                  5          SnAgSnAff = f)u[  
Descarga un archivo desde una URL o copia desde una ruta local

Args:
    ruta_origen (str): URL o ruta local del archivo
    directorio_destino (str): Directorio donde se guardará el archivo
    nombre_archivo (str, optional): Nombre personalizado para el archivo
    
Returns:
    str: Ruta completa del archivo descargado o None si hay error
r   N)urlparseunquotezhttp://zhttps://u       🌐 Descargando desde URL...   T)timeoutstreamwbi    )
chunk_sizer   u      ✅ Descargado: z (r    KB)u-      ❌ El archivo no se guardó correctamenteu"      ⚠️  Archivo no encontrado: u      ✅ Copiado: u"      ❌ Error de red al descargar: u"      ❌ Error al procesar archivo: )requestsurllib.parser   r   
startswithr   r   basenamer   rw   getraise_for_statusopeniter_contentwriter   statst_sizer?   nameshutilcopy2
exceptionsRequestExceptionr~   r   r   )r   r   r   r   r   r   es_url
parsed_urldestinoresponsefchunkr   origenr   r   s                   r   descargar_archivo&FormularioPDFService.descargar_archivo  s    	2C	 ++I6\+:P:PQ[:\F ")!)+!6J%,RWW-=-=joo-N%ON 12^C 8:#<<RM))+ '4(A!)!6!6$!6!G 5GGEN "H ) >>##!(!7!7$!>J//?r*SAQQUVWw<'IK k*}}>{mLM ")%+[[N 12^C V-((89:7|#G )(J ""33 	6qc:; 	6qc:;!		sV   B2G!  GG1AG! 	G! .G! AG! 
GG! !I;HI"IIr   ruta_zipc                     [         R                  " US[         R                  5       nU  HQ  nU(       d  M  [        U5      R	                  5       (       d  M,  UR                  U[        U5      R                  5        MS     SSS5        [        S[        U5      R                   35        g! , (       d  f       N0= f! [         a  n[        SU 35         SnAgSnAff = f)u  
Crea un archivo ZIP con todos los archivos descargados

Args:
    archivos (list): Lista de rutas de archivos a incluir en el ZIP
    ruta_zip (str): Ruta donde se guardará el archivo ZIP
    
Returns:
    bool: True si se creó exitosamente, False si hay error
rL   N   📦 ZIP creado: Tu   ❌ Error al crear ZIP: F)	zipfileZipFileZIP_DEFLATEDr   r   r   r   rw   r~   )r   r  zipfr   r   s        r   crear_zip_con_archivos+FormularioPDFService.crear_zip_con_archivos  s    	30D0DE'Gw4=#7#7#9#9

7DM,>,>?  ( F %d8n&9&9%:;< FE  	,QC01	s9   &B; B*B*)B* )B; *
B84B; ;
CCCc           
      2   [        S5        [        S5        [        S5        [        SU  35        [        SU(       a  SOS 35        [        SU(       a  SOS 35        [        5         [        R                  U 5      nU(       d  [        S5        g	 [        U R	                  S
5      S   5      n[        R                  S5      nSU R                  S
S5       3n[        R                  R                  Xg5      n[        R                  R                  U5      (       d$  [        R                  " U5        [        SU 35        Uc=  [        R                  " 5       R                  S5      n	SU R                  S
S5       SU	 S3n[        R                  R                  X5      n
[        SU 35        [        5          [        S5        [        5       nXl        UR#                  5         UR%                  5         UR'                  SSS5        UR)                  SSS5        UR+                  SSSSS5        UR-                  S5        [        S5        UR/                  S5        UR1                  SUS    S!5        UR1                  S"[3        US#   5      S!5        UR1                  S$US%   S!5        UR1                  S&US'   S!5        UR-                  S5        [        S(5        UR/                  S)5        UR1                  S*US+   S!5        UR1                  S,US-   S!5        UR1                  S.US/   S!5        UR-                  S5        [        S0[5        US1   5       S235        UR/                  S35        UR-                  S45        [7        US1   S55       HD  u  pUS-  S:X  a  [        S6U S7[5        US1   5       S835        UR9                  US9   US:   5        MF     [        S6[5        US1   5       S7[5        US1   5       S;35        [        S<5        UR-                  S5        UR'                  SS=S>5        UR)                  SSS5        [        R                  " 5       R                  S?5      nUR;                  SSS@U 3SS5S5        [        5         [        SA5        UR=                  U
5        SS	KnURA                  SB5        [        R                  R                  U
5      (       d  [        SC5        g	[        R                  RC                  U
5      SD-  n[        SEUSF SG35        U
/nU(       Ga  U(       Ga  [        5         [        S5        [        SI5        [        S5        [        RK                  U5      nU(       a  [        SJ[5        U5       SK35        [        5         [7        US55       H[  u  nn[        SLU S7[5        U5       SMUSN    35        [        RM                  USO   UUSN   SP9nU(       d  MJ  URO                  U5        M]     [        5         [        SQ[5        U5      S5-
   SR35        O[        SS5        S	nU(       a  [5        U5      S5:  a  [        5         [        S5        [        ST5        [        S5        SUU R                  S
S5       S[        R                  " 5       R                  S5       SV3n[        R                  R                  UU5      n[        RQ                  UU5      (       a3  [        R                  RC                  U5      SD-  n[        SWUSF SG35        OS	n[        5         [        S5        [        SX5        [        S5        [        SYU 35        [        SZU 35        [        S[[5        U5      S5-
   35        U(       a+  [        S\[        R                  RS                  U5       35        [        S5        U
US5S	 UUS].$ !   [        S5        S	n GN'= f! [D         a4  n[        5         [        SHU5        SS	K#nURI                  5          S	nAg	S	nAff = f)^a  
Genera un PDF del formulario y descarga archivos adjuntos

Args:
    form_id (str): ID del formulario (ej: '1002-1-FormGral')
    nombre_archivo (str, optional): Nombre del archivo PDF
    incluir_adjuntos (bool): Si es True, descarga archivos adjuntos
    crear_zip (bool): Si es True, crea un ZIP con PDF y adjuntos
    
Returns:
    dict: Diccionario con rutas de archivos generados o None si hay error
r   u6   🚀 INICIANDO GENERACIÓN DE REPORTE PDF CON ADJUNTOSr   u   📎 Incluir adjuntos: u   SíNou   📦 Crear ZIP: r   Nr   r   u,   ⚠️  No se pudo extraer DocsID del FormIDr   r   r   r   r   r   u   💾 Generando PDF: r   r   r   r-   r,   rp   u_   Bienvenido. Módulo para Información de formulario, diseñado para el área comercial de IGSA.r   r+   r   r   r   rg   rY   r   rh   r   ri   r   rj   r   r   r   rm   r   rk   r   rl   r   rn   r   r   r8   r   r   rv   r   rs   ru   r   r   r*   rf   r   r   r   g?r   r   u   ✅ PDF guardado exitosamente (r   r   u   ❌ ERROR al generar PDF:u"   📎 DESCARGANDO ARCHIVOS ADJUNTOSu   📥 Descargando z archivo(s)...[z] r   r   )r   r   r   u   ✅ Descargados r   u8      ℹ️  No hay archivos adjuntos para este formulariou   📦 CREANDO ARCHIVO ZIPpaquete_z.zipu   ✅ ZIP creado exitosamente (r   u   📄 PDF generado: u   📁 Ubicación: u   📎 Archivos adjuntos: r  )r   adjuntoszip
directorio)*rw   rb   r   intsplitr   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r#   rQ   r%   r:   rC   r?   r{   r|   rW   r$   r   timesleepr   r~   r   r   r   r	  r}   r  r   )r   r   incluir_adjuntos	crear_zipr   r   r   nombre_carpetadirectorio_formularior   ruta_pdfr   r   rR   r   r  r   r   r   archivos_descargadosarchivos_adjuntosr   ruta_descargadar  
nombre_zip   tamaño_zip_kbs                             r   generar_pdf_con_adjuntos-FormularioPDFService.generar_pdf_con_adjuntos  sE    	hFGh(	23'1At'LMN ) >?@ %==gFGH	'--,Q/0G 3LLZX 'wsC'@&AB "-@ Qww~~344KK-.,^,<=> ! //@I*7??3+D*EQykQUVN 77<< 5F$^$456
I	34%C!K LLN LL"b)sC-NN1a  "C  EF  HK  LFF1I CD89NN:uXHNN0#eK6H2I?[NN=%*<oNNN0%	2BOTFF1I @A9:NN9eK&8/JNN8U7^_ENN<~)>PFF1I &s5+='>&??YZ[89FF1I!*5+=q!A8q=1#aE+<N8O7PPZ[\++HZ,@(8BTU	 "B )#eK.@*A)B!CkHZD[C\\jkl CDFF1ILL#q)sC- //0CDIHHQ29+>1cJG 12JJx JJsO77>>(++@B2T9J3Js3C4HI !)zG(O67(O 4 N Nw W )#.?*@)APQ$-.?$CLCAcU!C(9$:#;2gg>N=OPQ&:&L&L$+FO+@'.w'7 'M 'O ',33OD %D (-A)BQ)F(GG]^_PQ
 12Q6G(O,-(O#GOOC$=#>a@W@WXg@h?iimnJww||$7DH#::;OQYZZ!#!:T!A5nS5INO
 	h34h#N#345!"7!89:(-A)BQ)F(GHI%bgg&6&6x&@%ABCh ,QR0/	
 	
Y	@AG~  	G-q1!	s+   _ 7L+_ #2_ _
`"*`` )r   )NT)N)NTT)rZ   r[   r\   r]   r^   staticmethodr?   dictr   r   r   r   r  listr   r	  boolr  r)  r_   r+  r   r   rb   rb   \   s    V# V$ V Vp   J J& FS F FX 73 74 7 7r Rs R RUX Rdg R Rh     2 Q
# Q
 Q
r   rb   )r^   sysr   r   r   r}   r   r   r   Consultas_SQL.conexionr   fpdfr   r   r   r   r  pathlibr   r   rb   r+  r   r   <module>r4     s     	  0I JK L 1      @J$ @JFJ

 J

r   