
    uh                     ,   d dl Z d dlmZmZmZ d dlmZ d dlZd dlZej                  j                  d       d dl
mZ defdZdefdZdefd	Zdefd
ZdefdZdefdZdefdZdefdZddedefdZdefdZdefdZdefdZdefdZdefdZy)    N)DictListAny)datetimez/var/www/html/config)get_connectionreturnc            	         	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|r|d   nd	}d
}|j                  |       |j                         }|r|d   nd	}d}|j                  |       |j                         }	|	r|	d   nd	}
|j	                          | j	                          |d	kD  rt        ||z  dz  d      nd}|d	kD  rt        |
|z  dz  d      nd}ddd|||
||dS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)u2   Obtener estadísticas de Inscripciones VoluntariosNF   Error de conexiónsuccessmessageT
dictionaryz7SELECT COUNT(*) as total FROM inscripciones_voluntariostotalr   zu
        SELECT COUNT(*) as exitosos 
        FROM inscripciones_voluntarios 
        WHERE estado_etapa = 2
        exitososzw
        SELECT COUNT(*) as rechazados 
        FROM inscripciones_voluntarios 
        WHERE estado_etapa = 5
        
rechazadosd              inscripciones_voluntariosz'Resultados de Inscripciones Voluntariosr   tablatitulototal_contactosr   r   porcentaje_exitososporcentaje_rechazadosu=   Error obteniendo estadísticas de inscripciones_voluntarios: r   error
r   cursorexecutefetchonecloseround	Exceptionloggingr   str
conexionBDr    total_querytotal_resultr   exitosos_queryexitosos_resultr   rechazados_queryrechazados_resultr   r   r   es                 R/var/www/dev.api.imparables.com.co/api_imparables/crm/administracion/statistics.py#get_inscripciones_voluntarios_statsr2      s   73#%
 / 
 ""d"3 P{#(3?,w/Q
 	~& //+2A?:.q
 	'("OO-8I&|4q
 O^`aNaeX%?#%EJgkRadeRezO'Cc'IA Nko 0?. $#6%:	
 		
  3UVWUXYZ 3q6223#   D C2D 	D?%D:4D?:D?c            	         	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|r|d   nd	}d
}|j                  |       |j                         }|r|d   nd	}d}|j                  |       |j                         }	|	r|	d   nd	}
|j	                          | j	                          |d	kD  rt        ||z  dz  d      nd}|d	kD  rt        |
|z  dz  d      nd}ddd|||
||dS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)u.   Obtener estadísticas de Registros CRM AntiguoNFr
   r   Tr   z3SELECT COUNT(*) as total FROM registros_crm_antiguor   r   zq
        SELECT COUNT(*) as exitosos 
        FROM registros_crm_antiguo 
        WHERE estado_etapa = 2
        r   zs
        SELECT COUNT(*) as rechazados 
        FROM registros_crm_antiguo 
        WHERE estado_etapa = 5
        r   r   r   r   registros_crm_antiguoz#Resultados de Registros CRM Antiguor   u9   Error obteniendo estadísticas de registros_crm_antiguo: r   r   r(   s                 r1   get_registros_crm_antiguo_statsr6   F   s   73#%
 / 
 ""d"3 L{#(3?,w/Q
 	~& //+2A?:.q
 	'("OO-8I&|4q
 O^`aNaeX%?#%EJgkRadeRezO'Cc'IA Nko ,;. $#6%:	
 		
  3QRSQTUV 3q6223r3   c            	         	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|r|d   nd	}d
}|j                  |       |j                         }|r|d   nd	}d}|j                  |       |j                         }	|	r|	d   nd	}
|j	                          | j	                          |d	kD  rt        ||z  dz  d      nd}|d	kD  rt        |
|z  dz  d      nd}ddd|||
||dS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)u*   Obtener estadísticas de Base de Datos 10kNFr
   r   Tr   z,SELECT COUNT(*) as total FROM base_datos_10kr   r   zj
        SELECT COUNT(*) as exitosos 
        FROM base_datos_10k 
        WHERE estado_etapa = 2
        r   zl
        SELECT COUNT(*) as rechazados 
        FROM base_datos_10k 
        WHERE estado_etapa = 5
        r   r   r   r   base_datos_10kzResultados de Base de Datos 10kr   u2   Error obteniendo estadísticas de base_datos_10k: r   r   r(   s                 r1   get_base_datos_10k_statsr9      s   73#%
 / 
 ""d"3 E{#(3?,w/Q
 	~& //+2A?:.q
 	'("OO-8I&|4q
 O^`aNaeX%?#%EJgkRadeRezO'Cc'IA Nko %7. $#6%:	
 		
  3J1#NO 3q6223r3   c            	         	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|r|d   nd	}d
}|j                  |       |j                         }|r|d   nd	}d}|j                  |       |j                         }	|	r|	d   nd	}
|j	                          | j	                          |d	kD  rt        ||z  dz  d      nd}|d	kD  rt        |
|z  dz  d      nd}ddd|||
||dS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)u*   Obtener estadísticas de Prospectos ManualNFr
   r   Tr   z/SELECT COUNT(*) as total FROM prospectos_manualr   r   zm
        SELECT COUNT(*) as exitosos 
        FROM prospectos_manual 
        WHERE estado_etapa = 2
        r   zo
        SELECT COUNT(*) as rechazados 
        FROM prospectos_manual 
        WHERE estado_etapa = 5
        r   r   r   r   prospectos_manualzResultados de Prospectos Manualr   u5   Error obteniendo estadísticas de prospectos_manual: r   r   r(   s                 r1   get_prospectos_manual_statsr<      s   73#%
 / 
 ""d"3 H{#(3?,w/Q
 	~& //+2A?:.q
 	'("OO-8I&|4q
 O^`aNaeX%?#%EJgkRadeRezO'Cc'IA Nko (7. $#6%:	
 		
  3MaSQR 3q6223r3   c            
      R   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }dt	        j
                         j                         d}|D ]Y  }|d	   }|d
   }|d   }|d   }	|dkD  rt        ||z  dz  d      nd}
