+
    i(                         ^ RI t ^ RIt^ RIHt ^ RIHtHtHt ]P                  ! R4      t^ RI	H
t
 ^ RIHt R R ltR	 R
 ltR R ltR R ltR R ltR# )    N)datetime)DictListOptionaldocs_management_sql)
Productivo)get_connectionc                H    V ^8  d   QhR\         R\        R\        R\        /# )   user_idorigen
created_byreturnintstrr   )formats   "hC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\Utilities\DocsManagementSQL.py__annotate__r      s.     D DS D# D3 D4 D    c           	        RpRp \        4       pV'       g   \        R4      hV;_uu_ 4        VP                  4       pVP                  W1W34       VP                  R4       VP	                  4       ^ ,          pVP                  4        \        P                  RV RV 24       RRR	V/uuRRR4       V'       d    VP                  4        # #     # ; i  + '       g   i     M; i  \        P                   dY   pR
\        T4       2p\        P                  T4       RRRRRRRT/u Rp?T'       d    TP                  4        #     # ; i# Rp?i\         d[   pR\        T4       2p\        P                  TRR7       RRRRRRRT/u Rp?T'       d    TP                  4        #     # ; i# Rp?ii ; i T'       d    TP                  4        R#     R# ; iR#   T'       d    TP                  4        i     i ; ii ; i)u  
Crea un registro en Q_SpQ_DocsHead para agrupar documentos

Args:
    user_id (int): ID del usuario
    origen (str): Módulo origen (ej: "Q_SpQ_FormsHead")
    created_by (str): Nombre completo del usuario

Returns:
    Dict: Resultado con DocsID generado
z
        INSERT INTO Q_SpQ_DocsHead (
            Origen,
            UserID,
            CreatedBy
        ) VALUES (?, ?, ?)
    N4   No se pudo establecer conexión con la base de datoszSELECT @@IDENTITY AS DocsIDz	DocsHead z creado exitosamente para successTdocs_idz*Error de base de datos al crear DocsHead: Fmessagez9Error al crear registro de documentos en la base de datoscodeDATABASE_ERRORtechnical_errorz$Error inesperado al crear DocsHead: exc_infoz-Error interno al crear registro de documentosINTERNAL_ERROR)r	   ConnectionErrorcursorexecutefetchonecommitloggerinfoclosepyodbcErrorr   error	Exception)	r   r   r   queryconnr#   r   e	error_msgs	   &&&      r   crear_docs_headr2      s   E D.!"XYYT[[]FNN57"?@ NN89oo'*GKKMKK)G9,FvhOP47 TJ 

 S T  << 
@QI	YuR$y	
 	
