Primer commit — OPSV Dashboard de siniestralidad vial

This commit is contained in:
2026-04-29 13:39:09 -03:00
commit ca7b159657
67 changed files with 12246 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
import { useState, useEffect, useCallback } from 'react'
import { supabasePublic } from '../lib/supabase'
function estaEnPeriodo(item, periodo) {
if (!periodo?.desde || !periodo?.hasta) return true
const ano = Number(item.ano)
const mes = Number(item.mes)
const desdeValor = periodo.desde.ano * 100 + periodo.desde.mes
const hastaValor = periodo.hasta.ano * 100 + periodo.hasta.mes
const actualValor = ano * 100 + mes
return actualValor >= desdeValor && actualValor <= hastaValor
}
export function useData(year = null, periodo = { desde: null, hasta: null }) {
const [siniestros, setSiniestros] = useState([])
const [involucrados, setInvolucrados] = useState([])
const [personas, setPersonas] = useState([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
const periodoKey = JSON.stringify(periodo)
const fetchData = useCallback(async () => {
setLoading(true)
setError(null)
const periodoActual = JSON.parse(periodoKey)
const periodoActivo = periodoActual.desde && periodoActual.hasta
try {
let qS = supabasePublic.from('siniestros').select('*')
let qI = supabasePublic.from('Involucrados').select('*')
let qP = supabasePublic.from('Personas').select('*')
if (periodoActivo) {
const anoDesde = periodoActual.desde.ano
const anoHasta = periodoActual.hasta.ano
qS = qS.gte('ano', anoDesde).lte('ano', anoHasta)
qI = qI.gte('ano', anoDesde).lte('ano', anoHasta)
qP = qP.gte('ano', anoDesde).lte('ano', anoHasta)
} else if (year) {
qS = qS.eq('ano', year)
qI = qI.eq('ano', year)
qP = qP.eq('ano', year)
}
const [resS, resI, resP] = await Promise.all([qS, qI, qP])
if (resS.error) throw resS.error
if (resI.error) throw resI.error
if (resP.error) throw resP.error
let dataS = resS.data || []
let dataI = resI.data || []
let dataP = resP.data || []
if (periodoActivo) {
dataS = dataS.filter(item => estaEnPeriodo(item, periodoActual))
dataI = dataI.filter(item => estaEnPeriodo(item, periodoActual))
dataP = dataP.filter(item => estaEnPeriodo(item, periodoActual))
}
console.log('useData fetch', {
year,
periodo: periodoActual,
siniestros: dataS.length,
involucrados: dataI.length,
personas: dataP.length,
})
setSiniestros(dataS)
setInvolucrados(dataI)
setPersonas(dataP)
} catch (err) {
setError(err?.message || String(err))
console.error('useData error', err)
} finally {
setLoading(false)
}
}, [year, periodoKey])
useEffect(() => {
fetchData()
}, [fetchData])
return { siniestros, involucrados, personas, loading, error, refetch: fetchData }
}