|dkD  rt        |	|z  dz  d      nd}d||d   |||	|
|d||<   [ |j                          | j                          |S # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)uQ   Obtener todas las estadísticas de contactabilidad para el dashboard - OPTIMIZADONFr
   r   Tr   a  
        SELECT 
            'inscripciones_voluntarios' as tabla,
            'Resultados de Inscripciones Voluntarios' as titulo,
            COUNT(*) as total_contactos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as exitosos,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM inscripciones_voluntarios
        UNION ALL
        SELECT 'registros_crm_antiguo', 'Resultados de Registros CRM Antiguo', COUNT(*), 
               SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END), 
               SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END)
        FROM registros_crm_antiguo
        UNION ALL
        SELECT 'base_datos_10k', 'Resultados de Base de Datos 10k', COUNT(*), 
               SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END), 
               SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END)
        FROM base_datos_10k
        UNION ALL
        SELECT 'prospectos_manual', 'Resultados de Prospectos Manual', COUNT(*), 
               SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END), 
               SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END)
        FROM prospectos_manual
        )r   generated_atr   r   r   r   r   r   r   r   r   r   u*   Error obteniendo todas las estadísticas: r   )r   r    r!   fetchallr   now	isoformatr$   r#   r%   r&   r   r'   )r)   r    query
resultadosstats	resultador   r   r   r   r   r   r0   s                r1   get_all_contactability_statsrF      sl   E3#%
$1EFF""d"32 	u__&
 $LLN446

 $ 	Ig&E'(9:O ,H"<0JRadeRe%O)Cc)IA"NkoVehiViE:+G#+MPQ$Ros!  #H-#2$(':)>	E%L	( 	 3B1#FG 3q6223s#   C- CC- -	D&6%D!D&!D&c                     	 t               } | dddS | j                  d      }d}|j                  |       |j                         }d}d}d}g }|D ]q  }|d	   }	|d
   }
