docs: Complete SIMCO documentation for MAI-009 and MAI-012 modules

- Add ENTITIES.md for MAI-012 (Combustible y Gastos) with 5 entities
- Add ENTITIES.md for MAI-009 (Facturacion Transporte) with 6 entities
- Update TASK-2026-01-25-DOCUMENTACION-MODULOS status to completed
- Document all fields, indices, ENUMs and helper methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-01-25 14:55:18 -06:00
parent e020576fcc
commit d1f6a176f0
3 changed files with 801 additions and 5 deletions

View File

@ -0,0 +1,426 @@
# ENTITIES.md - MAI-009 Facturacion Transporte
**Modulo:** MAI-009 | **Version:** 1.0.0 | **Actualizado:** 2026-01-25
---
## Resumen
| Metrica | Valor |
|---------|-------|
| Total Entidades | 6 |
| Schema BD | billing |
| ENUMs | 4 |
| Estado | Implementado |
---
## 1. Lane
**Archivo:** `lane.entity.ts`
**Tabla:** `billing.lanes`
**Descripcion:** Rutas/lanes de transporte (origen-destino) para cotizacion.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| codigo | varchar(50) | No | - | Codigo unico del lane |
| nombre | varchar(200) | No | - | Nombre descriptivo |
| origenCiudad | varchar(100) | No | - | Ciudad de origen |
| origenEstado | varchar(100) | No | - | Estado de origen |
| origenCodigoPostal | varchar(10) | Si | - | CP origen |
| destinoCiudad | varchar(100) | No | - | Ciudad de destino |
| destinoEstado | varchar(100) | No | - | Estado de destino |
| destinoCodigoPostal | varchar(10) | Si | - | CP destino |
| distanciaKm | decimal(10,2) | Si | - | Distancia en km |
| tiempoEstimadoHoras | decimal(6,2) | Si | - | Tiempo estimado hrs |
| activo | boolean | No | true | Lane activo |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_lane_tenant` (tenantId)
- `idx_lane_codigo` (tenantId, codigo) UNIQUE
### Helpers
- `descripcionCorta`: "Ciudad Origen -> Ciudad Destino"
- `descripcionCompleta`: "Ciudad, Estado -> Ciudad, Estado"
---
## 2. Tarifa
**Archivo:** `tarifa.entity.ts`
**Tabla:** `billing.tarifas`
**Descripcion:** Tarifas de transporte por lane, cliente, tipo de servicio.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| codigo | varchar(50) | No | - | Codigo de tarifa |
| nombre | varchar(200) | No | - | Nombre descriptivo |
| descripcion | text | Si | - | Descripcion detallada |
| clienteId | uuid | Si | - | FK a cliente (tarifa especifica) |
| laneId | uuid | Si | - | FK a lane |
| modalidadServicio | varchar(50) | Si | - | FTL, LTL, etc. |
| tipoEquipo | varchar(50) | Si | - | Caja seca, refrigerado, etc. |
| tipoTarifa | enum | No | - | Tipo de calculo |
| tarifaBase | decimal(15,2) | No | - | Monto base |
| tarifaKm | decimal(10,4) | Si | - | Tarifa por km |
| tarifaTonelada | decimal(10,4) | Si | - | Tarifa por tonelada |
| tarifaM3 | decimal(10,4) | Si | - | Tarifa por m3 |
| tarifaPallet | decimal(10,4) | Si | - | Tarifa por pallet |
| tarifaHora | decimal(10,4) | Si | - | Tarifa por hora |
| minimoFacturar | decimal(15,2) | Si | - | Minimo a facturar |
| pesoMinimoKg | decimal(10,2) | Si | - | Peso minimo kg |
| moneda | varchar(3) | No | MXN | Moneda (MXN, USD) |
| fechaInicio | date | No | - | Inicio vigencia |
| fechaFin | date | Si | - | Fin vigencia |
| activa | boolean | No | true | Tarifa activa |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
| updatedAt | timestamptz | No | now() | Fecha actualizacion |
### Relaciones
| Relacion | Tipo | Target | Campo FK |
|----------|------|--------|----------|
| lane | ManyToOne | Lane | laneId |
### Indices
- `idx_tarifa_tenant` (tenantId)
- `idx_tarifa_cliente` (clienteId)
- `idx_tarifa_lane` (laneId)
- `idx_tarifa_activa` (tenantId, activa, fechaInicio)
### ENUMs Asociados
```typescript
enum TipoTarifa {
POR_VIAJE = 'POR_VIAJE', // Monto fijo por viaje
POR_KM = 'POR_KM', // Base + km recorridos
POR_TONELADA = 'POR_TONELADA', // Base + toneladas
POR_M3 = 'POR_M3', // Base + metros cubicos
POR_PALLET = 'POR_PALLET', // Base + pallets
POR_HORA = 'POR_HORA', // Base + horas
MIXTA = 'MIXTA', // Combinacion de criterios
}
```
### Helpers
- `vigente`: true si activa y dentro de fechas
- `esEspecifica`: true si tiene clienteId
- `calcularMonto(params)`: Calcula monto segun tipoTarifa
---
## 3. RecargoCatalogo
**Archivo:** `recargo-catalogo.entity.ts`
**Tabla:** `billing.recargos_catalogo`
**Descripcion:** Catalogo de recargos aplicables (fuel surcharge, detention, etc.).
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| codigo | varchar(50) | No | - | Codigo unico |
| nombre | varchar(200) | No | - | Nombre del recargo |
| tipo | enum | No | - | Tipo de recargo |
| descripcion | text | Si | - | Descripcion |
| esPorcentaje | boolean | No | false | Es porcentaje o monto fijo |
| monto | decimal(15,4) | No | - | Monto o porcentaje |
| moneda | varchar(3) | No | MXN | Moneda |
| aplicaAutomatico | boolean | No | false | Se aplica automaticamente |
| condicionAplicacion | text | Si | - | Condicion para aplicar |
| activo | boolean | No | true | Recargo activo |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_recargo_tenant` (tenantId)
- `idx_recargo_codigo` (tenantId, codigo) UNIQUE
### ENUMs Asociados
```typescript
enum TipoRecargo {
FUEL_SURCHARGE = 'FUEL_SURCHARGE', // Recargo combustible
DETENTION = 'DETENTION', // Tiempo espera carga/descarga
MANIOBRAS = 'MANIOBRAS', // Maniobras especiales
CUSTODIA = 'CUSTODIA', // Escolta/custodia
ESCOLTA = 'ESCOLTA', // Escolta armada
PERNOCTA = 'PERNOCTA', // Pernocta de unidad
ESTADIAS = 'ESTADIAS', // Dias extra
FALSO_FLETE = 'FALSO_FLETE', // Viaje cancelado
SEGURO_ADICIONAL = 'SEGURO_ADICIONAL', // Seguro extra
OTRO = 'OTRO', // Otros
}
```
### Helpers
- `calcularRecargo(base)`: Calcula monto segun esPorcentaje
- `descripcionMonto`: "15%" o "$500.00 MXN"
---
## 4. FacturaTransporte
**Archivo:** `factura-transporte.entity.ts`
**Tabla:** `billing.facturas_transporte`
**Descripcion:** Facturas de servicios de transporte (CFDI).
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| serie | varchar(10) | Si | - | Serie de factura |
| folio | varchar(20) | No | - | Folio de factura |
| uuidCfdi | uuid | Si | - | UUID del CFDI timbrado |
| clienteId | uuid | No | - | FK a cliente |
| clienteRfc | varchar(13) | No | - | RFC del cliente |
| clienteRazonSocial | varchar(200) | No | - | Razon social |
| clienteUsoCfdi | varchar(10) | Si | - | Uso CFDI SAT |
| fechaEmision | timestamptz | No | - | Fecha/hora emision |
| fechaVencimiento | date | Si | - | Fecha vencimiento |
| subtotal | decimal(15,2) | No | - | Subtotal |
| descuento | decimal(15,2) | No | 0 | Descuento |
| iva | decimal(15,2) | No | 0 | IVA |
| retencionIva | decimal(15,2) | No | 0 | Retencion IVA |
| retencionIsr | decimal(15,2) | No | 0 | Retencion ISR |
| total | decimal(15,2) | No | - | Total factura |
| moneda | varchar(3) | No | MXN | Moneda |
| tipoCambio | decimal(10,4) | No | 1 | Tipo de cambio |
| formaPago | varchar(10) | Si | - | Forma pago SAT |
| metodoPago | varchar(10) | Si | - | Metodo pago SAT |
| condicionesPago | varchar(200) | Si | - | Condiciones |
| viajeIds | uuid[] | Si | - | IDs de viajes incluidos |
| otIds | uuid[] | Si | - | IDs de OTs incluidas |
| xmlCfdi | text | Si | - | XML del CFDI |
| pdfUrl | text | Si | - | URL del PDF |
| estado | enum | No | BORRADOR | Estado de factura |
| montoPagado | decimal(15,2) | No | 0 | Monto pagado |
| fechaPago | timestamptz | Si | - | Fecha de pago |
| fechaCancelacion | timestamptz | Si | - | Fecha cancelacion |
| motivoCancelacion | text | Si | - | Motivo cancelacion |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
| updatedAt | timestamptz | No | now() | Fecha actualizacion |
### Relaciones
| Relacion | Tipo | Target | Campo FK |
|----------|------|--------|----------|
| lineas | OneToMany | LineaFactura | facturaId |
### Indices
- `idx_factura_tenant` (tenantId)
- `idx_factura_cliente` (clienteId)
- `idx_factura_estado` (tenantId, estado)
- `idx_factura_fecha` (fechaEmision)
- `idx_factura_folio` (tenantId, serie, folio) UNIQUE
### ENUMs Asociados
```typescript
enum EstadoFactura {
BORRADOR = 'BORRADOR', // En edicion
EMITIDA = 'EMITIDA', // Timbrada
ENVIADA = 'ENVIADA', // Enviada al cliente
PAGADA = 'PAGADA', // Pagada completamente
PARCIAL = 'PARCIAL', // Pago parcial
VENCIDA = 'VENCIDA', // Vencida sin pago
CANCELADA = 'CANCELADA', // Cancelada SAT
}
```
### Helpers
- `saldoPendiente`: total - montoPagado
- `estaPagada`: true si montoPagado >= total
- `estaVencida`: true si paso fechaVencimiento
- `diasVencida`: Dias desde vencimiento
- `folioCompleto`: "SERIE-FOLIO"
---
## 5. LineaFactura
**Archivo:** `linea-factura.entity.ts`
**Tabla:** `billing.lineas_factura`
**Descripcion:** Lineas/conceptos de una factura.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| facturaId | uuid | No | - | FK a factura |
| linea | int | No | - | Numero de linea |
| descripcion | text | No | - | Descripcion concepto |
| claveProductoSat | varchar(10) | Si | - | Clave prod/serv SAT |
| unidadSat | varchar(10) | Si | - | Clave unidad SAT |
| cantidad | decimal(12,4) | No | - | Cantidad |
| precioUnitario | decimal(15,4) | No | - | Precio unitario |
| descuento | decimal(15,2) | No | 0 | Descuento |
| importe | decimal(15,2) | No | - | Importe (cant * PU) |
| ivaTasa | decimal(5,2) | No | 16 | Tasa IVA % |
| ivaMonto | decimal(15,2) | Si | - | Monto IVA |
| viajeId | uuid | Si | - | FK a viaje (referencia) |
| otId | uuid | Si | - | FK a OT (referencia) |
| recargoId | uuid | Si | - | FK a recargo aplicado |
### Relaciones
| Relacion | Tipo | Target | Campo FK |
|----------|------|--------|----------|
| factura | ManyToOne | FacturaTransporte | facturaId |
| recargo | ManyToOne | RecargoCatalogo | recargoId |
### Indices
- `idx_linea_factura` (facturaId)
### Helpers
- `importeNeto`: importe - descuento
- `importeConIva`: importeNeto + ivaMonto
- `calcularImporte()`: cantidad * precioUnitario
- `calcularIva()`: importeNeto * (ivaTasa/100)
---
## 6. FuelSurcharge
**Archivo:** `fuel-surcharge.entity.ts`
**Tabla:** `billing.fuel_surcharge`
**Descripcion:** Tabla de fuel surcharge (recargo por combustible) por periodo.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| fechaInicio | date | No | - | Inicio del periodo |
| fechaFin | date | No | - | Fin del periodo |
| precioDieselReferencia | decimal(10,4) | Si | - | Precio diesel base |
| precioDieselActual | decimal(10,4) | Si | - | Precio diesel actual |
| porcentajeSurcharge | decimal(5,2) | No | - | % a aplicar |
| activo | boolean | No | true | Periodo activo |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_fuel_surcharge_fecha` (tenantId, fechaInicio, fechaFin)
### Helpers
- `vigente`: true si fecha actual en rango y activo
- `variacionPrecio`: % variacion diesel actual vs referencia
- `calcularRecargo(montoBase)`: montoBase * (porcentajeSurcharge/100)
- `descripcionPeriodo`: "01/01/2026 - 15/01/2026"
---
## Diagrama de Relaciones
```
+----------------+ +----------------+
| Lane |<------+ Tarifa |
+----------------+ +----------------+
|
v
+----------------+ +------------------+
| RecargoCatalogo|<------+ LineaFactura |
+----------------+ +--------+---------+
|
v
+----------------+ +------------------+
| FuelSurcharge | | FacturaTransporte|
+----------------+ +------------------+
|
+----> Viajes/OTs (referencias)
```
---
## Flujo de Facturacion
```
1. CREAR FACTURA
- Seleccionar viajes/OTs a facturar
- Sistema calcula totales de servicios
2. AGREGAR LINEAS
- Lineas automaticas desde viajes/OTs
- Lineas manuales (recargos, ajustes)
3. APLICAR RECARGOS
- Fuel surcharge (automatico si activo)
- Detention, maniobras, etc.
4. REVISAR TOTALES
- Subtotal, descuentos, IVA, retenciones
- Total a cobrar
5. TIMBRAR CFDI
- Generar XML con Carta Porte (MAE-016)
- Enviar a PAC
- Obtener UUID y sello
6. ENVIAR AL CLIENTE
- PDF + XML por email
- Registrar en portal
7. SEGUIMIENTO COBRANZA
- Registrar pagos parciales/totales
- Alertas de vencimiento
```
---
## Casos de Uso
### CU-001: Crear Tarifa por Lane
1. Administrador define origen-destino (Lane)
2. Crea tarifa asociada con tipo de calculo
3. Define vigencia y monto minimo
4. Opcionalmente asocia a cliente especifico
### CU-002: Facturar Viajes
1. Operaciones cierra viajes con POD
2. Administracion selecciona viajes a facturar
3. Sistema genera factura con lineas
4. Aplica fuel surcharge vigente
5. Timbra y envia al cliente
### CU-003: Actualizar Fuel Surcharge
1. Administrador obtiene precio diesel actual
2. Compara con precio de referencia
3. Calcula % de incremento
4. Crea nuevo periodo de fuel surcharge
5. Sistema aplica automaticamente a nuevas facturas
---
*MAI-009 Facturacion Transporte - ERP Transportistas v1.0.0*

View File

@ -0,0 +1,364 @@
# ENTITIES.md - MAI-012 Combustible y Gastos
**Modulo:** MAI-012 | **Version:** 1.0.0 | **Actualizado:** 2026-01-25
---
## Resumen
| Metrica | Valor |
|---------|-------|
| Total Entidades | 5 |
| Schema BD | fuel |
| ENUMs | 7 |
| Estado | Implementado |
---
## 1. CargaCombustible
**Archivo:** `carga-combustible.entity.ts`
**Tabla:** `fuel.cargas_combustible`
**Descripcion:** Registro de cargas de combustible realizadas por operadores.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| unidadId | uuid | No | - | FK a unidad/vehiculo |
| viajeId | uuid | Si | - | FK a viaje (opcional) |
| operadorId | uuid | No | - | FK a operador |
| tipoCarga | enum | No | - | Tipo: VALE, TARJETA, EFECTIVO, FACTURA_DIRECTA |
| tipoCombustible | varchar(20) | No | - | DIESEL, GASOLINA_MAGNA, etc. |
| litros | decimal(10,3) | No | - | Cantidad en litros |
| precioLitro | decimal(10,4) | No | - | Precio por litro |
| total | decimal(12,2) | No | - | Monto total |
| odometroCarga | int | Si | - | Odometro al cargar |
| rendimientoCalculado | decimal(6,2) | Si | - | km/litro calculado |
| estacionId | uuid | Si | - | FK a estacion |
| estacionNombre | varchar(200) | Si | - | Nombre estacion |
| estacionDireccion | text | Si | - | Direccion estacion |
| latitud | decimal(10,7) | Si | - | Coordenada latitud |
| longitud | decimal(10,7) | Si | - | Coordenada longitud |
| numeroVale | varchar(50) | Si | - | Numero de vale |
| numeroFactura | varchar(50) | Si | - | Numero de factura |
| folioTicket | varchar(50) | Si | - | Folio del ticket |
| fechaCarga | timestamptz | No | - | Fecha/hora de carga |
| estado | enum | No | PENDIENTE | Estado: PENDIENTE, APROBADO, RECHAZADO, PAGADO |
| aprobadoPor | uuid | Si | - | Usuario que aprobo |
| aprobadoFecha | timestamptz | Si | - | Fecha de aprobacion |
| fotoTicketUrl | text | Si | - | URL foto ticket |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_carga_unidad` (unidadId)
- `idx_carga_viaje` (viajeId)
- `idx_carga_fecha` (tenantId, fechaCarga)
### ENUMs Asociados
```typescript
enum TipoCargaCombustible {
VALE = 'VALE',
TARJETA = 'TARJETA',
EFECTIVO = 'EFECTIVO',
FACTURA_DIRECTA = 'FACTURA_DIRECTA',
}
enum TipoCombustible {
DIESEL = 'DIESEL',
GASOLINA_MAGNA = 'GASOLINA_MAGNA',
GASOLINA_PREMIUM = 'GASOLINA_PREMIUM',
GAS_LP = 'GAS_LP',
GAS_NATURAL = 'GAS_NATURAL',
}
enum EstadoGasto {
PENDIENTE = 'PENDIENTE',
APROBADO = 'APROBADO',
RECHAZADO = 'RECHAZADO',
PAGADO = 'PAGADO',
}
```
### Helpers
- `costoPorLitro`: Calcula costo promedio por litro
---
## 2. CrucePeaje
**Archivo:** `cruce-peaje.entity.ts`
**Tabla:** `fuel.cruces_peaje`
**Descripcion:** Registro de cruces de casetas de peaje.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| unidadId | uuid | No | - | FK a unidad |
| viajeId | uuid | Si | - | FK a viaje |
| operadorId | uuid | Si | - | FK a operador |
| casetaNombre | varchar(200) | No | - | Nombre de la caseta |
| casetaCodigo | varchar(50) | Si | - | Codigo SCT de caseta |
| carretera | varchar(200) | Si | - | Carretera/autopista |
| monto | decimal(10,2) | No | - | Monto del peaje |
| tipoPago | varchar(20) | Si | - | EFECTIVO, TAG, PREPAGO |
| tagNumero | varchar(50) | Si | - | Numero de TAG IAVE/Televia |
| latitud | decimal(10,7) | Si | - | Coordenada latitud |
| longitud | decimal(10,7) | Si | - | Coordenada longitud |
| fechaCruce | timestamptz | No | - | Fecha/hora del cruce |
| numeroTicket | varchar(50) | Si | - | Numero ticket peaje |
| fotoTicketUrl | text | Si | - | URL foto comprobante |
| estado | enum | No | APROBADO | Estado del gasto |
| createdAt | timestamptz | No | now() | Fecha creacion |
### Indices
- `idx_peaje_unidad` (unidadId)
- `idx_peaje_viaje` (viajeId)
- `idx_peaje_fecha` (tenantId, fechaCruce)
### ENUMs Asociados
```typescript
enum TipoPagoPeaje {
EFECTIVO = 'EFECTIVO',
TAG = 'TAG',
PREPAGO = 'PREPAGO',
}
```
---
## 3. GastoViaje
**Archivo:** `gasto-viaje.entity.ts`
**Tabla:** `fuel.gastos_viaje`
**Descripcion:** Gastos varios incurridos durante un viaje.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| viajeId | uuid | No | - | FK a viaje |
| operadorId | uuid | No | - | FK a operador |
| tipoGasto | enum | No | - | Categoria del gasto |
| descripcion | varchar(500) | No | - | Descripcion del gasto |
| monto | decimal(12,2) | No | - | Monto del gasto |
| tieneFactura | boolean | No | false | Tiene factura fiscal |
| numeroFactura | varchar(50) | Si | - | Numero de factura |
| numeroTicket | varchar(50) | Si | - | Numero de ticket |
| fotoComprobanteUrl | text | Si | - | URL foto comprobante |
| lugar | varchar(200) | Si | - | Lugar del gasto |
| latitud | decimal(10,7) | Si | - | Coordenada latitud |
| longitud | decimal(10,7) | Si | - | Coordenada longitud |
| fechaGasto | timestamptz | No | - | Fecha/hora del gasto |
| estado | enum | No | PENDIENTE | Estado: PENDIENTE, APROBADO, RECHAZADO, PAGADO |
| aprobadoPor | uuid | Si | - | Usuario que aprobo |
| aprobadoFecha | timestamptz | Si | - | Fecha de aprobacion |
| motivoRechazo | text | Si | - | Motivo si rechazado |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_gasto_viaje` (viajeId)
- `idx_gasto_operador` (operadorId)
- `idx_gasto_estado` (tenantId, estado)
### ENUMs Asociados
```typescript
enum TipoGasto {
COMBUSTIBLE = 'COMBUSTIBLE',
PEAJE = 'PEAJE',
VIATICO = 'VIATICO',
HOSPEDAJE = 'HOSPEDAJE',
ALIMENTOS = 'ALIMENTOS',
ESTACIONAMIENTO = 'ESTACIONAMIENTO',
MULTA = 'MULTA',
MANIOBRA = 'MANIOBRA',
REPARACION_MENOR = 'REPARACION_MENOR',
OTRO = 'OTRO',
}
```
### Helpers
- `esDeducible`: true si tiene factura
- `requiereAprobacion`: true si estado PENDIENTE
---
## 4. AnticipoViatico
**Archivo:** `anticipo-viatico.entity.ts`
**Tabla:** `fuel.anticipos_viaticos`
**Descripcion:** Anticipos de dinero entregados a operadores para viajes.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| viajeId | uuid | No | - | FK a viaje |
| operadorId | uuid | No | - | FK a operador |
| montoSolicitado | decimal(12,2) | No | - | Monto solicitado |
| montoAprobado | decimal(12,2) | Si | - | Monto aprobado |
| montoComprobado | decimal(12,2) | No | 0 | Monto comprobado |
| montoReintegro | decimal(12,2) | No | 0 | Monto a reintegrar |
| combustibleEstimado | decimal(12,2) | Si | - | Estimado combustible |
| peajesEstimado | decimal(12,2) | Si | - | Estimado peajes |
| viaticosEstimado | decimal(12,2) | Si | - | Estimado viaticos |
| estado | varchar(20) | No | SOLICITADO | Estado del anticipo |
| fechaSolicitud | timestamptz | No | now() | Fecha solicitud |
| fechaAprobacion | timestamptz | Si | - | Fecha aprobacion |
| fechaEntrega | timestamptz | Si | - | Fecha entrega efectivo |
| fechaLiquidacion | timestamptz | Si | - | Fecha liquidacion |
| aprobadoPor | uuid | Si | - | Usuario que aprobo |
| entregadoPor | uuid | Si | - | Usuario que entrego |
| liquidadoPor | uuid | Si | - | Usuario que liquido |
| observaciones | text | Si | - | Observaciones |
| createdAt | timestamptz | No | now() | Fecha creacion |
| createdById | uuid | No | - | Usuario creador |
### Indices
- `idx_anticipo_viaje` (viajeId)
- `idx_anticipo_operador` (operadorId)
- `idx_anticipo_estado` (tenantId, estado)
### ENUMs Asociados
```typescript
enum EstadoAnticipo {
SOLICITADO = 'SOLICITADO',
APROBADO = 'APROBADO',
ENTREGADO = 'ENTREGADO',
COMPROBANDO = 'COMPROBANDO',
LIQUIDADO = 'LIQUIDADO',
RECHAZADO = 'RECHAZADO',
}
```
### Helpers
- `saldoPendiente`: montoAprobado - montoComprobado
- `porcentajeComprobado`: % del monto comprobado
- `requiereReintegro`: true si montoReintegro > 0
---
## 5. ControlRendimiento
**Archivo:** `control-rendimiento.entity.ts`
**Tabla:** `fuel.control_rendimiento`
**Descripcion:** Control de rendimiento de combustible por unidad/periodo.
### Campos
| Campo | Tipo | Null | Default | Descripcion |
|-------|------|------|---------|-------------|
| id | uuid | No | gen | Identificador unico |
| tenantId | uuid | No | - | Tenant (empresa) |
| unidadId | uuid | No | - | FK a unidad |
| fechaInicio | date | No | - | Inicio del periodo |
| fechaFin | date | No | - | Fin del periodo |
| kmRecorridos | int | No | - | Kilometros recorridos |
| litrosConsumidos | decimal(12,3) | No | - | Litros consumidos |
| rendimientoReal | decimal(6,2) | No | - | km/litro real |
| rendimientoEsperado | decimal(6,2) | Si | - | km/litro esperado |
| variacionPorcentaje | decimal(5,2) | Si | - | Variacion % vs esperado |
| costoTotalCombustible | decimal(15,2) | Si | - | Costo total periodo |
| costoPorKm | decimal(8,4) | Si | - | Costo por km |
| tieneAnomalia | boolean | No | false | Tiene anomalia detectada |
| tipoAnomalia | varchar(50) | Si | - | Tipo de anomalia |
| descripcionAnomalia | text | Si | - | Descripcion anomalia |
| createdAt | timestamptz | No | now() | Fecha creacion |
### Indices
- `idx_rendimiento_unidad` (unidadId)
- `idx_rendimiento_fecha` (tenantId, fechaInicio)
### ENUMs Asociados
```typescript
enum TipoAnomaliaRendimiento {
BAJO_RENDIMIENTO = 'BAJO_RENDIMIENTO',
CONSUMO_EXCESIVO = 'CONSUMO_EXCESIVO',
POSIBLE_ROBO = 'POSIBLE_ROBO',
FALLA_MECANICA = 'FALLA_MECANICA',
RUTA_INEFICIENTE = 'RUTA_INEFICIENTE',
}
```
### Helpers
- `eficiencia`: OPTIMO (>=95%), ACEPTABLE (>=85%), BAJO (>=75%), CRITICO (<75%)
- `diasPeriodo`: Calcula dias del periodo
---
## Diagrama de Relaciones
```
+------------------+
| Viaje |
+--------+---------+
|
+-------------------+-------------------+
| | |
v v v
+----------------+ +----------------+ +-----------------+
| CargaCombustible| | CrucePeaje | | GastoViaje |
+----------------+ +----------------+ +-----------------+
| |
v v
+----------------+ +-----------------+
| ControlRendim. | | AnticipoViatico |
+----------------+ +-----------------+
|
v
+----------------+
| Unidad |
+----------------+
```
---
## Casos de Uso
### CU-001: Registrar Carga de Combustible
1. Operador reporta carga desde app movil
2. Sistema captura ubicacion GPS
3. Operador toma foto del ticket
4. Sistema calcula rendimiento vs carga anterior
5. Si anomalia: genera alerta automatica
### CU-002: Control de Rendimiento
1. Sistema genera reporte periodico (semanal/mensual)
2. Calcula rendimiento real vs esperado
3. Detecta anomalias (consumo excesivo, posible robo)
4. Notifica a administracion si hay alertas
### CU-003: Liquidacion de Anticipo
1. Operador regresa de viaje
2. Presenta comprobantes (combustible, peajes, gastos)
3. Sistema coteja vs anticipo entregado
4. Calcula reintegro o adicional a pagar
---
*MAI-012 Combustible y Gastos - ERP Transportistas v1.0.0*

View File

@ -5,11 +5,12 @@ task_id: TASK-2026-01-25-DOCUMENTACION-MODULOS
title: "Documentacion de Modulos y Entidades de ERP Transportistas"
type: documentation
priority: P0
status: in_progress
status: completed
# Fechas
created: 2026-01-25
started: 2026-01-25
completed: 2026-01-25
# Asignacion
owner: claude-code
@ -55,24 +56,29 @@ scope:
phases:
- id: FASE-1
title: "Crear inventarios base"
status: pending
status: completed
completed_date: 2026-01-25
entregables:
- orchestration/inventarios/DATABASE_INVENTORY.yml
- orchestration/inventarios/BACKEND_INVENTORY.yml
- orchestration/inventarios/MASTER_INVENTORY.yml
notas: "MASTER_INVENTORY.yml pendiente para siguiente iteracion"
- id: FASE-2
title: "Documentar entidades nuevas"
status: pending
status: completed
completed_date: 2026-01-25
entregables:
- docs/02-definicion-modulos/MAI-012-combustible-gastos/ENTITIES.md
- docs/02-definicion-modulos/MAI-009-facturacion-transporte/ENTITIES.md
notas: "11 entidades documentadas con campos, indices, ENUMs y helpers"
- id: FASE-3
title: "Actualizar PROXIMA-ACCION.md"
status: pending
status: completed
completed_date: 2026-01-25
entregables:
- orchestration/PROXIMA-ACCION.md
notas: "Estado actual 45% completado documentado"
# Metodologia
methodology: CAPVED