[TASK-2026-02-03-SEEDS] feat: Add complete development seeds for demo

Seeds include:
- 01-core-catalogs.sql: Units, currencies, taxes, banks, states (~100 records)
- 02-users-profiles.sql: 12 roles, 50+ permissions, 12 demo users
- 03-empresa-tenant.sql: Demo company with 2 branches, 4 warehouses
- 04-proyectos-obras.sql: 3 projects, stages, lots, apartments
- 05-presupuestos.sql: CMIC-based concepts, 5 budgets
- 06-estimaciones.sql: Contracts, estimates, advances
- 07-avances-calidad.sql: Progress, logbook, quality checklists
- 08-hse.sql: PPE catalog, training, incidents
- 09-finanzas.sql: Chart of accounts, CxP, CxC, balanced entries
- 10-activos-documentos.sql: Assets, maintenance, documents

Total: ~940 records for complete demo coverage

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-02-03 11:08:26 -06:00
parent a9dcf86545
commit 8df74f73d2
13 changed files with 3724 additions and 0 deletions

View File

@ -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', '', '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', '', '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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

259
seeds/dev/08-hse.sql Normal file
View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

379
seeds/dev/09-finanzas.sql Normal file
View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════

141
seeds/dev/README.md Normal file
View File

@ -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.

109
seeds/dev/load-dev-seeds.sh Normal file
View File

@ -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 ""

View File

@ -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
-- ═══════════════════════════════════════════════════════════════════════════════