erp-construccion-database-v2/seeds/dev/validate-seeds.sql
Adrian Flores Cortes 6cd5507fc2 feat(seeds): Add comprehensive seed validation and new data files
- Add 02b-hr-employees.sql: 15 puestos, 15 employees for HSE EPP assignments
- Add 11-infonavit.sql: registro, ofertas, derechohabientes, asignaciones
- Add validate-seeds-comprehensive.sql: FK integrity, calculations, coverage
- Update 06-estimaciones.sql: Document formula in header
- Update 08-hse.sql: Fix hse.capacitacion → hse.capacitaciones, add 6 new tables
- Update validate-seeds.sql: Fix table name reference

New tables seeded: tipos_inspeccion, inspecciones, epp_matriz_puesto,
epp_asignaciones, cumplimiento_obra, dias_sin_accidente

Coverage increased: HSE 7%→17%, INFONAVIT 0%→50%

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 11:31:59 -06:00

376 lines
34 KiB
SQL

-- ═══════════════════════════════════════════════════════════════════════════════
-- SCRIPT: validate-seeds.sql
-- PROYECTO: ERP Construcción
-- DESCRIPCIÓN: Valida que todos los seeds de desarrollo estén correctamente cargados
-- ═══════════════════════════════════════════════════════════════════════════════
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE CATÁLOGOS BASE (SEED 01)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_unidades INTEGER;
v_monedas INTEGER;
v_impuestos INTEGER;
v_bancos INTEGER;
v_estados INTEGER;
v_municipios INTEGER;
v_errors TEXT := '';
BEGIN
SELECT COUNT(*) INTO v_unidades FROM core.unidades WHERE activo = true;
SELECT COUNT(*) INTO v_monedas FROM core.monedas WHERE activo = true;
SELECT COUNT(*) INTO v_impuestos FROM core.impuestos WHERE activo = true;
SELECT COUNT(*) INTO v_bancos FROM core.bancos WHERE activo = true;
SELECT COUNT(*) INTO v_estados FROM core.estados WHERE activo = true;
SELECT COUNT(*) INTO v_municipios FROM core.municipios WHERE activo = true;
RAISE NOTICE '';
RAISE NOTICE '════════════════════════════════════════════════════════════════';
RAISE NOTICE ' VALIDACIÓN DE SEEDS - ERP CONSTRUCCIÓN';
RAISE NOTICE '════════════════════════════════════════════════════════════════';
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 01: CATÁLOGOS BASE │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Unidades de medida: %', LPAD(v_unidades::TEXT, 4) || CASE WHEN v_unidades >= 30 THEN '' ELSE ' ✗ (esperado: 32)' END || '';
RAISE NOTICE '│ Monedas: %', LPAD(v_monedas::TEXT, 4) || CASE WHEN v_monedas >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '│ Impuestos: %', LPAD(v_impuestos::TEXT, 4) || CASE WHEN v_impuestos >= 8 THEN '' ELSE ' ✗ (esperado: 10)' END || '';
RAISE NOTICE '│ Bancos: %', LPAD(v_bancos::TEXT, 4) || CASE WHEN v_bancos >= 18 THEN '' ELSE ' ✗ (esperado: 20)' END || '';
RAISE NOTICE '│ Estados: %', LPAD(v_estados::TEXT, 4) || CASE WHEN v_estados >= 30 THEN '' ELSE ' ✗ (esperado: 32)' END || '';
RAISE NOTICE '│ Municipios: %', LPAD(v_municipios::TEXT, 4) || CASE WHEN v_municipios >= 10 THEN '' ELSE ' ✗ (esperado: 15)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
IF v_unidades < 30 OR v_monedas < 4 OR v_impuestos < 8 THEN
v_errors := v_errors || 'SEED-01 incompleto. ';
END IF;
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE USUARIOS Y PERFILES (SEED 02)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_roles INTEGER;
v_permisos INTEGER;
v_usuarios INTEGER;
v_usuarios_demo INTEGER;
BEGIN
SELECT COUNT(*) INTO v_roles FROM core.roles WHERE activo = true;
SELECT COUNT(*) INTO v_permisos FROM core.permisos WHERE activo = true;
SELECT COUNT(*) INTO v_usuarios FROM core.usuarios WHERE activo = true;
SELECT COUNT(*) INTO v_usuarios_demo FROM core.usuarios WHERE email LIKE '%@demo.com' AND activo = true;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 02: USUARIOS Y PERFILES │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Roles: %', LPAD(v_roles::TEXT, 4) || CASE WHEN v_roles >= 10 THEN '' ELSE ' ✗ (esperado: 12)' END || '';
RAISE NOTICE '│ Permisos: %', LPAD(v_permisos::TEXT, 4) || CASE WHEN v_permisos >= 45 THEN '' ELSE ' ✗ (esperado: 50+)' END || '';
RAISE NOTICE '│ Usuarios totales: %', LPAD(v_usuarios::TEXT, 4) || CASE WHEN v_usuarios >= 10 THEN '' ELSE ' ✗ (esperado: 12)' END || '';
RAISE NOTICE '│ Usuarios demo: %', LPAD(v_usuarios_demo::TEXT, 4) || CASE WHEN v_usuarios_demo >= 10 THEN '' ELSE ' ✗ (esperado: 12)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE EMPRESA Y ESTRUCTURA (SEED 03)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_tenants INTEGER;
v_sucursales INTEGER;
v_almacenes INTEGER;
BEGIN
SELECT COUNT(*) INTO v_tenants FROM core.tenants WHERE activo = true;
SELECT COUNT(*) INTO v_sucursales FROM core.sucursales WHERE activo = true;
SELECT COUNT(*) INTO v_almacenes FROM inventory.almacenes WHERE activo = true;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 03: EMPRESA Y ESTRUCTURA │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Tenants: %', LPAD(v_tenants::TEXT, 4) || CASE WHEN v_tenants >= 1 THEN '' ELSE ' ✗ (esperado: 1)' END || '';
RAISE NOTICE '│ Sucursales: %', LPAD(v_sucursales::TEXT, 4) || CASE WHEN v_sucursales >= 2 THEN '' ELSE ' ✗ (esperado: 2)' END || '';
RAISE NOTICE '│ Almacenes: %', LPAD(v_almacenes::TEXT, 4) || CASE WHEN v_almacenes >= 4 THEN '' ELSE ' ✗ (esperado: 4)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE PROYECTOS Y OBRAS (SEED 04)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_prototipos INTEGER;
v_proyectos INTEGER;
v_etapas INTEGER;
v_manzanas INTEGER;
v_lotes INTEGER;
v_departamentos INTEGER;
v_subcontratistas INTEGER;
BEGIN
SELECT COUNT(*) INTO v_prototipos FROM construction.prototipos_vivienda WHERE activo = true;
SELECT COUNT(*) INTO v_proyectos FROM construction.fraccionamientos WHERE activo = true;
SELECT COUNT(*) INTO v_etapas FROM construction.etapas;
SELECT COUNT(*) INTO v_manzanas FROM construction.manzanas WHERE activo = true;
SELECT COUNT(*) INTO v_lotes FROM construction.lotes WHERE activo = true;
SELECT COUNT(*) INTO v_departamentos FROM construction.departamentos WHERE activo = true;
SELECT COUNT(*) INTO v_subcontratistas FROM construction.subcontratistas WHERE activo = true;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 04: PROYECTOS Y OBRAS │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Prototipos: %', LPAD(v_prototipos::TEXT, 4) || CASE WHEN v_prototipos >= 5 THEN '' ELSE ' ✗ (esperado: 6)' END || '';
RAISE NOTICE '│ Proyectos/Fraccionamientos: %', LPAD(v_proyectos::TEXT, 4) || CASE WHEN v_proyectos >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Etapas: %', LPAD(v_etapas::TEXT, 4) || CASE WHEN v_etapas >= 5 THEN '' ELSE ' ✗ (esperado: 6)' END || '';
RAISE NOTICE '│ Manzanas: %', LPAD(v_manzanas::TEXT, 4) || CASE WHEN v_manzanas >= 7 THEN '' ELSE ' ✗ (esperado: 8)' END || '';
RAISE NOTICE '│ Lotes: %', LPAD(v_lotes::TEXT, 4) || CASE WHEN v_lotes >= 12 THEN '' ELSE ' ✗ (esperado: 15)' END || '';
RAISE NOTICE '│ Departamentos: %', LPAD(v_departamentos::TEXT, 4) || CASE WHEN v_departamentos >= 10 THEN '' ELSE ' ✗ (esperado: 12)' END || '';
RAISE NOTICE '│ Subcontratistas: %', LPAD(v_subcontratistas::TEXT, 4) || CASE WHEN v_subcontratistas >= 8 THEN '' ELSE ' ✗ (esperado: 10)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE PRESUPUESTOS (SEED 05)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_conceptos INTEGER;
v_presupuestos INTEGER;
v_partidas INTEGER;
v_programas INTEGER;
BEGIN
SELECT COUNT(*) INTO v_conceptos FROM construction.conceptos WHERE activo = true;
SELECT COUNT(*) INTO v_presupuestos FROM construction.presupuestos WHERE activo = true;
SELECT COUNT(*) INTO v_partidas FROM construction.presupuesto_partidas;
SELECT COUNT(*) INTO v_programas FROM construction.programa_obra WHERE activo = true;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 05: PRESUPUESTOS │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Conceptos (catálogo CMIC): %', LPAD(v_conceptos::TEXT, 4) || CASE WHEN v_conceptos >= 20 THEN '' ELSE ' ✗ (esperado: 25+)' END || '';
RAISE NOTICE '│ Presupuestos: %', LPAD(v_presupuestos::TEXT, 4) || CASE WHEN v_presupuestos >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '│ Partidas presupuestales: %', LPAD(v_partidas::TEXT, 4) || CASE WHEN v_partidas >= 12 THEN '' ELSE ' ✗ (esperado: 14)' END || '';
RAISE NOTICE '│ Programas de obra: %', LPAD(v_programas::TEXT, 4) || CASE WHEN v_programas >= 2 THEN '' ELSE ' ✗ (esperado: 2)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE ESTIMACIONES (SEED 06)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_contratos INTEGER;
v_estimaciones INTEGER;
v_anticipos INTEGER;
v_fondos INTEGER;
BEGIN
SELECT COUNT(*) INTO v_contratos FROM estimates.contratos WHERE activo = true;
SELECT COUNT(*) INTO v_estimaciones FROM estimates.estimaciones;
SELECT COUNT(*) INTO v_anticipos FROM estimates.anticipos;
SELECT COUNT(*) INTO v_fondos FROM estimates.fondo_garantia;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 06: ESTIMACIONES Y CONTRATOS │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Contratos: %', LPAD(v_contratos::TEXT, 4) || CASE WHEN v_contratos >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '│ Estimaciones: %', LPAD(v_estimaciones::TEXT, 4) || CASE WHEN v_estimaciones >= 5 THEN '' ELSE ' ✗ (esperado: 6)' END || '';
RAISE NOTICE '│ Anticipos: %', LPAD(v_anticipos::TEXT, 4) || CASE WHEN v_anticipos >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Fondos de garantía: %', LPAD(v_fondos::TEXT, 4) || CASE WHEN v_fondos >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE AVANCES Y CALIDAD (SEED 07)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_avances INTEGER;
v_bitacora INTEGER;
v_checklists INTEGER;
v_inspecciones INTEGER;
v_tickets INTEGER;
BEGIN
SELECT COUNT(*) INTO v_avances FROM construction.avance_obra;
SELECT COUNT(*) INTO v_bitacora FROM construction.bitacora_obra;
SELECT COUNT(*) INTO v_checklists FROM construction.checklist_calidad WHERE activo = true;
SELECT COUNT(*) INTO v_inspecciones FROM construction.inspecciones;
SELECT COUNT(*) INTO v_tickets FROM construction.tickets_garantia;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 07: AVANCES Y CALIDAD │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Registros de avance: %', LPAD(v_avances::TEXT, 4) || CASE WHEN v_avances >= 5 THEN '' ELSE ' ✗ (esperado: 6)' END || '';
RAISE NOTICE '│ Entradas de bitácora: %', LPAD(v_bitacora::TEXT, 4) || CASE WHEN v_bitacora >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '│ Checklists de calidad: %', LPAD(v_checklists::TEXT, 4) || CASE WHEN v_checklists >= 3 THEN '' ELSE ' ✗ (esperado: 4)' END || '';
RAISE NOTICE '│ Inspecciones: %', LPAD(v_inspecciones::TEXT, 4) || CASE WHEN v_inspecciones >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Tickets de garantía: %', LPAD(v_tickets::TEXT, 4) || CASE WHEN v_tickets >= 2 THEN '' ELSE ' ✗ (esperado: 2)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE HSE (SEED 08)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_epp INTEGER;
v_capacitaciones INTEGER;
v_incidentes INTEGER;
v_horas INTEGER;
BEGIN
SELECT COUNT(*) INTO v_epp FROM hse.epp_catalogo WHERE activo = true;
SELECT COUNT(*) INTO v_capacitaciones FROM hse.capacitaciones WHERE activo = true;
SELECT COUNT(*) INTO v_incidentes FROM hse.incidentes;
SELECT COUNT(*) INTO v_horas FROM hse.horas_trabajadas;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 08: HSE (SEGURIDAD, SALUD Y AMBIENTE) │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Catálogo EPP: %', LPAD(v_epp::TEXT, 4) || CASE WHEN v_epp >= 12 THEN '' ELSE ' ✗ (esperado: 13)' END || '';
RAISE NOTICE '│ Capacitaciones: %', LPAD(v_capacitaciones::TEXT, 4) || CASE WHEN v_capacitaciones >= 7 THEN '' ELSE ' ✗ (esperado: 8)' END || '';
RAISE NOTICE '│ Incidentes registrados: %', LPAD(v_incidentes::TEXT, 4) || CASE WHEN v_incidentes >= 3 THEN '' ELSE ' ✗ (esperado: 4)' END || '';
RAISE NOTICE '│ Registros de horas: %', LPAD(v_horas::TEXT, 4) || CASE WHEN v_horas >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE FINANZAS (SEED 09)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_cuentas INTEGER;
v_bancos INTEGER;
v_cxp INTEGER;
v_cxc INTEGER;
v_polizas INTEGER;
v_movimientos INTEGER;
v_balance NUMERIC;
BEGIN
SELECT COUNT(*) INTO v_cuentas FROM finance.cuentas_contables WHERE activo = true;
SELECT COUNT(*) INTO v_bancos FROM finance.cuentas_bancarias WHERE activo = true;
SELECT COUNT(*) INTO v_cxp FROM finance.cuentas_por_pagar WHERE activo = true;
SELECT COUNT(*) INTO v_cxc FROM finance.cuentas_por_cobrar WHERE activo = true;
SELECT COUNT(*) INTO v_polizas FROM finance.polizas_contables;
SELECT COUNT(*) INTO v_movimientos FROM finance.movimientos_poliza;
-- Verificar que las pólizas estén cuadradas
SELECT COALESCE(SUM(CASE WHEN tipo_movimiento = 'cargo' THEN monto ELSE -monto END), 0)
INTO v_balance FROM finance.movimientos_poliza;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 09: FINANZAS │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Cuentas contables: %', LPAD(v_cuentas::TEXT, 4) || CASE WHEN v_cuentas >= 30 THEN '' ELSE ' ✗ (esperado: 35)' END || '';
RAISE NOTICE '│ Cuentas bancarias: %', LPAD(v_bancos::TEXT, 4) || CASE WHEN v_bancos >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Cuentas por pagar: %', LPAD(v_cxp::TEXT, 4) || CASE WHEN v_cxp >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Cuentas por cobrar: %', LPAD(v_cxc::TEXT, 4) || CASE WHEN v_cxc >= 2 THEN '' ELSE ' ✗ (esperado: 2)' END || '';
RAISE NOTICE '│ Pólizas contables: %', LPAD(v_polizas::TEXT, 4) || CASE WHEN v_polizas >= 4 THEN '' ELSE ' ✗ (esperado: 4)' END || '';
RAISE NOTICE '│ Movimientos póliza: %', LPAD(v_movimientos::TEXT, 4) || CASE WHEN v_movimientos >= 8 THEN '' ELSE ' ✗ (esperado: 10)' END || '';
RAISE NOTICE '│ Balance pólizas (debe=0): %', LPAD(v_balance::TEXT, 8) || CASE WHEN v_balance = 0 THEN '' ELSE ' ✗ DESCUADRADO!' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- VALIDACIÓN DE ACTIVOS Y DOCUMENTOS (SEED 10)
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_categorias INTEGER;
v_activos INTEGER;
v_mantenimientos INTEGER;
v_cat_docs INTEGER;
v_documentos INTEGER;
BEGIN
SELECT COUNT(*) INTO v_categorias FROM assets.categorias_activo WHERE activo = true;
SELECT COUNT(*) INTO v_activos FROM assets.activos WHERE activo = true;
SELECT COUNT(*) INTO v_mantenimientos FROM assets.mantenimiento_programado WHERE activo = true;
SELECT COUNT(*) INTO v_cat_docs FROM documents.categorias_documento WHERE activo = true;
SELECT COUNT(*) INTO v_documentos FROM documents.documentos WHERE activo = true;
RAISE NOTICE '';
RAISE NOTICE '┌─────────────────────────────────────────────────────────────┐';
RAISE NOTICE '│ SEED 10: ACTIVOS Y DOCUMENTOS │';
RAISE NOTICE '├─────────────────────────────────────────────────────────────┤';
RAISE NOTICE '│ Categorías de activos: %', LPAD(v_categorias::TEXT, 4) || CASE WHEN v_categorias >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '│ Activos/Equipos: %', LPAD(v_activos::TEXT, 4) || CASE WHEN v_activos >= 8 THEN '' ELSE ' ✗ (esperado: 10)' END || '';
RAISE NOTICE '│ Mantenimientos programados: %', LPAD(v_mantenimientos::TEXT, 4) || CASE WHEN v_mantenimientos >= 3 THEN '' ELSE ' ✗ (esperado: 3)' END || '';
RAISE NOTICE '│ Categorías de documentos: %', LPAD(v_cat_docs::TEXT, 4) || CASE WHEN v_cat_docs >= 10 THEN '' ELSE ' ✗ (esperado: 11)' END || '';
RAISE NOTICE '│ Documentos: %', LPAD(v_documentos::TEXT, 4) || CASE WHEN v_documentos >= 4 THEN '' ELSE ' ✗ (esperado: 5)' END || '';
RAISE NOTICE '└─────────────────────────────────────────────────────────────┘';
END $$;
-- ─────────────────────────────────────────────────────────────────────────────────
-- RESUMEN FINAL
-- ─────────────────────────────────────────────────────────────────────────────────
DO $$
DECLARE
v_total_registros INTEGER := 0;
v_temp INTEGER;
BEGIN
-- Contar todos los registros de seeds
SELECT COUNT(*) INTO v_temp FROM core.unidades; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.monedas; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.impuestos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.bancos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.estados; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.municipios; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.roles; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.permisos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.usuarios; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.tenants; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM core.sucursales; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM inventory.almacenes; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.prototipos_vivienda; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.fraccionamientos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.etapas; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.manzanas; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.lotes; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.departamentos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.subcontratistas; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.conceptos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.presupuestos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.presupuesto_partidas; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM estimates.contratos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM estimates.estimaciones; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.avance_obra; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM construction.bitacora_obra; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM hse.epp_catalogo; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM hse.capacitaciones; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM hse.incidentes; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM finance.cuentas_contables; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM finance.polizas_contables; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM assets.activos; v_total_registros := v_total_registros + v_temp;
SELECT COUNT(*) INTO v_temp FROM documents.documentos; v_total_registros := v_total_registros + v_temp;
RAISE NOTICE '';
RAISE NOTICE '════════════════════════════════════════════════════════════════';
RAISE NOTICE ' RESUMEN DE VALIDACIÓN';
RAISE NOTICE '════════════════════════════════════════════════════════════════';
RAISE NOTICE '';
RAISE NOTICE ' Total de registros cargados: %', v_total_registros;
RAISE NOTICE ' Esperado aproximado: ~940';
RAISE NOTICE '';
RAISE NOTICE ' Estado: %', CASE WHEN v_total_registros >= 800 THEN '✓ SEEDS CARGADOS CORRECTAMENTE' ELSE '✗ SEEDS INCOMPLETOS' END;
RAISE NOTICE '';
RAISE NOTICE '════════════════════════════════════════════════════════════════';
END $$;
-- ═══════════════════════════════════════════════════════════════════════════════
-- FIN VALIDACIÓN
-- ═══════════════════════════════════════════════════════════════════════════════