|d   }||	z  }||
z  }||z  }|	dkD  rt	        |
|	z  dz  d      nd}|	dkD  rt	        ||	z  dz  d      nd}|j                  |d   |d   |	|
|||d       s |j                          | j                          |dkD  rt	        ||z  dz  d      nd}|dkD  rt	        ||z  dz  d      nd}dt        j                         j                         |||||d|dS # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)uL   Obtener resumen consolidado de todas las estadísticas - VERSIÓN OPTIMIZADANFr
   r   Tr   a  
        SELECT 
            'inscripciones_voluntarios' as tabla,
            'Resultados de Inscripciones Voluntarios' as titulo,
            COUNT(*) as total_contactos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as exitosos,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM inscripciones_voluntarios
        
        UNION ALL
        
        SELECT 
            'registros_crm_antiguo' as tabla,
            'Resultados de Registros CRM Antiguo' as titulo,
            COUNT(*) as total_contactos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as exitosos,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM registros_crm_antiguo
        
        UNION ALL
        
        SELECT 
            'base_datos_10k' as tabla,
            'Resultados de Base de Datos 10k' as titulo,
            COUNT(*) as total_contactos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as exitosos,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM base_datos_10k
        
        UNION ALL
        
        SELECT 
            'prospectos_manual' as tabla,
            'Resultados de Prospectos Manual' as titulo,
            COUNT(*) as total_contactos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as exitosos,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM prospectos_manual
        r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   total_exitosostotal_rechazadosr   r   )r   r>   resumen_generaldetalle_por_tablaz%Error generando resumen consolidado: r   )r   r    r!   r?   r$   appendr#   r   r@   rA   r%   r&   r   r'   )r)   r    query_optimizadarC   total_generaltotal_exitosos_generaltotal_rechazados_generaltablas_datarE   r   r   r   r   r   porcentaje_exitosos_generalporcentaje_rechazados_generalr0   s                    r1   get_contactability_summaryrT   @  s
   d3#%
$1EFF""d"3&P 	'(__&
 !"#$ # 	I'(9:O ,H"<0J_,M"h."$
2$RadeRe%O)Cc)IA"NkoVehiViE:+G#+MPQ$Ros!"7+#H-#2$(':)>  	, 	borsbse-Cm-SVY-Y\]&^y}#fsvwfw/G-/WZ]/]`a(b  ~B% $LLN446#0"8$<'B)F  "-
 	
  3=aSAB 3q6223s#   E D1E 	E>%E93E>9E>c            	      "   	 t               } | dddS | j                  d      }d}|j                  |       |j                         }d}|j                  |       |j	                         }|r|d	   nd
}|j                          | j                          g }|D ])  }|j                  |d   |d   t        |d         d       + dd||t        |      dS # t        $ r0}	t        j                  d|	        dt        |	      dcY d}	~	S d}	~	ww xY w)u;   Obtener estadísticas de prospectos por ciudad - OPTIMIZADONFr
   r   Tr   a  
        WITH total_prospectos AS (
            SELECT COUNT(*) as total FROM (
                SELECT 1 FROM inscripciones_voluntarios WHERE estado_etapa = 1
                UNION ALL SELECT 1 FROM registros_crm_antiguo WHERE estado_etapa = 1
                UNION ALL SELECT 1 FROM base_datos_10k WHERE estado_etapa = 1
                UNION ALL SELECT 1 FROM prospectos_manual WHERE estado_etapa = 1
            ) t
        )
        SELECT 
            ciudad,
            COUNT(*) as total_prospectos,
            ROUND((COUNT(*) * 100.0 / (SELECT total FROM total_prospectos)), 2) as porcentaje
        FROM (
            SELECT ciudad FROM inscripciones_voluntarios 
            WHERE estado_etapa = 1 AND ciudad IS NOT NULL AND ciudad != ''
            UNION ALL
            SELECT ciudad FROM registros_crm_antiguo 
            WHERE estado_etapa = 1 AND ciudad IS NOT NULL AND ciudad != ''
            UNION ALL
            SELECT ciudad FROM base_datos_10k 
            WHERE estado_etapa = 1 AND ciudad IS NOT NULL AND ciudad != ''
            UNION ALL
            SELECT ciudad FROM prospectos_manual 
            WHERE estado_etapa = 1 AND ciudad IS NOT NULL AND ciudad != ''
        ) AS todas_ciudades
        GROUP BY ciudad
        ORDER BY total_prospectos DESC
        LIMIT 100
        a  
        SELECT COUNT(*) as total FROM (
            SELECT 1 FROM inscripciones_voluntarios WHERE estado_etapa = 1
            UNION ALL SELECT 1 FROM registros_crm_antiguo WHERE estado_etapa = 1
            UNION ALL SELECT 1 FROM base_datos_10k WHERE estado_etapa = 1
            UNION ALL SELECT 1 FROM prospectos_manual WHERE estado_etapa = 1
        ) AS todos_prospectos
        r   r   ciudadtotal_prospectos
