feat: Initial database structure for ERP Transportistas

- PostgreSQL 15 with PostGIS extension
- 8 schemas for transport domain
- ENUMs for viaje states, unit types, events
- DDL documentation and conventions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-01-25 09:51:31 -06:00
commit c93e2b1e0e
2 changed files with 200 additions and 0 deletions

140
ddl/00-schemas-init.sql Normal file
View File

@ -0,0 +1,140 @@
-- =============================================================================
-- ERP TRANSPORTISTAS - Inicializacion de Schemas
-- =============================================================================
-- Archivo: 00-schemas-init.sql
-- Version: 1.0.0
-- Fecha: 2026-01-25
-- Descripcion: Crea los schemas especificos del giro transporte
-- =============================================================================
-- Extensiones requeridas
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "postgis"; -- Para geolocalizacion
-- =============================================================================
-- SCHEMAS DEL GIRO TRANSPORTE
-- =============================================================================
-- Schema principal de transporte
CREATE SCHEMA IF NOT EXISTS transport;
COMMENT ON SCHEMA transport IS 'Ordenes de transporte, embarques, viajes, POD';
-- Schema de flota
CREATE SCHEMA IF NOT EXISTS fleet;
COMMENT ON SCHEMA fleet IS 'Unidades, remolques, operadores, documentos';
-- Schema de tracking
CREATE SCHEMA IF NOT EXISTS tracking;
COMMENT ON SCHEMA tracking IS 'Eventos GPS, geocercas, alertas';
-- Schema de combustible y gastos
CREATE SCHEMA IF NOT EXISTS fuel;
COMMENT ON SCHEMA fuel IS 'Control de combustible, peajes, gastos de viaje';
-- Schema de mantenimiento
CREATE SCHEMA IF NOT EXISTS maintenance;
COMMENT ON SCHEMA maintenance IS 'Mantenimiento preventivo y correctivo de flota';
-- Schema de carriers (terceros)
CREATE SCHEMA IF NOT EXISTS carriers;
COMMENT ON SCHEMA carriers IS 'Gestion de transportistas subcontratados';
-- Schema de facturacion transporte
CREATE SCHEMA IF NOT EXISTS billing;
COMMENT ON SCHEMA billing IS 'Tarifas, facturacion, recargos especificos transporte';
-- Schema de cumplimiento normativo
CREATE SCHEMA IF NOT EXISTS compliance;
COMMENT ON SCHEMA compliance IS 'Carta Porte, HOS, inspecciones, NOM-087/068';
-- =============================================================================
-- TIPOS ENUMERADOS COMUNES
-- =============================================================================
-- Estados del viaje
CREATE TYPE transport.estado_viaje AS ENUM (
'BORRADOR',
'PLANEADO',
'DESPACHADO',
'EN_TRANSITO',
'EN_DESTINO',
'ENTREGADO',
'CERRADO',
'FACTURADO',
'COBRADO',
'CANCELADO'
);
-- Tipos de unidad
CREATE TYPE fleet.tipo_unidad AS ENUM (
'TRACTORA',
'REMOLQUE',
'CAJA_SECA',
'CAJA_REFRIGERADA',
'PLATAFORMA',
'TANQUE',
'PORTACONTENEDOR',
'TORTON',
'RABON',
'CAMIONETA'
);
-- Estados de unidad
CREATE TYPE fleet.estado_unidad AS ENUM (
'DISPONIBLE',
'EN_VIAJE',
'EN_TALLER',
'BLOQUEADA',
'BAJA'
);
-- Tipos de evento tracking
CREATE TYPE tracking.tipo_evento AS ENUM (
'SALIDA',
'ARRIBO_ORIGEN',
'INICIO_CARGA',
'FIN_CARGA',
'ARRIBO_DESTINO',
'INICIO_DESCARGA',
'FIN_DESCARGA',
'ENTREGA_POD',
'DESVIO',
'PARADA',
'INCIDENTE',
'GPS_POSICION'
);
-- Fuente del evento
CREATE TYPE tracking.fuente_evento AS ENUM (
'GPS',
'APP_OPERADOR',
'SISTEMA',
'MANUAL',
'GEOCERCA'
);
-- Tipos de incidencia
CREATE TYPE transport.tipo_incidencia AS ENUM (
'RETRASO',
'RECHAZO',
'DANO',
'ROBO',
'FALTANTE',
'DEVOLUCION',
'ACCIDENTE',
'MULTA',
'OTRO'
);
-- Modalidad de servicio
CREATE TYPE transport.modalidad_servicio AS ENUM (
'FTL', -- Full Truck Load
'LTL', -- Less Than Truck Load
'DEDICADO',
'EXPRESS',
'CONSOLIDADO'
);
-- =============================================================================
-- FIN DE INICIALIZACION
-- =============================================================================

60
ddl/README.md Normal file
View File

@ -0,0 +1,60 @@
# DDL - ERP Transportistas
Este directorio contiene los scripts DDL (Data Definition Language) para PostgreSQL.
## Estructura de Archivos
```
ddl/
├── 01-transport-schema-ddl.sql # OT, Embarques, Viajes, Paradas, POD
├── 02-fleet-schema-ddl.sql # Unidades, Remolques, Operadores
├── 03-tracking-schema-ddl.sql # Eventos GPS, Geocercas, Alertas
├── 04-fuel-schema-ddl.sql # Combustible, Peajes, Gastos
├── 05-maintenance-schema-ddl.sql # Mantenimiento, Ordenes de trabajo
├── 06-carriers-schema-ddl.sql # Terceros, Documentos, Scorecard
├── 07-billing-transport-ddl.sql # Tarifas, Facturacion, Recargos
├── 08-compliance-schema-ddl.sql # Carta Porte, HOS, Inspecciones
└── 99-rls-transport-modules.sql # Row Level Security
```
## Orden de Ejecucion
1. Ejecutar DDL de erp-core primero (schemas base)
2. Ejecutar archivos de este directorio en orden numerico
## Convencion de Nombres
- Tablas: snake_case, plural (ej: `ordenes_transporte`)
- Indices: `idx_{tabla}_{columnas}`
- Foreign Keys: `fk_{tabla}_{referencia}`
- Constraints: `chk_{tabla}_{regla}`
## Multi-Tenancy
Todas las tablas incluyen:
- `tenant_id UUID NOT NULL`
- Indice compuesto con tenant_id
- RLS policy para aislamiento
## Ejemplo de Tabla
```sql
CREATE TABLE transport.ordenes_transporte (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES public.tenants(id),
codigo VARCHAR(50) NOT NULL,
-- ... mas columnas
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
created_by_id UUID NOT NULL,
CONSTRAINT uq_ot_tenant_codigo UNIQUE (tenant_id, codigo)
);
CREATE INDEX idx_ot_tenant ON transport.ordenes_transporte(tenant_id);
CREATE INDEX idx_ot_estado ON transport.ordenes_transporte(tenant_id, estado);
ALTER TABLE transport.ordenes_transporte ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON transport.ordenes_transporte
USING (tenant_id = current_setting('app.tenant_id')::uuid);
```