Skip to main content

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_recibo en 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)
    Para LITROS_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 APITabla.Columna / Lógica
tipo(lógica de enrutamiento); para CONTROL_INTERNO usar valor1 como clave
valor1ALP_RECOLECCION_VIAJES.CONTROL_INTERNO (principal)
valor2ALP_RECOLECCION_TRANSFERENCIAS.CONTROL_INTERNO2 o ALP_RECOLECCION_VIAJES.CONTROL_INTERNO2 (si aplica transferencia)
p_origen / p_destinoALP_RECOLECCION_VIAJES.ORIGEN / DESTINO
p_fecha_reciboALP_INV_RECIBO_LECHE_DATOS.FECHA_PLANTA (o FECHA_PROGRAMA/PLANTA según estándar)
operadorNomina / operadorNombreALP_RECOLECCION_VIAJES.OPERADOR_EMPLOYEE_NUMBER / OPERADOR_FULL_NAME
tractor / pipa1ALP_RECOLECCION_VIAJES.TRACTOR / PIPA
proveedorTransporteALP_RECOLECCION_VIAJES.PROVEEDOR_TRANSPORTE
selloDomo1 / selloValvula1ALP_RECOLECCION_VIAJES.SELLO_DOMO / SELLO_VALVULA
selloDomo2 / selloValvula2ALP_RECOLECCION_VIAJES.SELLO_DOMO2 / SELLO_VALVULA2 (si existe y aplica a 2a unidad)
p_est_sello_domo1ALP_RECOLECCION_VIAJES.EST_SELLO_DOMO (estatus textual)
p_est_sello_domo2ALP_RECOLECCION_VIAJES.JUSTIFICACION_SELLO_DOMO2 o campo específico si definido para estatus 2
litrosRemisionados1/2ALP_DET_RECO_TANQUES_VIAJES.LITROS_REMISIONADOS (por tanque/socio); consolidado al maestro en ALP_RECOLECCION_VIAJES.LITROS_REMISIONADOS
p_producto / articulo1/2ALP_RECOLECCION_VIAJES.PRODUCTO / ALP_DET_RECO_TANQUES_VIAJES.PRODUCTO
p_volumen / p_kilosALP_RECOLECCION_VIAJES.VOLUMEN / KILOS_* (en maestro o detalle)
p_latitud / p_longitudALP_RECOLECCION_VIAJES.LATITUD / LONGITUD
p_vendor_id / p_proveedorALP_RECOLECCION_VIAJES.VENDOR_ID / PROVEEDOR_TRANSPORTE
p_oc_transferenciaALP_RECOLECCION_VIAJES.NUM_OC_TRANSFERENCIA
p_observacionesALP_RECOLECCION_VIAJES.OBSERVACIONES
Response: ticketInsert en ALP_INV_RECIBO_LECHE_DATOS.TICKET_PLANTA (y devolver en API)
Response: control_internoALP_RECOLECCION_VIAJES.CONTROL_INTERNO
Response: est_sello_domoALP_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) por ID_VIAJE al 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_total puede ser litrosRemisionados1 + litrosRemisionados2 o el SUM desde ALP_DET_RECO_TANQUES_VIAJES por ID_VIAJE.


5) Diagrama de secuencia