porcentajerV   rW   rX   zProspectos por Ciudad)r   r   total_prospectos_generalciudadestotal_ciudadesz(Error obteniendo prospectos por ciudad: r   )r   r    r!   r?   r"   r#   rL   floatlenr%   r&   r   r'   )
r)   r    rB   rC   r*   r+   rW   ciudades_datarE   r0   s
             r1   get_prospectos_por_ciudadr`     s5   L3#%
$1EFF""d"3> 	u__&
 	{#(4@<0a# 	I  #H-$-.@$A#Il$;<" 	 -(8%!-0
 	
  3@DE 3q6223s#   C CC 	D%D	D	Dc            
         	 t               } | dddS | j                  d      }g }ddd	d
dd	ddd	ddd	g}|D ]  }|d   }|d   }d| d}|j                  |       |j                         }|r|d   nd}	d| d}
|j                  |
       |j	                         }g }|D ]9  }|	dkD  rt        |d   |	z  dz  d      nd}|j                  |d   |d   |d       ; |j                  |||	|t        |      d        |j                          | j                          ddt        j                         j                         |d S # t        $ r0}t        j                  d!|        dt        |      d"cY d}~S d}~ww xY w)#z2Obtener detalle de prospectos por tabla individualNFr
   r   Tr   r   Inscripciones Voluntariosnombrer   r5   Registros CRM Antiguor8   Base de Datos 10kr;   Prospectos Manualrd   r   zSELECT COUNT(*) as total FROM z WHERE estado_etapa = 1r   r   zJ
            SELECT ciudad, COUNT(*) as total_prospectos
            FROM z
            WHERE estado_etapa = 1 AND ciudad IS NOT NULL AND ciudad != ''
            GROUP BY ciudad
            ORDER BY total_prospectos DESC
            rW   r   r   r   rV   rY   )r   r   rW   r[   r\   z(Detalle de Prospectos por Tabla y Ciudad)r   r   r>   rK   z2Error obteniendo detalle de prospectos por tabla: r   )r   r    r!   r"   r?   r$   rL   r^   r#   r   r@   rA   r%   r&   r   r'   )r)   r    tablas_detalletablas
tabla_infotabla_nombretabla_titulor*   r+   total_prospectos_tablaciudad_queryciudades_tablaciudades_con_porcentajeciudad_datarX   r0   s                   r1    get_prospectos_detalle_por_tablarr     s   G3#%
 / 
 ""d"3 3>YZ.:QR'3FG*6IJ	
 ! %	J%h/L%h/L ;<.H_`KNN;'!??,L>J\'%:PQ"   L NN<(#__.N ')#-  lB  EF  lFUK0B$CF\$\_b$befg  LP
'..)(3(34F(G",0  !!%&$:3"%&="># ?%	N 	 @$LLN446!/	
 	
  3J1#NO 3q6223s#   E D4E 	F%E<6F<Flimitec                     	 t               }|d   s|S |d   d|  }dd|  d|d   || dS # t        $ r0}t        j                  d	|        d
