Appearance
CuponPagoService
Responsabilidad
Generar y validar cupones de pago con código de barras ITF (19 dígitos).
Código ITF (19 dígitos)
SUCU(4) + CLIENTE(6) + TIMESTAMP(8) + DV(1) = 19 dígitos
Ejemplo:
0001 + 056789 + 20260127 + 4 = 0001056789202601274
DV = Dígito Verificador (Módulo 10, ponderación 3-1)Métodos
generarCupon()
Parámetros:
clienteId: ID del clientefacturas: Array de facturas a incluir en el cupóntotal: Monto total del cupóndiasVencimiento: Días hasta el vencimiento del cupóntenantContext: Contexto del tenant
Retorna:
json
{
"cupon_id": "uuid",
"codigo_barras": "0001056789202601274",
"monto": 10000.00,
"fecha_vencimiento": "2026-02-27",
"facturas": [...]
}getCuponesByCliente()
Parámetros:
clienteId: ID del clientetenantContext: Contexto del tenant (database, schema)estado: (opcional) Filtrar por estado: 'pending', 'used', 'expired', 'cancelled'limit: Número de registros a retornar (default: 50)offset: Offset para paginación (default: 0)
Retorna:
json
{
"cupones": [
{
"cupon_id": "uuid",
"codigo_barras": "0001056789202601274",
"monto": 10000.00,
"estado": "pending",
"fecha_generacion": "2026-01-27",
"fecha_vencimiento": "2026-02-27",
"fecha_uso": null,
"facturas": [],
"recibo_id": null
}
],
"total": 2,
"has_more": false
}validarCupon()
Parámetros:
codigo: Código de barras del cupóntenantContext: Contexto del tenant
Retorna: Datos del cupón si es válido, null si no existe o está vencido
Lógica de Negocio
Generación de Cupón
- Generar código ITF único de 19 dígitos
- Calcular fecha de vencimiento (días desde hoy)
- Crear registro en
portal_cuponescon estado "pending" - Retornar datos del cupón con código de barras
Obtener Cupones por Cliente
- Buscar cupones del cliente con filtros opcionales (estado)
- Aplicar paginación (limit/offset)
- Actualizar cupones vencidos automáticamente (si
fecha_vencimiento< hoy) - Retornar lista con metadata de paginación
Validar Cupón
- Buscar cupón por código de barras
- Verificar que no esté vencido
- Verificar que esté en estado "pending"
- Retornar datos del cupón o
nullsi no es válido
Generación de Código ITF
Formato: SUCU(4) + CLIENTE(6) + TIMESTAMP(8) + DV(1)
Ejemplo: 0001 + 056789 + 20260127 + 4 = 0001056789202601274
Cálculo del dígito verificador (DV):
- Módulo 10 con ponderación 3-1
Validación del Código
El código de barras debe:
- Tener exactamente 19 dígitos
- El último dígito (DV) debe coincidir con el cálculo usando módulo 10 y ponderación 3-1
Casos de Prueba
Escenarios clave a testear:
- Generar código ITF: Debe generar 19 dígitos con formato correcto
- Dígito verificador: Debe calcular correctamente el DV con módulo 10
- Obtener cupones por cliente: Debe retornar lista con paginación
- Filtrar por estado: Debe filtrar cupones por estado especificado
- Paginación: Debe paginar correctamente con limit/offset
Integración con Caja
El sistema de caja existente puede:
- Validar cupones usando
validarCupon() - Procesar el pago si el cupón es válido
- Marcar el cupón como "used" y vincular el recibo generado