Script validates all 19 conditional FK constraints and 6 additional indexes. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
296 lines
12 KiB
SQL
296 lines
12 KiB
SQL
-- ============================================================================
|
|
-- TEST: Validar FK Constraints - EPIC-001 FK Débiles
|
|
-- Verifica que los FK constraints condicionales fueron creados correctamente
|
|
-- ============================================================================
|
|
-- Uso:
|
|
-- PGPASSWORD=erp_dev_2026 psql -h localhost -U erp_admin -d erp_construccion_db -f validate-fk-constraints.sql
|
|
-- ============================================================================
|
|
|
|
\echo '============================================'
|
|
\echo 'TEST: Validación de FK Constraints'
|
|
\echo '============================================'
|
|
\echo ''
|
|
|
|
-- Crear tabla temporal para resultados
|
|
DROP TABLE IF EXISTS _fk_test_results;
|
|
CREATE TEMP TABLE _fk_test_results (
|
|
id SERIAL PRIMARY KEY,
|
|
test_name VARCHAR(100),
|
|
expected_constraint VARCHAR(100),
|
|
status VARCHAR(20),
|
|
details TEXT
|
|
);
|
|
|
|
-- ============================================================================
|
|
-- INVENTORY SCHEMA - FK Constraints
|
|
-- ============================================================================
|
|
\echo 'Verificando schema INVENTORY...'
|
|
|
|
-- Test 1: fk_almacenes_proyecto_warehouse
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Almacenes Proyecto → Warehouses',
|
|
'fk_almacenes_proyecto_warehouse',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_almacenes_proyecto_warehouse')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'inventory' AND tablename = 'warehouses')
|
|
THEN 'Tabla warehouses existe - FK esperado'
|
|
ELSE 'Tabla warehouses NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 2: fk_requisicion_lineas_product
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Requisicion Lineas → Products',
|
|
'fk_requisicion_lineas_product',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisicion_lineas_product')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'products' AND tablename = 'products')
|
|
THEN 'Tabla products existe - FK esperado'
|
|
ELSE 'Tabla products NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 3: fk_requisicion_lineas_unit
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Requisicion Lineas → UOM',
|
|
'fk_requisicion_lineas_unit',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisicion_lineas_unit')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'core' AND tablename = 'uom')
|
|
THEN 'Tabla uom existe - FK esperado'
|
|
ELSE 'Tabla uom NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 4: fk_requisiciones_obra_dest_warehouse
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Requisiciones Obra → Dest Warehouse',
|
|
'fk_requisiciones_obra_dest_warehouse',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisiciones_obra_dest_warehouse')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para destination_warehouse_id';
|
|
|
|
-- Test 5: fk_requisiciones_obra_purchase_order
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Requisiciones Obra → Purchase Orders',
|
|
'fk_requisiciones_obra_purchase_order',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_requisiciones_obra_purchase_order')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'purchases' AND tablename = 'purchase_orders')
|
|
THEN 'Tabla purchase_orders existe - FK esperado'
|
|
ELSE 'Tabla purchase_orders NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 6: fk_consumos_obra_product
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Consumos Obra → Products',
|
|
'fk_consumos_obra_product',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_consumos_obra_product')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para product_id en consumos';
|
|
|
|
-- Test 7: fk_consumos_obra_stock_move
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Consumos Obra → Stock Moves',
|
|
'fk_consumos_obra_stock_move',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_consumos_obra_stock_move')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'inventory' AND tablename = 'stock_moves')
|
|
THEN 'Tabla stock_moves existe - FK esperado'
|
|
ELSE 'Tabla stock_moves NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- ============================================================================
|
|
-- PURCHASE SCHEMA - FK Constraints
|
|
-- ============================================================================
|
|
\echo 'Verificando schema PURCHASE...'
|
|
|
|
-- Test 8: fk_po_construction_purchase_order
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'PO Construction → Purchase Orders',
|
|
'fk_po_construction_purchase_order',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_po_construction_purchase_order')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'purchases' AND tablename = 'purchase_orders')
|
|
THEN 'Tabla purchase_orders existe - FK esperado'
|
|
ELSE 'Tabla purchase_orders NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 9: fk_supplier_construction_partner
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Supplier Construction → Partners',
|
|
'fk_supplier_construction_partner',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_supplier_construction_partner')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'partners' AND tablename = 'partners')
|
|
THEN 'Tabla partners existe - FK esperado'
|
|
ELSE 'Tabla partners NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 10: fk_comparativo_winner_supplier
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Comparativo → Winner Supplier',
|
|
'fk_comparativo_winner_supplier',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_winner_supplier')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para winner_supplier_id';
|
|
|
|
-- Test 11: fk_comparativo_prov_supplier
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Comparativo Prov → Supplier',
|
|
'fk_comparativo_prov_supplier',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_prov_supplier')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para supplier_id en comparativo_proveedores';
|
|
|
|
-- Test 12: fk_comparativo_prod_product
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Comparativo Prod → Product',
|
|
'fk_comparativo_prod_product',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_comparativo_prod_product')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para product_id en comparativo_productos';
|
|
|
|
-- ============================================================================
|
|
-- HSE SCHEMA - FK Constraints
|
|
-- ============================================================================
|
|
\echo 'Verificando schema HSE...'
|
|
|
|
-- Test 13: fk_epp_inventario_almacen
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'EPP Inventario → Almacen Temporal',
|
|
'fk_epp_inventario_almacen',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_inventario_almacen')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para almacen_id en epp_inventario';
|
|
|
|
-- Test 14: fk_epp_movimientos_almacen_origen
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'EPP Movimientos → Almacen Origen',
|
|
'fk_epp_movimientos_almacen_origen',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_movimientos_almacen_origen')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para almacen_origen_id';
|
|
|
|
-- Test 15: fk_epp_movimientos_almacen_destino
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'EPP Movimientos → Almacen Destino',
|
|
'fk_epp_movimientos_almacen_destino',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_epp_movimientos_almacen_destino')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para almacen_destino_id';
|
|
|
|
-- ============================================================================
|
|
-- DOCUMENTS SCHEMA - FK Constraints
|
|
-- ============================================================================
|
|
\echo 'Verificando schema DOCUMENTS...'
|
|
|
|
-- Test 16: fk_documents_parent
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Documents → Parent Document',
|
|
'fk_documents_parent',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_documents_parent')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para parent_document_id';
|
|
|
|
-- Test 17: fk_access_logs_document
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Access Logs → Document',
|
|
'fk_access_logs_document',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_access_logs_document')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para document_id';
|
|
|
|
-- Test 18: fk_access_logs_user
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Access Logs → User',
|
|
'fk_access_logs_user',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_access_logs_user')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'auth' AND tablename = 'users')
|
|
THEN 'Tabla users existe - FK esperado'
|
|
ELSE 'Tabla users NO existe - FK no aplicable'
|
|
END;
|
|
|
|
-- Test 19: fk_document_shares_shared_by
|
|
INSERT INTO _fk_test_results (test_name, expected_constraint, status, details)
|
|
SELECT
|
|
'Document Shares → Shared By',
|
|
'fk_document_shares_shared_by',
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_document_shares_shared_by')
|
|
THEN 'PASS' ELSE 'FAIL' END,
|
|
'FK para shared_by_id';
|
|
|
|
-- ============================================================================
|
|
-- RESULTADOS
|
|
-- ============================================================================
|
|
\echo ''
|
|
\echo '============================================'
|
|
\echo 'RESULTADOS DE TESTS FK CONSTRAINTS'
|
|
\echo '============================================'
|
|
|
|
SELECT
|
|
id,
|
|
test_name,
|
|
status,
|
|
details
|
|
FROM _fk_test_results
|
|
ORDER BY id;
|
|
|
|
\echo ''
|
|
\echo '============================================'
|
|
\echo 'RESUMEN'
|
|
\echo '============================================'
|
|
|
|
SELECT
|
|
status,
|
|
COUNT(*) as total,
|
|
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM _fk_test_results), 1) as porcentaje
|
|
FROM _fk_test_results
|
|
GROUP BY status
|
|
ORDER BY status;
|
|
|
|
\echo ''
|
|
\echo 'NOTA: Los tests con FAIL donde la tabla referenciada NO existe son esperados.'
|
|
\echo ' Los FK constraints son condicionales - solo se crean si la tabla destino existe.'
|
|
\echo ''
|
|
|
|
-- ============================================================================
|
|
-- INDICES ADICIONALES
|
|
-- ============================================================================
|
|
\echo '============================================'
|
|
\echo 'VERIFICACION DE INDICES ADICIONALES'
|
|
\echo '============================================'
|
|
|
|
SELECT
|
|
indexname,
|
|
CASE WHEN EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = t.indexname)
|
|
THEN 'EXISTE' ELSE 'NO EXISTE' END as status
|
|
FROM (
|
|
VALUES
|
|
('idx_comparativo_prod_product_id'),
|
|
('idx_epp_inventario_almacen_id'),
|
|
('idx_epp_movimientos_almacen_origen'),
|
|
('idx_epp_movimientos_almacen_destino'),
|
|
('idx_documents_parent'),
|
|
('idx_document_shares_shared_by')
|
|
) AS t(indexname);
|
|
|
|
\echo ''
|
|
\echo 'Test completado.'
|