t	        |      dcY d}~S d}~ww xY w)u.   Obtener el top de ciudades con más prospectosr   r[   NTzTop u    Ciudades con Más ProspectosrZ   )r   r   rZ   top_ciudadeslimite_aplicadozError obteniendo top ciudades: Fr   )r`   r%   r&   r   r'   )rs   prospectos_dataru   r0   s       r1   get_top_ciudades_prospectosrx   C  s    335y)"" 'z27F; VH$AB(78R(S(%
 	
  37s;< 3q6223s   * * 	A#%AA#A#c                     	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          |sdddS |d	   }d
d|d   ddd|d   ddd|d   ddd|d   ddd|d   dg}g }|D ]=  }|dkD  rt        |d   |z  dz  d      nd}|j                  |d   |d   |d   |d        ? dd!d"||t        j                         j                         d#S # t        $ r0}	t        j                  d$|	        dt        |	      d%cY d}	~	S d}	~	ww xY w)&uB   Obtener estadísticas de personas por estado de etapa - OPTIMIZADONFr
   r   Tr   a  
        SELECT 
            COUNT(*) as total_personas,
            SUM(CASE WHEN estado_etapa = 1 THEN 1 ELSE 0 END) as prospectos,
            SUM(CASE WHEN estado_etapa = 2 THEN 1 ELSE 0 END) as primer_contacto,
            SUM(CASE WHEN estado_etapa = 3 THEN 1 ELSE 0 END) as consolidacion,
            SUM(CASE WHEN estado_etapa = 4 THEN 1 ELSE 0 END) as fidelizacion,
            SUM(CASE WHEN estado_etapa = 5 THEN 1 ELSE 0 END) as rechazados
        FROM union_contactos_personas
        zNo se encontraron datostotal_personas   	Prospecto
prospectos)idrd   r   r   Primer contactoprimer_contacto      Consolidaciónconsolidacion      Fidelizaciónfidelizacion   	Rechazador   r   r   r   r   r~   rd   )estado_etapa_idestado_etapa_nombrerz   rX   u;   Estadísticas por Estado de Etapa - Union Contacto Personasunion_contactos_personas)r   r   r   total_personas_generalestadisticas_por_etapar>   u<   Error obteniendo estadísticas de union_contactos_personas: r   )r   r    r!   r"   r#   r$   rL   r   r@   rA   r%   r&   r   r'   )
r)   r    rB   rE   rz   estados_datar   estadorX   r0   s
             r1   !get_union_contacto_personas_statsr   Z  s   =3#%
$1EFF""d"3	 	uOO%	$1JKK"#34 i6MN 1IFW<XY 09_;UV)N:STi6MN
 "$" 	FO]`aOaw. @3 FKgkJ"))#)$<'-h'7"(/(	+ 	 S/&4&<$LLN446
 	
  3TUVTWXY 3q6223s*   D AD /BD 	E%D?9E?Ec            	         	 t               } | d   s| S i }| d   D ]k  }|d   }|dk(  r|d   |d   d|d<   |d	k(  r|d   |d   d|d
<   0|dk(  r|d   |d   d|d<   D|dk(  r|d   |d   d|d<   X|dk(  s^|d   |d   d|d<   m |j                  di       j                  dd      |j                  d
i       j                  dd      z   |j                  di       j                  dd      z   |j                  di       j                  dd      z   }|j                  di       j                  dd      }| d   }|dkD  rt        ||z  dz  d	      nd}|dkD  rt        ||z  dz  d	      nd}ddd|||||d|| d   t        j                         j                         dS # t        $ r0}	t        j                  d|	        dt        |	      dcY d}	~	S d}	~	ww xY w)uK   Obtener resumen consolidado de union_contactos_personas con métricas claver   r   r   r{   rz   rX   )r   rX   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   TzResumen Union Contacto Personasr   )total_activosrI   porcentaje_activosr   )r   r   r   rN   metricas_clavedetalle_por_etapaestadisticas_completasr>   z5Error generando resumen de union_contactos_personas: Fr   N)
r   getr$   r   r@   rA   r%   r&   r   r'   )

stats_datametricasetapa	estado_idr   rI   rN   r   r   r0   s
             r1   #get_union_contacto_personas_resumenr     sv   B368
)$  89 	E/0IA~"#34"'"5*& a"#34"'"5/*+ a"#34"'"5-) a"#34"'"5,( a"#34"'"5*&/	: "lB7;;GQG %6;??KL _b9==gqIJ !^R8<<WaHI
 $<<b9==gqI"#;<P]`aPaUMM$AC$G!LgkVcfgVg'7-'G#'MPQ Rmq 7/*!.$4&8)>	 "*&01I&J$LLN446
 	
   3MaSQR 3q6223s*   F A$F 8D&F 	G(%GGGc                     	 t               } | dddS | j                  d      }d}|j                  |       |j                         }|j	                          | j	                          |sdddS d	d
