// Filtros globales del dashboard (sidebar) export interface DashboardFilters { depto?: string genero?: string[] etario?: string[] modalidad?: string[] } // Estado de cada widget export type WidgetStatus = 'loading' | 'ok' | 'suppressed' | 'error' // Payloads de cada RPC export interface KpiData { status: 'ok' n: number pct_cuidadores: number score_bienestar: number | null // avg raw 4.3 (1.0–5.0) pct_ausencias: number } export interface DeptoData { depto: string n: number | null pct_cuidadores: number | null suppressed: boolean } export interface PrevalenciaData { status: 'ok'; n_total: number; data: DeptoData[] } export interface HeatmapCell { horas: string; ausencias: string; n: number | null; suppressed: boolean } export interface HeatmapData { status: 'ok'; n_total: number; data: HeatmapCell[] } export interface DistribucionData { status: 'ok'; n: number disc_propia: number; familiar: number; adulto_mayor: number; ninguno: number } export interface ApoyoItem { politica: string; n: number; pct: number } export interface ApoyosData { status: 'ok'; n_total: number; data: ApoyoItem[] } export interface ScoreData { status: 'ok'; n: number; score: number; zona: 'baja' | 'desarrollo' | 'consciente' } export interface PiramideCell { etario: string; genero: string; n: number | null; suppressed: boolean } export interface PiramideData { status: 'ok'; n_total: number; data: PiramideCell[] } export interface IntensidadCell { horas: string; bienestar: string; n: number | null; suppressed: boolean } export interface IntensidadData { status: 'ok'; n_total: number; data: IntensidadCell[] } export interface SaturacionSegmento { segmento: string n: number | null pct: number | null apoyo: string | null suppressed: boolean } export interface SaturacionData { status: 'ok'; n_total: number; segmentos: SaturacionSegmento[] } export type SuppressedPayload = { status: 'suppressed'; min_n: number; n: number } export type RpcResult = T | SuppressedPayload export function isSuppressed(r: unknown): r is SuppressedPayload { return typeof r === 'object' && r !== null && (r as Record)['status'] === 'suppressed' }