
    i(                         S SK r S SKrS SKJr  S SKJrJrJr  \R                  " S5      rS SK	J
r
  S SKJr  S\S\S	\S
\4S jrS\S\S\S\S\S\S
\4S jrS\S
\4S jrS\S
\4S jrS\S
\4S jrg)    N)datetime)DictListOptionaldocs_management_sql)
Productivo)get_connectionuser_idorigen
created_byreturnc                    SnSn [        5       nU(       d  [        S5      eU   UR                  5       nUR                  X1X45        UR                  S5        UR	                  5       S   nUR                  5         [        R                  SU SU 35        SUS	.sSSS5        U(       a   UR                  5         $ $ !    $ = f! , (       d  f       O= f! [        R                   aT  nS
[        U5       3n[        R                  U5        SSSUS.s SnAU(       a   UR                  5         $ !    $ = f$ SnAf[         aS  nS[        U5       3n[        R                  USS9  SSSUS.s SnAU(       a   UR                  5         $ !    $ = f$ SnAff = f U(       a   UR                  5         g!    g= fg! U(       a   UR                  5         f !    f = ff = f)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 DocsIDr   z	DocsHead z creado exitosamente para T)successdocs_idz*Error de base de datos al crear DocsHead: Fz9Error al crear registro de documentos en la base de datosDATABASE_ERRORr   messagecode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Errorstrerror	Exception)	r
   r   r   queryconnr   r   e	error_msgs	            hC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\Utilities\DocsManagementSQL.pycrear_docs_headr,      s   E D.!"XYY[[]FNN57"?@ NN89oo'*GKKMKK)G9,FvhOP" TJ 

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

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

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

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

	 s   C A7C	C ,B>>C
CC F> C F*)D9FF>  D11D59F(F.F/F> ;FFFF> %F6 6F:>G GG GG r   doc_linetitledescriptionruta	file_typec           
         SnSn [        5       nU(       d  [        S5      eU   UR                  5       nUR                  UU UUUUU45        UR	                  5         U  SU 3n	[
        R                  SU	 S35        SU	S.sSSS5        U(       a   UR                  5         $ $ !    $ = f! , (       d  f       O= f! [        R                   aT  n
S	[        U
5       3n[
        R                  U5        S
SSUS.s Sn
A
U(       a   UR                  5         $ !    $ = f$ Sn
A
f[         aS  n
S[        U
5       3n[
        R                  USS9  S
SSUS.s Sn
A
U(       a   UR                  5         $ !    $ = f$ Sn
A
ff = f U(       a   UR                  5         g!    g= fg! U(       a   UR                  5         f !    f = ff = f)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 exitosamenteT)r   doc_line_idz,Error de base de datos al crear DocsDetail: Fz:Error al guardar detalle del documento en la base de datosr   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   r-   r.   r/   r0   r1   r'   r(   r   r4   r)   r*   s               r+   crear_docs_detailr5   X   s   "	E D3!"XYY[[]FNN5#  KKM$IQxj1KKK+k]2FGH  *! TT 

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

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

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

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

	 s   B< AB+	B< B$$B(+
B95B< 8F$ 9B< <E?)D9E?:F$ DDE?,(E:E?F$ !E22E6:E??F$ F F $G-F>=G>G Gc           	      P   SnSn [        5       nU(       d3  [        R                  SU  35         U(       a   UR                  5         ggU   UR	                  5       nUR                  X45        UR                  5       nU(       aW  US   (       aM  [        US   5      n[        R                  SU  SU 35        UsSSS5        U(       a   UR                  5         $ $  SSS5        U(       a   UR                  5         gg!    g= f!    $ = f!    g= f! , (       d  f       O= f! [        R                   aN  n[        R                  SU  S[        U5       35         SnAU(       a   UR                  5         g!    g= fgSnAf[         aN  n[        R                  S	U  S[        U5       35         SnAU(       a   UR                  5         g!    g= fgSnAff = f U(       a   UR                  5         g!    g= fg! U(       a   UR                  5         f !    f = ff = f)
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    r   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   intdebugr"   r#   r%   r$   r&   )r   r'   r(   r   row	next_liner)   s          r+   obtener_siguiente_doc_liner>      s   E DNNPQXPYZ[. 

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

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

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

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

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

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

	    )D& D  
D& A.D:	D& DDD& .D  DDD
D#D& "H #D& &G:$FH *E; ;E?G$G4H  G GGH *G; ;G?H%HH%H!H%c           	      P   SnSn [        5       nU(       d3  [        R                  SU  35         U(       a   UR                  5         ggU   UR	                  5       nUR                  X45        UR                  5       nU(       aW  US   (       aM  [        US   5      n[        R                  SU  SU 35        UsSSS5        U(       a   UR                  5         $ $  SSS5        U(       a   UR                  5         gg!    g= f!    $ = f!    g= f! , (       d  f       O= f! [        R                   aN  n[        R                  SU  S	[        U5       35         SnAU(       a   UR                  5         g!    g= fgSnAf[         aN  n[        R                  S
U  S	[        U5       35         SnAU(       a   UR                  5         g!    g= fgSnAff = f U(       a   UR                  5         g!    g= fg! U(       a   UR                  5         f !    f = ff = f)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 Fr   zDocsID z	 existe: z Error de BD al verificar DocsID r8   z%Error inesperado al verificar DocsID )r	   r   r9   r!   r   r   r   boolr;   r"   r#   r%   r$   r&   )r   r'   r(   r   r<   exister)   s          r+   verificar_docs_head_existerC      s   E DNNGyQR. 

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

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

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

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

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

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

	 r?   c           	      N   SnSn [        5       nU(       d  SSS.U(       a   UR                  5         $ $ U   UR                  5       nUR                  X45        UR	                  5       nU(       aZ  SUS   =(       d    SUS   =(       d    SUS	   =(       d    SUS
   =(       d    SS.sSSS5        U(       a   UR                  5         $ $ SSSSSS.sSSS5        U(       a   UR                  5         $ $ !    $ = f!    $ = f!    $ = f! , (       d  f       O= f! [
        R                   aS  n[        R                  SU  S[        U5       35        SSS.s SnAU(       a   UR                  5         $ !    $ = f$ SnAf[         aS  n[        R                  SU  S[        U5       35        SSS.s SnAU(       a   UR                  5         $ !    $ = f$ SnAff = f U(       a   UR                  5         g!    g= fg! U(       a   UR                  5         f !    f = ff = f)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 = ?
    NFz&No se pudo conectar a la base de datos)r   r   Tr   r7         )r   total_documentostipos_archivosprimer_doc_lineultimo_doc_lineu1   Error de BD al obtener estadísticas para DocsID r8   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   r<   r)   s         r+   obtener_estadisticas_docsrK     s4   E D1 CT 

 K [[]FNN5*-//#C#(+A!&)!fk'*1v{'*1v{ TJ 

 -  $()&''('( TJ 

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

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

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

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

	 s   D C5D A1D
(	D 9C<D
	D #D5C9<D D

DD H D G/(E=GH $E55E9=G
(G2G3H ?GGGH )G: :G>H$HH$H H$)r"   loggingr   typingr   r   r   	getLoggerr   configr   Consultas_SQL.conexionr	   r:   r$   r,   r5   r>   rA   rC   rK        r+   <module>rS      s       ' ' 
		0	1  1DS D# D3 D4 DLPs Pc P# PC PP+.P37Pd1 1 1f1 1 1fGs Gt GrR   