sap
de la base GCP, así se puede auditar qué se liquidó, qué se armó y qué respondió SAP.
Para qué sirve
Reemplazar el proceso del servidor on-premise que hoy liquida agencias contra SAP
Para negocio
Contaduría necesita que la plata que cobran las agencias aparezca en SAP con la cuenta correcta y un número de liquidación que se pueda rastrear. Hoy lo hace un servidor on-premise; GCP hace lo mismo desde la base en la nube y corre en paralelo contra SAP QA hasta que se decida el pase a producción.
Para técnica
Todo vive en el schema sap de andesmar_sales. Los procedimientos
se crean por migraciones Alembic: la fuente de verdad del procedimiento es la migración,
no el .sql suelto del repo, que puede estar desactualizado. Runbook:
scripts/sap/RUNBOOK_LIQUIDACION_SAP.md.
Los cuatro pasos
Tres corren solos a la madrugada; el cuarto es el envío
| Paso | Qué hace (negocio) | Dónde queda (técnico) | Quién lo corre |
|---|---|---|---|
| 1 Liquidar boletos | Agrupa los boletos vendidos por agencia y día y les asigna un número de liquidación | sap.liquidacion_sap, sap.liquidacion_sap_ticket |
Job sap-liquidacion-pipeline, 05:00 ART |
| 2 Liquidar ítems | Lo mismo para los ítems vendidos aparte del boleto (seguros, percepciones) | Tablas de liquidación de ítem en sap |
|
| 3 Armar asientos | Traduce cada liquidación a líneas contables con la cuenta SAP y el CUIT de la agencia | Función sap.armar_asientos() |
|
| 4 Enviar | Manda cada asiento a SAP y guarda la respuesta ("Documento validado" o el error) | send_asientos.py, marca en sap.asiento_envio por ambiente |
Job sap-asientos-sender-qa, 06:00 ART (solo QA) |
southamerica-east1 con cron en UTC (0 8 * * * y 0 9 * * *).Tipo de servicio N / P / I
La clasificación que decide la cuenta contable
| Tipo | Cuándo | Cuenta SAP |
|---|---|---|
| P Provincial | Tramo dentro de Mendoza o dentro de Córdoba | 411100108 |
| I Internacional | Boleto que no lleva IVA | 411100103 |
| N Nacional | Todo lo demás | 411100104 |
alcance_tramo. SAP marca P solo dentro de Mendoza o Córdoba
e I cuando el boleto no lleva IVA; alcance_tramo del BI es geografía pura. Coinciden en ~96% de los
boletos. Por eso el BI lleva una columna aparte, tipo_liquidacion, copiada de
sap.liquidacion_sap_ticket. Para cuadrar contra SAP, tipo_liquidacion; para analizar
viajes, alcance_tramo. No hay que unificarlas.Numeración de liquidaciones
Un contador por agencia; la referencia viaja a SAP
Cómo se numera hoy
- El contador vive en
sap.agency_liquidacion_countery es por código de agencia. - La referencia tiene la forma
AGENCIA:NUMERO+ tipo (por ejemploC80:44N). - GCP hoy numera por tipo de servicio; el legacy on-premise no.
- SAP trunca la referencia (
XBLNR) en 16 caracteres: la conciliación de respuestas trunca los dos lados.
Lo acordado el 25/09 (pendiente de aplicar)
- Un número por agencia y día, igual para SAP y para el SRT.
- El día D-1 se cierra a las 03:00.
- Lo que llega tarde va a una liquidación nueva, no reabre la cerrada.
- El cambio espera la respuesta del lado SRT. Detalle:
docs/integracion/SRT_LIQUIDACION_UNIFICADA.md.
Quién entra y quién no
Agencias excluidas y el CUIT como única validación
sap.ag_excluidassap.agency_cuitarmar_asientos matchea el código tal cual: no arma y no da error.armar_asientos() solo valida el CUIT. No puede saber que una agencia es de
prueba o de cuenta corriente: eso lo decide Contaduría y se carga en sap.ag_excluidas.
Los códigos de agencia y los CUIT de la lista vienen de Contaduría y del on-premise, no de Betterez,
que no expone el CUIT de la agencia.Envío a SAP y corte
Qué sale y qué queda en la cola
- Corte
SAP_ENVIO_DESDE=2026-09-02: solo se envían asientos con fecha de documento desde el inicio del paralelo. Es obligatorio en producción para no duplicar lo que ya liquidó el on-premise. - Prefijos excluidos: Busbud se excluye por prefijo en el sender hasta habilitarlo con una tanda chica.
- Marca por ambiente:
sap.asiento_envioregistra el envío separado para QA y para producción; enviar a QA no marca el asiento como enviado a producción. - Producción no está configurada: solo existen credenciales de QA. El pase a producción es una decisión de Andesmar.
- "Pendiente en la base" no es lo mismo que "se envía solo": el corte y los prefijos recortan la cola.
Alertas
Sentry (proyecto betterez-api-gcp) y políticas de Cloud Monitoring
| # | Alerta | Qué significa para negocio |
|---|---|---|
| 1 | Asientos con error | SAP rechazó o no dio veredicto sobre asientos enviados (un solo aviso por corrida, con el detalle) |
| 2 | Tardanza | La corrida tardó más de lo esperado (el job avisa a los 15 min) |
| 3 | Sin movimiento | El pipeline no generó nada en el día, o el envío desatendido encontró la cola vacía |
| 4 | Descuadre | Un asiento cuya partida doble no da cero (control propio de GCP) |
| 5 | Liquidaciones sin asiento | Plata liquidada que no arma asiento: falta un CUIT o una exclusión, lo define Andesmar |
| 6 | Código fuera del catálogo | Una liquidación nueva con un código de agencia que no está en dim_agency (típico: Betterez renombró la agencia) |
Estado del paralelo
Envío diario a SAP QA desde el 02/09/2026
al 22/09
al 22/09
al 22/09
- 29/09: 3 asientos sin respuesta de SAP QA (QA tarda ~68 s por asiento).
- 29/09: 12 liquidaciones sin asiento por $2,65 M, de agencias sin CUIT cargado.
- Producción: 0 asientos enviados. El pase depende de Andesmar.
Checklist rápido
Antes de responder una pregunta sobre SAP
- Para cuadrar contra SAP:
tipo_liquidacion, noalcance_tramo - Número de liquidación: la clave real es
agency_code+ número - Conciliar con el legacy por fecha e importe, no por referencia
- Agencia que no debe pasar:
sap.ag_excluidas, decidido por Contaduría - Procedimiento vigente: leer la migración, no el
.sqlsuelto - Envío: revisar corte
SAP_ENVIO_DESDEy prefijos excluidos antes de hablar de "pendientes"