
     qh                         d dl Z d dlZd dlmZ e j                  j	                  d       d dlmZ d Zd Zd Z	d Z
d	 Zy)
    N)datetimez/var/www/html/config)get_connectionc                  2   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          |r|d   xs d|d	   xs d|d
   xs d|d   xs ddd|d   xs d|d   xs d|d   xs d|d   xs d|d   xs d|d   xs d|d   xs dt        j                         j                         d}d|dS dddS # t        $ r}ddt        |       dcY d}~S d}~ww xY w)zP
    Obtiene todos los KPIs del dashboard de contactos en una sola consulta
    Nr      Error de conexiónsuccessmessageT
dictionaryu  
            SELECT
                -- Estados de Contactos (usando la relación con estados_etapas)
                SUM(CASE WHEN ee.estado_etapa IN ('Prospecto', 'Primer contacto', 'Fidelización') THEN 1 ELSE 0 END) as contactos_activos,
                SUM(CASE WHEN ee.estado_etapa = 'Descartado' THEN 1 ELSE 0 END) as contactos_descartados,
                SUM(CASE WHEN ee.estado_etapa = 'Consolidación' THEN 1 ELSE 0 END) as contactos_consolidacion,
                
                -- Demografía (por género)
                SUM(CASE WHEN ucp.genero = 'Masculino' THEN 1 ELSE 0 END) as contactos_hombres,
                SUM(CASE WHEN ucp.genero = 'Femenino' THEN 1 ELSE 0 END) as contactos_mujeres,
                SUM(CASE WHEN ucp.genero IS NULL OR ucp.genero NOT IN ('Masculino', 'Femenino') THEN 1 ELSE 0 END) as contactos_otros,
                
                -- Ubicación (urbano vs rural)
                SUM(CASE WHEN ucp.ciudad IS NOT NULL AND ucp.ciudad != '' THEN 1 ELSE 0 END) as contactos_urbanos,
                SUM(CASE WHEN ucp.ciudad IS NULL OR ucp.ciudad = '' THEN 1 ELSE 0 END) as contactos_rurales,
                
                -- Interés Ambiental
                SUM(CASE WHEN ucp.intereses = 'AMBIENTE' THEN 1 ELSE 0 END) as contactos_interes_ambiente,
                
                -- Total de contactos para referencia
                COUNT(*) as total_contactos
                
            FROM union_contactos_personas ucp
            LEFT JOIN estados_etapas ee ON ee.id = ucp.estado_etapa
        contactos_activoscontactos_descartadoscontactos_consolidaciontotal_contactoscontactos_hombrescontactos_mujerescontactos_otroscontactos_urbanoscontactos_ruralescontactos_interes_ambiente)r   r   r   total_contactadoscontactos_interesadoscontactos_confirmadosr   r   r   r   r   r   r   fecha_consulta   r   datazNo se encontraron datoszError al obtener KPIs: )
r   cursorexecutefetchonecloser   now	isoformat	Exceptionstr)
conexionBDr   queryresult	kpis_dataes         G/var/www/dev.api.imparables.com.co/api_imparables/crm/dashboard/kpis.pygetContactosKPIsr+      sx   JM#%
 -ABB""d"34 	u" &,,?%@%EA)/0G)H)MA+12K+L+QPQ &,,=%>%C!)*)* &,,?%@%EA%+,?%@%EA#)*;#<#A &,,?%@%EA%+,?%@%EA /55Q.R.WVW $**;#<#A"*,,.":":"<3I8  !)44 -FGG M+B3q6()KLLMs)   C2 CC2 -C2 2	D;DDDc                  (   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          d|d	S # t
        $ r}dd
t        |       dcY d}~S d}~ww xY w)uI   
    Función específica para obtener solo los estados de contactos
    Nr   r   r   Tr
   a.  
            SELECT
                ee.estado_etapa,
                COUNT(*) as cantidad
            FROM union_contactos_personas ucp
            LEFT JOIN estados_etapas ee ON ee.id = ucp.estado_etapa
            GROUP BY ee.estado_etapa, ucp.estado_etapa
            ORDER BY COUNT(*) DESC
        r   r   zError al obtener estados: r   r   r   fetchallr    r#   r$   r%   r   r&   rowsr)   s        r*   getContactosEstadosr1   X   s    P#%
 -ABB""d"3 	u d++ P+Ec!fX)NOOP#   A- AA- -	B6BBBc                  (   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          d|d	S # t
        $ r}dd
t        |       dcY d}~S d}~ww xY w)uD   
    Función específica para obtener demografía de contactos
    Nr   r   r   Tr
   a  
            SELECT
                CASE 
                    WHEN genero = 'Masculino' THEN 'Masculino'
                    WHEN genero = 'Femenino' THEN 'Femenino'
                    ELSE 'No Especificado'
                END as genero_categoria,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            GROUP BY genero_categoria
            ORDER BY cantidad DESC
        r   r   u   Error al obtener demografía: r-   r/   s        r*   getContactosDemografiar4   v   s    T#%
 -ABB""d"3 	u d++ T+I#a&)RSSTr2   c                  (   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          d|d	S # t
        $ r}dd
t        |       dcY d}~S d}~ww xY w)uC   
    Función específica para obtener ubicación de contactos
    Nr   r   r   Tr
   a[  
            SELECT
                CASE 
                    WHEN ciudad IS NOT NULL AND ciudad != '' THEN 'Urbano'
                    ELSE 'Rural'
                END as tipo_ubicacion,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            GROUP BY tipo_ubicacion
            ORDER BY cantidad DESC
        r   r   u   Error al obtener ubicación: r-   r/   s        r*   getContactosUbicacionr6      s    S#%
 -ABB""d"3
 	u d++ S+HQ)QRRSr2   c                  (   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          d|d	S # t
        $ r}dd
t        |       dcY d}~S d}~ww xY w)uB   
    Función específica para obtener intereses de contactos
    Nr   r   r   Tr
   z
            SELECT
                interes,
                COUNT(*) as cantidad
            FROM union_contactos_personas
            WHERE interes IS NOT NULL AND interes != ''
            GROUP BY interes
            ORDER BY cantidad DESC
        r   r   zError al obtener intereses: r-   r/   s        r*   getContactosInteresesr8      s    R#%
 -ABB""d"3 	u d++ R+GAx)PQQRr2   )sysosr   pathappendcnxpdor   r+   r1   r4   r6   r8        r*   <module>r@      sD    
 	  & ' !NM`P<TBS@Rr?   