Documentacion de comunicacion CtaCte

Arquitectura POS -> Gateway -> Autorizador, con foco en compra, cobro, adelanto, consultas y gestion profesional de reversas. No se documentan payloads; se documenta la logica operacional, estados y responsabilidades.

Version: v5 profesional Foco: reversas preventivas Ambiente: POS / Gateway / Autorizador

Resumen ejecutivo

El POS historico ya contiene una proteccion local: antes de enviar operaciones financieras de CtaCte guarda una transaccion pendiente en disco para poder reversarla si la operacion queda en estado incierto.

Con la arquitectura actual POS -> Gateway -> Autorizador, aparece una segunda frontera critica: el Gateway puede recibir correctamente la compra del POS, enviarla al Autorizador y perder la respuesta. En ese caso, el POS no debe generar reversa local si recibio respuesta del Gateway. La reversa debe ser administrada por el Gateway.

Decision clave de diseno El Gateway debe persistir una reversa preventiva antes de enviar la compra al Autorizador. Asi se cubre corte de luz, caida del servicio o reinicio mientras existe una compra en curso.

1. Operaciones CtaCte

OperacionCodigoOrigen tipicoGenera riesgo de reversaResponsable principal
Consulta de saldoOP_CONSULTAConsulta cuentaNoNo modifica saldo
Ultimas operaciones / liquidacionOP_ULTOPS / OP_ULTLIQConsulta informativaNoNo modifica saldo
Compra CtaCteOP_CARGOVenta POS con medio CtaCteSiPOS si no llego al Gateway; Gateway si llego al Gateway
AdelantoOP_ADELANTOOperacion financieraSiIgual que compra
Cobro en cuentaOP_COBROPago de deuda / cuentaSiIgual que compra
ReversaOP_REVERSOCompensacion de operacion inciertaCompensaQuien controla la frontera donde ocurrio la incertidumbre

2. Logica POS historica

El POS protege operaciones financieras locales guardando una transaccion pendiente en CtaCtes.Rev antes de transmitir. En la proxima comunicacion, si encuentra ese archivo, intenta enviarlo como OP_REVERSO antes de procesar otra operacion no-consulta.

Flujo POS historico con reversa local

flowchart TD A([Inicio operacion CtaCte en POS]) --> B{Tipo de operacion} B -->|Consulta| C[OP_CONSULTA / OP_ULTOPS / OP_ULTLIQ] B -->|Movimiento financiero| D[OP_CARGO / OP_ADELANTO / OP_COBRO] C --> E[SendMessage] D --> E[SendMessage] E --> F[Completa datos comunes: POS, sucursal, Z, usuario, ticket] F --> G[Conecta TCP] G --> H{Existe CtaCtes.Rev local?} H -->|Si| I[Envia pendiente como OP_REVERSO] I --> J{Reversa local OK?} J -->|Si| K[Borra CtaCtes.Rev] J -->|No y operacion actual no es consulta| X([Bloquea operacion actual: reversa pendiente]) J -->|No y operacion actual es consulta| L[Continua consulta] H -->|No| L[Procesa operacion actual] K --> L L --> M{Operacion actual es consulta?} M -->|Si| P[Envia sin guardar reversa] M -->|No| O[Guarda CtaCtes.Rev antes de transmitir] O --> P[Envia transaccion] P --> Q{Respuesta valida?} Q -->|No| R([Queda CtaCtes.Rev pendiente]) Q -->|Si| S{Respuesta denegada o error de negocio?} S -->|Si| T[Borra CtaCtes.Rev] S -->|No, autorizada OK| U[Continua cierre local / voucher] U --> V[Borra CtaCtes.Rev al confirmar cierre local]

Por que existe CtaCtes.Rev

Porque si el POS transmite una compra y luego no recibe respuesta, no sabe si el autorizador impacto o no la operacion. La reversa local cubre esa incertidumbre cuando la frontera de falla esta entre POS y el destino al que se conecta.

Limite de esta logica

Si el POS si recibio una respuesta del Gateway, pero el problema ocurrio entre Gateway y Autorizador, el POS ya no tiene suficiente informacion para reversar correctamente. Esa responsabilidad pasa al Gateway.

3. Arquitectura POS -> Gateway -> Autorizador

El Gateway introduce una nueva capa con estado propio. Debe actuar como coordinador de transacciones contra el Autorizador y como barrera de seguridad para el POS.

Flujo normal de compra autorizada

