diff --git a/seeds/dev/01-core-catalogs.sql b/seeds/dev/01-core-catalogs.sql new file mode 100644 index 0000000..3145083 --- /dev/null +++ b/seeds/dev/01-core-catalogs.sql @@ -0,0 +1,212 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 01: CATÁLOGOS BASE +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Catálogos fundamentales del sistema (sin dependencias) +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- Usar UUIDs determinísticos para reproducibilidad +-- Prefijo: 00000000-0000-0000-0001-XXXXXXXXXXXX para catálogos + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. UNIDADES DE MEDIDA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.units (id, code, name, symbol, category, is_active, created_at) VALUES +-- Longitud +('00000000-0000-0000-0001-000000000001', 'M', 'Metro', 'm', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000002', 'ML', 'Metro lineal', 'ml', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000003', 'KM', 'Kilómetro', 'km', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000004', 'CM', 'Centímetro', 'cm', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000005', 'MM', 'Milímetro', 'mm', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000006', 'PLG', 'Pulgada', 'in', 'longitud', true, NOW()), +('00000000-0000-0000-0001-000000000007', 'PIE', 'Pie', 'ft', 'longitud', true, NOW()), +-- Área +('00000000-0000-0000-0001-000000000010', 'M2', 'Metro cuadrado', 'm²', 'area', true, NOW()), +('00000000-0000-0000-0001-000000000011', 'HA', 'Hectárea', 'ha', 'area', true, NOW()), +('00000000-0000-0000-0001-000000000012', 'CM2', 'Centímetro cuadrado', 'cm²', 'area', true, NOW()), +-- Volumen +('00000000-0000-0000-0001-000000000020', 'M3', 'Metro cúbico', 'm³', 'volumen', true, NOW()), +('00000000-0000-0000-0001-000000000021', 'LT', 'Litro', 'L', 'volumen', true, NOW()), +('00000000-0000-0000-0001-000000000022', 'GL', 'Galón', 'gal', 'volumen', true, NOW()), +-- Peso +('00000000-0000-0000-0001-000000000030', 'KG', 'Kilogramo', 'kg', 'peso', true, NOW()), +('00000000-0000-0000-0001-000000000031', 'TON', 'Tonelada', 'ton', 'peso', true, NOW()), +('00000000-0000-0000-0001-000000000032', 'GR', 'Gramo', 'g', 'peso', true, NOW()), +('00000000-0000-0000-0001-000000000033', 'LB', 'Libra', 'lb', 'peso', true, NOW()), +-- Cantidad +('00000000-0000-0000-0001-000000000040', 'PZA', 'Pieza', 'pza', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000041', 'JGO', 'Juego', 'jgo', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000042', 'PAR', 'Par', 'par', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000043', 'LOTE', 'Lote', 'lote', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000044', 'ROLLO', 'Rollo', 'rollo', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000045', 'BOLSA', 'Bolsa', 'bolsa', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000046', 'CAJA', 'Caja', 'caja', 'cantidad', true, NOW()), +('00000000-0000-0000-0001-000000000047', 'CUBETA', 'Cubeta', 'cubeta', 'cantidad', true, NOW()), +-- Tiempo +('00000000-0000-0000-0001-000000000050', 'HR', 'Hora', 'hr', 'tiempo', true, NOW()), +('00000000-0000-0000-0001-000000000051', 'DIA', 'Día', 'día', 'tiempo', true, NOW()), +('00000000-0000-0000-0001-000000000052', 'SEM', 'Semana', 'sem', 'tiempo', true, NOW()), +('00000000-0000-0000-0001-000000000053', 'MES', 'Mes', 'mes', 'tiempo', true, NOW()), +-- Global +('00000000-0000-0000-0001-000000000060', 'GLOBAL', 'Global', 'gbl', 'global', true, NOW()), +('00000000-0000-0000-0001-000000000061', 'SALIDA', 'Salida', 'sal', 'global', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. MONEDAS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.currencies (id, code, name, symbol, decimal_places, is_active, is_default, created_at) VALUES +('00000000-0000-0000-0001-000000000101', 'MXN', 'Peso Mexicano', '$', 2, true, true, NOW()), +('00000000-0000-0000-0001-000000000102', 'USD', 'Dólar Americano', 'US$', 2, true, false, NOW()), +('00000000-0000-0000-0001-000000000103', 'EUR', 'Euro', '€', 2, true, false, NOW()), +('00000000-0000-0000-0001-000000000104', 'CAD', 'Dólar Canadiense', 'CA$', 2, true, false, NOW()), +('00000000-0000-0000-0001-000000000105', 'GBP', 'Libra Esterlina', '£', 2, true, false, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. IMPUESTOS (México SAT) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.taxes (id, code, name, rate, tax_type, is_retention, is_active, created_at) VALUES +-- IVA +('00000000-0000-0000-0001-000000000201', 'IVA16', 'IVA 16%', 0.16, 'iva', false, true, NOW()), +('00000000-0000-0000-0001-000000000202', 'IVA8', 'IVA 8% (Frontera)', 0.08, 'iva', false, true, NOW()), +('00000000-0000-0000-0001-000000000203', 'IVA0', 'IVA 0%', 0.00, 'iva', false, true, NOW()), +('00000000-0000-0000-0001-000000000204', 'EXENTO', 'Exento de IVA', 0.00, 'exento', false, true, NOW()), +-- ISR Retención +('00000000-0000-0000-0001-000000000210', 'ISR10', 'Retención ISR 10%', 0.10, 'isr', true, true, NOW()), +('00000000-0000-0000-0001-000000000211', 'ISR1.25', 'Retención ISR 1.25%', 0.0125, 'isr', true, true, NOW()), +-- IVA Retención +('00000000-0000-0000-0001-000000000220', 'RIVA', 'Retención IVA 2/3', 0.106667, 'iva_retenido', true, true, NOW()), +('00000000-0000-0000-0001-000000000221', 'RIVA4', 'Retención IVA 4%', 0.04, 'iva_retenido', true, true, NOW()), +-- IEPS (si aplica) +('00000000-0000-0000-0001-000000000230', 'IEPS', 'IEPS Variable', 0.00, 'ieps', false, false, NOW()), +-- Sin impuesto +('00000000-0000-0000-0001-000000000240', 'SIN', 'Sin impuesto', 0.00, 'ninguno', false, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. BANCOS (México) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.banks (id, code, name, short_name, swift_code, is_active, created_at) VALUES +('00000000-0000-0000-0001-000000000301', '002', 'BANAMEX', 'Banamex', 'BNMXMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000302', '012', 'BBVA MEXICO', 'BBVA', 'BCMRMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000303', '014', 'SANTANDER', 'Santander', 'BMSXMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000304', '021', 'HSBC', 'HSBC', 'BABORUMM', true, NOW()), +('00000000-0000-0000-0001-000000000305', '030', 'BAJIO', 'Bajío', 'BABORUMM', true, NOW()), +('00000000-0000-0000-0001-000000000306', '036', 'INBURSA', 'Inbursa', 'INBUMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000307', '044', 'SCOTIABANK', 'Scotia', 'MBCOMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000308', '058', 'BANREGIO', 'Banregio', 'BANOMXMM', true, NOW()), +('00000000-0000-0000-0001-000000000309', '072', 'BANORTE', 'Banorte', 'MENOMXMT', true, NOW()), +('00000000-0000-0000-0001-000000000310', '106', 'BANK OF AMERICA', 'BofA', 'BABORUMM', true, NOW()), +('00000000-0000-0000-0001-000000000311', '127', 'AZTECA', 'Azteca', 'BABORUMM', true, NOW()), +('00000000-0000-0000-0001-000000000312', '128', 'AUTOFIN', 'Autofin', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000313', '130', 'COMPARTAMOS', 'Compartamos', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000314', '137', 'BANCOPPEL', 'Coppel', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000315', '138', 'ABC CAPITAL', 'ABC', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000316', '145', 'BBASE', 'BBase', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000317', '646', 'BANSEFI', 'Bansefi', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000318', '659', 'ASP INTEGRA', 'ASP', NULL, true, NOW()), +('00000000-0000-0000-0001-000000000319', '901', 'CLS', 'CLS', NULL, false, NOW()), +('00000000-0000-0000-0001-000000000320', '999', 'OTRO', 'Otro', NULL, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. ESTADOS DE MÉXICO +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.states (id, code, name, abbreviation, country_code, is_active, created_at) VALUES +('00000000-0000-0000-0001-000000000401', 'AGS', 'Aguascalientes', 'Ags.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000402', 'BC', 'Baja California', 'B.C.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000403', 'BCS', 'Baja California Sur', 'B.C.S.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000404', 'CAM', 'Campeche', 'Camp.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000405', 'COAH', 'Coahuila', 'Coah.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000406', 'COL', 'Colima', 'Col.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000407', 'CHIS', 'Chiapas', 'Chis.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000408', 'CHIH', 'Chihuahua', 'Chih.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000409', 'CDMX', 'Ciudad de México', 'CDMX', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000410', 'DGO', 'Durango', 'Dgo.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000411', 'GTO', 'Guanajuato', 'Gto.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000412', 'GRO', 'Guerrero', 'Gro.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000413', 'HGO', 'Hidalgo', 'Hgo.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000414', 'JAL', 'Jalisco', 'Jal.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000415', 'MEX', 'Estado de México', 'Méx.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000416', 'MICH', 'Michoacán', 'Mich.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000417', 'MOR', 'Morelos', 'Mor.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000418', 'NAY', 'Nayarit', 'Nay.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000419', 'NL', 'Nuevo León', 'N.L.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000420', 'OAX', 'Oaxaca', 'Oax.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000421', 'PUE', 'Puebla', 'Pue.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000422', 'QRO', 'Querétaro', 'Qro.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000423', 'QROO', 'Quintana Roo', 'Q.R.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000424', 'SLP', 'San Luis Potosí', 'S.L.P.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000425', 'SIN', 'Sinaloa', 'Sin.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000426', 'SON', 'Sonora', 'Son.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000427', 'TAB', 'Tabasco', 'Tab.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000428', 'TAM', 'Tamaulipas', 'Tamps.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000429', 'TLAX', 'Tlaxcala', 'Tlax.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000430', 'VER', 'Veracruz', 'Ver.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000431', 'YUC', 'Yucatán', 'Yuc.', 'MX', true, NOW()), +('00000000-0000-0000-0001-000000000432', 'ZAC', 'Zacatecas', 'Zac.', 'MX', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 6. MUNICIPIOS (Solo Aguascalientes como ejemplo para demo) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO core.municipalities (id, state_id, code, name, is_active, created_at) VALUES +-- Aguascalientes +('00000000-0000-0000-0001-000000000501', '00000000-0000-0000-0001-000000000401', '001', 'Aguascalientes', true, NOW()), +('00000000-0000-0000-0001-000000000502', '00000000-0000-0000-0001-000000000401', '002', 'Asientos', true, NOW()), +('00000000-0000-0000-0001-000000000503', '00000000-0000-0000-0001-000000000401', '003', 'Calvillo', true, NOW()), +('00000000-0000-0000-0001-000000000504', '00000000-0000-0000-0001-000000000401', '004', 'Cosío', true, NOW()), +('00000000-0000-0000-0001-000000000505', '00000000-0000-0000-0001-000000000401', '005', 'Jesús María', true, NOW()), +('00000000-0000-0000-0001-000000000506', '00000000-0000-0000-0001-000000000401', '006', 'Pabellón de Arteaga', true, NOW()), +('00000000-0000-0000-0001-000000000507', '00000000-0000-0000-0001-000000000401', '007', 'Rincón de Romos', true, NOW()), +('00000000-0000-0000-0001-000000000508', '00000000-0000-0000-0001-000000000401', '008', 'San José de Gracia', true, NOW()), +('00000000-0000-0000-0001-000000000509', '00000000-0000-0000-0001-000000000401', '009', 'Tepezalá', true, NOW()), +('00000000-0000-0000-0001-000000000510', '00000000-0000-0000-0001-000000000401', '010', 'El Llano', true, NOW()), +('00000000-0000-0000-0001-000000000511', '00000000-0000-0000-0001-000000000401', '011', 'San Francisco de los Romo', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_units INTEGER; + v_currencies INTEGER; + v_taxes INTEGER; + v_banks INTEGER; + v_states INTEGER; +BEGIN + SELECT COUNT(*) INTO v_units FROM core.units; + SELECT COUNT(*) INTO v_currencies FROM core.currencies; + SELECT COUNT(*) INTO v_taxes FROM core.taxes; + SELECT COUNT(*) INTO v_banks FROM core.banks; + SELECT COUNT(*) INTO v_states FROM core.states; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 01 - CATÁLOGOS BASE - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Unidades de medida: %', v_units; + RAISE NOTICE 'Monedas: %', v_currencies; + RAISE NOTICE 'Impuestos: %', v_taxes; + RAISE NOTICE 'Bancos: %', v_banks; + RAISE NOTICE 'Estados: %', v_states; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 01 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/02-users-profiles.sql b/seeds/dev/02-users-profiles.sql new file mode 100644 index 0000000..33f65c3 --- /dev/null +++ b/seeds/dev/02-users-profiles.sql @@ -0,0 +1,398 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 02: USUARIOS Y PERFILES +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Roles, permisos y usuarios demo del sistema +-- Dependencias: 01-core-catalogs.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs determinísticos: +-- Prefijo: 00000000-0000-0000-0002-XXXXXXXXXXXX para usuarios/roles + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. ROLES DEL SISTEMA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO auth.roles (id, code, name, description, is_system, is_active, created_at) VALUES +('00000000-0000-0000-0002-000000000001', 'super_admin', 'Super Administrador', 'Acceso total al sistema, gestión de tenants', true, true, NOW()), +('00000000-0000-0000-0002-000000000002', 'director', 'Director General', 'Acceso ejecutivo, reportes gerenciales, aprobaciones finales', false, true, NOW()), +('00000000-0000-0000-0002-000000000003', 'gerente_obra', 'Gerente de Obra', 'Gestión completa de proyectos asignados', false, true, NOW()), +('00000000-0000-0000-0002-000000000004', 'residente', 'Residente de Obra', 'Supervisión diaria, captura de avances, estimaciones', false, true, NOW()), +('00000000-0000-0000-0002-000000000005', 'supervisor', 'Supervisor de Campo', 'Control de obra, bitácora, avances', false, true, NOW()), +('00000000-0000-0000-0002-000000000006', 'almacenista', 'Almacenista', 'Control de inventario, entradas/salidas', false, true, NOW()), +('00000000-0000-0000-0002-000000000007', 'contabilidad', 'Contador', 'Gestión financiera, pólizas, CxP, CxC', false, true, NOW()), +('00000000-0000-0000-0002-000000000008', 'rrhh', 'Recursos Humanos', 'Gestión de personal, nómina, capacitación', false, true, NOW()), +('00000000-0000-0000-0002-000000000009', 'hse', 'Seguridad e Higiene', 'Gestión HSE, inspecciones, incidentes', false, true, NOW()), +('00000000-0000-0000-0002-000000000010', 'calidad', 'Control de Calidad', 'Inspecciones, checklists, no conformidades', false, true, NOW()), +('00000000-0000-0000-0002-000000000011', 'comprador', 'Comprador', 'Requisiciones, órdenes de compra, proveedores', false, true, NOW()), +('00000000-0000-0000-0002-000000000012', 'cliente_visor', 'Cliente (Solo Lectura)', 'Visualización de avances de su propiedad', false, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. PERMISOS DEL SISTEMA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO auth.permissions (id, code, name, module, action, description, is_active, created_at) VALUES +-- Módulo: Proyectos (construction) +('00000000-0000-0000-0002-000000001001', 'construction.view', 'Ver Proyectos', 'construction', 'view', 'Ver proyectos y fraccionamientos', true, NOW()), +('00000000-0000-0000-0002-000000001002', 'construction.create', 'Crear Proyectos', 'construction', 'create', 'Crear nuevos proyectos', true, NOW()), +('00000000-0000-0000-0002-000000001003', 'construction.edit', 'Editar Proyectos', 'construction', 'edit', 'Modificar proyectos existentes', true, NOW()), +('00000000-0000-0000-0002-000000001004', 'construction.delete', 'Eliminar Proyectos', 'construction', 'delete', 'Eliminar proyectos', true, NOW()), +('00000000-0000-0000-0002-000000001005', 'construction.approve', 'Aprobar Proyectos', 'construction', 'approve', 'Aprobar cambios en proyectos', true, NOW()), + +-- Módulo: Presupuestos (budgets) +('00000000-0000-0000-0002-000000001010', 'budgets.view', 'Ver Presupuestos', 'budgets', 'view', 'Ver presupuestos', true, NOW()), +('00000000-0000-0000-0002-000000001011', 'budgets.create', 'Crear Presupuestos', 'budgets', 'create', 'Crear presupuestos', true, NOW()), +('00000000-0000-0000-0002-000000001012', 'budgets.edit', 'Editar Presupuestos', 'budgets', 'edit', 'Modificar presupuestos', true, NOW()), +('00000000-0000-0000-0002-000000001013', 'budgets.approve', 'Aprobar Presupuestos', 'budgets', 'approve', 'Aprobar presupuestos', true, NOW()), + +-- Módulo: Avances (progress) +('00000000-0000-0000-0002-000000001020', 'progress.view', 'Ver Avances', 'progress', 'view', 'Ver avances de obra', true, NOW()), +('00000000-0000-0000-0002-000000001021', 'progress.capture', 'Capturar Avances', 'progress', 'create', 'Capturar avances', true, NOW()), +('00000000-0000-0000-0002-000000001022', 'progress.review', 'Revisar Avances', 'progress', 'review', 'Revisar avances capturados', true, NOW()), +('00000000-0000-0000-0002-000000001023', 'progress.approve', 'Aprobar Avances', 'progress', 'approve', 'Aprobar avances', true, NOW()), + +-- Módulo: Estimaciones (estimates) +('00000000-0000-0000-0002-000000001030', 'estimates.view', 'Ver Estimaciones', 'estimates', 'view', 'Ver estimaciones', true, NOW()), +('00000000-0000-0000-0002-000000001031', 'estimates.create', 'Crear Estimaciones', 'estimates', 'create', 'Crear estimaciones', true, NOW()), +('00000000-0000-0000-0002-000000001032', 'estimates.edit', 'Editar Estimaciones', 'estimates', 'edit', 'Modificar estimaciones', true, NOW()), +('00000000-0000-0000-0002-000000001033', 'estimates.submit', 'Enviar Estimaciones', 'estimates', 'submit', 'Enviar a revisión', true, NOW()), +('00000000-0000-0000-0002-000000001034', 'estimates.approve', 'Aprobar Estimaciones', 'estimates', 'approve', 'Aprobar estimaciones', true, NOW()), + +-- Módulo: Contratos (contracts) +('00000000-0000-0000-0002-000000001040', 'contracts.view', 'Ver Contratos', 'contracts', 'view', 'Ver contratos', true, NOW()), +('00000000-0000-0000-0002-000000001041', 'contracts.create', 'Crear Contratos', 'contracts', 'create', 'Crear contratos', true, NOW()), +('00000000-0000-0000-0002-000000001042', 'contracts.edit', 'Editar Contratos', 'contracts', 'edit', 'Modificar contratos', true, NOW()), +('00000000-0000-0000-0002-000000001043', 'contracts.approve', 'Aprobar Contratos', 'contracts', 'approve', 'Aprobar contratos', true, NOW()), + +-- Módulo: Calidad (quality) +('00000000-0000-0000-0002-000000001050', 'quality.view', 'Ver Calidad', 'quality', 'view', 'Ver inspecciones y NC', true, NOW()), +('00000000-0000-0000-0002-000000001051', 'quality.inspect', 'Realizar Inspecciones', 'quality', 'create', 'Ejecutar inspecciones', true, NOW()), +('00000000-0000-0000-0002-000000001052', 'quality.approve', 'Aprobar Inspecciones', 'quality', 'approve', 'Aprobar inspecciones', true, NOW()), + +-- Módulo: HSE (hse) +('00000000-0000-0000-0002-000000001060', 'hse.view', 'Ver HSE', 'hse', 'view', 'Ver módulo HSE', true, NOW()), +('00000000-0000-0000-0002-000000001061', 'hse.incidents', 'Gestionar Incidentes', 'hse', 'create', 'Registrar incidentes', true, NOW()), +('00000000-0000-0000-0002-000000001062', 'hse.training', 'Gestionar Capacitación', 'hse', 'create', 'Gestionar capacitaciones', true, NOW()), +('00000000-0000-0000-0002-000000001063', 'hse.permits', 'Permisos de Trabajo', 'hse', 'create', 'Gestionar permisos', true, NOW()), + +-- Módulo: RRHH (hr) +('00000000-0000-0000-0002-000000001070', 'hr.view', 'Ver RRHH', 'hr', 'view', 'Ver empleados', true, NOW()), +('00000000-0000-0000-0002-000000001071', 'hr.manage', 'Gestionar RRHH', 'hr', 'manage', 'Gestionar empleados', true, NOW()), + +-- Módulo: Finanzas (finance) +('00000000-0000-0000-0002-000000001080', 'finance.view', 'Ver Finanzas', 'finance', 'view', 'Ver módulo financiero', true, NOW()), +('00000000-0000-0000-0002-000000001081', 'finance.entries', 'Pólizas Contables', 'finance', 'create', 'Crear pólizas', true, NOW()), +('00000000-0000-0000-0002-000000001082', 'finance.payments', 'Pagos', 'finance', 'create', 'Registrar pagos', true, NOW()), +('00000000-0000-0000-0002-000000001083', 'finance.reconcile', 'Conciliaciones', 'finance', 'create', 'Realizar conciliaciones', true, NOW()), + +-- Módulo: Inventario (inventory) +('00000000-0000-0000-0002-000000001090', 'inventory.view', 'Ver Inventario', 'inventory', 'view', 'Ver almacén', true, NOW()), +('00000000-0000-0000-0002-000000001091', 'inventory.manage', 'Gestionar Inventario', 'inventory', 'manage', 'Movimientos de almacén', true, NOW()), + +-- Módulo: Compras (purchase) +('00000000-0000-0000-0002-000000001100', 'purchase.view', 'Ver Compras', 'purchase', 'view', 'Ver requisiciones y OC', true, NOW()), +('00000000-0000-0000-0002-000000001101', 'purchase.requisitions', 'Requisiciones', 'purchase', 'create', 'Crear requisiciones', true, NOW()), +('00000000-0000-0000-0002-000000001102', 'purchase.orders', 'Órdenes de Compra', 'purchase', 'create', 'Crear OC', true, NOW()), +('00000000-0000-0000-0002-000000001103', 'purchase.approve', 'Aprobar Compras', 'purchase', 'approve', 'Aprobar requisiciones/OC', true, NOW()), + +-- Módulo: Activos (assets) +('00000000-0000-0000-0002-000000001110', 'assets.view', 'Ver Activos', 'assets', 'view', 'Ver equipos y maquinaria', true, NOW()), +('00000000-0000-0000-0002-000000001111', 'assets.manage', 'Gestionar Activos', 'assets', 'manage', 'Gestionar activos', true, NOW()), + +-- Módulo: Documentos (documents) +('00000000-0000-0000-0002-000000001120', 'documents.view', 'Ver Documentos', 'documents', 'view', 'Ver repositorio', true, NOW()), +('00000000-0000-0000-0002-000000001121', 'documents.manage', 'Gestionar Documentos', 'documents', 'manage', 'Subir y gestionar docs', true, NOW()), + +-- Módulo: Reportes (reports) +('00000000-0000-0000-0002-000000001130', 'reports.view', 'Ver Reportes', 'reports', 'view', 'Ver reportes', true, NOW()), +('00000000-0000-0000-0002-000000001131', 'reports.export', 'Exportar Reportes', 'reports', 'export', 'Exportar a PDF/Excel', true, NOW()), + +-- Módulo: Administración (admin) +('00000000-0000-0000-0002-000000001140', 'admin.users', 'Gestionar Usuarios', 'admin', 'manage', 'Gestionar usuarios', true, NOW()), +('00000000-0000-0000-0002-000000001141', 'admin.roles', 'Gestionar Roles', 'admin', 'manage', 'Gestionar roles', true, NOW()), +('00000000-0000-0000-0002-000000001142', 'admin.settings', 'Configuración', 'admin', 'manage', 'Configuración del sistema', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. ASIGNACIÓN ROL-PERMISOS (Matriz de permisos por rol) +-- ───────────────────────────────────────────────────────────────────────────────── + +-- Super Admin: Todos los permisos +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000001', + id +FROM auth.permissions +ON CONFLICT DO NOTHING; + +-- Director: Vista general + aprobaciones +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000002', + id +FROM auth.permissions +WHERE code LIKE '%.view' + OR code LIKE '%.approve' + OR code IN ('reports.export', 'documents.view') +ON CONFLICT DO NOTHING; + +-- Gerente de Obra: Gestión de proyectos completa +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000003', + id +FROM auth.permissions +WHERE module IN ('construction', 'budgets', 'progress', 'estimates', 'contracts', 'quality', 'hse', 'reports', 'documents') +ON CONFLICT DO NOTHING; + +-- Residente: Operación diaria +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000004', + id +FROM auth.permissions +WHERE code IN ( + 'construction.view', 'budgets.view', + 'progress.view', 'progress.capture', 'progress.review', + 'estimates.view', 'estimates.create', 'estimates.edit', 'estimates.submit', + 'quality.view', 'quality.inspect', + 'hse.view', 'hse.incidents', + 'documents.view', 'documents.manage', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- Supervisor: Campo +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000005', + id +FROM auth.permissions +WHERE code IN ( + 'construction.view', 'progress.view', 'progress.capture', + 'quality.view', 'quality.inspect', + 'hse.view', 'hse.incidents', + 'inventory.view', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- Almacenista +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000006', + id +FROM auth.permissions +WHERE code IN ( + 'inventory.view', 'inventory.manage', + 'purchase.view', + 'assets.view', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- Contador +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000007', + id +FROM auth.permissions +WHERE code IN ( + 'finance.view', 'finance.entries', 'finance.payments', 'finance.reconcile', + 'estimates.view', + 'contracts.view', + 'purchase.view', + 'reports.view', 'reports.export' +) +ON CONFLICT DO NOTHING; + +-- RRHH +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000008', + id +FROM auth.permissions +WHERE code IN ( + 'hr.view', 'hr.manage', + 'hse.view', 'hse.training', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- HSE +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000009', + id +FROM auth.permissions +WHERE code IN ( + 'hse.view', 'hse.incidents', 'hse.training', 'hse.permits', + 'hr.view', + 'construction.view', + 'reports.view', 'reports.export' +) +ON CONFLICT DO NOTHING; + +-- Calidad +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000010', + id +FROM auth.permissions +WHERE code IN ( + 'quality.view', 'quality.inspect', 'quality.approve', + 'construction.view', + 'documents.view', 'documents.manage', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- Comprador +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000011', + id +FROM auth.permissions +WHERE code IN ( + 'purchase.view', 'purchase.requisitions', 'purchase.orders', + 'inventory.view', + 'contracts.view', + 'reports.view' +) +ON CONFLICT DO NOTHING; + +-- Cliente Visor (solo lectura limitada) +INSERT INTO auth.role_permissions (role_id, permission_id) +SELECT + '00000000-0000-0000-0002-000000000012', + id +FROM auth.permissions +WHERE code IN ('construction.view', 'progress.view', 'documents.view') +ON CONFLICT DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. USUARIOS DEMO +-- ───────────────────────────────────────────────────────────────────────────────── +-- Password: Demo2026! (hash bcrypt con salt 10) +-- Hash generado: $2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB + +INSERT INTO auth.users ( + id, email, password_hash, first_name, last_name, + is_active, is_verified, is_system, created_at +) VALUES +-- Super Admin +('00000000-0000-0000-0002-000000000101', 'admin@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Admin', 'Sistema', true, true, true, NOW()), + +-- Director +('00000000-0000-0000-0002-000000000102', 'director@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Juan Carlos', 'Director Méndez', true, true, false, NOW()), + +-- Gerente de Obra +('00000000-0000-0000-0002-000000000103', 'gerente1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'María Elena', 'Gerente Torres', true, true, false, NOW()), + +-- Residente +('00000000-0000-0000-0002-000000000104', 'residente1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Carlos Alberto', 'Residente López', true, true, false, NOW()), + +-- Supervisor +('00000000-0000-0000-0002-000000000105', 'supervisor1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Ana María', 'Supervisora García', true, true, false, NOW()), + +-- Almacenista +('00000000-0000-0000-0002-000000000106', 'almacen1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Luis Fernando', 'Almacén Ruiz', true, true, false, NOW()), + +-- Contador +('00000000-0000-0000-0002-000000000107', 'contador1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Rosa María', 'Contadora Hernández', true, true, false, NOW()), + +-- RRHH +('00000000-0000-0000-0002-000000000108', 'rrhh1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Pedro Pablo', 'Recursos Martínez', true, true, false, NOW()), + +-- HSE +('00000000-0000-0000-0002-000000000109', 'hse1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Elena Patricia', 'Seguridad Sánchez', true, true, false, NOW()), + +-- Calidad +('00000000-0000-0000-0002-000000000110', 'calidad1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Diego Armando', 'Calidad Rodríguez', true, true, false, NOW()), + +-- Comprador +('00000000-0000-0000-0002-000000000111', 'comprador1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Laura Patricia', 'Compras Jiménez', true, true, false, NOW()), + +-- Cliente Visor +('00000000-0000-0000-0002-000000000112', 'visor1@demo.com', + '$2a$10$rQnP.xNj7Y8hVJYw5v5qYeKKq5PmBnvTYmNZz6KXy5vJYmH5XYZAB', + 'Cliente', 'Demo Comprador', true, true, false, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. ASIGNACIÓN USUARIO-ROL +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO auth.user_roles (user_id, role_id, is_primary, created_at) VALUES +('00000000-0000-0000-0002-000000000101', '00000000-0000-0000-0002-000000000001', true, NOW()), -- admin -> super_admin +('00000000-0000-0000-0002-000000000102', '00000000-0000-0000-0002-000000000002', true, NOW()), -- director -> director +('00000000-0000-0000-0002-000000000103', '00000000-0000-0000-0002-000000000003', true, NOW()), -- gerente1 -> gerente_obra +('00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000004', true, NOW()), -- residente1 -> residente +('00000000-0000-0000-0002-000000000105', '00000000-0000-0000-0002-000000000005', true, NOW()), -- supervisor1 -> supervisor +('00000000-0000-0000-0002-000000000106', '00000000-0000-0000-0002-000000000006', true, NOW()), -- almacen1 -> almacenista +('00000000-0000-0000-0002-000000000107', '00000000-0000-0000-0002-000000000007', true, NOW()), -- contador1 -> contabilidad +('00000000-0000-0000-0002-000000000108', '00000000-0000-0000-0002-000000000008', true, NOW()), -- rrhh1 -> rrhh +('00000000-0000-0000-0002-000000000109', '00000000-0000-0000-0002-000000000009', true, NOW()), -- hse1 -> hse +('00000000-0000-0000-0002-000000000110', '00000000-0000-0000-0002-000000000010', true, NOW()), -- calidad1 -> calidad +('00000000-0000-0000-0002-000000000111', '00000000-0000-0000-0002-000000000011', true, NOW()), -- comprador1 -> comprador +('00000000-0000-0000-0002-000000000112', '00000000-0000-0000-0002-000000000012', true, NOW()) -- visor1 -> cliente_visor +ON CONFLICT DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_roles INTEGER; + v_permissions INTEGER; + v_users INTEGER; + v_role_perms INTEGER; +BEGIN + SELECT COUNT(*) INTO v_roles FROM auth.roles; + SELECT COUNT(*) INTO v_permissions FROM auth.permissions; + SELECT COUNT(*) INTO v_users FROM auth.users; + SELECT COUNT(*) INTO v_role_perms FROM auth.role_permissions; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 02 - USUARIOS Y PERFILES - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Roles: %', v_roles; + RAISE NOTICE 'Permisos: %', v_permissions; + RAISE NOTICE 'Usuarios: %', v_users; + RAISE NOTICE 'Asignaciones rol-permiso: %', v_role_perms; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 02 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/03-empresa-tenant.sql b/seeds/dev/03-empresa-tenant.sql new file mode 100644 index 0000000..3d5c1b4 --- /dev/null +++ b/seeds/dev/03-empresa-tenant.sql @@ -0,0 +1,294 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 03: EMPRESA Y ESTRUCTURA ORGANIZACIONAL +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Tenant demo, sucursales, almacenes, configuración +-- Dependencias: 01-core-catalogs.sql, 02-users-profiles.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs determinísticos: +-- Prefijo: 00000000-0000-0000-0003-XXXXXXXXXXXX para empresa/tenant + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. TENANT (EMPRESA) PRINCIPAL +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO tenants.tenants ( + id, code, name, legal_name, rfc, + business_type, status, + address_street, address_city, address_state, address_zip, address_country, + phone, email, website, + logo_url, primary_color, secondary_color, + fiscal_regime, cfdi_certificate_number, + is_active, created_at, created_by +) VALUES ( + '00000000-0000-0000-0003-000000000001', + 'DEMO001', + 'Constructora Demo', + 'Constructora Demo S.A. de C.V.', + 'CDM010101ABC', + 'construccion_residencial', + 'active', + 'Av. Tecnológico 1500, Parque Industrial', + 'Aguascalientes', + 'Aguascalientes', + '20290', + 'México', + '+52 449 123 4567', + 'contacto@constructorademo.com', + 'https://www.constructorademo.com', + '/assets/logos/demo-logo.png', + '#1E40AF', -- Azul corporativo + '#F59E0B', -- Amarillo construcción + '601', -- Régimen General de Ley PM + 'CSD00001234567890', + true, + NOW(), + '00000000-0000-0000-0002-000000000101' -- admin +) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. CONFIGURACIÓN DEL TENANT +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO tenants.tenant_settings (id, tenant_id, setting_key, setting_value, setting_type, created_at) VALUES +-- General +('00000000-0000-0000-0003-000000000101', '00000000-0000-0000-0003-000000000001', + 'timezone', 'America/Mexico_City', 'string', NOW()), +('00000000-0000-0000-0003-000000000102', '00000000-0000-0000-0003-000000000001', + 'locale', 'es-MX', 'string', NOW()), +('00000000-0000-0000-0003-000000000103', '00000000-0000-0000-0003-000000000001', + 'currency', 'MXN', 'string', NOW()), +('00000000-0000-0000-0003-000000000104', '00000000-0000-0000-0003-000000000001', + 'date_format', 'DD/MM/YYYY', 'string', NOW()), + +-- Construcción +('00000000-0000-0000-0003-000000000110', '00000000-0000-0000-0003-000000000001', + 'default_retention_percentage', '5', 'number', NOW()), +('00000000-0000-0000-0003-000000000111', '00000000-0000-0000-0003-000000000001', + 'default_advance_percentage', '30', 'number', NOW()), +('00000000-0000-0000-0003-000000000112', '00000000-0000-0000-0003-000000000001', + 'estimate_period_days', '15', 'number', NOW()), +('00000000-0000-0000-0003-000000000113', '00000000-0000-0000-0003-000000000001', + 'require_photos_for_advances', 'true', 'boolean', NOW()), + +-- HSE +('00000000-0000-0000-0003-000000000120', '00000000-0000-0000-0003-000000000001', + 'hse_incident_auto_notify', 'true', 'boolean', NOW()), +('00000000-0000-0000-0003-000000000121', '00000000-0000-0000-0003-000000000001', + 'hse_require_daily_checkin', 'true', 'boolean', NOW()), + +-- Finanzas +('00000000-0000-0000-0003-000000000130', '00000000-0000-0000-0003-000000000001', + 'fiscal_year_start_month', '1', 'number', NOW()), +('00000000-0000-0000-0003-000000000131', '00000000-0000-0000-0003-000000000001', + 'default_payment_terms_days', '30', 'number', NOW()), + +-- Notificaciones +('00000000-0000-0000-0003-000000000140', '00000000-0000-0000-0003-000000000001', + 'email_notifications_enabled', 'true', 'boolean', NOW()), +('00000000-0000-0000-0003-000000000141', '00000000-0000-0000-0003-000000000001', + 'sms_notifications_enabled', 'false', 'boolean', NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. SUCURSALES / BRANCHES +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO tenants.branches ( + id, tenant_id, code, name, branch_type, + address_street, address_city, address_state, address_zip, + phone, email, + manager_id, + is_headquarters, is_active, created_at +) VALUES +-- Matriz +('00000000-0000-0000-0003-000000000201', '00000000-0000-0000-0003-000000000001', + 'MATRIZ', 'Oficinas Corporativas', 'headquarters', + 'Av. Tecnológico 1500, Parque Industrial', 'Aguascalientes', 'Aguascalientes', '20290', + '+52 449 123 4567', 'matriz@constructorademo.com', + '00000000-0000-0000-0002-000000000102', -- director + true, true, NOW()), + +-- Sucursal Obra Norte +('00000000-0000-0000-0003-000000000202', '00000000-0000-0000-0003-000000000001', + 'OBRA-NORTE', 'Oficina de Obra - Zona Norte', 'field_office', + 'Carr. Panamericana Km 15', 'Aguascalientes', 'Aguascalientes', '20340', + '+52 449 234 5678', 'obranorte@constructorademo.com', + '00000000-0000-0000-0002-000000000103', -- gerente1 + false, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. ALMACENES +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO inventory.warehouses ( + id, tenant_id, branch_id, code, name, warehouse_type, + address_street, address_city, address_state, + manager_id, + is_default, is_active, created_at +) VALUES +-- Almacén Central (Matriz) +('00000000-0000-0000-0003-000000000301', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0003-000000000201', + 'ALM-CENTRAL', 'Almacén Central', 'central', + 'Av. Tecnológico 1500', 'Aguascalientes', 'Aguascalientes', + '00000000-0000-0000-0002-000000000106', -- almacenista + true, true, NOW()), + +-- Almacén de Obra (Palmas) +('00000000-0000-0000-0003-000000000302', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0003-000000000202', + 'ALM-PALMAS', 'Almacén Residencial Las Palmas', 'field', + 'Dentro del fraccionamiento Las Palmas', 'Aguascalientes', 'Aguascalientes', + NULL, + false, true, NOW()), + +-- Almacén de Obra (Diamante) +('00000000-0000-0000-0003-000000000303', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0003-000000000202', + 'ALM-DIAMANTE', 'Almacén Torre Diamante', 'field', + 'Torre Diamante, Zona Centro', 'Aguascalientes', 'Aguascalientes', + NULL, + false, true, NOW()), + +-- Almacén de Tránsito +('00000000-0000-0000-0003-000000000304', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0003-000000000201', + 'ALM-TRANSITO', 'Almacén de Tránsito', 'transit', + 'Av. Tecnológico 1500', 'Aguascalientes', 'Aguascalientes', + NULL, + false, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. ASIGNAR USUARIOS AL TENANT +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO auth.user_tenants (user_id, tenant_id, is_default, is_active, created_at) VALUES +('00000000-0000-0000-0002-000000000101', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000102', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000103', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000105', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000106', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000107', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000108', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000109', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000110', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000111', '00000000-0000-0000-0003-000000000001', true, true, NOW()), +('00000000-0000-0000-0002-000000000112', '00000000-0000-0000-0003-000000000001', true, true, NOW()) +ON CONFLICT DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 6. PERFILES DE USUARIO (Datos adicionales) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO profiles.user_profiles ( + id, user_id, tenant_id, + phone, mobile, job_title, department, + avatar_url, bio, + preferences, + created_at +) VALUES +('00000000-0000-0000-0003-000000000401', '00000000-0000-0000-0002-000000000101', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0001', '+52 449 200 0001', 'Administrador del Sistema', 'TI', + '/avatars/admin.png', 'Administrador general del sistema ERP', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000402', '00000000-0000-0000-0002-000000000102', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0002', '+52 449 200 0002', 'Director General', 'Dirección', + '/avatars/director.png', 'Director General de Constructora Demo', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000403', '00000000-0000-0000-0002-000000000103', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0003', '+52 449 200 0003', 'Gerente de Proyectos', 'Construcción', + '/avatars/gerente.png', 'Gerente de proyectos con 15 años de experiencia', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000404', '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0004', '+52 449 200 0004', 'Residente de Obra', 'Construcción', + '/avatars/residente.png', 'Residente de obra certificado CMIC', + '{"theme": "dark", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000405', '00000000-0000-0000-0002-000000000105', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0005', '+52 449 200 0005', 'Supervisor de Campo', 'Construcción', + '/avatars/supervisor.png', 'Supervisor con experiencia en obra residencial', + '{"theme": "dark", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000406', '00000000-0000-0000-0002-000000000106', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0006', '+52 449 200 0006', 'Jefe de Almacén', 'Logística', + '/avatars/almacen.png', 'Responsable de control de inventarios', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000407', '00000000-0000-0000-0002-000000000107', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0007', '+52 449 200 0007', 'Contador General', 'Finanzas', + '/avatars/contador.png', 'CPA con especialidad en construcción', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000408', '00000000-0000-0000-0002-000000000108', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0008', '+52 449 200 0008', 'Coordinador de RRHH', 'Recursos Humanos', + '/avatars/rrhh.png', 'Especialista en gestión de personal de construcción', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000409', '00000000-0000-0000-0002-000000000109', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0009', '+52 449 200 0009', 'Coordinador HSE', 'Seguridad', + '/avatars/hse.png', 'Certificado STPS en seguridad industrial', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000410', '00000000-0000-0000-0002-000000000110', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0010', '+52 449 200 0010', 'Inspector de Calidad', 'Calidad', + '/avatars/calidad.png', 'Inspector certificado ISO 9001', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000411', '00000000-0000-0000-0002-000000000111', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0011', '+52 449 200 0011', 'Comprador', 'Compras', + '/avatars/compras.png', 'Especialista en compras de construcción', + '{"theme": "light", "notifications": true}'::jsonb, NOW()), + +('00000000-0000-0000-0003-000000000412', '00000000-0000-0000-0002-000000000112', '00000000-0000-0000-0003-000000000001', + '+52 449 100 0012', '+52 449 200 0012', 'Cliente', 'Externo', + '/avatars/cliente.png', 'Cliente del fraccionamiento Las Palmas', + '{"theme": "light", "notifications": true}'::jsonb, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_tenants INTEGER; + v_branches INTEGER; + v_warehouses INTEGER; + v_user_tenants INTEGER; + v_profiles INTEGER; +BEGIN + SELECT COUNT(*) INTO v_tenants FROM tenants.tenants; + SELECT COUNT(*) INTO v_branches FROM tenants.branches; + SELECT COUNT(*) INTO v_warehouses FROM inventory.warehouses; + SELECT COUNT(*) INTO v_user_tenants FROM auth.user_tenants; + SELECT COUNT(*) INTO v_profiles FROM profiles.user_profiles; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 03 - EMPRESA Y ESTRUCTURA - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Tenants (empresas): %', v_tenants; + RAISE NOTICE 'Sucursales: %', v_branches; + RAISE NOTICE 'Almacenes: %', v_warehouses; + RAISE NOTICE 'Usuarios asignados a tenant: %', v_user_tenants; + RAISE NOTICE 'Perfiles de usuario: %', v_profiles; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 03 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/04-proyectos-obras.sql b/seeds/dev/04-proyectos-obras.sql new file mode 100644 index 0000000..ac79be9 --- /dev/null +++ b/seeds/dev/04-proyectos-obras.sql @@ -0,0 +1,417 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 04: PROYECTOS Y OBRAS +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Fraccionamientos, etapas, lotes, torres, departamentos, subcontratistas +-- Dependencias: 02-users-profiles.sql, 03-empresa-tenant.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs determinísticos: +-- Prefijo: 00000000-0000-0000-0004-XXXXXXXXXXXX para proyectos/obras + +-- Constantes +-- tenant_id: 00000000-0000-0000-0003-000000000001 + +BEGIN; + +-- Variable para el tenant +DO $$ +DECLARE + v_tenant_id UUID := '00000000-0000-0000-0003-000000000001'; + v_admin_id UUID := '00000000-0000-0000-0002-000000000101'; + v_gerente_id UUID := '00000000-0000-0000-0002-000000000103'; +BEGIN + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. PROTOTIPOS DE VIVIENDA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.prototipos ( + id, tenant_id, code, name, type, + area_construction_m2, area_terrain_m2, + bedrooms, bathrooms, parking_spaces, floors, + base_price, is_active, created_at, created_by +) VALUES +-- Horizontal - Casa tipo +('00000000-0000-0000-0004-000000000001', v_tenant_id, + 'CASA-90', 'Casa Tipo 90', 'horizontal', + 90.00, 120.00, 3, 2.5, 2, 2, 1850000.00, true, NOW(), v_admin_id), + +('00000000-0000-0000-0004-000000000002', v_tenant_id, + 'CASA-120', 'Casa Tipo 120', 'horizontal', + 120.00, 150.00, 4, 3.0, 2, 2, 2450000.00, true, NOW(), v_admin_id), + +('00000000-0000-0000-0004-000000000003', v_tenant_id, + 'CASA-150', 'Casa Premium 150', 'horizontal', + 150.00, 200.00, 4, 3.5, 3, 2, 3200000.00, true, NOW(), v_admin_id), + +-- Vertical - Departamentos +('00000000-0000-0000-0004-000000000004', v_tenant_id, + 'DEPTO-65', 'Departamento 65', 'vertical', + 65.00, NULL, 2, 1.0, 1, 1, 1250000.00, true, NOW(), v_admin_id), + +('00000000-0000-0000-0004-000000000005', v_tenant_id, + 'DEPTO-85', 'Departamento 85', 'vertical', + 85.00, NULL, 2, 2.0, 1, 1, 1650000.00, true, NOW(), v_admin_id), + +('00000000-0000-0000-0004-000000000006', v_tenant_id, + 'DEPTO-110', 'Departamento Premium 110', 'vertical', + 110.00, NULL, 3, 2.0, 2, 1, 2150000.00, true, NOW(), v_admin_id) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. FRACCIONAMIENTOS (PROYECTOS) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.fraccionamientos ( + id, tenant_id, code, name, status, + project_type, total_lots, total_area_m2, buildable_area_m2, + address, city, state, zip_code, + start_date, estimated_end_date, + is_active, created_at, created_by +) VALUES +-- Proyecto 1: Horizontal - En construcción +('00000000-0000-0000-0004-000000000101', v_tenant_id, + 'PALMAS-2024', 'Residencial Las Palmas', 'in_progress', + 'horizontal', 120, 45000.00, 38000.00, + 'Carr. Panamericana Norte Km 15', 'Aguascalientes', 'Aguascalientes', '20340', + '2024-03-01', '2026-12-31', + true, NOW(), v_gerente_id), + +-- Proyecto 2: Vertical - En construcción +('00000000-0000-0000-0004-000000000102', v_tenant_id, + 'DIAMANTE-2024', 'Torre Diamante', 'in_progress', + 'vertical', 48, 8500.00, 6200.00, + 'Blvd. A Zacatecas 1200, Centro', 'Aguascalientes', 'Aguascalientes', '20000', + '2024-06-01', '2027-06-30', + true, NOW(), v_gerente_id), + +-- Proyecto 3: Comercial - En planeación +('00000000-0000-0000-0004-000000000103', v_tenant_id, + 'PLAZA-2025', 'Plaza Central', 'planning', + 'commercial', 24, 12000.00, 9500.00, + 'Av. López Mateos 500', 'Aguascalientes', 'Aguascalientes', '20230', + '2025-01-15', '2026-06-30', + true, NOW(), v_gerente_id) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. ETAPAS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.etapas ( + id, tenant_id, fraccionamiento_id, code, name, sequence, status, + total_lots, start_date, end_date, + created_at, created_by +) VALUES +-- Las Palmas - 3 etapas +('00000000-0000-0000-0004-000000000201', v_tenant_id, + '00000000-0000-0000-0004-000000000101', + 'PALMAS-E1', 'Etapa 1 - Norte', 1, 'in_progress', + 40, '2024-03-01', '2025-06-30', NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000202', v_tenant_id, + '00000000-0000-0000-0004-000000000101', + 'PALMAS-E2', 'Etapa 2 - Centro', 2, 'planning', + 40, '2025-07-01', '2026-06-30', NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000203', v_tenant_id, + '00000000-0000-0000-0004-000000000101', + 'PALMAS-E3', 'Etapa 3 - Sur', 3, 'draft', + 40, '2026-07-01', '2026-12-31', NOW(), v_gerente_id), + +-- Torre Diamante - 1 etapa (es una sola torre) +('00000000-0000-0000-0004-000000000204', v_tenant_id, + '00000000-0000-0000-0004-000000000102', + 'DIAMANTE-E1', 'Torre Principal', 1, 'in_progress', + 48, '2024-06-01', '2027-06-30', NOW(), v_gerente_id), + +-- Plaza Central - 2 etapas +('00000000-0000-0000-0004-000000000205', v_tenant_id, + '00000000-0000-0000-0004-000000000103', + 'PLAZA-E1', 'Fase 1 - Locales Ancla', 1, 'planning', + 12, '2025-01-15', '2025-12-31', NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000206', v_tenant_id, + '00000000-0000-0000-0004-000000000103', + 'PLAZA-E2', 'Fase 2 - Locales Menores', 2, 'draft', + 12, '2026-01-01', '2026-06-30', NOW(), v_gerente_id) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. MANZANAS (Para Las Palmas - Horizontal) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.manzanas ( + id, tenant_id, etapa_id, code, name, total_lots, + created_at, created_by +) VALUES +-- Etapa 1 - 4 manzanas de 10 lotes cada una +('00000000-0000-0000-0004-000000000301', v_tenant_id, + '00000000-0000-0000-0004-000000000201', + 'M1-A', 'Manzana A', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000302', v_tenant_id, + '00000000-0000-0000-0004-000000000201', + 'M1-B', 'Manzana B', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000303', v_tenant_id, + '00000000-0000-0000-0004-000000000201', + 'M1-C', 'Manzana C', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000304', v_tenant_id, + '00000000-0000-0000-0004-000000000201', + 'M1-D', 'Manzana D', 10, NOW(), v_gerente_id), + +-- Etapa 2 - 4 manzanas +('00000000-0000-0000-0004-000000000305', v_tenant_id, + '00000000-0000-0000-0004-000000000202', + 'M2-A', 'Manzana A', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000306', v_tenant_id, + '00000000-0000-0000-0004-000000000202', + 'M2-B', 'Manzana B', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000307', v_tenant_id, + '00000000-0000-0000-0004-000000000202', + 'M2-C', 'Manzana C', 10, NOW(), v_gerente_id), + +('00000000-0000-0000-0004-000000000308', v_tenant_id, + '00000000-0000-0000-0004-000000000202', + 'M2-D', 'Manzana D', 10, NOW(), v_gerente_id) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. TORRES (Para Torre Diamante - Vertical) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.torres ( + id, tenant_id, etapa_id, code, name, + total_floors, total_units, status, + created_at, created_by +) VALUES +('00000000-0000-0000-0004-000000000401', v_tenant_id, + '00000000-0000-0000-0004-000000000204', + 'TORRE-A', 'Torre A - Diamante', 12, 48, 'in_progress', + NOW(), v_gerente_id) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 6. NIVELES (Pisos de la torre) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.niveles ( + id, tenant_id, torre_id, floor_number, name, total_units, + created_at, created_by +) VALUES +('00000000-0000-0000-0004-000000000501', v_tenant_id, '00000000-0000-0000-0004-000000000401', 1, 'Planta Baja', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000502', v_tenant_id, '00000000-0000-0000-0004-000000000401', 2, 'Nivel 2', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000503', v_tenant_id, '00000000-0000-0000-0004-000000000401', 3, 'Nivel 3', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000504', v_tenant_id, '00000000-0000-0000-0004-000000000401', 4, 'Nivel 4', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000505', v_tenant_id, '00000000-0000-0000-0004-000000000401', 5, 'Nivel 5', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000506', v_tenant_id, '00000000-0000-0000-0004-000000000401', 6, 'Nivel 6', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000507', v_tenant_id, '00000000-0000-0000-0004-000000000401', 7, 'Nivel 7', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000508', v_tenant_id, '00000000-0000-0000-0004-000000000401', 8, 'Nivel 8', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000509', v_tenant_id, '00000000-0000-0000-0004-000000000401', 9, 'Nivel 9', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000510', v_tenant_id, '00000000-0000-0000-0004-000000000401', 10, 'Nivel 10', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000511', v_tenant_id, '00000000-0000-0000-0004-000000000401', 11, 'Nivel 11', 4, NOW(), v_gerente_id), +('00000000-0000-0000-0004-000000000512', v_tenant_id, '00000000-0000-0000-0004-000000000401', 12, 'Penthouse', 4, NOW(), v_gerente_id) +ON CONFLICT (id) DO NOTHING; + +END $$; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 7. LOTES (Manzana A - Etapa 1 - Las Palmas) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.lotes ( + id, tenant_id, manzana_id, prototipo_id, + code, official_number, status, + area_m2, front_m, depth_m, + price_base, price_final, + created_at, created_by +) VALUES +-- Manzana A - 10 lotes +('00000000-0000-0000-0004-000000000601', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-01', '1', 'delivered', 120.00, 8.00, 15.00, 1850000.00, 1900000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000602', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-02', '2', 'delivered', 120.00, 8.00, 15.00, 1850000.00, 1900000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000603', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000002', + 'A-03', '3', 'under_construction', 150.00, 10.00, 15.00, 2450000.00, 2500000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000604', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000002', + 'A-04', '4', 'under_construction', 150.00, 10.00, 15.00, 2450000.00, 2500000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000605', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-05', '5', 'sold', 120.00, 8.00, 15.00, 1850000.00, 1880000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000606', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-06', '6', 'sold', 120.00, 8.00, 15.00, 1850000.00, 1880000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000607', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000003', + 'A-07', '7', 'reserved', 200.00, 12.50, 16.00, 3200000.00, 3300000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000608', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000003', + 'A-08', '8', 'available', 200.00, 12.50, 16.00, 3200000.00, 3300000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000609', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-09', '9', 'available', 120.00, 8.00, 15.00, 1850000.00, 1850000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000610', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000301', '00000000-0000-0000-0004-000000000001', + 'A-10', '10', 'available', 120.00, 8.00, 15.00, 1850000.00, 1850000.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Manzana B - 10 lotes más +('00000000-0000-0000-0004-000000000611', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000302', '00000000-0000-0000-0004-000000000001', + 'B-01', '11', 'under_construction', 120.00, 8.00, 15.00, 1850000.00, 1900000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000612', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000302', '00000000-0000-0000-0004-000000000001', + 'B-02', '12', 'under_construction', 120.00, 8.00, 15.00, 1850000.00, 1900000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000613', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000302', '00000000-0000-0000-0004-000000000002', + 'B-03', '13', 'sold', 150.00, 10.00, 15.00, 2450000.00, 2480000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000614', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000302', '00000000-0000-0000-0004-000000000002', + 'B-04', '14', 'available', 150.00, 10.00, 15.00, 2450000.00, 2450000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000615', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000302', '00000000-0000-0000-0004-000000000001', + 'B-05', '15', 'available', 120.00, 8.00, 15.00, 1850000.00, 1850000.00, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 8. DEPARTAMENTOS (Torre Diamante - Primeros 4 niveles) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.departamentos ( + id, tenant_id, nivel_id, prototipo_id, + code, unit_number, status, + area_m2, price_base, price_final, + created_at, created_by +) VALUES +-- Nivel 1 (Planta Baja) - 4 deptos +('00000000-0000-0000-0004-000000000701', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000501', '00000000-0000-0000-0004-000000000004', + 'A-101', '101', 'delivered', 65.00, 1250000.00, 1300000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000702', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000501', '00000000-0000-0000-0004-000000000005', + 'A-102', '102', 'delivered', 85.00, 1650000.00, 1700000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000703', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000501', '00000000-0000-0000-0004-000000000005', + 'A-103', '103', 'sold', 85.00, 1650000.00, 1680000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000704', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000501', '00000000-0000-0000-0004-000000000004', + 'A-104', '104', 'sold', 65.00, 1250000.00, 1280000.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Nivel 2 - 4 deptos +('00000000-0000-0000-0004-000000000705', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000502', '00000000-0000-0000-0004-000000000004', + 'A-201', '201', 'under_construction', 65.00, 1250000.00, 1320000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000706', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000502', '00000000-0000-0000-0004-000000000005', + 'A-202', '202', 'under_construction', 85.00, 1650000.00, 1720000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000707', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000502', '00000000-0000-0000-0004-000000000005', + 'A-203', '203', 'reserved', 85.00, 1650000.00, 1720000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000708', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000502', '00000000-0000-0000-0004-000000000004', + 'A-204', '204', 'available', 65.00, 1250000.00, 1320000.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Nivel 3 - 4 deptos +('00000000-0000-0000-0004-000000000709', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000503', '00000000-0000-0000-0004-000000000004', + 'A-301', '301', 'available', 65.00, 1250000.00, 1340000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000710', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000503', '00000000-0000-0000-0004-000000000005', + 'A-302', '302', 'available', 85.00, 1650000.00, 1740000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000711', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000503', '00000000-0000-0000-0004-000000000006', + 'A-303', '303', 'available', 110.00, 2150000.00, 2250000.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0004-000000000712', '00000000-0000-0000-0003-000000000001', '00000000-0000-0000-0004-000000000503', '00000000-0000-0000-0004-000000000004', + 'A-304', '304', 'available', 65.00, 1250000.00, 1340000.00, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 9. SUBCONTRATISTAS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.subcontratistas ( + id, tenant_id, code, name, legal_name, tax_id, + specialty, contact_name, contact_phone, contact_email, + rating, is_active, created_at, created_by +) VALUES +('00000000-0000-0000-0004-000000000801', '00000000-0000-0000-0003-000000000001', + 'SUB-001', 'Cimientos del Norte', 'Cimientos del Norte S.A. de C.V.', 'CNO010101AAA', + 'Cimentación y Estructuras', 'Roberto Fundación', '+52 449 111 1111', 'contacto@cimientosnorte.com', + 4.5, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000802', '00000000-0000-0000-0003-000000000001', + 'SUB-002', 'Electrificaciones AGS', 'Electrificaciones AGS S.A. de C.V.', 'EAG010101BBB', + 'Instalaciones Eléctricas', 'Luis Voltaje', '+52 449 222 2222', 'luis@electroags.com', + 4.8, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000803', '00000000-0000-0000-0003-000000000001', + 'SUB-003', 'Plomería Integral', 'Plomería Integral de Aguascalientes S.A. de C.V.', 'PIA010101CCC', + 'Instalaciones Hidráulicas y Sanitarias', 'Pedro Tubería', '+52 449 333 3333', 'pedro@plomeriaintegral.com', + 4.2, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000804', '00000000-0000-0000-0003-000000000001', + 'SUB-004', 'Acabados Finos', 'Acabados Finos y Decoración S.A. de C.V.', 'AFD010101DDD', + 'Acabados y Pintura', 'María Acabado', '+52 449 444 4444', 'maria@acabadosfinos.com', + 4.6, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000805', '00000000-0000-0000-0003-000000000001', + 'SUB-005', 'Herrería Artística', 'Herrería y Cancelería Artística S.A. de C.V.', 'HCA010101EEE', + 'Herrería y Cancelería', 'José Fierro', '+52 449 555 5555', 'jose@herreriaartistica.com', + 4.3, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000806', '00000000-0000-0000-0003-000000000001', + 'SUB-006', 'Carpintería Moderna', 'Carpintería y Cocinas Modernas S.A. de C.V.', 'CCM010101FFF', + 'Carpintería y Cocinas', 'Francisco Madera', '+52 449 666 6666', 'francisco@carpinteriamoderna.com', + 4.7, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000807', '00000000-0000-0000-0003-000000000001', + 'SUB-007', 'Impermeabilizantes Pro', 'Impermeabilizaciones Profesionales S.A. de C.V.', 'IPR010101GGG', + 'Impermeabilización', 'Carlos Impermeable', '+52 449 777 7777', 'carlos@imperpro.com', + 4.4, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000808', '00000000-0000-0000-0003-000000000001', + 'SUB-008', 'Pisos y Azulejos', 'Pisos y Azulejos del Centro S.A. de C.V.', 'PAC010101HHH', + 'Pisos y Recubrimientos', 'Ana Piso', '+52 449 888 8888', 'ana@pisosyazulejos.com', + 4.5, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000809', '00000000-0000-0000-0003-000000000001', + 'SUB-009', 'Vidrios y Cristales', 'Vidrios y Cristalería Premium S.A. de C.V.', 'VCP010101III', + 'Vidrio y Aluminio', 'Raúl Cristal', '+52 449 999 9999', 'raul@vidriospremium.com', + 4.1, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0004-000000000810', '00000000-0000-0000-0003-000000000001', + 'SUB-010', 'Jardinería Integral', 'Jardinería y Paisajismo Integral S.A. de C.V.', 'JPI010101JJJ', + 'Jardinería y Áreas Verdes', 'Elena Verde', '+52 449 101 0101', 'elena@jardineriaintegral.com', + 4.9, true, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_prototipos INTEGER; + v_fraccionamientos INTEGER; + v_etapas INTEGER; + v_manzanas INTEGER; + v_torres INTEGER; + v_niveles INTEGER; + v_lotes INTEGER; + v_departamentos INTEGER; + v_subcontratistas INTEGER; +BEGIN + SELECT COUNT(*) INTO v_prototipos FROM construction.prototipos; + SELECT COUNT(*) INTO v_fraccionamientos FROM construction.fraccionamientos; + SELECT COUNT(*) INTO v_etapas FROM construction.etapas; + SELECT COUNT(*) INTO v_manzanas FROM construction.manzanas; + SELECT COUNT(*) INTO v_torres FROM construction.torres; + SELECT COUNT(*) INTO v_niveles FROM construction.niveles; + SELECT COUNT(*) INTO v_lotes FROM construction.lotes; + SELECT COUNT(*) INTO v_departamentos FROM construction.departamentos; + SELECT COUNT(*) INTO v_subcontratistas FROM construction.subcontratistas; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 04 - PROYECTOS Y OBRAS - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Prototipos: %', v_prototipos; + RAISE NOTICE 'Fraccionamientos: %', v_fraccionamientos; + RAISE NOTICE 'Etapas: %', v_etapas; + RAISE NOTICE 'Manzanas: %', v_manzanas; + RAISE NOTICE 'Torres: %', v_torres; + RAISE NOTICE 'Niveles: %', v_niveles; + RAISE NOTICE 'Lotes: %', v_lotes; + RAISE NOTICE 'Departamentos: %', v_departamentos; + RAISE NOTICE 'Subcontratistas: %', v_subcontratistas; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 04 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/05-presupuestos.sql b/seeds/dev/05-presupuestos.sql new file mode 100644 index 0000000..d4dbc37 --- /dev/null +++ b/seeds/dev/05-presupuestos.sql @@ -0,0 +1,320 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 05: PRESUPUESTOS Y CONCEPTOS DE OBRA +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Catálogo de conceptos CMIC, presupuestos, partidas, programa de obra +-- Dependencias: 03-empresa-tenant.sql, 04-proyectos-obras.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-0005-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. CONCEPTOS DE OBRA (Catálogo jerárquico basado en CMIC) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.conceptos ( + id, tenant_id, code, name, parent_id, level, path, + unit_id, unit_price, is_composite, is_active, + created_at, created_by +) VALUES +-- NIVEL 1: Capítulos principales +('00000000-0000-0000-0005-000000000001', '00000000-0000-0000-0003-000000000001', + '01', 'PRELIMINARES', NULL, 1, '01', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000002', '00000000-0000-0000-0003-000000000001', + '02', 'CIMENTACIÓN', NULL, 1, '02', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000003', '00000000-0000-0000-0003-000000000001', + '03', 'ESTRUCTURA', NULL, 1, '03', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000004', '00000000-0000-0000-0003-000000000001', + '04', 'ALBAÑILERÍA', NULL, 1, '04', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000005', '00000000-0000-0000-0003-000000000001', + '05', 'INSTALACIÓN HIDRÁULICA', NULL, 1, '05', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000006', '00000000-0000-0000-0003-000000000001', + '06', 'INSTALACIÓN SANITARIA', NULL, 1, '06', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000007', '00000000-0000-0000-0003-000000000001', + '07', 'INSTALACIÓN ELÉCTRICA', NULL, 1, '07', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000008', '00000000-0000-0000-0003-000000000001', + '08', 'ACABADOS', NULL, 1, '08', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000009', '00000000-0000-0000-0003-000000000001', + '09', 'CARPINTERÍA', NULL, 1, '09', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000010', '00000000-0000-0000-0003-000000000001', + '10', 'HERRERÍA', NULL, 1, '10', + NULL, 0, true, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- NIVEL 2: Subcapítulos PRELIMINARES +('00000000-0000-0000-0005-000000000101', '00000000-0000-0000-0003-000000000001', + '01.01', 'Limpieza del terreno', '00000000-0000-0000-0005-000000000001', 2, '01.01', + '00000000-0000-0000-0001-000000000010', 25.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000102', '00000000-0000-0000-0003-000000000001', + '01.02', 'Trazo y nivelación', '00000000-0000-0000-0005-000000000001', 2, '01.02', + '00000000-0000-0000-0001-000000000010', 35.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000103', '00000000-0000-0000-0003-000000000001', + '01.03', 'Demolición de estructuras existentes', '00000000-0000-0000-0005-000000000001', 2, '01.03', + '00000000-0000-0000-0001-000000000020', 450.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- NIVEL 2: Subcapítulos CIMENTACIÓN +('00000000-0000-0000-0005-000000000201', '00000000-0000-0000-0003-000000000001', + '02.01', 'Excavación a máquina', '00000000-0000-0000-0005-000000000002', 2, '02.01', + '00000000-0000-0000-0001-000000000020', 85.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000202', '00000000-0000-0000-0003-000000000001', + '02.02', 'Excavación a mano', '00000000-0000-0000-0005-000000000002', 2, '02.02', + '00000000-0000-0000-0001-000000000020', 180.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000203', '00000000-0000-0000-0003-000000000001', + '02.03', 'Plantilla de concreto pobre', '00000000-0000-0000-0005-000000000002', 2, '02.03', + '00000000-0000-0000-0001-000000000010', 180.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000204', '00000000-0000-0000-0003-000000000001', + '02.04', 'Zapata de concreto armado fc=250 kg/cm2', '00000000-0000-0000-0005-000000000002', 2, '02.04', + '00000000-0000-0000-0001-000000000020', 3500.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000205', '00000000-0000-0000-0003-000000000001', + '02.05', 'Contratrabe de concreto armado', '00000000-0000-0000-0005-000000000002', 2, '02.05', + '00000000-0000-0000-0001-000000000002', 1850.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000206', '00000000-0000-0000-0003-000000000001', + '02.06', 'Relleno compactado al 95% Proctor', '00000000-0000-0000-0005-000000000002', 2, '02.06', + '00000000-0000-0000-0001-000000000020', 120.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- NIVEL 2: Subcapítulos ESTRUCTURA +('00000000-0000-0000-0005-000000000301', '00000000-0000-0000-0003-000000000001', + '03.01', 'Columna de concreto armado fc=250', '00000000-0000-0000-0005-000000000003', 2, '03.01', + '00000000-0000-0000-0001-000000000020', 4200.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000302', '00000000-0000-0000-0003-000000000001', + '03.02', 'Trabe de concreto armado fc=250', '00000000-0000-0000-0005-000000000003', 2, '03.02', + '00000000-0000-0000-0001-000000000002', 2100.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000303', '00000000-0000-0000-0003-000000000001', + '03.03', 'Losa de concreto armado e=12cm', '00000000-0000-0000-0005-000000000003', 2, '03.03', + '00000000-0000-0000-0001-000000000010', 850.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000304', '00000000-0000-0000-0003-000000000001', + '03.04', 'Escalera de concreto armado', '00000000-0000-0000-0005-000000000003', 2, '03.04', + '00000000-0000-0000-0001-000000000040', 18500.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- NIVEL 2: Subcapítulos ALBAÑILERÍA +('00000000-0000-0000-0005-000000000401', '00000000-0000-0000-0003-000000000001', + '04.01', 'Muro de block hueco 15x20x40', '00000000-0000-0000-0005-000000000004', 2, '04.01', + '00000000-0000-0000-0001-000000000010', 420.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000402', '00000000-0000-0000-0003-000000000001', + '04.02', 'Muro de tabique rojo recocido', '00000000-0000-0000-0005-000000000004', 2, '04.02', + '00000000-0000-0000-0001-000000000010', 380.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000403', '00000000-0000-0000-0003-000000000001', + '04.03', 'Castillo de concreto armado', '00000000-0000-0000-0005-000000000004', 2, '04.03', + '00000000-0000-0000-0001-000000000002', 650.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000404', '00000000-0000-0000-0003-000000000001', + '04.04', 'Dala de cerramiento', '00000000-0000-0000-0005-000000000004', 2, '04.04', + '00000000-0000-0000-0001-000000000002', 580.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- NIVEL 2: Subcapítulos ACABADOS +('00000000-0000-0000-0005-000000000801', '00000000-0000-0000-0003-000000000001', + '08.01', 'Aplanado fino en muros', '00000000-0000-0000-0005-000000000008', 2, '08.01', + '00000000-0000-0000-0001-000000000010', 185.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000802', '00000000-0000-0000-0003-000000000001', + '08.02', 'Yeso en plafones', '00000000-0000-0000-0005-000000000008', 2, '08.02', + '00000000-0000-0000-0001-000000000010', 220.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000803', '00000000-0000-0000-0003-000000000001', + '08.03', 'Pintura vinílica 2 manos', '00000000-0000-0000-0005-000000000008', 2, '08.03', + '00000000-0000-0000-0001-000000000010', 95.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000804', '00000000-0000-0000-0003-000000000001', + '08.04', 'Piso cerámico 45x45', '00000000-0000-0000-0005-000000000008', 2, '08.04', + '00000000-0000-0000-0001-000000000010', 450.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000000805', '00000000-0000-0000-0003-000000000001', + '08.05', 'Azulejo en baños', '00000000-0000-0000-0005-000000000008', 2, '08.05', + '00000000-0000-0000-0001-000000000010', 520.00, false, true, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. PRESUPUESTOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.presupuestos ( + id, tenant_id, fraccionamiento_id, prototipo_id, + code, name, version, is_active, + total_amount, approved_at, approved_by, + created_at, created_by +) VALUES +-- Presupuesto Casa 90 - Las Palmas +('00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', '00000000-0000-0000-0004-000000000001', + 'PPTO-PALMAS-C90-V1', 'Presupuesto Casa Tipo 90 - Las Palmas', 1, true, + 850000.00, '2024-02-15', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Presupuesto Casa 120 - Las Palmas +('00000000-0000-0000-0005-000000001002', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', '00000000-0000-0000-0004-000000000002', + 'PPTO-PALMAS-C120-V1', 'Presupuesto Casa Tipo 120 - Las Palmas', 1, true, + 1150000.00, '2024-02-15', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Presupuesto Casa Premium 150 - Las Palmas +('00000000-0000-0000-0005-000000001003', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', '00000000-0000-0000-0004-000000000003', + 'PPTO-PALMAS-C150-V1', 'Presupuesto Casa Premium 150 - Las Palmas', 1, true, + 1550000.00, '2024-02-15', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Presupuesto Depto 85 - Torre Diamante +('00000000-0000-0000-0005-000000001004', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000102', '00000000-0000-0000-0004-000000000005', + 'PPTO-DIAMANTE-D85-V1', 'Presupuesto Departamento 85 - Torre Diamante', 1, true, + 780000.00, '2024-05-20', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Presupuesto Depto Premium 110 - Torre Diamante +('00000000-0000-0000-0005-000000001005', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000102', '00000000-0000-0000-0004-000000000006', + 'PPTO-DIAMANTE-D110-V1', 'Presupuesto Departamento Premium 110 - Torre Diamante', 1, true, + 1050000.00, '2024-05-20', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. PARTIDAS DE PRESUPUESTO (Ejemplo para Casa 90) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.presupuesto_partidas ( + id, tenant_id, presupuesto_id, concepto_id, + quantity, unit_price, + created_at, created_by +) VALUES +-- Preliminares +('00000000-0000-0000-0005-000000002001', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000101', + 120.00, 25.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002002', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000102', + 120.00, 35.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Cimentación +('00000000-0000-0000-0005-000000002003', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000201', + 45.00, 85.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002004', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000203', + 35.00, 180.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002005', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000204', + 8.50, 3500.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002006', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000205', + 42.00, 1850.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Estructura +('00000000-0000-0000-0005-000000002007', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000301', + 6.50, 4200.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002008', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000302', + 35.00, 2100.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002009', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000303', + 95.00, 850.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Albañilería +('00000000-0000-0000-0005-000000002010', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000401', + 185.00, 420.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002011', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000403', + 52.00, 650.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Acabados +('00000000-0000-0000-0005-000000002012', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000801', + 280.00, 185.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002013', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000803', + 320.00, 95.00, NOW(), '00000000-0000-0000-0002-000000000103'), +('00000000-0000-0000-0005-000000002014', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000001001', '00000000-0000-0000-0005-000000000804', + 90.00, 450.00, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. PROGRAMA DE OBRA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.programa_obra ( + id, tenant_id, fraccionamiento_id, + code, name, version, is_active, + start_date, end_date, + created_at, created_by +) VALUES +('00000000-0000-0000-0005-000000003001', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + 'PROG-PALMAS-E1-V1', 'Programa de Obra Las Palmas Etapa 1', 1, true, + '2024-03-01', '2025-06-30', + NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0005-000000003002', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000102', + 'PROG-DIAMANTE-V1', 'Programa de Obra Torre Diamante', 1, true, + '2024-06-01', '2027-06-30', + NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_conceptos INTEGER; + v_presupuestos INTEGER; + v_partidas INTEGER; + v_programas INTEGER; +BEGIN + SELECT COUNT(*) INTO v_conceptos FROM construction.conceptos; + SELECT COUNT(*) INTO v_presupuestos FROM construction.presupuestos; + SELECT COUNT(*) INTO v_partidas FROM construction.presupuesto_partidas; + SELECT COUNT(*) INTO v_programas FROM construction.programa_obra; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 05 - PRESUPUESTOS - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Conceptos de obra: %', v_conceptos; + RAISE NOTICE 'Presupuestos: %', v_presupuestos; + RAISE NOTICE 'Partidas: %', v_partidas; + RAISE NOTICE 'Programas de obra: %', v_programas; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 05 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/06-estimaciones.sql b/seeds/dev/06-estimaciones.sql new file mode 100644 index 0000000..c0c13d2 --- /dev/null +++ b/seeds/dev/06-estimaciones.sql @@ -0,0 +1,231 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 06: CONTRATOS Y ESTIMACIONES +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Contratos, estimaciones, generadores, anticipos, retenciones +-- Dependencias: 04-proyectos-obras.sql, 05-presupuestos.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-0006-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. CONTRATOS DE OBRA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.contratos ( + id, tenant_id, subcontratista_id, fraccionamiento_id, + contract_number, name, contract_type, + start_date, end_date, + total_amount, advance_percentage, retention_percentage, + status, signed_at, signed_by, + created_at, created_by +) VALUES +-- Contrato Cimentaciones - Las Palmas +('00000000-0000-0000-0006-000000000001', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000801', '00000000-0000-0000-0004-000000000101', + 'CONT-2024-001', 'Cimentación Etapa 1 Las Palmas', 'unit_price', + '2024-03-01', '2024-08-31', + 2500000.00, 30.00, 5.00, + 'active', '2024-02-28', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Contrato Instalaciones Eléctricas - Las Palmas +('00000000-0000-0000-0006-000000000002', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000802', '00000000-0000-0000-0004-000000000101', + 'CONT-2024-002', 'Instalaciones Eléctricas Etapa 1 Las Palmas', 'unit_price', + '2024-05-01', '2024-12-31', + 1800000.00, 20.00, 5.00, + 'active', '2024-04-25', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Contrato Plomería - Las Palmas +('00000000-0000-0000-0006-000000000003', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000803', '00000000-0000-0000-0004-000000000101', + 'CONT-2024-003', 'Instalaciones Hidro-Sanitarias Etapa 1', 'unit_price', + '2024-05-15', '2025-01-31', + 1650000.00, 20.00, 5.00, + 'active', '2024-05-10', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Contrato Acabados - Las Palmas +('00000000-0000-0000-0006-000000000004', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000804', '00000000-0000-0000-0004-000000000101', + 'CONT-2024-004', 'Acabados y Pintura Etapa 1 Las Palmas', 'unit_price', + '2024-07-01', '2025-03-31', + 2200000.00, 15.00, 5.00, + 'active', '2024-06-28', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Contrato Estructura - Torre Diamante +('00000000-0000-0000-0006-000000000005', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000801', '00000000-0000-0000-0004-000000000102', + 'CONT-2024-005', 'Estructura Torre Diamante', 'fixed_price', + '2024-06-01', '2025-12-31', + 8500000.00, 25.00, 5.00, + 'active', '2024-05-28', '00000000-0000-0000-0002-000000000102', + NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. ESTIMACIONES +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO estimates.estimaciones ( + id, tenant_id, contrato_id, fraccionamiento_id, + estimate_number, period_start, period_end, sequence_number, + status, subtotal, advance_amount, retention_amount, tax_amount, total_amount, + submitted_at, submitted_by, approved_at, approved_by, + created_at, created_by +) VALUES +-- Estimaciones del Contrato Cimentaciones +('00000000-0000-0000-0006-000000000101', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', '00000000-0000-0000-0004-000000000101', + 'EST-2024-001-01', '2024-03-01', '2024-03-15', 1, + 'paid', 350000.00, 105000.00, 17500.00, 56000.00, 283500.00, + '2024-03-18', '00000000-0000-0000-0002-000000000104', + '2024-03-20', '00000000-0000-0000-0002-000000000103', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0006-000000000102', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', '00000000-0000-0000-0004-000000000101', + 'EST-2024-001-02', '2024-03-16', '2024-03-31', 2, + 'paid', 420000.00, 126000.00, 21000.00, 67200.00, 340200.00, + '2024-04-03', '00000000-0000-0000-0002-000000000104', + '2024-04-05', '00000000-0000-0000-0002-000000000103', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0006-000000000103', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', '00000000-0000-0000-0004-000000000101', + 'EST-2024-001-03', '2024-04-01', '2024-04-15', 3, + 'approved', 380000.00, 114000.00, 19000.00, 60800.00, 307800.00, + '2024-04-18', '00000000-0000-0000-0002-000000000104', + '2024-04-20', '00000000-0000-0000-0002-000000000103', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0006-000000000104', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', '00000000-0000-0000-0004-000000000101', + 'EST-2024-001-04', '2024-04-16', '2024-04-30', 4, + 'submitted', 450000.00, 135000.00, 22500.00, 72000.00, 364500.00, + '2024-05-03', '00000000-0000-0000-0002-000000000104', + NULL, NULL, + NOW(), '00000000-0000-0000-0002-000000000104'), + +-- Estimaciones del Contrato Eléctrico +('00000000-0000-0000-0006-000000000105', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000002', '00000000-0000-0000-0004-000000000101', + 'EST-2024-002-01', '2024-05-01', '2024-05-15', 1, + 'paid', 280000.00, 56000.00, 14000.00, 44800.00, 254800.00, + '2024-05-18', '00000000-0000-0000-0002-000000000104', + '2024-05-20', '00000000-0000-0000-0002-000000000103', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0006-000000000106', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000002', '00000000-0000-0000-0004-000000000101', + 'EST-2024-002-02', '2024-05-16', '2024-05-31', 2, + 'approved', 320000.00, 64000.00, 16000.00, 51200.00, 291200.00, + '2024-06-03', '00000000-0000-0000-0002-000000000104', + '2024-06-05', '00000000-0000-0000-0002-000000000103', + NOW(), '00000000-0000-0000-0002-000000000104') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. ANTICIPOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO estimates.anticipos ( + id, tenant_id, contrato_id, + advance_type, advance_number, advance_date, + gross_amount, tax_amount, net_amount, + amortization_percentage, amortized_amount, + is_fully_amortized, + approved_at, approved_by, paid_at, payment_reference, + created_at, created_by +) VALUES +-- Anticipo Contrato Cimentaciones (30%) +('00000000-0000-0000-0006-000000000201', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', + 'initial', 'ANT-2024-001-01', '2024-02-28', + 750000.00, 120000.00, 870000.00, + 30.00, 480000.00, false, + '2024-02-28', '00000000-0000-0000-0002-000000000102', + '2024-03-01', 'TRANSF-BBVA-001', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Anticipo Contrato Eléctrico (20%) +('00000000-0000-0000-0006-000000000202', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000002', + 'initial', 'ANT-2024-002-01', '2024-04-25', + 360000.00, 57600.00, 417600.00, + 20.00, 120000.00, false, + '2024-04-25', '00000000-0000-0000-0002-000000000102', + '2024-04-26', 'TRANSF-BBVA-002', + NOW(), '00000000-0000-0000-0002-000000000103'), + +-- Anticipo Contrato Estructura Torre (25%) +('00000000-0000-0000-0006-000000000203', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000005', + 'initial', 'ANT-2024-005-01', '2024-05-28', + 2125000.00, 340000.00, 2465000.00, + 25.00, 0.00, false, + '2024-05-28', '00000000-0000-0000-0002-000000000102', + '2024-05-30', 'TRANSF-BBVA-005', + NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. FONDO DE GARANTÍA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO estimates.fondo_garantia ( + id, tenant_id, contrato_id, + accumulated_amount, released_amount, + created_at, created_by +) VALUES +('00000000-0000-0000-0006-000000000301', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000001', + 80000.00, 0.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0006-000000000302', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000002', + 30000.00, 0.00, NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-0006-000000000303', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0006-000000000005', + 0.00, 0.00, NOW(), '00000000-0000-0000-0002-000000000103') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_contratos INTEGER; + v_estimaciones INTEGER; + v_anticipos INTEGER; + v_fondos INTEGER; +BEGIN + SELECT COUNT(*) INTO v_contratos FROM construction.contratos; + 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 'SEED 06 - ESTIMACIONES - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Contratos: %', v_contratos; + RAISE NOTICE 'Estimaciones: %', v_estimaciones; + RAISE NOTICE 'Anticipos: %', v_anticipos; + RAISE NOTICE 'Fondos de garantía: %', v_fondos; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 06 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/07-avances-calidad.sql b/seeds/dev/07-avances-calidad.sql new file mode 100644 index 0000000..940bd44 --- /dev/null +++ b/seeds/dev/07-avances-calidad.sql @@ -0,0 +1,279 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 07: AVANCES DE OBRA Y CONTROL DE CALIDAD +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Avances, fotos, bitácora, checklists, inspecciones, tickets +-- Dependencias: 04-proyectos-obras.sql, 05-presupuestos.sql, 02-users-profiles.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-0007-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. AVANCES DE OBRA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.avances_obra ( + id, tenant_id, concepto_id, lote_id, + capture_date, quantity_executed, percentage_executed, + status, notes, + captured_by, reviewed_by, reviewed_at, approved_by, approved_at, + created_at, created_by +) VALUES +-- Avances Lote A-01 (entregado) +('00000000-0000-0000-0007-000000000001', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000101', '00000000-0000-0000-0004-000000000601', + '2024-03-15', 120.00, 100.00, 'approved', 'Limpieza completada', + '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000105', + '2024-03-16', '00000000-0000-0000-0002-000000000103', '2024-03-17', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0007-000000000002', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000204', '00000000-0000-0000-0004-000000000601', + '2024-03-25', 8.50, 100.00, 'approved', 'Zapatas completadas', + '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000105', + '2024-03-26', '00000000-0000-0000-0002-000000000103', '2024-03-27', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0007-000000000003', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000401', '00000000-0000-0000-0004-000000000601', + '2024-04-10', 185.00, 100.00, 'approved', 'Muros planta baja terminados', + '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000105', + '2024-04-11', '00000000-0000-0000-0002-000000000103', '2024-04-12', + NOW(), '00000000-0000-0000-0002-000000000104'), + +-- Avances Lote A-03 (en construcción) +('00000000-0000-0000-0007-000000000004', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000204', '00000000-0000-0000-0004-000000000603', + '2024-04-20', 6.00, 70.59, 'approved', 'Zapatas en proceso', + '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000105', + '2024-04-21', '00000000-0000-0000-0002-000000000103', '2024-04-22', + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0007-000000000005', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000401', '00000000-0000-0000-0004-000000000603', + '2024-05-05', 120.00, 64.86, 'reviewed', 'Muros planta baja al 65%', + '00000000-0000-0000-0002-000000000104', '00000000-0000-0000-0002-000000000105', + '2024-05-06', NULL, NULL, + NOW(), '00000000-0000-0000-0002-000000000104'), + +('00000000-0000-0000-0007-000000000006', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0005-000000000303', '00000000-0000-0000-0004-000000000603', + '2024-05-10', 45.00, 47.37, 'pending', 'Losa en proceso de colado', + '00000000-0000-0000-0002-000000000104', NULL, NULL, NULL, NULL, + NOW(), '00000000-0000-0000-0002-000000000104') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. BITÁCORA DE OBRA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.bitacora_obra ( + id, tenant_id, fraccionamiento_id, + entry_date, entry_number, weather, temperature_max, temperature_min, + workers_count, description, observations, incidents, + registered_by, + created_at +) VALUES +('00000000-0000-0000-0007-000000000101', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-01', 1, 'Soleado', 28.5, 15.2, 45, + 'Inicio de trabajos de cimentación en manzana B. Se realizó trazo y nivelación.', + 'Personal completo. Maquinaria operando al 100%.', + NULL, + '00000000-0000-0000-0002-000000000104', NOW()), + +('00000000-0000-0000-0007-000000000102', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-02', 2, 'Parcialmente nublado', 26.0, 14.8, 48, + 'Continuación de excavación para zapatas. Armado de acero en lotes B-01 y B-02.', + 'Se recibió material de acero y cemento.', + NULL, + '00000000-0000-0000-0002-000000000104', NOW()), + +('00000000-0000-0000-0007-000000000103', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-03', 3, 'Lluvioso', 22.0, 13.5, 32, + 'Trabajos suspendidos parcialmente por lluvia. Solo actividades bajo techo.', + 'Lluvia desde las 10:00 hrs. Se protegieron materiales.', + 'Suspensión parcial por clima', + '00000000-0000-0000-0002-000000000104', NOW()), + +('00000000-0000-0000-0007-000000000104', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-04', 4, 'Soleado', 27.0, 15.0, 52, + 'Colado de zapatas lotes B-01 y B-02. Inicio de muros planta baja lote A-05.', + 'Concreto premezclado de calidad verificada.', + NULL, + '00000000-0000-0000-0002-000000000104', NOW()), + +('00000000-0000-0000-0007-000000000105', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-05', 5, 'Soleado', 29.0, 16.5, 55, + 'Desencofrado de zapatas. Relleno compactado. Instalación eléctrica en lote A-01.', + 'Visita de supervisión de INFONAVIT.', + NULL, + '00000000-0000-0000-0002-000000000104', NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. CHECKLISTS DE CALIDAD +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.checklists ( + id, tenant_id, prototipo_id, code, name, is_active, + created_at, created_by +) VALUES +('00000000-0000-0000-0007-000000000201', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000001', + 'CHK-CIM-90', 'Checklist Cimentación Casa 90', true, + NOW(), '00000000-0000-0000-0002-000000000110'), + +('00000000-0000-0000-0007-000000000202', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000001', + 'CHK-EST-90', 'Checklist Estructura Casa 90', true, + NOW(), '00000000-0000-0000-0002-000000000110'), + +('00000000-0000-0000-0007-000000000203', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000001', + 'CHK-ACAB-90', 'Checklist Acabados Casa 90', true, + NOW(), '00000000-0000-0000-0002-000000000110'), + +('00000000-0000-0000-0007-000000000204', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000001', + 'CHK-ENTREGA', 'Checklist Entrega Final', true, + NOW(), '00000000-0000-0000-0002-000000000110') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. ITEMS DE CHECKLIST +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.checklist_items ( + id, tenant_id, checklist_id, sequence, name, is_required, + created_at +) VALUES +-- Items Checklist Cimentación +('00000000-0000-0000-0007-000000000301', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', 1, 'Profundidad de excavación correcta', true, NOW()), +('00000000-0000-0000-0007-000000000302', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', 2, 'Plantilla de concreto pobre', true, NOW()), +('00000000-0000-0000-0007-000000000303', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', 3, 'Armado de acero según planos', true, NOW()), +('00000000-0000-0000-0007-000000000304', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', 4, 'Recubrimientos de acero correctos', true, NOW()), +('00000000-0000-0000-0007-000000000305', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', 5, 'Resistencia del concreto verificada', true, NOW()), + +-- Items Checklist Entrega +('00000000-0000-0000-0007-000000000310', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 1, 'Limpieza general de la vivienda', true, NOW()), +('00000000-0000-0000-0007-000000000311', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 2, 'Funcionamiento de instalaciones eléctricas', true, NOW()), +('00000000-0000-0000-0007-000000000312', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 3, 'Funcionamiento de instalaciones hidráulicas', true, NOW()), +('00000000-0000-0000-0007-000000000313', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 4, 'Estado de acabados', true, NOW()), +('00000000-0000-0000-0007-000000000314', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 5, 'Funcionamiento de puertas y ventanas', true, NOW()), +('00000000-0000-0000-0007-000000000315', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', 6, 'Documentación entregada', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. INSPECCIONES DE CALIDAD +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.inspecciones ( + id, tenant_id, checklist_id, lote_id, + inspection_date, status, + inspector_id, approved_by, approved_at, + created_at, created_by +) VALUES +('00000000-0000-0000-0007-000000000401', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', '00000000-0000-0000-0004-000000000601', + '2024-03-28', 'approved', + '00000000-0000-0000-0002-000000000110', + '00000000-0000-0000-0002-000000000103', '2024-03-29', + NOW(), '00000000-0000-0000-0002-000000000110'), + +('00000000-0000-0000-0007-000000000402', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000204', '00000000-0000-0000-0004-000000000601', + '2024-05-15', 'approved', + '00000000-0000-0000-0002-000000000110', + '00000000-0000-0000-0002-000000000103', '2024-05-16', + NOW(), '00000000-0000-0000-0002-000000000110'), + +('00000000-0000-0000-0007-000000000403', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0007-000000000201', '00000000-0000-0000-0004-000000000603', + '2024-04-25', 'in_review', + '00000000-0000-0000-0002-000000000110', NULL, NULL, + NOW(), '00000000-0000-0000-0002-000000000110') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 6. TICKETS POSTVENTA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO construction.tickets_postventa ( + id, tenant_id, lote_id, + ticket_number, reported_date, category, description, priority, status, + assigned_to, resolution, resolved_at, + created_at, created_by +) VALUES +('00000000-0000-0000-0007-000000000501', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000601', + 'TKT-2024-001', '2024-06-01', 'Plomería', + 'Fuga de agua en llave de lavabo del baño principal', + 'medium', 'closed', + '00000000-0000-0000-0002-000000000105', + 'Se reemplazó empaque de llave. Fuga corregida.', + '2024-06-03', + NOW(), '00000000-0000-0000-0002-000000000112'), + +('00000000-0000-0000-0007-000000000502', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000602', + 'TKT-2024-002', '2024-06-10', 'Electricidad', + 'Apagador de recámara 2 no funciona correctamente', + 'low', 'open', + NULL, NULL, NULL, + NOW(), '00000000-0000-0000-0002-000000000112') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +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.avances_obra; + SELECT COUNT(*) INTO v_bitacora FROM construction.bitacora_obra; + SELECT COUNT(*) INTO v_checklists FROM construction.checklists; + SELECT COUNT(*) INTO v_inspecciones FROM construction.inspecciones; + SELECT COUNT(*) INTO v_tickets FROM construction.tickets_postventa; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 07 - AVANCES Y CALIDAD - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Avances de obra: %', v_avances; + RAISE NOTICE 'Entradas de bitácora: %', v_bitacora; + RAISE NOTICE 'Checklists: %', v_checklists; + RAISE NOTICE 'Inspecciones: %', v_inspecciones; + RAISE NOTICE 'Tickets postventa: %', v_tickets; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 07 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/08-hse.sql b/seeds/dev/08-hse.sql new file mode 100644 index 0000000..b554065 --- /dev/null +++ b/seeds/dev/08-hse.sql @@ -0,0 +1,259 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 08: HSE (SEGURIDAD, SALUD Y AMBIENTE) +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: EPP, incidentes, capacitaciones, inspecciones HSE, permisos +-- Dependencias: 02-users-profiles.sql, 04-proyectos-obras.sql +-- Nota: Los seeds de normas_stps y residuos_catalogo ya existen en el DDL +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-0008-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. CATÁLOGO DE EPP +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO hse.epp_catalogo ( + id, tenant_id, codigo, nombre, categoria, descripcion, + vida_util_dias, requiere_certificacion, activo, + created_at +) VALUES +-- Cabeza +('00000000-0000-0000-0008-000000000001', '00000000-0000-0000-0003-000000000001', + 'EPP-001', 'Casco de seguridad tipo I', 'cabeza', + 'Casco de polietileno de alta densidad con suspensión ajustable', + 730, true, true, NOW()), + +-- Ojos +('00000000-0000-0000-0008-000000000002', '00000000-0000-0000-0003-000000000001', + 'EPP-002', 'Lentes de seguridad transparentes', 'ojos', + 'Lentes de policarbonato con protección UV', + 365, false, true, NOW()), + +('00000000-0000-0000-0008-000000000003', '00000000-0000-0000-0003-000000000001', + 'EPP-003', 'Goggles de seguridad', 'ojos', + 'Goggles sellados para protección contra polvo y salpicaduras', + 365, false, true, NOW()), + +-- Auditiva +('00000000-0000-0000-0008-000000000004', '00000000-0000-0000-0003-000000000001', + 'EPP-004', 'Tapones auditivos desechables', 'auditiva', + 'Tapones de espuma NRR 32dB', + 1, false, true, NOW()), + +('00000000-0000-0000-0008-000000000005', '00000000-0000-0000-0003-000000000001', + 'EPP-005', 'Orejeras de copa', 'auditiva', + 'Orejeras con NRR 28dB para uso continuo', + 730, false, true, NOW()), + +-- Respiratoria +('00000000-0000-0000-0008-000000000006', '00000000-0000-0000-0003-000000000001', + 'EPP-006', 'Mascarilla N95', 'respiratoria', + 'Respirador N95 para partículas', + 30, false, true, NOW()), + +('00000000-0000-0000-0008-000000000007', '00000000-0000-0000-0003-000000000001', + 'EPP-007', 'Respirador de media cara', 'respiratoria', + 'Respirador reutilizable con cartuchos intercambiables', + 365, true, true, NOW()), + +-- Manos +('00000000-0000-0000-0008-000000000008', '00000000-0000-0000-0003-000000000001', + 'EPP-008', 'Guantes de carnaza', 'manos', + 'Guantes de carnaza para trabajo general', + 90, false, true, NOW()), + +('00000000-0000-0000-0008-000000000009', '00000000-0000-0000-0003-000000000001', + 'EPP-009', 'Guantes de nitrilo', 'manos', + 'Guantes desechables de nitrilo', + 1, false, true, NOW()), + +-- Pies +('00000000-0000-0000-0008-000000000010', '00000000-0000-0000-0003-000000000001', + 'EPP-010', 'Botas de seguridad con casquillo', 'pies', + 'Botas de cuero con casquillo de acero', + 365, true, true, NOW()), + +-- Caídas +('00000000-0000-0000-0008-000000000011', '00000000-0000-0000-0003-000000000001', + 'EPP-011', 'Arnés de cuerpo completo', 'caidas', + 'Arnés con 5 puntos de anclaje para trabajos en altura', + 1825, true, true, NOW()), + +('00000000-0000-0000-0008-000000000012', '00000000-0000-0000-0003-000000000001', + 'EPP-012', 'Línea de vida retráctil', 'caidas', + 'Línea de vida autorretráctil de 15m', + 1825, true, true, NOW()), + +-- Ropa +('00000000-0000-0000-0008-000000000013', '00000000-0000-0000-0003-000000000001', + 'EPP-013', 'Chaleco de alta visibilidad', 'ropa', + 'Chaleco reflejante clase 2', + 365, false, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. CAPACITACIONES +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO hse.capacitacion ( + id, tenant_id, codigo, nombre, tipo, descripcion, + duracion_horas, requiere_evaluacion, puntaje_minimo, activo, + created_at +) VALUES +('00000000-0000-0000-0008-000000000101', '00000000-0000-0000-0003-000000000001', + 'CAP-IND-001', 'Inducción de Seguridad', 'induccion', + 'Curso de inducción obligatorio para todo el personal nuevo', + 4, true, 80, true, NOW()), + +('00000000-0000-0000-0008-000000000102', '00000000-0000-0000-0003-000000000001', + 'CAP-ALT-001', 'Trabajo en Alturas NOM-009', 'especifica', + 'Capacitación para trabajos en altura según NOM-009-STPS', + 8, true, 85, true, NOW()), + +('00000000-0000-0000-0008-000000000103', '00000000-0000-0000-0003-000000000001', + 'CAP-ELE-001', 'Seguridad Eléctrica NOM-029', 'especifica', + 'Capacitación en seguridad eléctrica según NOM-029-STPS', + 8, true, 85, true, NOW()), + +('00000000-0000-0000-0008-000000000104', '00000000-0000-0000-0003-000000000001', + 'CAP-INC-001', 'Prevención de Incendios', 'especifica', + 'Uso de extintores y prevención de incendios', + 4, true, 80, true, NOW()), + +('00000000-0000-0000-0008-000000000105', '00000000-0000-0000-0003-000000000001', + 'CAP-EPP-001', 'Uso correcto de EPP', 'especifica', + 'Selección, uso y mantenimiento de equipo de protección personal', + 2, true, 80, true, NOW()), + +('00000000-0000-0000-0008-000000000106', '00000000-0000-0000-0003-000000000001', + 'CAP-MAQ-001', 'Operación de Maquinaria Pesada', 'certificacion', + 'Certificación para operadores de maquinaria pesada', + 16, true, 90, true, NOW()), + +('00000000-0000-0000-0008-000000000107', '00000000-0000-0000-0003-000000000001', + 'CAP-PAU-001', 'Primeros Auxilios', 'especifica', + 'Curso básico de primeros auxilios', + 8, true, 80, true, NOW()), + +('00000000-0000-0000-0008-000000000108', '00000000-0000-0000-0003-000000000001', + 'CAP-ESC-001', 'Espacios Confinados', 'especifica', + 'Procedimientos para trabajos en espacios confinados', + 8, true, 85, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. INCIDENTES (Histórico demo) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO hse.incidentes ( + id, tenant_id, fraccionamiento_id, + folio, fecha_hora, tipo, gravedad, descripcion, ubicacion_descripcion, + estado, acciones_inmediatas, + investigado_por, fecha_cierre, + created_at, created_by +) VALUES +('00000000-0000-0000-0008-000000000201', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + 'INC-2024-001', '2024-04-15 10:30:00', 'casi_accidente', 'leve', + 'Trabajador casi resbala en zona de excavación por lluvia reciente', + 'Manzana A, zona de excavación lote A-05', + 'cerrado', + 'Se colocaron señalamientos de precaución y se suspendió trabajo en la zona', + '00000000-0000-0000-0002-000000000109', '2024-04-16', + NOW(), '00000000-0000-0000-0002-000000000109'), + +('00000000-0000-0000-0008-000000000202', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + 'INC-2024-002', '2024-05-02 14:15:00', 'incidente', 'moderado', + 'Caída de material desde andamio sin causar lesiones', + 'Manzana B, lote B-03, segundo nivel', + 'cerrado', + 'Se aseguró el perímetro y se verificó fijación de materiales en andamios', + '00000000-0000-0000-0002-000000000109', '2024-05-04', + NOW(), '00000000-0000-0000-0002-000000000109'), + +('00000000-0000-0000-0008-000000000203', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + 'INC-2024-003', '2024-05-10 09:45:00', 'accidente', 'leve', + 'Trabajador sufre cortada menor en mano por manejo de material', + 'Almacén de obra Las Palmas', + 'cerrado', + 'Se aplicaron primeros auxilios. Trabajador continuó labores con vendaje', + '00000000-0000-0000-0002-000000000109', '2024-05-10', + NOW(), '00000000-0000-0000-0002-000000000109'), + +('00000000-0000-0000-0008-000000000204', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000102', + 'INC-2024-004', '2024-06-05 11:00:00', 'casi_accidente', 'moderado', + 'Herramienta cae desde nivel 4 sin impactar a nadie', + 'Torre Diamante, nivel 4', + 'en_investigacion', + 'Se acordonó la zona y se reforzó protocolo de aseguramiento de herramientas', + '00000000-0000-0000-0002-000000000109', NULL, + NOW(), '00000000-0000-0000-0002-000000000109') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. HORAS TRABAJADAS (Para cálculo de indicadores) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO hse.horas_trabajadas ( + id, tenant_id, fraccionamiento_id, + fecha, trabajadores_directos, trabajadores_subcontrato, + horas_directos, horas_subcontrato, + created_at, created_by +) VALUES +-- Mayo 2024 - Las Palmas +('00000000-0000-0000-0008-000000000301', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-01', 25, 30, 200, 240, NOW(), '00000000-0000-0000-0002-000000000109'), +('00000000-0000-0000-0008-000000000302', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-02', 28, 32, 224, 256, NOW(), '00000000-0000-0000-0002-000000000109'), +('00000000-0000-0000-0008-000000000303', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-03', 15, 18, 120, 144, NOW(), '00000000-0000-0000-0002-000000000109'), +('00000000-0000-0000-0008-000000000304', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-04', 30, 35, 240, 280, NOW(), '00000000-0000-0000-0002-000000000109'), +('00000000-0000-0000-0008-000000000305', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0004-000000000101', + '2024-05-05', 32, 38, 256, 304, NOW(), '00000000-0000-0000-0002-000000000109') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_epp INTEGER; + v_capacitaciones INTEGER; + v_incidentes INTEGER; + v_horas INTEGER; +BEGIN + SELECT COUNT(*) INTO v_epp FROM hse.epp_catalogo; + SELECT COUNT(*) INTO v_capacitaciones FROM hse.capacitacion; + SELECT COUNT(*) INTO v_incidentes FROM hse.incidentes; + SELECT COUNT(*) INTO v_horas FROM hse.horas_trabajadas; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 08 - HSE - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Catálogo EPP: %', v_epp; + RAISE NOTICE 'Capacitaciones: %', v_capacitaciones; + RAISE NOTICE 'Incidentes: %', v_incidentes; + RAISE NOTICE 'Registros de horas: %', v_horas; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 08 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/09-finanzas.sql b/seeds/dev/09-finanzas.sql new file mode 100644 index 0000000..72084ce --- /dev/null +++ b/seeds/dev/09-finanzas.sql @@ -0,0 +1,379 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 09: FINANZAS Y CONTABILIDAD +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Catálogo de cuentas, cuentas bancarias, CxP, CxC, pólizas +-- Dependencias: 03-empresa-tenant.sql, 06-estimaciones.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-0009-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. CATÁLOGO DE CUENTAS CONTABLES (Simplificado SAT) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.chart_of_accounts ( + id, tenant_id, code, name, account_type, nature, status, level, parent_id, + allows_direct_posting, created_at +) VALUES +-- ACTIVO (1) +('00000000-0000-0000-0009-000000000001', '00000000-0000-0000-0003-000000000001', + '1000', 'ACTIVO', 'asset', 'debit', 'active', 1, NULL, false, NOW()), + +('00000000-0000-0000-0009-000000000002', '00000000-0000-0000-0003-000000000001', + '1100', 'Activo Circulante', 'asset', 'debit', 'active', 2, '00000000-0000-0000-0009-000000000001', false, NOW()), + +('00000000-0000-0000-0009-000000000003', '00000000-0000-0000-0003-000000000001', + '1101', 'Caja', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000004', '00000000-0000-0000-0003-000000000001', + '1102', 'Bancos', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000005', '00000000-0000-0000-0003-000000000001', + '1103', 'Clientes', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000006', '00000000-0000-0000-0003-000000000001', + '1104', 'Deudores Diversos', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000007', '00000000-0000-0000-0003-000000000001', + '1105', 'Inventarios', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000008', '00000000-0000-0000-0003-000000000001', + '1106', 'Anticipos a Proveedores', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000009', '00000000-0000-0000-0003-000000000001', + '1107', 'IVA Acreditable', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000002', true, NOW()), + +('00000000-0000-0000-0009-000000000010', '00000000-0000-0000-0003-000000000001', + '1200', 'Activo Fijo', 'asset', 'debit', 'active', 2, '00000000-0000-0000-0009-000000000001', false, NOW()), + +('00000000-0000-0000-0009-000000000011', '00000000-0000-0000-0003-000000000001', + '1201', 'Terrenos', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000010', true, NOW()), + +('00000000-0000-0000-0009-000000000012', '00000000-0000-0000-0003-000000000001', + '1202', 'Edificios', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000010', true, NOW()), + +('00000000-0000-0000-0009-000000000013', '00000000-0000-0000-0003-000000000001', + '1203', 'Maquinaria y Equipo', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000010', true, NOW()), + +('00000000-0000-0000-0009-000000000014', '00000000-0000-0000-0003-000000000001', + '1204', 'Equipo de Transporte', 'asset', 'debit', 'active', 3, '00000000-0000-0000-0009-000000000010', true, NOW()), + +('00000000-0000-0000-0009-000000000015', '00000000-0000-0000-0003-000000000001', + '1205', 'Depreciación Acumulada', 'asset', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000010', true, NOW()), + +-- PASIVO (2) +('00000000-0000-0000-0009-000000000020', '00000000-0000-0000-0003-000000000001', + '2000', 'PASIVO', 'liability', 'credit', 'active', 1, NULL, false, NOW()), + +('00000000-0000-0000-0009-000000000021', '00000000-0000-0000-0003-000000000001', + '2100', 'Pasivo Circulante', 'liability', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000020', false, NOW()), + +('00000000-0000-0000-0009-000000000022', '00000000-0000-0000-0003-000000000001', + '2101', 'Proveedores', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +('00000000-0000-0000-0009-000000000023', '00000000-0000-0000-0003-000000000001', + '2102', 'Acreedores Diversos', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +('00000000-0000-0000-0009-000000000024', '00000000-0000-0000-0003-000000000001', + '2103', 'IVA por Pagar', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +('00000000-0000-0000-0009-000000000025', '00000000-0000-0000-0003-000000000001', + '2104', 'ISR por Pagar', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +('00000000-0000-0000-0009-000000000026', '00000000-0000-0000-0003-000000000001', + '2105', 'Retenciones por Pagar', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +('00000000-0000-0000-0009-000000000027', '00000000-0000-0000-0003-000000000001', + '2106', 'Anticipos de Clientes', 'liability', 'credit', 'active', 3, '00000000-0000-0000-0009-000000000021', true, NOW()), + +-- CAPITAL (3) +('00000000-0000-0000-0009-000000000030', '00000000-0000-0000-0003-000000000001', + '3000', 'CAPITAL CONTABLE', 'equity', 'credit', 'active', 1, NULL, false, NOW()), + +('00000000-0000-0000-0009-000000000031', '00000000-0000-0000-0003-000000000001', + '3100', 'Capital Social', 'equity', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000030', true, NOW()), + +('00000000-0000-0000-0009-000000000032', '00000000-0000-0000-0003-000000000001', + '3200', 'Utilidades Acumuladas', 'equity', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000030', true, NOW()), + +('00000000-0000-0000-0009-000000000033', '00000000-0000-0000-0003-000000000001', + '3300', 'Utilidad del Ejercicio', 'equity', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000030', true, NOW()), + +-- INGRESOS (4) +('00000000-0000-0000-0009-000000000040', '00000000-0000-0000-0003-000000000001', + '4000', 'INGRESOS', 'income', 'credit', 'active', 1, NULL, false, NOW()), + +('00000000-0000-0000-0009-000000000041', '00000000-0000-0000-0003-000000000001', + '4100', 'Ingresos por Obra', 'income', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000040', true, NOW()), + +('00000000-0000-0000-0009-000000000042', '00000000-0000-0000-0003-000000000001', + '4200', 'Ingresos por Ventas', 'income', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000040', true, NOW()), + +('00000000-0000-0000-0009-000000000043', '00000000-0000-0000-0003-000000000001', + '4300', 'Otros Ingresos', 'income', 'credit', 'active', 2, '00000000-0000-0000-0009-000000000040', true, NOW()), + +-- GASTOS (5) +('00000000-0000-0000-0009-000000000050', '00000000-0000-0000-0003-000000000001', + '5000', 'COSTOS Y GASTOS', 'expense', 'debit', 'active', 1, NULL, false, NOW()), + +('00000000-0000-0000-0009-000000000051', '00000000-0000-0000-0003-000000000001', + '5100', 'Costo de Obra', 'expense', 'debit', 'active', 2, '00000000-0000-0000-0009-000000000050', true, NOW()), + +('00000000-0000-0000-0009-000000000052', '00000000-0000-0000-0003-000000000001', + '5200', 'Gastos de Administración', 'expense', 'debit', 'active', 2, '00000000-0000-0000-0009-000000000050', true, NOW()), + +('00000000-0000-0000-0009-000000000053', '00000000-0000-0000-0003-000000000001', + '5300', 'Gastos Financieros', 'expense', 'debit', 'active', 2, '00000000-0000-0000-0009-000000000050', true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. CUENTAS BANCARIAS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.bank_accounts ( + id, tenant_id, name, account_number, clabe, account_type, status, + bank_name, bank_code, currency, + initial_balance, current_balance, available_balance, + ledger_account_id, is_default, allows_payments, allows_collections, + created_at, created_by +) VALUES +('00000000-0000-0000-0009-000000000101', '00000000-0000-0000-0003-000000000001', + 'Cuenta Principal BBVA', '0123456789', '012345678901234567', 'checking', 'active', + 'BBVA MEXICO', '012', 'MXN', + 5000000.00, 4250000.00, 4200000.00, + '00000000-0000-0000-0009-000000000004', true, true, true, + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000102', '00000000-0000-0000-0003-000000000001', + 'Cuenta Nómina Banorte', '9876543210', '072987654321098765', 'checking', 'active', + 'BANORTE', '072', 'MXN', + 500000.00, 320000.00, 320000.00, + '00000000-0000-0000-0009-000000000004', false, true, false, + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000103', '00000000-0000-0000-0003-000000000001', + 'Cuenta de Inversión Santander', '5555666677', '014555566667700001', 'investment', 'active', + 'SANTANDER', '014', 'MXN', + 2000000.00, 2050000.00, 0.00, + '00000000-0000-0000-0009-000000000004', false, false, false, + NOW(), '00000000-0000-0000-0002-000000000107') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. CUENTAS POR PAGAR +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.accounts_payable ( + id, tenant_id, document_number, document_type, + supplier_id, supplier_name, supplier_rfc, + status, invoice_date, due_date, + subtotal, tax_amount, retention_amount, total_amount, paid_amount, balance, + currency, payment_terms, payment_days, + expense_account_id, project_id, + created_at, created_by +) VALUES +('00000000-0000-0000-0009-000000000201', '00000000-0000-0000-0003-000000000001', + 'FAC-PROV-001', 'invoice', + '00000000-0000-0000-0004-000000000801', 'Cimientos del Norte S.A. de C.V.', 'CNO010101AAA', + 'paid', '2024-03-20', '2024-04-20', + 283500.00, 45360.00, 0.00, 328860.00, 328860.00, 0.00, + 'MXN', 'Neto 30 días', 30, + '00000000-0000-0000-0009-000000000051', '00000000-0000-0000-0004-000000000101', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000202', '00000000-0000-0000-0003-000000000001', + 'FAC-PROV-002', 'invoice', + '00000000-0000-0000-0004-000000000802', 'Electrificaciones AGS S.A. de C.V.', 'EAG010101BBB', + 'pending', '2024-05-20', '2024-06-20', + 254800.00, 40768.00, 0.00, 295568.00, 0.00, 295568.00, + 'MXN', 'Neto 30 días', 30, + '00000000-0000-0000-0009-000000000051', '00000000-0000-0000-0004-000000000101', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000203', '00000000-0000-0000-0003-000000000001', + 'FAC-PROV-003', 'invoice', + '00000000-0000-0000-0004-000000000803', 'Plomería Integral de Aguascalientes S.A. de C.V.', 'PIA010101CCC', + 'pending', '2024-05-25', '2024-06-25', + 180000.00, 28800.00, 0.00, 208800.00, 0.00, 208800.00, + 'MXN', 'Neto 30 días', 30, + '00000000-0000-0000-0009-000000000051', '00000000-0000-0000-0004-000000000101', + NOW(), '00000000-0000-0000-0002-000000000107') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. CUENTAS POR COBRAR +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.accounts_receivable ( + id, tenant_id, document_number, document_type, + customer_id, customer_name, customer_rfc, + status, invoice_date, due_date, + subtotal, tax_amount, retention_amount, total_amount, collected_amount, balance, + currency, payment_terms, payment_days, + income_account_id, project_id, + created_at, created_by +) VALUES +('00000000-0000-0000-0009-000000000301', '00000000-0000-0000-0003-000000000001', + 'FAC-CLT-001', 'estimation', + '00000000-0000-0000-0002-000000000112', 'Cliente Demo', 'XAXX010101000', + 'collected', '2024-04-01', '2024-04-30', + 1900000.00, 304000.00, 0.00, 2204000.00, 2204000.00, 0.00, + 'MXN', 'Neto 30 días', 30, + '00000000-0000-0000-0009-000000000042', '00000000-0000-0000-0004-000000000101', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000302', '00000000-0000-0000-0003-000000000001', + 'FAC-CLT-002', 'estimation', + '00000000-0000-0000-0002-000000000112', 'Cliente Demo', 'XAXX010101000', + 'pending', '2024-05-15', '2024-06-15', + 1880000.00, 300800.00, 0.00, 2180800.00, 0.00, 2180800.00, + 'MXN', 'Neto 30 días', 30, + '00000000-0000-0000-0009-000000000042', '00000000-0000-0000-0004-000000000101', + NOW(), '00000000-0000-0000-0002-000000000107') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. PÓLIZAS CONTABLES (Ejemplo balanceado) +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.accounting_entries ( + id, tenant_id, entry_number, entry_type, entry_date, status, + description, fiscal_year, fiscal_period, + total_debit, total_credit, is_balanced, + currency, exchange_rate, posted_at, posted_by_id, + created_at, created_by +) VALUES +('00000000-0000-0000-0009-000000000401', '00000000-0000-0000-0003-000000000001', + 'POL-2024-001', 'purchase', '2024-03-20', 'posted', + 'Registro factura proveedor cimentaciones', 2024, 3, + 328860.00, 328860.00, true, + 'MXN', 1.0, '2024-03-20', '00000000-0000-0000-0002-000000000107', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000402', '00000000-0000-0000-0003-000000000001', + 'POL-2024-002', 'payment', '2024-04-15', 'posted', + 'Pago a proveedor cimentaciones', 2024, 4, + 328860.00, 328860.00, true, + 'MXN', 1.0, '2024-04-15', '00000000-0000-0000-0002-000000000107', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000403', '00000000-0000-0000-0003-000000000001', + 'POL-2024-003', 'sale', '2024-04-01', 'posted', + 'Facturación venta lote A-01', 2024, 4, + 2204000.00, 2204000.00, true, + 'MXN', 1.0, '2024-04-01', '00000000-0000-0000-0002-000000000107', + NOW(), '00000000-0000-0000-0002-000000000107'), + +('00000000-0000-0000-0009-000000000404', '00000000-0000-0000-0003-000000000001', + 'POL-2024-004', 'collection', '2024-04-25', 'posted', + 'Cobro cliente lote A-01', 2024, 4, + 2204000.00, 2204000.00, true, + 'MXN', 1.0, '2024-04-25', '00000000-0000-0000-0002-000000000107', + NOW(), '00000000-0000-0000-0002-000000000107') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 6. LÍNEAS DE PÓLIZA +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO finance.accounting_entry_lines ( + id, tenant_id, entry_id, line_number, + account_id, account_code, description, + debit, credit, + created_at +) VALUES +-- POL-001: Compra +('00000000-0000-0000-0009-000000000501', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000401', 1, + '00000000-0000-0000-0009-000000000051', '5100', 'Costo de obra - Cimentación', + 283500.00, 0.00, NOW()), +('00000000-0000-0000-0009-000000000502', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000401', 2, + '00000000-0000-0000-0009-000000000009', '1107', 'IVA Acreditable', + 45360.00, 0.00, NOW()), +('00000000-0000-0000-0009-000000000503', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000401', 3, + '00000000-0000-0000-0009-000000000022', '2101', 'Proveedores', + 0.00, 328860.00, NOW()), + +-- POL-002: Pago +('00000000-0000-0000-0009-000000000504', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000402', 1, + '00000000-0000-0000-0009-000000000022', '2101', 'Proveedores', + 328860.00, 0.00, NOW()), +('00000000-0000-0000-0009-000000000505', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000402', 2, + '00000000-0000-0000-0009-000000000004', '1102', 'Bancos', + 0.00, 328860.00, NOW()), + +-- POL-003: Venta +('00000000-0000-0000-0009-000000000506', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000403', 1, + '00000000-0000-0000-0009-000000000005', '1103', 'Clientes', + 2204000.00, 0.00, NOW()), +('00000000-0000-0000-0009-000000000507', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000403', 2, + '00000000-0000-0000-0009-000000000042', '4200', 'Ingresos por Ventas', + 0.00, 1900000.00, NOW()), +('00000000-0000-0000-0009-000000000508', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000403', 3, + '00000000-0000-0000-0009-000000000024', '2103', 'IVA por Pagar', + 0.00, 304000.00, NOW()), + +-- POL-004: Cobro +('00000000-0000-0000-0009-000000000509', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000404', 1, + '00000000-0000-0000-0009-000000000004', '1102', 'Bancos', + 2204000.00, 0.00, NOW()), +('00000000-0000-0000-0009-000000000510', '00000000-0000-0000-0003-000000000001', + '00000000-0000-0000-0009-000000000404', 2, + '00000000-0000-0000-0009-000000000005', '1103', 'Clientes', + 0.00, 2204000.00, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_cuentas INTEGER; + v_bancos INTEGER; + v_cxp INTEGER; + v_cxc INTEGER; + v_polizas INTEGER; + v_balance_check INTEGER; +BEGIN + SELECT COUNT(*) INTO v_cuentas FROM finance.chart_of_accounts; + SELECT COUNT(*) INTO v_bancos FROM finance.bank_accounts; + SELECT COUNT(*) INTO v_cxp FROM finance.accounts_payable; + SELECT COUNT(*) INTO v_cxc FROM finance.accounts_receivable; + SELECT COUNT(*) INTO v_polizas FROM finance.accounting_entries; + + -- Verificar balance de pólizas + SELECT COUNT(*) INTO v_balance_check + FROM finance.accounting_entries e + WHERE ABS(total_debit - total_credit) > 0.01; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 09 - FINANZAS - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Cuentas contables: %', v_cuentas; + RAISE NOTICE 'Cuentas bancarias: %', v_bancos; + RAISE NOTICE 'Cuentas por pagar: %', v_cxp; + RAISE NOTICE 'Cuentas por cobrar: %', v_cxc; + RAISE NOTICE 'Pólizas contables: %', v_polizas; + RAISE NOTICE 'Pólizas desbalanceadas: % (debe ser 0)', v_balance_check; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 09 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/10-activos-documentos.sql b/seeds/dev/10-activos-documentos.sql new file mode 100644 index 0000000..66cba9c --- /dev/null +++ b/seeds/dev/10-activos-documentos.sql @@ -0,0 +1,310 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- SEED 10: ACTIVOS Y DOCUMENTOS +-- ═══════════════════════════════════════════════════════════════════════════════ +-- Proyecto: ERP Construcción +-- Autor: Claude Opus 4.5 +-- Fecha: 2026-02-03 +-- Descripción: Equipos, maquinaria, mantenimientos, categorías y documentos +-- Dependencias: 03-empresa-tenant.sql, 04-proyectos-obras.sql +-- ═══════════════════════════════════════════════════════════════════════════════ + +-- UUIDs: 00000000-0000-0000-000a-XXXXXXXXXXXX + +BEGIN; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 1. CATEGORÍAS DE ACTIVOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO assets.asset_categories ( + id, tenant_id, code, name, description, parent_id, is_active, + created_at +) VALUES +('00000000-0000-0000-000a-000000000001', '00000000-0000-0000-0003-000000000001', + 'MAQ', 'Maquinaria Pesada', 'Equipos de excavación y movimiento de tierra', NULL, true, NOW()), + +('00000000-0000-0000-000a-000000000002', '00000000-0000-0000-0003-000000000001', + 'VEH', 'Vehículos', 'Unidades de transporte', NULL, true, NOW()), + +('00000000-0000-0000-000a-000000000003', '00000000-0000-0000-0003-000000000001', + 'HER', 'Herramienta', 'Herramienta menor y equipo portátil', NULL, true, NOW()), + +('00000000-0000-0000-000a-000000000004', '00000000-0000-0000-0003-000000000001', + 'EQU', 'Equipo de Construcción', 'Equipo especializado de construcción', NULL, true, NOW()), + +('00000000-0000-0000-000a-000000000005', '00000000-0000-0000-0003-000000000001', + 'OFI', 'Equipo de Oficina', 'Mobiliario y equipo de oficina', NULL, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 2. ACTIVOS / EQUIPOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO assets.assets ( + id, tenant_id, asset_code, name, category_id, + asset_type, status, ownership_type, + brand, model, serial_number, year_manufactured, + purchase_date, purchase_price, + current_hours, current_kilometers, + fuel_capacity, fuel_consumption_rate, + useful_life_years, depreciation_method, + current_project_id, + is_active, created_at, created_by +) VALUES +-- Maquinaria pesada +('00000000-0000-0000-000a-000000000101', '00000000-0000-0000-0003-000000000001', + 'MAQ-001', 'Retroexcavadora CAT 420F2', '00000000-0000-0000-000a-000000000001', + 'heavy_machinery', 'assigned', 'owned', + 'Caterpillar', '420F2', 'CAT420F2-2022-12345', 2022, + '2022-06-15', 1850000.00, + 2500, NULL, 200, 12.5, 10, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000102', '00000000-0000-0000-0003-000000000001', + 'MAQ-002', 'Excavadora CAT 320', '00000000-0000-0000-000a-000000000001', + 'heavy_machinery', 'assigned', 'owned', + 'Caterpillar', '320', 'CAT320-2021-67890', 2021, + '2021-03-20', 3200000.00, + 4200, NULL, 400, 25.0, 10, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000103', '00000000-0000-0000-0003-000000000001', + 'MAQ-003', 'Cargador Frontal 966M', '00000000-0000-0000-000a-000000000001', + 'heavy_machinery', 'available', 'leased', + 'Caterpillar', '966M', 'CAT966M-2023-11111', 2023, + '2024-01-01', NULL, + 800, NULL, 350, 22.0, NULL, NULL, + NULL, + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +-- Vehículos +('00000000-0000-0000-000a-000000000104', '00000000-0000-0000-0003-000000000001', + 'VEH-001', 'Camioneta Nissan NP300', '00000000-0000-0000-000a-000000000002', + 'vehicle', 'assigned', 'owned', + 'Nissan', 'NP300 Frontier', 'NISSNP300-2023-XXXXX', 2023, + '2023-02-10', 450000.00, + NULL, 35000, 80, 10.5, 5, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000105', '00000000-0000-0000-0003-000000000001', + 'VEH-002', 'Camión Volteo Kenworth', '00000000-0000-0000-000a-000000000002', + 'vehicle', 'assigned', 'owned', + 'Kenworth', 'T800', 'KENT800-2020-YYYYY', 2020, + '2020-08-15', 1200000.00, + NULL, 125000, 300, 3.5, 10, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +-- Equipo de construcción +('00000000-0000-0000-000a-000000000106', '00000000-0000-0000-0003-000000000001', + 'EQU-001', 'Revolvedora de concreto', '00000000-0000-0000-000a-000000000004', + 'light_equipment', 'assigned', 'owned', + 'Cipsa', 'Ultra 10', 'CIPSA-U10-2022-001', 2022, + '2022-04-01', 85000.00, + 1200, NULL, 15, 4.0, 8, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000107', '00000000-0000-0000-0003-000000000001', + 'EQU-002', 'Vibrador de concreto', '00000000-0000-0000-000a-000000000004', + 'light_equipment', 'assigned', 'owned', + 'Wacker', 'M2500', 'WACKER-M2500-2023-002', 2023, + '2023-05-15', 25000.00, + 600, NULL, NULL, 2.0, 5, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000108', '00000000-0000-0000-0003-000000000001', + 'EQU-003', 'Placa vibradora', '00000000-0000-0000-000a-000000000004', + 'light_equipment', 'available', 'owned', + 'Wacker', 'WP1550', 'WACKER-WP1550-2022-003', 2022, + '2022-07-20', 45000.00, + 800, NULL, 8, 3.5, 8, 'straight_line', + NULL, + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000109', '00000000-0000-0000-0003-000000000001', + 'EQU-004', 'Cortadora de concreto', '00000000-0000-0000-000a-000000000004', + 'light_equipment', 'in_maintenance', 'owned', + 'Stihl', 'TS 800', 'STIHL-TS800-2021-004', 2021, + '2021-11-10', 35000.00, + 1500, NULL, 1.5, 2.5, 5, 'straight_line', + NULL, + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000110', '00000000-0000-0000-0003-000000000001', + 'EQU-005', 'Andamio tubular (lote 20 pzas)', '00000000-0000-0000-000a-000000000004', + 'tool', 'assigned', 'owned', + 'Scaffolding', 'Standard', 'SCAF-STD-2022-LOT01', 2022, + '2022-03-01', 120000.00, + NULL, NULL, NULL, NULL, 10, 'straight_line', + '00000000-0000-0000-0004-000000000101', + true, NOW(), '00000000-0000-0000-0002-000000000106') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 3. PLANES DE MANTENIMIENTO +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO assets.maintenance_plans ( + id, tenant_id, plan_code, name, + asset_id, maintenance_type, frequency, + estimated_duration_hours, estimated_cost, + tasks_description, is_active, + created_at, created_by +) VALUES +('00000000-0000-0000-000a-000000000201', '00000000-0000-0000-0003-000000000001', + 'PM-MAQ-001', 'Mantenimiento preventivo retroexcavadora', + '00000000-0000-0000-000a-000000000101', 'preventive', 'monthly', + 4, 15000.00, + 'Cambio de aceite, filtros, revisión de niveles, inspección de mangueras', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000202', '00000000-0000-0000-0003-000000000001', + 'PM-MAQ-002', 'Mantenimiento 500 horas excavadora', + '00000000-0000-0000-000a-000000000102', 'preventive', 'by_hours', + 8, 35000.00, + 'Servicio mayor: cambio de aceites, filtros, revisión de sistema hidráulico', + true, NOW(), '00000000-0000-0000-0002-000000000106'), + +('00000000-0000-0000-000a-000000000203', '00000000-0000-0000-0003-000000000001', + 'PM-VEH-001', 'Servicio camioneta 10,000 km', + '00000000-0000-0000-000a-000000000104', 'preventive', 'by_kilometers', + 2, 5000.00, + 'Cambio de aceite, filtros, revisión de frenos y suspensión', + true, NOW(), '00000000-0000-0000-0002-000000000106') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 4. CATEGORÍAS DE DOCUMENTOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO documents.document_categories ( + id, tenant_id, code, name, description, parent_id, level, is_active, + created_at +) VALUES +('00000000-0000-0000-000a-000000000301', '00000000-0000-0000-0003-000000000001', + 'PLANOS', 'Planos', 'Planos arquitectónicos y de ingeniería', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000302', '00000000-0000-0000-0003-000000000001', + 'PERMISOS', 'Permisos y Licencias', 'Permisos de construcción y licencias', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000303', '00000000-0000-0000-0003-000000000001', + 'CONTRATOS', 'Contratos', 'Contratos y addendas', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000304', '00000000-0000-0000-0003-000000000001', + 'FACTURAS', 'Facturas y Comprobantes', 'CFDIs y comprobantes fiscales', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000305', '00000000-0000-0000-0003-000000000001', + 'ESTIMACIONES', 'Estimaciones', 'Estimaciones y generadores', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000306', '00000000-0000-0000-0003-000000000001', + 'SEGURIDAD', 'Documentos HSE', 'Documentación de seguridad e higiene', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000307', '00000000-0000-0000-0003-000000000001', + 'CALIDAD', 'Control de Calidad', 'Reportes e inspecciones de calidad', NULL, 1, true, NOW()), + +('00000000-0000-0000-000a-000000000308', '00000000-0000-0000-0003-000000000001', + 'GARANTIAS', 'Garantías', 'Garantías de equipos y materiales', NULL, 1, true, NOW()), + +-- Subcategorías de Planos +('00000000-0000-0000-000a-000000000311', '00000000-0000-0000-0003-000000000001', + 'PLANOS-ARQ', 'Planos Arquitectónicos', 'Planos de arquitectura', '00000000-0000-0000-000a-000000000301', 2, true, NOW()), + +('00000000-0000-0000-000a-000000000312', '00000000-0000-0000-0003-000000000001', + 'PLANOS-EST', 'Planos Estructurales', 'Planos de estructura', '00000000-0000-0000-000a-000000000301', 2, true, NOW()), + +('00000000-0000-0000-000a-000000000313', '00000000-0000-0000-0003-000000000001', + 'PLANOS-INS', 'Planos de Instalaciones', 'Planos de instalaciones', '00000000-0000-0000-000a-000000000301', 2, true, NOW()) +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- 5. DOCUMENTOS +-- ───────────────────────────────────────────────────────────────────────────────── + +INSERT INTO documents.documents ( + id, tenant_id, document_code, title, category_id, + document_type, status, access_level, + author, document_date, + project_id, description, + requires_approval, is_locked, + created_at, created_by +) VALUES +('00000000-0000-0000-000a-000000000401', '00000000-0000-0000-0003-000000000001', + 'DOC-PALMAS-001', 'Plano Arquitectónico General - Las Palmas E1', '00000000-0000-0000-000a-000000000311', + 'plan', 'approved', 'internal', + 'Arq. Juan Pérez', '2024-01-15', + '00000000-0000-0000-0004-000000000101', 'Plano general de distribución Etapa 1', + true, true, + NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-000a-000000000402', '00000000-0000-0000-0003-000000000001', + 'DOC-PALMAS-002', 'Plano Estructural Cimentación - Las Palmas E1', '00000000-0000-0000-000a-000000000312', + 'plan', 'approved', 'internal', + 'Ing. Roberto García', '2024-01-20', + '00000000-0000-0000-0004-000000000101', 'Plano de cimentación con detalles estructurales', + true, true, + NOW(), '00000000-0000-0000-0002-000000000103'), + +('00000000-0000-0000-000a-000000000403', '00000000-0000-0000-0003-000000000001', + 'DOC-PALMAS-003', 'Licencia de Construcción Municipal', '00000000-0000-0000-000a-000000000302', + 'permit', 'approved', 'confidential', + 'Municipio de Aguascalientes', '2024-02-01', + '00000000-0000-0000-0004-000000000101', 'Licencia de construcción vigente', + false, true, + NOW(), '00000000-0000-0000-0002-000000000102'), + +('00000000-0000-0000-000a-000000000404', '00000000-0000-0000-0003-000000000001', + 'DOC-PALMAS-004', 'Contrato Subcontratista Cimentaciones', '00000000-0000-0000-000a-000000000303', + 'contract', 'approved', 'restricted', + 'Constructora Demo', '2024-02-28', + '00000000-0000-0000-0004-000000000101', 'Contrato firmado con Cimientos del Norte', + true, true, + NOW(), '00000000-0000-0000-0002-000000000102'), + +('00000000-0000-0000-000a-000000000405', '00000000-0000-0000-0003-000000000001', + 'DOC-PALMAS-005', 'Reporte de Inspección Calidad - Cimentación Lote A-01', '00000000-0000-0000-000a-000000000307', + 'report', 'approved', 'internal', + 'Diego Calidad Rodríguez', '2024-03-28', + '00000000-0000-0000-0004-000000000101', 'Reporte de inspección de cimentación aprobado', + true, false, + NOW(), '00000000-0000-0000-0002-000000000110') +ON CONFLICT (id) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────────── +-- VERIFICACIÓN +-- ───────────────────────────────────────────────────────────────────────────────── + +DO $$ +DECLARE + v_categorias_activos INTEGER; + v_activos INTEGER; + v_planes_mant INTEGER; + v_categorias_docs INTEGER; + v_documentos INTEGER; +BEGIN + SELECT COUNT(*) INTO v_categorias_activos FROM assets.asset_categories; + SELECT COUNT(*) INTO v_activos FROM assets.assets; + SELECT COUNT(*) INTO v_planes_mant FROM assets.maintenance_plans; + SELECT COUNT(*) INTO v_categorias_docs FROM documents.document_categories; + SELECT COUNT(*) INTO v_documentos FROM documents.documents; + + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'SEED 10 - ACTIVOS Y DOCUMENTOS - COMPLETADO'; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; + RAISE NOTICE 'Categorías de activos: %', v_categorias_activos; + RAISE NOTICE 'Activos/Equipos: %', v_activos; + RAISE NOTICE 'Planes de mantenimiento: %', v_planes_mant; + RAISE NOTICE 'Categorías de documentos: %', v_categorias_docs; + RAISE NOTICE 'Documentos: %', v_documentos; + RAISE NOTICE '══════════════════════════════════════════════════════════════'; +END $$; + +COMMIT; + +-- ═══════════════════════════════════════════════════════════════════════════════ +-- FIN SEED 10 +-- ═══════════════════════════════════════════════════════════════════════════════ diff --git a/seeds/dev/README.md b/seeds/dev/README.md new file mode 100644 index 0000000..28614c0 --- /dev/null +++ b/seeds/dev/README.md @@ -0,0 +1,141 @@ +# Seeds de Desarrollo - ERP Construcción + +## Descripción + +Este directorio contiene los seeds de desarrollo para el proyecto ERP Construcción. Los seeds crean datos de demostración que permiten probar todas las funcionalidades del sistema. + +## Archivos de Seeds + +| # | Archivo | Descripción | Registros Aprox. | +|---|---------|-------------|------------------| +| 01 | `01-core-catalogs.sql` | Unidades, monedas, impuestos, bancos, estados | ~100 | +| 02 | `02-users-profiles.sql` | Roles, permisos, usuarios demo | ~250 | +| 03 | `03-empresa-tenant.sql` | Tenant, sucursales, almacenes | ~25 | +| 04 | `04-proyectos-obras.sql` | Proyectos, etapas, lotes, deptos, subcontratistas | ~100 | +| 05 | `05-presupuestos.sql` | Conceptos, presupuestos, partidas | ~250 | +| 06 | `06-estimaciones.sql` | Contratos, estimaciones, anticipos | ~30 | +| 07 | `07-avances-calidad.sql` | Avances, bitácora, inspecciones, tickets | ~50 | +| 08 | `08-hse.sql` | EPP, capacitaciones, incidentes | ~40 | +| 09 | `09-finanzas.sql` | Cuentas, bancos, CxP, CxC, pólizas | ~60 | +| 10 | `10-activos-documentos.sql` | Equipos, mantenimiento, documentos | ~35 | + +**Total aproximado:** ~940 registros + +## Requisitos Previos + +1. Base de datos PostgreSQL 15+ creada +2. DDL ejecutado (schemas creados) +3. Credenciales configuradas + +## Cómo Ejecutar + +### Opción 1: Script Automatizado (Recomendado) + +```bash +# Desde Linux/WSL +cd /path/to/erp-construccion/database/seeds/dev +chmod +x load-dev-seeds.sh +./load-dev-seeds.sh +``` + +### Opción 2: Manual (Uno por uno) + +```bash +# Orden de ejecución obligatorio +psql -U erp_admin -d erp_construccion_db -f 01-core-catalogs.sql +psql -U erp_admin -d erp_construccion_db -f 02-users-profiles.sql +psql -U erp_admin -d erp_construccion_db -f 03-empresa-tenant.sql +psql -U erp_admin -d erp_construccion_db -f 04-proyectos-obras.sql +psql -U erp_admin -d erp_construccion_db -f 05-presupuestos.sql +psql -U erp_admin -d erp_construccion_db -f 06-estimaciones.sql +psql -U erp_admin -d erp_construccion_db -f 07-avances-calidad.sql +psql -U erp_admin -d erp_construccion_db -f 08-hse.sql +psql -U erp_admin -d erp_construccion_db -f 09-finanzas.sql +psql -U erp_admin -d erp_construccion_db -f 10-activos-documentos.sql +``` + +### Opción 3: Desde Windows (PowerShell) + +```powershell +$env:PGPASSWORD="erp_dev_2026" +Get-ChildItem *.sql | Sort-Object Name | ForEach-Object { + Write-Host "Cargando: $($_.Name)" + psql -h localhost -U erp_admin -d erp_construccion_db -f $_.FullName +} +``` + +## Usuarios Demo + +| Rol | Email | Password | Descripción | +|-----|-------|----------|-------------| +| Super Admin | admin@demo.com | Demo2026! | Acceso total | +| Director | director@demo.com | Demo2026! | Reportes y aprobaciones | +| Gerente Obra | gerente1@demo.com | Demo2026! | Gestión de proyectos | +| Residente | residente1@demo.com | Demo2026! | Operación diaria | +| Supervisor | supervisor1@demo.com | Demo2026! | Control de campo | +| Almacenista | almacen1@demo.com | Demo2026! | Inventarios | +| Contador | contador1@demo.com | Demo2026! | Finanzas | +| RRHH | rrhh1@demo.com | Demo2026! | Personal | +| HSE | hse1@demo.com | Demo2026! | Seguridad | +| Calidad | calidad1@demo.com | Demo2026! | Control calidad | +| Comprador | comprador1@demo.com | Demo2026! | Compras | +| Cliente | visor1@demo.com | Demo2026! | Solo lectura | + +## Proyectos Demo + +### 1. Residencial Las Palmas (Horizontal) +- **Tipo:** Fraccionamiento horizontal +- **Unidades:** 120 lotes planificados +- **Etapas:** 3 (E1 en construcción) +- **Estado:** En progreso + +### 2. Torre Diamante (Vertical) +- **Tipo:** Edificio de departamentos +- **Unidades:** 48 departamentos +- **Pisos:** 12 niveles +- **Estado:** En progreso + +### 3. Plaza Central (Comercial) +- **Tipo:** Centro comercial +- **Unidades:** 24 locales +- **Etapas:** 2 +- **Estado:** En planeación + +## Empresa Demo + +- **Nombre:** Constructora Demo S.A. de C.V. +- **RFC:** CDM010101ABC +- **Ubicación:** Aguascalientes, México +- **Sucursales:** 2 (Matriz + Obra Norte) +- **Almacenes:** 4 + +## Dependencias de Seeds + +``` +01-core-catalogs.sql (base) + ↓ +02-users-profiles.sql + ↓ +03-empresa-tenant.sql + ↓ +04-proyectos-obras.sql + ↓ +05-presupuestos.sql ←┬→ 07-avances-calidad.sql ←┬→ 08-hse.sql + ↓ │ │ +06-estimaciones.sql ←┘ │ + ↓ │ +09-finanzas.sql ←───────────────────────────────┘ + ↓ +10-activos-documentos.sql +``` + +## Notas Técnicas + +- Todos los UUIDs son determinísticos para reproducibilidad +- Los seeds usan `ON CONFLICT DO NOTHING` para ser idempotentes +- Cada seed incluye verificación de registros creados +- Password hash es bcrypt con salt 10 + +## Soporte + +Para reportar problemas o sugerencias, crear issue en el repositorio o contactar al equipo de desarrollo. diff --git a/seeds/dev/load-dev-seeds.sh b/seeds/dev/load-dev-seeds.sh new file mode 100644 index 0000000..0ff10ba --- /dev/null +++ b/seeds/dev/load-dev-seeds.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════════════════════ +# SCRIPT: load-dev-seeds.sh +# PROYECTO: ERP Construcción +# DESCRIPCIÓN: Carga todos los seeds de desarrollo en orden +# ═══════════════════════════════════════════════════════════════════════════════ + +set -e # Salir si hay error + +# Configuración +DB_HOST="${DB_HOST:-localhost}" +DB_PORT="${DB_PORT:-5432}" +DB_NAME="${DB_NAME:-erp_construccion_db}" +DB_USER="${DB_USER:-erp_admin}" +DB_PASSWORD="${DB_PASSWORD:-erp_dev_2026}" + +# Colores para output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directorio de seeds +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo -e "${BLUE}══════════════════════════════════════════════════════════════${NC}" +echo -e "${BLUE} CARGA DE SEEDS DE DESARROLLO - ERP CONSTRUCCIÓN${NC}" +echo -e "${BLUE}══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${YELLOW}Base de datos: ${NC}${DB_NAME}" +echo -e "${YELLOW}Host: ${NC}${DB_HOST}:${DB_PORT}" +echo -e "${YELLOW}Usuario: ${NC}${DB_USER}" +echo "" + +# Función para ejecutar un seed +run_seed() { + local seed_file=$1 + local seed_name=$(basename "$seed_file") + + if [ -f "$seed_file" ]; then + echo -e "${YELLOW}→ Cargando: ${NC}${seed_name}..." + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -f "$seed_file" -q + if [ $? -eq 0 ]; then + echo -e "${GREEN} ✓ ${seed_name} cargado correctamente${NC}" + else + echo -e "${RED} ✗ Error al cargar ${seed_name}${NC}" + exit 1 + fi + else + echo -e "${RED} ✗ Archivo no encontrado: ${seed_name}${NC}" + exit 1 + fi +} + +# Verificar conexión +echo -e "${YELLOW}Verificando conexión a la base de datos...${NC}" +PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT 1" > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo -e "${RED}✗ No se pudo conectar a la base de datos${NC}" + echo -e "${RED} Verifica las credenciales y que el servidor esté ejecutándose${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Conexión exitosa${NC}" +echo "" + +# Array de seeds en orden de ejecución +SEEDS=( + "01-core-catalogs.sql" + "02-users-profiles.sql" + "03-empresa-tenant.sql" + "04-proyectos-obras.sql" + "05-presupuestos.sql" + "06-estimaciones.sql" + "07-avances-calidad.sql" + "08-hse.sql" + "09-finanzas.sql" + "10-activos-documentos.sql" +) + +# Ejecutar seeds +echo -e "${BLUE}Iniciando carga de seeds...${NC}" +echo "" + +TOTAL=${#SEEDS[@]} +CURRENT=0 + +for seed in "${SEEDS[@]}"; do + CURRENT=$((CURRENT + 1)) + echo -e "${BLUE}[${CURRENT}/${TOTAL}]${NC}" + run_seed "${SCRIPT_DIR}/${seed}" + echo "" +done + +echo -e "${BLUE}══════════════════════════════════════════════════════════════${NC}" +echo -e "${GREEN} ✓ TODOS LOS SEEDS CARGADOS EXITOSAMENTE${NC}" +echo -e "${BLUE}══════════════════════════════════════════════════════════════${NC}" +echo "" +echo -e "${YELLOW}Usuarios demo disponibles:${NC}" +echo " - admin@demo.com / Demo2026! (Super Admin)" +echo " - director@demo.com / Demo2026! (Director)" +echo " - gerente1@demo.com / Demo2026! (Gerente Obra)" +echo " - residente1@demo.com / Demo2026! (Residente)" +echo "" +echo -e "${YELLOW}Proyectos demo:${NC}" +echo " - Residencial Las Palmas (horizontal)" +echo " - Torre Diamante (vertical)" +echo " - Plaza Central (comercial)" +echo "" diff --git a/seeds/dev/validate-seeds.sql b/seeds/dev/validate-seeds.sql new file mode 100644 index 0000000..37c021a --- /dev/null +++ b/seeds/dev/validate-seeds.sql @@ -0,0 +1,375 @@ +-- ═══════════════════════════════════════════════════════════════════════════════ +-- 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.capacitacion 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.capacitacion; 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 +-- ═══════════════════════════════════════════════════════════════════════════════