erp-transportistas-v2/docs/02-definicion-modulos/MAI-003-ordenes-transporte/historias-usuario/US-MAI003-001.md
Adrian Flores Cortes ec43d9c6cd docs: Add Phase 3 secondary modules specifications (P1/P2/P3)
Modules documented:
- MAI-003 (OT): README, REQUERIMIENTOS, RESUMEN-EPICA, 10 US
- MAI-006 (Tracking): README, REQUERIMIENTOS, RESUMEN-EPICA
- MAI-008 (Incidencias): 3 US (18 SP)
- MAI-011 (Flota): README, REQUERIMIENTOS, RESUMEN-EPICA
- MAI-012 (Combustible): 3 US (18 SP)
- MAI-013 (Mantenimiento): 3 US (18 SP)
- MAI-014 (Carriers): 3 US (18 SP)
- MAI-015 (Portal): 3 US (18 SP)
- MAE-016 (Carta Porte): 10 US
- MAE-017 (HOS): 3 US (16 SP)
- MAE-018 (Reportes): 3 US (18 SP)

Phase 2+3 complete: 13 modules, 50+ User Stories

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 02:24:35 -06:00

5.1 KiB

US-MAI003-001: Crear orden de transporte

Metadata

Campo Valor
ID US-MAI003-001
Epica EPIC-MAI-003 - Ordenes de Transporte
Modulo ordenes-transporte
Prioridad P0
Story Points 8
Sprint Por asignar
Estado Backlog

Historia de Usuario

Como despachador de una empresa transportista, quiero crear una orden de transporte con todos los datos del servicio solicitado por el cliente, para registrar formalmente la demanda de transporte y que pueda ser procesada por el equipo de planeacion y operaciones.

Descripcion Detallada

La creacion de una OT es el punto de entrada del flujo operativo de transporte. El despachador recibe la solicitud del cliente (por telefono, email o portal) y registra toda la informacion necesaria para ejecutar el servicio: datos del shipper y consignee, ubicaciones de origen y destino con coordenadas geograficas, fechas y ventanas de tiempo para recoleccion y entrega, caracteristicas de la carga (tipo, peso, volumen, piezas, pallets, valor declarado) y la tarifa aplicable.

El sistema debe generar automaticamente un codigo unico de OT por tenant (por ejemplo, OT-2026-00001) y registrar al usuario creador. La OT se crea en estado BORRADOR, permitiendo al despachador completar o modificar los datos antes de confirmarla.

Los campos de origen y destino incluyen datos de geolocalizacion (latitud/longitud) que seran utilizados posteriormente por los modulos de planeacion (MAI-004) y tracking (MAI-006). La tarifa se calcula automaticamente al asociar un tarifario, aplicando recargos y descuentos para obtener el total del servicio.

Criterios de Aceptacion

Escenario 1: Creacion exitosa con datos obligatorios

Dado que el despachador tiene permisos de creacion de OT y existe al menos un cliente registrado, Cuando completa el formulario con los datos obligatorios (shipper, consignee, origen, destino) y presiona guardar, Entonces el sistema crea la OT en estado BORRADOR con un codigo unico generado automaticamente, registra created_at y created_by_id, y muestra el detalle de la OT creada.

Escenario 2: Validacion de datos obligatorios

Dado que el despachador esta creando una nueva OT, Cuando intenta guardar sin completar los campos obligatorios (shipper_id, shipper_nombre, consignee_id, consignee_nombre, origen_direccion, destino_direccion, created_by_id), Entonces el sistema muestra mensajes de validacion indicando los campos faltantes y no crea la OT.

Escenario 3: Codigo unico por tenant

Dado que el tenant ya tiene OTs registradas, Cuando se crea una nueva OT, Entonces el sistema genera un codigo que no exista previamente para ese tenant, respetando la constraint uq_ot_tenant_codigo.

Escenario 4: Registro completo de carga y tarifas

Dado que el despachador esta creando una OT con datos de carga completos, Cuando selecciona tipo_carga, ingresa peso_kg, volumen_m3, piezas, pallets, valor_declarado y asocia una tarifa_id, Entonces el sistema calcula tarifa_base, recargos, descuentos, subtotal, IVA y total automaticamente y los almacena en la OT.

Tareas Tecnicas

  • Database: Verificar que la tabla transport.ordenes_transporte existe con todos los campos del DDL, incluyendo indices idx_ot_tenant, idx_ot_estado, idx_ot_shipper, idx_ot_fechas y constraint uq_ot_tenant_codigo.
  • Backend: Crear entity OrdenTransporte mapeada a transport.ordenes_transporte. Crear OrdenTransporteService con metodo create() que valide datos obligatorios, genere codigo unico y calcule tarifas. Crear OrdenTransporteController con endpoint POST /api/v1/ordenes-transporte. Crear DTOs: CreateOrdenTransporteDto con validaciones class-validator.
  • Frontend: Crear pagina OrdenesTransporteCreatePage con formulario multi-seccion (datos generales, origen/destino, carga, tarifas). Incluir seleccion de shipper y consignee con autocompletado. Incluir mapa para seleccion de coordenadas.
  • Tests: Tests unitarios del servicio (validacion, generacion de codigo, calculo de tarifas). Tests de integracion del endpoint POST. Tests e2e del flujo completo de creacion.

Dependencias

  • Depende de: MAI-001 (Auth - autenticacion y permisos), MAI-002 (Clientes - catalogo de shippers/consignees y tarifas)
  • Bloquea: US-MAI003-002 (paradas), US-MAI003-003 (restricciones), US-MAI003-004 (embarques), US-MAI003-005 (consulta status), US-MAI003-006 (modificar), US-MAI003-007 (cancelar)

Notas Tecnicas

  • Endpoint: POST /api/v1/ordenes-transporte
  • Entity: OrdenTransporte -> transport.ordenes_transporte
  • RLS: La politica tenant_isolation_ot filtra por tenant_id = current_setting('app.tenant_id')::uuid
  • Generacion de codigo: Implementar secuencia por tenant, formato sugerido: OT-{YYYY}-{SECUENCIAL:5}
  • Calculo de tarifa: Consultar tarifa vigente del modulo MAI-002, aplicar recargos del catalogo de billing, calcular IVA al 16%
  • Coordenadas: Campos origen_latitud, origen_longitud, destino_latitud, destino_longitud como DECIMAL(10,7) para precision de ~1cm

US-MAI003-001 - ERP Transportistas v1.0.0