6.7. Flujo genera tickets
Este documento mapea el servicio legacy generaTicket al nuevo servicio de tickets, y detalla el mapeo a las tablas de base de datos para la generación y persistencia del ticket.
1) Nuevo servicio equivalente
Servicio: Ticketing Service (v1)
Base URL: https://api.alpura.mx/ticketing/v1
Endpoint: POST /tickets
Headers obligatorios: Authorization, X-Trace-Id, Idempotency-Key
Descripción: Genera un ticket de recolección con datos de control interno, sellos, operador, unidades y transferencia.
2) Legacy → Nuevo (payload)
2.1 Request (legacy)
{
"tipo": "CONTROL_INTERNO",
"configuracion": "",
"valor1": 1315042,
"valor2": 1315043,
"p_origen": "",
"p_destino": "CUAUTITLAN",
"p_fecha_recibo": "2024-06-03T12:10:28",
"operadorNomina": "",
"operadorNombre": "",
"tractor": "",
"proveedorTransporte": "",
"pipa1": "",
"selloDomo1": "",
"selloValvula1": "",
"litrosRemisionados1": "",
"articulo1": "",
"pipa2": "",
"selloDomo2": "",
"selloValvula2": "",
"litrosRemisionados2": "",
"articulo2": "",
"p_zona": "",
"p_ruta": "",
"p_tipo_proveedor": "",
"p_producto": "",
"p_volumen": "",
"p_kilos": "",
"p_evento": "",
"p_latitud": 19.6648278,
"p_longitud": -99.1995708,
"p_vendor_id": "",
"p_proveedor": "",
"p_oc_transferencia": "",
"p_observaciones": "",
"p_employee_number": 1535337,
"p_est_sello_domo1": "Sello revisado - coincide y bien colocado",
"p_est_sello_domo2": "Sello revisado - coincide y bien colocado"
}
2.2 Request (nuevo — generateTicketRequest)
POST /tickets
Content-Type: application/json
{
"tipo": "CONTROL_INTERNO",
"configuracion": "",
"valor1": "1315042",
"valor2": "1315043",
"p_origen": "",
"p_destino": "CUAUTITLAN",
"p_fecha_recibo": "2024-06-03",
"operadorNomina": "",
"operadorNombre": "",
"tractor": "",
"proveedorTransporte": "",
"pipa1": "",
"selloDomo1": "",
"selloValvula1": "",
"litrosRemisionados1": "",
"articulo1": "",
"pipa2": "",
"selloDomo2": "",
"selloValvula2": "",
"litrosRemisionados2": "",
"articulo2": "",
"p_zona": "",
"p_ruta": "",
"p_tipo_proveedor": "",
"p_producto": "",
"p_volumen": "",
"p_kilos": "",
"p_evento": "",
"p_latitud": 19.6648278,
"p_longitud": -99.1995708,
"p_vendor_id": "",
"p_proveedor": "",
"p_oc_transferencia": "",
"p_observaciones": "",
"p_employee_number": "1535337",
"p_est_sello_domo1": "Sello revisado - coincide y bien colocado",
"p_est_sello_domo2": "Sello revisado - coincide y bien colocado"
}
Diferencias: en el spec nuevo, varios campos se tipan como string (ej.
valor1/valor2,p_fecha_reciboen formato date).
2.3 Response (nuevo — generateTicketResponse)
{
"estatus": "OK",
"descripcion": "Ticket generado correctamente.",
"ticket": "506234",
"control_interno": "1315042",
"est_sello_domo": ""
}
3) Mapeo a Tablas de Base de Datos
La generación de ticket impacta inventario/recibo de leche y trazabilidad del viaje. Se contemplan 3 tablas principales: maestro del viaje, detalle/mediciones y recibo en planta.
3.1 Tablas involucradas
- ALP_RECOLECCION_VIAJES (maestro de viaje)
Campos relevantes:CONTROL_INTERNO,RUTA,ORIGEN,DESTINO,PIPA,TRACTOR,PROVEEDOR_TRANSPORTE,SELLO_DOMO,JUSTIFICACION_SELLO_DOMO,SEDE_SELLO_DOMO,SELLO_VALVULA,JUSTIFICACION_SELLO_VALVULA,SEDE_SELLO_VALVULA,LATITUD,LONGITUD,LITROS_REMISIONADOS,EST_SELLO_DOMO,ID_TRANSFERENCIA,NUM_OC_TRANSFERENCIA. - ALP_DET_RECO_TANQUES_VIAJES (tanques/mediciones)
ParaLITROS_REMISIONADOS(1/2), producto(s), densidad/temperatura si aplica por tanque. - ALP_INV_RECIBO_LECHE_DATOS (recibo/planta)
Persistencia del ticket asignado y consolidado de recepción:TICKET_PLANTA,CONTROL_INTERNO,RUTA,PIPA,DESTINO,LITROS_REMISIONADOS,FECHA_PLANTA,STATUS.
3.2 Mapeo de campos (request/response → BD)
| Campo API | Tabla.Columna / Lógica |
|---|---|
tipo | (lógica de enrutamiento); para CONTROL_INTERNO usar valor1 como clave |
valor1 | ALP_RECOLECCION_VIAJES.CONTROL_INTERNO (principal) |
valor2 | ALP_RECOLECCION_TRANSFERENCIAS.CONTROL_INTERNO2 o ALP_RECOLECCION_VIAJES.CONTROL_INTERNO2 (si aplica transferencia) |
p_origen / p_destino | ALP_RECOLECCION_VIAJES.ORIGEN / DESTINO |
p_fecha_recibo | ALP_INV_RECIBO_LECHE_DATOS.FECHA_PLANTA (o FECHA_PROGRAMA/PLANTA según estándar) |
operadorNomina / operadorNombre | ALP_RECOLECCION_VIAJES.OPERADOR_EMPLOYEE_NUMBER / OPERADOR_FULL_NAME |
tractor / pipa1 | ALP_RECOLECCION_VIAJES.TRACTOR / PIPA |
proveedorTransporte | ALP_RECOLECCION_VIAJES.PROVEEDOR_TRANSPORTE |
selloDomo1 / selloValvula1 | ALP_RECOLECCION_VIAJES.SELLO_DOMO / SELLO_VALVULA |
selloDomo2 / selloValvula2 | ALP_RECOLECCION_VIAJES.SELLO_DOMO2 / SELLO_VALVULA2 (si existe y aplica a 2a unidad) |
p_est_sello_domo1 | ALP_RECOLECCION_VIAJES.EST_SELLO_DOMO (estatus textual) |
p_est_sello_domo2 | ALP_RECOLECCION_VIAJES.JUSTIFICACION_SELLO_DOMO2 o campo específico si definido para estatus 2 |
litrosRemisionados1/2 | ALP_DET_RECO_TANQUES_VIAJES.LITROS_REMISIONADOS (por tanque/socio); consolidado al maestro en ALP_RECOLECCION_VIAJES.LITROS_REMISIONADOS |
p_producto / articulo1/2 | ALP_RECOLECCION_VIAJES.PRODUCTO / ALP_DET_RECO_TANQUES_VIAJES.PRODUCTO |
p_volumen / p_kilos | ALP_RECOLECCION_VIAJES.VOLUMEN / KILOS_* (en maestro o detalle) |
p_latitud / p_longitud | ALP_RECOLECCION_VIAJES.LATITUD / LONGITUD |
p_vendor_id / p_proveedor | ALP_RECOLECCION_VIAJES.VENDOR_ID / PROVEEDOR_TRANSPORTE |
p_oc_transferencia | ALP_RECOLECCION_VIAJES.NUM_OC_TRANSFERENCIA |
p_observaciones | ALP_RECOLECCION_VIAJES.OBSERVACIONES |
Response: ticket | Insert en ALP_INV_RECIBO_LECHE_DATOS.TICKET_PLANTA (y devolver en API) |
Response: control_interno | ALP_RECOLECCION_VIAJES.CONTROL_INTERNO |
Response: est_sello_domo | ALP_RECOLECCION_VIAJES.EST_SELLO_DOMO |
Nota: El consolidado final de litros se refleja tanto en tanques (detalle) como en maestro. Si el maestro no mantiene el total, se calcula
SUM(LITROS_REMISIONADOS)porID_VIAJEal generar el ticket.
4) SQL de referencia
-- 1) Insertar/actualizar recibo en planta con ticket
MERGE INTO ALP_INV_RECIBO_LECHE_DATOS t
USING (SELECT :control_interno AS CONTROL_INTERNO FROM dual) s
ON (t.CONTROL_INTERNO = s.CONTROL_INTERNO)
WHEN MATCHED THEN UPDATE SET
TICKET_PLANTA = :ticket,
RUTA = :p_ruta,
PIPA = :pipa1,
TRACTOR = :tractor,
DESTINO = :p_destino,
LITROS_REMISIONADOS= :litros_total,
FECHA_PLANTA = TO_DATE(:p_fecha_recibo, 'YYYY-MM-DD"T"HH24:MI:SS'),
STATUS = 'RECIBIDO'
WHEN NOT MATCHED THEN INSERT (
ALP_INV_RECIBO_LECHE_DATOS_ID, CONTROL_INTERNO, TICKET_PLANTA, RUTA, PIPA, TRACTOR,
DESTINO, LITROS_REMISIONADOS, FECHA_PLANTA, STATUS
) VALUES (
SEQ_RECIBO_LECHE.NEXTVAL, :control_interno, :ticket, :p_ruta, :pipa1, :tractor,
:p_destino, :litros_total, TO_DATE(:p_fecha_recibo, 'YYYY-MM-DD"T"HH24:MI:SS'), 'RECIBIDO'
);
-- 2) Actualizar maestro con sellos/geo y totales
UPDATE ALP_RECOLECCION_VIAJES
SET
SELLO_DOMO = NULLIF(:selloDomo1, ''),
SELLO_VALVULA = NULLIF(:selloValvula1, ''),
SELLO_DOMO2 = NULLIF(:selloDomo2, ''),
SELLO_VALVULA2 = NULLIF(:selloValvula2, ''),
EST_SELLO_DOMO = :p_est_sello_domo1,
LATITUD = :p_latitud,
LONGITUD = :p_longitud,
NUM_OC_TRANSFERENCIA = NULLIF(:p_oc_transferencia, ''),
LITROS_REMISIONADOS = COALESCE(:litros_total, LITROS_REMISIONADOS),
LAST_UPDATE_DATE = SYSDATE,
LAST_UPDATED_BY = :p_employee_number
WHERE CONTROL_INTERNO = :control_interno;
:litros_totalpuede serlitrosRemisionados1 + litrosRemisionados2o el SUM desdeALP_DET_RECO_TANQUES_VIAJESporID_VIAJE.