refactor completo + truncate de base de datos + reingenieria dashboard

This commit is contained in:
markosbenitez
2026-06-05 17:13:45 -03:00
parent a17e810ea8
commit 307a54dabc
43 changed files with 1320 additions and 92 deletions

View File

@@ -66,6 +66,8 @@ export async function submitSurvey(payload: {
typeof payload.answers['A5'] === 'string' ? payload.answers['A5'] : null
const qi_sector =
typeof payload.answers['A4'] === 'string' ? payload.answers['A4'] : null
const qi_zone =
typeof payload.answers['A1'] === 'string' ? payload.answers['A1'] : null
// 7. INSERT response (respondent_id=null — encuesta anónima, regla 2 CLAUDE.md)
const { error: rErr } = await supabase
@@ -79,7 +81,7 @@ export async function submitSurvey(payload: {
consent_record_id: consentId,
qi_age_bucket: qi_age_bucket || null,
qi_sector: qi_sector || null,
qi_zone: null,
qi_zone: qi_zone || null,
})
if (rErr) return { success: false, error: `response_insert_failed: ${rErr.message}` }

View File

@@ -10,12 +10,12 @@ const RPC_MAP: Record<string, string> = {
kpis: 'rpc_dashboard_kpis',
prevalencia: 'rpc_prevalencia_por_depto',
heatmap: 'rpc_heatmap_intensidad',
distribucion: 'rpc_distribucion_cuidado',
politicas: 'rpc_politicas_gap',
distribucion: 'rpc_perfil_poblacion',
apoyos: 'rpc_apoyos_demandados',
score: 'rpc_score_organizacional',
piramide: 'rpc_piramide_demografica',
intensidad: 'rpc_intensidad_vs_productividad',
riesgo: 'rpc_riesgo_retencion',
intensidad: 'rpc_intensidad_vs_bienestar',
saturacion: 'rpc_saturacion_cuidador',
}
function getSupabaseServer() {

View File

@@ -7,9 +7,9 @@ import { DonutCuidados } from '@/components/dashboard/donut-cuidados'
import { GaugeOrganizacional } from '@/components/dashboard/gauge-organizacional'
import { HeatmapWidget } from '@/components/dashboard/heatmap-widget'
import { PiramideDemografica } from '@/components/dashboard/piramide-demografica'
import { PoliticasBar } from '@/components/dashboard/politicas-bar'
import { ApoyosBar } from '@/components/dashboard/apoyos-bar'
import { IntensidadProductividad } from '@/components/dashboard/intensidad-productividad'
import { TablaRiesgo } from '@/components/dashboard/tabla-riesgo'
import { TablaSaturacion } from '@/components/dashboard/tabla-saturacion'
import { FilterSidebar } from '@/components/dashboard/filter-sidebar'
import type { DashboardFilters } from '@/lib/dashboard-types'
@@ -60,15 +60,15 @@ export default function DashboardPage() {
<PiramideDemografica surveyId={surveyId} filters={filters} />
</section>
{/* Fila 4: Barras políticas (6) + Hexbin intensidad/bienestar (6) */}
<section className="db-grid db-section" aria-label="Políticas e impacto">
<PoliticasBar surveyId={surveyId} filters={filters} />
{/* Fila 4: Apoyos demandados (6) + Hexbin intensidad/bienestar (6) */}
<section className="db-grid db-section" aria-label="Apoyos e impacto">
<ApoyosBar surveyId={surveyId} filters={filters} />
<IntensidadProductividad surveyId={surveyId} filters={filters} />
</section>
{/* Fila 5: Tabla riesgo (12) */}
<section className="db-grid db-section" aria-label="Riesgo de retención">
<TablaRiesgo surveyId={surveyId} filters={filters} />
{/* Fila 5: Saturación del cuidador (12) */}
<section className="db-grid db-section" aria-label="Saturación del cuidador">
<TablaSaturacion surveyId={surveyId} filters={filters} />
</section>
</div>
</div>

View File

@@ -32,6 +32,7 @@
/* ── Reset & base ── */
*, *::before, *::after { box-sizing: border-box; }
html { font-size: 16px; scroll-behavior: smooth; }
html, body { height: 100%; }
body {
margin: 0;
background: var(--color-bg);
@@ -39,7 +40,12 @@ body {
font-family: system-ui, -apple-system, 'Segoe UI', sans-serif;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
display: flex;
flex-direction: column;
min-height: 100vh;
}
/* El contenido entre header y footer crece para empujar el footer al fondo */
.layout-content { flex: 1; }
/* ── Skip link ── */
.skip-link {
@@ -608,13 +614,25 @@ body {
transition: box-shadow 0.3s;
}
.db-kpi-card:hover { box-shadow: 0 0 20px rgba(67,187,200,0.18); }
/* Título de KPI: mayúsculas, bold, siempre visible */
.db-kpi-title { font-size: 0.8125rem; font-weight: 700; color: #E7E6E5; text-transform: uppercase; letter-spacing: 0.04em; }
/* Subtítulo de KPI: código de pregunta + descripción */
.db-kpi-subtitle { font-size: 0.6875rem; color: #7A8FA0; font-weight: 400; line-height: 1.4; margin-bottom: 4px; }
.db-kpi-value {
font-size: 2rem; font-weight: 700; color: var(--color-re-teal);
font-variant-numeric: tabular-nums;
font-variant-numeric: tabular-nums; margin-top: 4px;
}
.db-kpi-value-suppressed { font-size: 1.25rem; color: #6b7280; }
.db-kpi-note { font-size: 0.75rem; color: #9ca3af; }
.db-kpi-suppressed-block { display: flex; flex-direction: column; align-items: center; gap: 4px; margin-top: 8px; }
/* Compat — se puede quitar si ya no se usa */
.db-kpi-label { font-size: 0.8125rem; color: #E7E6E5; }
.db-kpi-sub { font-size: 0.75rem; color: #9ca3af; }
/* Subtítulo de widget-shell */
.db-widget-title-group { display: flex; flex-direction: column; gap: 2px; flex: 1; }
.db-widget-subtitle { font-size: 0.75rem; color: #7A8FA0; font-weight: 400; margin: 0; line-height: 1.4; }
/* ── Mapa tile ── */
.db-map-wrapper { position: relative; }
.db-map-tooltip {