'use client'; import { useMunicipalityQuery, useParishQuery, useStateQuery, } from '@/feactures/location/hooks/use-query-location'; import { Button } from '@repo/shadcn/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@repo/shadcn/card'; import { Input } from '@repo/shadcn/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@repo/shadcn/select'; import { SelectSearchable } from '@repo/shadcn/select-searchable'; import { useState } from 'react'; import { Bar, BarChart, CartesianGrid, Cell, Legend, Pie, PieChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts'; import { useTrainingStatsQuery } from '../hooks/use-training-statistics'; import { exportTrainingAction } from '../actions/training-actions'; import { Download } from 'lucide-react'; const OSP_TYPES = [ 'EPSD', 'EPSI', 'UPF', 'Cooperativa', 'Grupo de Intercambio', ]; export function TrainingStatistics() { // Filter State const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [stateId, setStateId] = useState(0); const [municipalityId, setMunicipalityId] = useState(0); const [parishId, setParishId] = useState(0); const [ospType, setOspType] = useState(''); // Location Data const { data: dataState } = useStateQuery(); const { data: dataMunicipality } = useMunicipalityQuery(stateId); const { data: dataParish } = useParishQuery(municipalityId); const stateOptions = dataState?.data || [{ id: 0, name: 'Sin estados' }]; const municipalityOptions = Array.isArray(dataMunicipality?.data) && dataMunicipality.data.length > 0 ? dataMunicipality.data : [{ id: 0, stateId: 0, name: 'Sin Municipios' }]; const parishOptions = Array.isArray(dataParish?.data) && dataParish.data.length > 0 ? dataParish.data : [{ id: 0, stateId: 0, name: 'Sin Parroquias' }]; // Query with Filters const { data, isLoading, refetch } = useTrainingStatsQuery({ startDate: startDate || undefined, endDate: endDate || undefined, stateId: stateId || undefined, municipalityId: municipalityId || undefined, parishId: parishId || undefined, ospType: ospType || undefined, }); const handleClearFilters = () => { setStartDate(''); setEndDate(''); setStateId(0); setMunicipalityId(0); setParishId(0); setOspType(''); }; const [isExporting, setIsExporting] = useState(false); const handleExport = async () => { try { setIsExporting(true); const bytes = await exportTrainingAction({ startDate: startDate || undefined, endDate: endDate || undefined, stateId: stateId || undefined, municipalityId: municipalityId || undefined, parishId: parishId || undefined, ospType: ospType || undefined, }); const blob = new Blob([new Uint8Array(bytes)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `entrenamientos_${new Date().toISOString().split('T')[0]}.xlsx`; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } catch (error) { console.error('Error exporting:', error); } finally { setIsExporting(false); } }; if (isLoading) { return (
Cargando estadísticas...
); } if (!data) { return (
No hay datos disponibles.
); } const { totalOsps, // totalProducers, statusDistribution, activityDistribution, typeDistribution, stateDistribution, yearDistribution, ecoSectorDistribution, productiveSectorDistribution, centralActivityDistribution, mainActivityDistribution, structureTypeDistribution, isOpenSpaceDistribution, hasTransportDistribution, genderDistribution, municipalityDistribution, parishDistribution, } = data; const COLORS = [ '#0088FE', '#00C49F', '#FFBB28', '#FF8042', '#8884d8', '#82ca9d', ]; return (
{/* Filters Section */} Filtros
setStartDate(e.target.value)} />
setEndDate(e.target.value)} />
({ value: item.id.toString(), label: item.name, }))} onValueChange={(value: any) => { setStateId(Number(value)); setMunicipalityId(0); // Reset municipality setParishId(0); // Reset parish }} placeholder="Selecciona un estado" defaultValue={stateId ? stateId.toString() : ''} />
({ value: item.id.toString(), label: item.name, }))} onValueChange={(value: any) => { setMunicipalityId(Number(value)); setParishId(0); }} placeholder="Selecciona municipio" defaultValue={municipalityId ? municipalityId.toString() : ''} disabled={!stateId || stateId === 0} />
({ value: item.id.toString(), label: item.name, }))} onValueChange={(value: any) => setParishId(Number(value))} placeholder="Selecciona parroquia" defaultValue={parishId ? parishId.toString() : ''} disabled={!municipalityId || municipalityId === 0} />
{/* Statistics Cards */}
Total de OSP Registradas
{totalOsps}

Organizaciones Socioproductivas

{/* Total de Productores
{totalProducers}

Productores asociados

*/} Actividad Productiva Distribución por tipo de actividad {/* Location Distribution (Dynamic) */} Distribución por Estado OSP registradas por estado {stateId > 0 ? ( Distribución por Municipio OSP registradas en este estado ) : ( Distribución por Municipio Seleccione un estado )} {municipalityId > 0 ? ( Distribución por Parroquia OSP registradas en este municipio ) : ( Distribución por Parroquia Seleccione un municipio )} {/* Year Distribution */} Año de Constitución Año de registro de la empresa Estatus Actual Estado operativo de las OSP {statusDistribution.map((entry, index) => ( ))} Tipo de Organización Clasificación de las OSP {/* ECO SECTOR DISTRIBUTION */} Sector Económico Distribución por sector económico {/* PRODUCTIVE SECTOR DISTRIBUTION */} Sector Productivo Distribución por sector productivo {/* CENTRAL PRODUCTIVE ACTIVITY DISTRIBUTION */} Actividad Central Productiva Distribución por actividad central productiva {/* MAIN PRODUCTIVE ACTIVITY DISTRIBUTION */} Actividad Productiva Principal Distribución por actividad productiva principal {/* STRUCTURE TYPE DISTRIBUTION */} Tipo de Estructura Distribución física {/* GENDER DISTRIBUTION */} Distribución de Género Conteo total por género {/* OPEN SPACE AND TRANSPORT (PIE CHARTS) */}
Espacio Abierto ¿Poseen áreas libres? {isOpenSpaceDistribution.map((entry, index) => ( ))} Transporte ¿Tienen vehículo propio? {hasTransportDistribution.map((entry, index) => ( ))}
); }