$ 

	   
:3q6(C	Y.uF$y	
 	
 

	 
5 J 

	 4

	 s   'C( A<C)
C( <CCC%	 C( $G! %C( (F8=,E)F8*G! 7EEF8F8.F3F8G! F++F/3F88G! G G!	H+G<;H<H >Hc                l    V ^8  d   QhR\         R\         R\        R\        R\        R\        R\        /# )r   r   doc_linetitledescriptionruta	file_typer   r   )r   s   "r   r   r   X   sI     P Ps Pc P# PC PP+.P37Pr   c                   RpRp \        4       pV'       g   \        R4      hV;_uu_ 4        VP                  4       pVP                  VV VVVVV34       VP	                  4        V  RV 2p	\
        P                  RV	 R24       RRR	V	/uuRRR4       V'       d    VP                  4        # #     # ; i  + '       g   i     M; i  \        P                   dY   p
R
\        T
4       2p\
        P                  T4       RRRRRRRT/u Rp
?
T'       d    TP                  4        #     # ; i# Rp
?
i\         d[   p
R\        T
4       2p\
        P                  TRR7       RRRRRRRT/u Rp
?
T'       d    TP                  4        #     # ; i# Rp
?
ii ; i T'       d    TP                  4        R#     R# ; iR#   T'       d    TP                  4        i     i ; ii ; i)uw  
Crea un registro individual en Q_SpQ_DocsDetail

Args:
    docs_id (int): ID del grupo de documentos
    doc_line (int): Número de línea del documento
    title (str): Título del archivo
    description (str): Descripción del archivo
    ruta (str): Ruta/URL del documento
    file_type (str): Tipo de archivo (extensión)

Returns:
    Dict: Resultado de la operación
z
        INSERT INTO Q_SpQ_DocsDetail (
            DocsID,
            DocLine,
            Title,
            Description,
            Ruta,
            Type
        ) VALUES (?, ?, ?, ?, ?, ?)
    Nr   -zDocsDetail z creado exitosamenter   Tdoc_line_idz,Error de base de datos al crear DocsDetail: Fr   z:Error al guardar detalle del documento en la base de datosr   r   r   z&Error inesperado al crear DocsDetail: r   z.Error interno al guardar detalle del documentor!   )r	   r"   r#   r$   r&   r'   r(   r)   r*   r+   r   r,   r-   )r   r4   r5   r6   r7   r8   r.   r/   r#   r;   r0   r1   s   &&&&&&      r   crear_docs_detailr<   X   s   "	E D3!"XYYT[[]FNN5#  KKM$IQxj1KKK+k]2FGH 4{! TT 

 ] T* << 
B3q6(K	YuS$y	
 	
$ 

	   
<SVHE	Y.uG$y	
 	
 

	 
? T 

	 4

	 s   'C
 AB7
C
 B00B47C	C
 G C
 
F,D2FG D**D.2F?F .F.F/G <FFFG 'F9 9F>	G&GG&G" G&c                0    V ^8  d   QhR\         R\         /# r   r   r   )r   )r   s   "r   r   r      s     1 1 1 1r   c           	        RpRp \        4       pV'       g7   \        P                  RV  24        V'       d    VP                  4        ^# ^# T;_uu_ 4        VP	                  4       pVP                  W34       VP                  4       pV'       dc   V^ ,          '       dT   \        V^ ,          4      p\        P                  RV  RV 24       TuuRRR4       V'       d    VP                  4        # #  RRR4       V'       d    VP                  4        ^# ^#     ^# ; i    # ; i    ^# ; i  + '       g   i     M; i  \        P                   dS   p\        P                  RT  R\        T4       24        Rp?T'       d    TP                  4        ^#     ^# ; i^# Rp?i\         dS   p\        P                  RT  R\        T4       24        Rp?T'       d    TP                  4        ^#     ^# ; i^# Rp?ii ; i T'       d    TP                  4        R#     R# ; iR#   T'       d    TP                  4        i     i ; ii ; i)u   
Obtiene el siguiente número de línea disponible para un DocsID

Args:
    docs_id (int): ID del grupo de documentos

Returns:
    int: Siguiente número de línea disponible
zv
        SELECT ISNULL(MAX(DocLine), 0) + 1 AS NextDocLine
        FROM Q_SpQ_DocsDetail
        WHERE DocsID = ?
    Nz3No se pudo conectar para obtener DocLine de DocsID zSiguiente DocLine para DocsID : z5Error de BD al obtener siguiente DocLine para DocsID z0Error inesperado al obtener DocLine para DocsID )r	   r'   warningr)   r#   r$   r%   r   debugr*   r+   r,   r   r-   )r   r.   r/   r#   row	next_liner0   s   &      r   obtener_siguiente_doc_linerE      s   E DNNPQXPYZ[. 

 + T[[]FNN5*-//#Cs1vvAK	=gYbTU  T* 

   * 

 3 T << LWIUWX[\]X^W_`a 

	   GyPRSVWXSYRZ[\ 

	 ! * 

	 4

	    *E D 
E A	D2".D2
E #D#5D26E D* D #D'*D/2E	=E H0 E H$F'>H0 F F"'H4H5$HH0 &G8 8G=HH0 H& &H+0	I:I
IIIc                0    V ^8  d   QhR\         R\        /# r>   )r   bool)r   s   "r   r   r      s     1 1 1 1r   c           	        RpRp \        4       pV'       g7   \        P                  RV  24        V'       d    VP                  4        R# R# T;_uu_ 4        VP	                  4       pVP                  W34       VP                  4       pV'       dc   V^ ,          '       dT   \        V^ ,          4      p\        P                  RV  RV 24       TuuRRR4       V'       d    VP                  4        # #  RRR4       V'       d    VP                  4        R# R#     R# ; i    # ; i    R# ; i  + '       g   i     M; i  \        P                   dS   p\        P                  RT  R\        T4       24        Rp?T'       d    TP                  4        R#     R# ; iR# Rp?i\         dS   p\        P                  R	T  R\        T4       24        Rp?T'       d    TP                  4        R#     R# ; iR# Rp?ii ; i T'       d    TP                  4        R#     R# ; iR#   T'       d    TP                  4        i     i ; ii ; i)
z
Verifica si un DocsID existe en la tabla Q_SpQ_DocsHead

Args:
    docs_id (int): ID del grupo de documentos

Returns:
    bool: True si existe, False si no existe
zk
        SELECT COUNT(1) AS Existe
        FROM Q_SpQ_DocsHead
        WHERE DocsID = ? AND Active = 1
    Nz*No se pudo conectar para verificar DocsID FzDocsID z	 existe: z Error de BD al verificar DocsID r@   z%Error inesperado al verificar DocsID )r	   r'   rA   r)   r#   r$   r%   rH   rB   r*   r+   r,   r   r-   )r   r.   r/   r#   rC   exister0   s   &      r   verificar_docs_head_existerK      s   E DNNGyQR. 

 + T[[]FNN5*-//#Cs1vvc!fwwiyAB T* 

   * 

 3 T << 7y3q6(KL 

	   <WIRAxPQ 

	 ! * 

	 4

	 rF   c                0    V ^8  d   QhR\         R\        /# r>   )r   r   )r   s   "r   r   r     s     G Gs Gt Gr   c                   RpRp \        4       pV'       g!   RRRR/V'       d    VP                  4        # # T;_uu_ 4        VP                  4       pVP                  W34       VP	                  4       pV'       du   RRRV^ ,          ;'       g    ^ R	V^,          ;'       g    ^ R
V^,          ;'       g    ^ RV^,          ;'       g    ^ /uuRRR4       V'       d    VP                  4        # # RRR^ R	^ R
^ R^ /uuRRR4       V'       d    VP                  4        # #     # ; i    # ; i    # ; i  + '       g   i     M; i  \
        P                   dV   p\        P                  RT  R\        T4       24       RRRR/u Rp?T'       d    TP                  4        #     # ; i# Rp?i\         dV   p\        P                  RT  R\        T4       24       RRRR/u Rp?T'       d    TP                  4        #     # ; i# Rp?ii ; i T'       d    TP                  4        R#     R# ; iR#   T'       d    TP                  4        i     i ; ii ; i)u   
Obtiene estadísticas de documentos para un DocsID

Args:
    docs_id (int): ID del grupo de documentos

Returns:
    Dict: Estadísticas del grupo de documentos
z
        SELECT 
            COUNT(*) AS TotalDocumentos,
            COUNT(DISTINCT Type) AS TiposArchivos,
            MIN(DocLine) AS PrimerDocLine,
            MAX(DocLine) AS UltimoDocLine
        FROM Q_SpQ_DocsDetail
        WHERE DocsID = ?
    Nr   Fr   z&No se pudo conectar a la base de datosTtotal_documentostipos_archivosprimer_doc_lineultimo_doc_lineu1   Error de BD al obtener estadísticas para DocsID r@   u.   Error al consultar estadísticas de documentosu6   Error inesperado al obtener estadísticas para DocsID u(   Error interno al consultar estadísticas)r	   r)   r#   r$   r%   r*   r+   r'   r,   r   r-   )r   r.   r/   r#   rC   r0   s   &     r   obtener_estadisticas_docsrR     sa   E D15CT 

 K T[[]FNN5*-//#Ct&A!$c!fkk%s1v{{%s1v{{ TJ 

 - t&$a%q%q TJ 

 S T, << 
H	QSTWXYTZS[\]uG
 	
 

	   
MgYVXY\]^Y_X`abuA
 	
 

	 
; J 

	 4

	 s   E	 D!
E	 AD6D6#D66D6	D6
E	 D(1D6<
E	 D/!D%(D,/D36E	E	 H: E	 	H)F.HH: F&&F*.H;H<)H%H&H: 3HHHH: H0 0H5:	IIIII)r*   loggingr   typingr   r   r   	getLoggerr'   configr   Consultas_SQL.conexionr	   r2   r<   rE   rK   rR    r   r   <module>rY      sO       ' ' 
		0	1  1DLPd1f1fGr   