U
    i(                     @   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   sj  d}d}z8zt }|s td|l | }|||| |f |d | d }|  td| d|  d|d	W  5 Q R  W W S Q R X W n t	j
k
r } z2d
t| }t| ddd|d W Y W hS d}~X Y nV tk
r> } z6dt| }tj|dd ddd|d W Y W S d}~X Y nX W 5 |rdz|   W n   Y nX X 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)closer   ConnectionErrorcursorexecutefetchonecommitloggerinfopyodbcErrorstrerror	Exception)	r   r	   r
   queryconnr   r   e	error_msg r(   hC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\Consultas_SQL\Utilities\DocsManagementSQL.pycrear_docs_head   sJ    
"
$r*   )r   doc_linetitledescriptionruta	file_typer   c                 C   sd  d}d}z2zt }|s td|f | }||| |||||f |  |  d| }	td|	 d d|	dW  5 Q R  W W S Q R X W n tj	k
r }
 z2d	t
|
 }t| d
dd|d W Y W hS d}
~
X Y nV tk
r8 }
 z6dt
|
 }tj|dd d
dd|d W Y W S d}
~
X Y nX W 5 |r^z|   W n   Y nX X 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   sV    	"
$r2   )r   r   c                 C   sx  d}d}zFzt }|s4td|   W W "dS || | }||| f | }|r|d rt|d }td|  d|  |W  5 Q R  W W S W 5 Q R  W W dS W 5 Q R X W n t	j
k
r } z(td|  dt|  W Y W \dS d}~X Y nH tk
rL } z(td	|  dt|  W Y W dS d}~X Y nX W 5 |rrz|   W n   Y nX X 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   r   warningr   r   r   intdebugr   r    r"   r!   r#   )r   r$   r%   r   row	next_liner&   r(   r(   r)   obtener_siguiente_doc_line   s6    " r:   c                 C   sx  d}d}zFzt }|s4td|   W W "dS || | }||| f | }|r|d rt|d }td|  d|  |W  5 Q R  W W S W 5 Q R  W W dS W 5 Q R X W n t	j
k
r } z(td|  d	t|  W Y W \dS d}~X Y nH tk
rL } z(td
|  d	t|  W Y W dS d}~X Y nX W 5 |rrz|   W n   Y nX X 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   r   r5   r   r   r   boolr7   r   r    r"   r!   r#   )r   r$   r%   r   r8   Zexister&   r(   r(   r)   verificar_docs_head_existe   s6    " r<   c                 C   s  d}d}z\zt }|s*dddW W @S | | }||| f | }|rd|d p^d|d phd|d	 prd|d
 p|ddW  5 Q R  W W S ddddddW  5 Q R  W W S W 5 Q R X W n tjk
r } z0td|  dt	|  ddd W Y W bS d}~X Y nP t
k
rb } z0td|  dt	|  ddd W Y W S d}~X Y nX W 5 |rz|   W n   Y nX X 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  sP    




	&$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