sequenceDiagram autonumber participant POS participant GW as Gateway participant AUT as Autorizador POS->>GW: Compra CtaCte GW->>GW: Valida que no exista reversa pendiente para ese POS GW->>GW: Persiste reversa preventiva / operacion en curso GW->>AUT: Envia Compra AUT-->>GW: Compra aprobada GW->>GW: Marca operacion como aprobada y cierra reversa preventiva GW-->>POS: Compra aprobada POS->>POS: Cierra ticket / registra medio de pago

Falla Autorizador no responde: reversa queda en Gateway

sequenceDiagram autonumber participant POS participant GW as Gateway participant AUT as Autorizador POS->>GW: Compra CtaCte GW->>GW: Persiste reversa preventiva antes de enviar GW->>AUT: Envia Compra AUT--xGW: No responde / timeout / conexion perdida GW->>GW: Mantiene reversa pendiente GW->>GW: Agenda reintentos periodicos de OP_REVERSO GW-->>POS: Error: Autorizador no responde Note over POS: POS no genera reversa local porque recibio respuesta del Gateway loop Hasta resolver pendiente GW->>AUT: Envia OP_REVERSO pendiente AUT--xGW: No responde o no confirma reversa GW->>GW: Mantiene pendiente y reprograma intento end

4. Reversa preventiva en Gateway

La mejora importante es que el Gateway no debe crear la reversa recien despues del timeout. Debe crearla antes de enviar la compra al Autorizador.

Regla profesional Toda operacion financiera que pueda modificar saldo debe persistirse como operacion en curso / reversa preventiva antes de salir al Autorizador.

Punto exacto donde se prepara la reversa preventiva

flowchart TD A([Gateway recibe Compra del POS]) --> B{Existe reversa pendiente para este POS?} B -->|Si| C[No reenviar la compra al Autorizador] C --> C1([Responder al POS: denegado / reversa pendiente en curso]) B -->|No| D[Validar datos y generar idOperacionGateway] D --> E[(Persistir reversa preventiva)] E --> F[Enviar Compra al Autorizador] F --> G{Resultado del Autorizador} G -->|Aprobada| H[Cerrar reversa preventiva como OK] H --> I([Responder compra aprobada al POS]) G -->|Denegada clara| J[Cerrar reversa preventiva sin reversar] J --> K([Responder compra denegada al POS]) G -->|Timeout / corte / error incierto| L[(Mantener reversa pendiente)] L --> M[Programar reintentos periodicos de reversa] L --> N([Responder error al POS si el Gateway sigue vivo])

Datos minimos a persistir

CampoMotivo
posId, sucursal, cajaBloquear nuevas compras solo del POS afectado y auditar origen.
nroTicketPOS / nro operacion POSRelacionar la compra original con el intento de reversa.
idOperacionGatewayIdempotencia interna y trazabilidad.
cuenta / cliente / tarjetaIdentificar cuenta afectada.
importe, moneda, cuotasReversa debe compensar la operacion exacta.
estadoEj.: PENDIENTE_ENVIO_COMPRA, COMPRA_ENVIADA, REVERSA_PENDIENTE, REVERSA_OK, CERRADA.
intentos, ultimo error, proximo intentoControlar circuito periodico y soporte operativo.

5. Bloqueo por reversa pendiente y reintentos

Mientras exista una reversa pendiente en el Gateway para un POS determinado, una nueva compra de ese POS no debe reenviarse al Autorizador. El Gateway debe responder inmediatamente con una denegacion tecnica/operativa: reversa pendiente en curso.

Nueva compra bloqueada por reversa pendiente

sequenceDiagram autonumber participant POS participant GW as Gateway participant AUT as Autorizador Note over GW: Existe reversa pendiente para POS X POS->>GW: Nueva Compra CtaCte POS X GW->>GW: Consulta estado pendiente por POS GW-->>POS: Denegado: reversa pendiente en curso Note over AUT: La nueva compra no se envia al Autorizador loop Proceso background Gateway GW->>AUT: Reintento OP_REVERSO AUT-->>GW: Reversa aprobada GW->>GW: Libera pendiente POS X end POS->>GW: Nueva Compra posterior GW->>AUT: Se permite enviar compra

Para el POS

Debe mostrar un mensaje claro y no intentar reversar localmente si el Gateway respondio. La operacion no fue autorizada para el cierre del ticket.

Para el Gateway

