a
    0i(                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZ edZd dl	m
Z
 d dlmZ eeeeddd	Zeeeeeeed
ddZeedddZeedddZeedddZdS )    N)datetime)DictListOptionalZdocs_management_sql)
Productivo)get_connection)user_idorigen
created_byreturnc           	      C   s  d}d}zzt  }|s td| | }|||| |f |d | d }|  td| d|  d|d	W  d   W W |rz|  W S    Y S 0 S 1 s0    Y  W n t	j
y0 } zTd
t| }t| ddd|dW  Y d}~W |r&z|  W S    Y S 0 S d}~0  ty } zXdt| }tj|dd ddd|dW  Y d}~W |rz|  W S    Y S 0 S d}~0 0 W |rz|  W n   Y n0 n"|rz|  W n   Y n0 0 dS )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_msg r(   >/var/www/html/src/Consultas_SQL/Utilities/DocsManagementSQL.pycrear_docs_head   sx    


r*   )r   doc_linetitledescriptionruta	file_typer   c                 C   s  d}d}zzt  }|s td| | }||| |||||f |  |  d| }	td|	 d d|	dW  d   W W |rz|  W S    Y S 0 S 1 s0    Y  W n tj	y* }
 zTd	t
|
 }t| d
dd|dW  Y d}
~
W |r z|  W S    Y S 0 S d}
~
0  ty }
 zXdt
|
 }tj|dd d
dd|dW  Y d}
~
W |rz|  W S    Y S 0 S d}
~
0 0 W |rz|  W n   Y n0 n"|rz|  W n   Y n0 0 dS )u  
    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-   r.   r/   r$   r%   r   r1   r&   r'   r(   r(   r)   crear_docs_detailX   s    	

r2   )r   r   c                 C   s@  d}d}zzt  }|sPtd|   W W |rLz|  W n   Y n0 dS | | }||| f | }|r|d rt|d }td|  d|  |W  d   W W |rz|  W S    Y S 0 S W d   W W |rz|  W n   Y n0 dS W d   n1 s 0    Y  W n t	j
y } zJtd|  dt|  W Y d}~W |rz|  W n   Y n0 dS d}~0  ty } zJtd	|  dt|  W Y d}~W |rz|  W n   Y n0 dS d}~0 0 W |r<z|  W n   Y n0 n"|r:z|  W n   Y n0 0 dS )
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&   r(   r(   r)   obtener_siguiente_doc_line   s|    (r:   c                 C   s@  d}d}zzt  }|sPtd|   W W |rLz|  W n   Y n0 dS | | }||| f | }|r|d rt|d }td|  d|  |W  d   W W |rz|  W S    Y S 0 S W d   W W |rz|  W n   Y n0 dS W d   n1 s 0    Y  W n t	j
y } zJtd|  d	t|  W Y d}~W |rz|  W n   Y n0 dS d}~0  ty } zJtd
|  d	t|  W Y d}~W |rz|  W n   Y n0 dS d}~0 0 W |r<z|  W n   Y n0 n"|r:z|  W n   Y n0 0 dS )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 r4   z%Error inesperado al verificar DocsID )r   r   r5   r   r   r   r   boolr7   r   r    r"   r!   r#   )r   r$   r%   r   r8   exister&   r(   r(   r)   verificar_docs_head_existe   s|    (r=   c                 C   sV  d}d}z$z$t  }|sFdddW W |rDz|  W S    Y S 0 S | | }||| f | }|rd|d pzd|d pd|d	 pd|d
 pddW  d   W W |rz|  W S    Y S 0 S ddddddW  d   W W |rz|  W S    Y S 0 S W d   n1 s&0    Y  W n tjy } zRtd|  dt	|  dddW  Y d}~W |rz|  W S    Y S 0 S d}~0  t
y
 } zRtd|  dt	|  dddW  Y d}~W |r z|  W S    Y S 0 S d}~0 0 W |rRz|  W n   Y n0 n"|rPz|  W n   Y n0 0 dS )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   r3         )r   Ztotal_documentosZtipos_archivosZprimer_doc_lineZultimo_doc_lineu1   Error de BD al obtener estadísticas para DocsID r4   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   r8   r&   r(   r(   r)   obtener_estadisticas_docs  s    
*



	&
r@   )r   loggingr   typingr   r   r   	getLoggerr   configr   Consultas_SQL.conexionr   r6   r!   r*   r2   r:   r;   r=   r@   r(   r(   r(   r)   <module>   s   
FR33