commit c93e2b1e0e7f497c8627ab00e2bd7162d92422f5 Author: Adrian Flores Cortes Date: Sun Jan 25 09:51:31 2026 -0600 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 diff --git a/ddl/00-schemas-init.sql b/ddl/00-schemas-init.sql new file mode 100644 index 0000000..2f49796 --- /dev/null +++ b/ddl/00-schemas-init.sql @@ -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 +-- ============================================================================= diff --git a/ddl/README.md b/ddl/README.md new file mode 100644 index 0000000..e558785 --- /dev/null +++ b/ddl/README.md @@ -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); +```