dddd}t        d |D              }|D cg c]  }t        |d         D ]  }|d   	  }}}ddl}	t        |	j                  |      d      }
|	j                  |      }ddlm}  ||      }|j                  d      d   d   }g }|D ]W  }|d   }|d   }|dkD  r||z  dz  nd}t        ||z  dz  d      }|j                  ||j                  |d|       |||d       Y dd|ddd|
|||j                  |d|       did|it!        j"                         j%                         d S c c}}w # t&        $ r0}t)        j*                  d!|        dt-        |      d"cY d}~S d}~ww xY w)#u:   Obtener estadísticas descriptivas - VERSIÓN SIMPLIFICADANFr
   r   Tr   a  
        SELECT 
            estado_etapa,
            COUNT(*) as frecuencia
        FROM (
            SELECT CAST(estado_etapa AS SIGNED) as estado_etapa FROM inscripciones_voluntarios 
            WHERE estado_etapa REGEXP '^[1-5]$'
            UNION ALL
            SELECT CAST(estado_etapa AS SIGNED) FROM registros_crm_antiguo 
            WHERE estado_etapa REGEXP '^[1-5]$'
            UNION ALL
            SELECT CAST(estado_etapa AS SIGNED) FROM base_datos_10k 
            WHERE estado_etapa REGEXP '^[1-5]$'
            UNION ALL
            SELECT CAST(estado_etapa AS SIGNED) FROM prospectos_manual 
            WHERE estado_etapa REGEXP '^[1-5]$'
        ) AS todos_estados
        GROUP BY estado_etapa
        ORDER BY estado_etapa
        u    No se encontraron datos válidosr|   r   r   r   r   )r{   r   r   r   r   c              3   &   K   | ]	  }|d      yw)
frecuenciaN ).0rs     r1   	<genexpr>z=get_estadisticas_descriptivas_consolidadas.<locals>.<genexpr>  s     B!aoBs   r   estado_etapar   r   Counterr{   r   r   r   zEstado )r   r   r   rX   porcentaje_sin_redondearu8   Estadísticas Descriptivas Recopiladas - Estado de Etapa)total_registrosvariable_analizadamedidas_centrales)mediamedianamodamoda_nombrepor_estado_etapa)r   r   muestra_consolidadaestadisticas_descriptivasdistribucion_frecuenciasr>   u-   Error calculando estadísticas descriptivas: r   )r   r    r!   r?   r#   sumrange
statisticsr$   meanmediancollectionsr   most_commonrL   r   r   r@   rA   r%   r&   r   r'   )r)   r    rB   rC   estados_nombresr   r   _estadosr   r   r   r   contadorr   distribucion_detalladarE   r   r   r   rX   r0   s                         r1   *get_estadisticas_descriptivas_consolidadasr     sW   Z3#%
$1EFF""d"3* 	u__&
$1STT *.?DTYhmxyBzBB.8Y%,BXYQ1^$Y$YYjoog.2##G,'7###A&q)!,!## 	I!.1I"<0JO^abOb
_(Ds(Jhk$
_ <s BQGJ"))#,'6':':9PY{F['\((,D+ 	 P#2&4$
 $"& #2#6#6twtf=M#N	&* #$:) %LLN446%
 	
3 Z\  3EaSIJ 3q6223s<   F1 AF1 /F1 F+-C=F1 +F1 1	G*:%G%G*%G*c                      	 t               } | dddS | j                  d      }ddd	d
dd	ddd	ddd	g}g }ddl}|D ]J  }|d   }|d   }d| d}|j                  |       |j	                         }	|	s8g }
|	D ]0  }	 t        |d         }d|cxk  rdk  rn n|
j                  |       2 |
srt        |
      }t        |j                  |
      d      }|j                  |
      }	 |j                  |
      }	 t        |
      dkD  rt        |j%                  |
      d      nd}	 t        |
      dkD  rt        |j'                  |
      d      nd}t)        |
      }t+        |
      }|j                  ||||||||||||z
  dd       M |j-                          | j-                          dd|t/        j0                         j3                         dS # t        t        f$ r Y kw xY w# |j                  $ r) ddlm}  ||
      }|j#                  d      d   d   }Y 'w xY w# |j                  $ r d}Y w xY w# |j                  $ r d}Y w xY w# t4        $ r0}t7        j8                  d|        dt;        |      d cY d}~S d}~ww xY w)!uO   Obtener estadísticas descriptivas de cada tabla por separado para comparaciónNFr
   r   Tr   r   rb   rc   r5   re   r8   rf   r;   rg   r   rd   r   zS
            SELECT CAST(estado_etapa AS SIGNED) as estado_etapa 
            FROM z 
            WHERE estado_etapa IS NOT NULL 
            AND estado_etapa != '' 
            AND estado_etapa REGEXP '^[0-9]+$'
            r   r{   r   r   r   r   )r   r   r   desviacion_estandarvarianzaminimomaximorango)r   r   r   estadisticasu/   Estadísticas Descriptivas por Tabla Individual)r   r   estadisticas_por_tablar>   u*   Error calculando estadísticas por tabla: r   )r   r    r   r!   r?   intrL   