Debe reintentar reversa hasta recibir confirmacion o hasta que una operatoria administrativa resuelva la inconsistencia.

Para soporte

Debe existir visibilidad de pendientes: POS, ticket, importe, cuenta, cantidad de intentos, ultimo error y proximo intento.

6. Maquina de estados recomendada en Gateway

Estados de una operacion financiera en Gateway

stateDiagram-v2 [*] --> RECIBIDA_DEL_POS RECIBIDA_DEL_POS --> RECHAZADA_POR_REVERSA_EXISTENTE: Existe pendiente para POS RECIBIDA_DEL_POS --> PREVENTIVA_PERSISTIDA: No existe pendiente PREVENTIVA_PERSISTIDA --> COMPRA_ENVIADA_AUTORIZADOR: Envio compra PREVENTIVA_PERSISTIDA --> REVERSA_PENDIENTE: Gateway cae antes/durante envio o estado incierto COMPRA_ENVIADA_AUTORIZADOR --> COMPRA_APROBADA: Autorizador aprueba COMPRA_ENVIADA_AUTORIZADOR --> COMPRA_DENEGADA: Autorizador deniega claramente COMPRA_ENVIADA_AUTORIZADOR --> REVERSA_PENDIENTE: Timeout / sin respuesta COMPRA_APROBADA --> CERRADA_OK: Responder OK al POS COMPRA_DENEGADA --> CERRADA_DENEGADA: Responder denegada al POS REVERSA_PENDIENTE --> REVERSA_EN_REINTENTO: Timer / worker REVERSA_EN_REINTENTO --> REVERSA_PENDIENTE: Falla o no confirma REVERSA_EN_REINTENTO --> REVERSA_CONFIRMADA: Autorizador confirma reversa REVERSA_CONFIRMADA --> CERRADA_REVERSADA: Liberar POS RECHAZADA_POR_REVERSA_EXISTENTE --> [*] CERRADA_OK --> [*] CERRADA_DENEGADA --> [*] CERRADA_REVERSADA --> [*]

7. Matriz de decisiones

SituacionPOSGatewayAutorizadorResultado esperado
POS no logra conectar al GatewayPuede conservar proteccion local si habia transaccion preparadaNo conoce la operacionNo participaError local / no autorizada
Gateway recibe compra pero aun no envio al Autorizador y caePuede quedar esperando/errorAl reiniciar detecta preventiva y la trata como pendiente inciertaNo necesariamente participoGateway debe resolver/liberar antes de nuevas compras
Gateway envia compra y Autorizador apruebaCierra ticketCierra preventivaAutorizaCompra OK
Gateway envia compra y Autorizador deniega claramenteNo cierra como autorizadaCierra preventiva sin reversaDeniegaDenegada comercial/funcional
Autorizador no responde al GatewayRecibe error; no genera reversa local si hubo respuesta del GatewayMantiene reversa pendiente y reintentaEstado inciertoPOS queda bloqueado para nuevas compras hasta resolver
Nueva compra con reversa pendienteRecibe denegacion tecnicaNo reenvia al AutorizadorNo recibe la nueva compraMensaje: reversa pendiente en curso
Reversa aprobadaPuede volver a operarLibera pendienteConfirma reversaEstado consistente

8. Reglas finales de implementacion

Regla 1 Consultas no generan reversa: no modifican saldo.
Regla 2 Compra, adelanto y cobro son operaciones financieras; siempre deben tener mecanismo de reversa o cierre seguro.
Regla 3 Si el POS no recibio respuesta del Gateway, puede aplicar su proteccion historica local.
Regla 4 Si el POS recibio respuesta del Gateway indicando que el Autorizador no responde, el POS no genera reversa local. El Gateway es responsable.
Regla 5 El Gateway debe persistir reversa preventiva antes de enviar al Autorizador. No despues del timeout.
Regla 6 Mientras exista reversa pendiente de un POS, el Gateway debe bloquear nuevas compras de ese POS y no reenviarlas al Autorizador.

9. Mensajes operativos sugeridos

CasoMensaje al POS / cajeroTipo
Autorizador no respondeOperacion no autorizada. Autorizador no responde.Tecnico
Reversa pendienteDenegado: reversa pendiente en curso. Reintentar mas tarde o llamar a soporte.Bloqueo operativo
Denegada por autorizadorOperacion denegada por autorizador.Negocio
Reversa resueltaOperacion anterior regularizada. Puede operar nuevamente.Recuperacion