erp-construccion-database-v2/seeds/dev/08-hse.sql
Adrian Flores Cortes 8df74f73d2 [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>
2026-02-03 11:08:26 -06:00

260 lines
14 KiB
PL/PgSQL

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