ValueError	TypeErrorr^   r$   r   r   modeStatisticsErrorr   r   r   stdevvarianceminmaxr#   r   r@   rA   r%   r&   r   r'   )r)   r    ri   resultados_por_tablar   rj   rk   rl   rB   registros_tablaestados_etaparegistror   n_tablamedia_tablamediana_tabla
moda_tablar   r   desviacion_tablavarianza_tabla	min_tabla	max_tablar0   s                           r1   'get_estadisticas_descriptivas_por_tablar   ?  s   k3#%
 / 
 ""d"3 3>YZ.:QR'3FG*6IJ	
  "  G	J%h/L%h/L  E NN5!$oo/O" M+  .!9:FF'a'%,,V4	 !-(G  
 >BK&--m<M;'__];
'PSTaPbefPf5)9)9-)H!#Llo %QTUbQcfgQgz':':='I1!Mmp M*IM*I ''%&#*(,&+; .''&2	!	) sG	R 	 G&:$LLN446	
 	
g #I.  -- ;/"=1%11!4Q7:
; -- '#& '
 -- %!$%@  3B1#FG 3q6223s   I A+I ?-G,<I )G*;+H%'+H=BI G'#I &G''I *4H"I !H""I %H:6I 9H::I =II II 	J%JJJc                     	 t               } | dddS | j                  d      }d}|j                  |       |j                         }t	        |      }|D ]*  }|j                  d      s|d   j                         |d<   , |j                          | j                          dd	||t        j                         j                         d
S # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)zBObtener logs de primer contacto con nombres de tablas relacionadasNFr
   r   Tr   a  
        SELECT 
            lpc.id,
            lpc.id_usuario,
            e.nombres as nombres_empleado,
            e.apellidos as apellidos_empleado,
            CONCAT(e.nombres, ' ', e.apellidos) as nombre_completo_empleado,
            lpc.id_contacto,
            ucp.nombres,
            ucp.apellidos,
            CONCAT(ucp.nombres, ' ', ucp.apellidos) as nombre_completo_contacto,
            lpc.id_evento,
            ev.evento as nombre_evento,
            lpc.fecha_hora
        FROM logs_primer_contacto lpc
        LEFT JOIN empleados e ON lpc.id_usuario = e.id
        LEFT JOIN union_contactos_personas ucp ON lpc.id_contacto = ucp.id
        LEFT JOIN eventos ev ON lpc.id_evento = ev.id
        ORDER BY lpc.fecha_hora DESC
        
fecha_horazLogs de Primer Contacto)r   r   
total_logslogsr>   z*Error obteniendo logs de primer contacto: r   )r   r    r!   r?   r^   r   rA   r#   r   r@   r%   r&   r   r'   )r)   r    rB   	logs_datar   logr0   s          r1    get_logs_primer_contacto_summaryr     s   83#%
 / 
 ""d"3* 	uOO%	 ^
  	BCww|$$'$5$?$?$AL!	B 	 /$$LLN446
 	
  3B1#FG 3q6223s*   C
 AC
 *AC
 
	D%C>8D>D)
   )r&   typingr   r   r   r   sysospathrL   cnxpdor   r2   r6   r9   r<   rF   rT   r`   rr   r   rx   r   r   r   r   r   r       r1   <module>r      s     " "  
 	 & ' !93T 93v93 93v93$ 93v93T 93vG3d G3Rf3D f3PN34 N3`I3$ I3V3 3T 3.?34 ?3BD3T D3L\3D \3|m3 m3d:3$ :3r   