Ir al contenido

Flujo de Transferencia Saliente

Backend Finalitix
│ POST /api/v1/connection
│ { module: "transaction", method: "postTransaction", params: {...} }
TransactionController.postTransaction
├─ 1. Obtener credenciales y config STP
├─ 2. Verificar saldo: account.amount >= amount
│ → Insuficiente: error "La cuenta no cuenta con saldo suficiente"
├─ 3. Verificar plan activo con remaining_transactions > 0
│ → Sin plan: error "No se encontro un plan con transacciones restantes"
├─ 4. Calcular límite de aprobación
├─ Si supera límite del director:
│ ├─ limit_state = "director_to_approve"
│ ├─ Congelar monto (amount -= monto, pending_amount += monto)
│ ├─ Crear alerta DLA (URL: /transactions/unapproved)
│ └─ Notificar director vía Lambda + WebSocket
│ └─ DETENER (esperar aprobación manual)
├─ Si es transferencia interna Finalitix → Finalitix:
│ ├─ Actualizar saldo origen y destino directamente
│ └─ Saltar petición a STP
├─ 5. Generar claveRastreo: prefijoClaveRastreo + random(10 dígitos)
├─ 6. Generar referenciaNumerica: random(7 dígitos)
├─ 7. Firmar: CryptoHandlerOrdenPago.getSign(passphrase, privateKey)
├─ 8. PUT STP: registraOrdenUrl
│ { institucionContraparte, empresa, claveRastreo, monto,
│ nombreOrdenante, cuentaOrdenante, nombreBeneficiario,
│ cuentaBeneficiario, conceptoPago, referenciaNumerica,
│ tipoCuentaOrdenante, tipoCuentaBeneficiario, tipoPago: 30,
│ firma, ... }
│ → STP responde: { id: 12345678 } (id > 999 = éxito)
│ → id <= 999: error en STP
├─ 9. Guardar transacción: type="cargo", api_id=id, api_state="enviada"
├─ 10. Actualizar saldo: account.amount -= amount
├─ 11. Restar 1 de remaining_transactions del plan
├─ 12. SQS → Odoo: create_post_move (account.move cargo)
├─ 13. Lambda: TRANSACTION_OUT (email/SMS al usuario)
├─ 14. Detección de zona de riesgo:
│ Extraer código de plaza de CLABE beneficiaria (dígitos 4-6)
│ Calcular: frontera×25/5 + puerto×35/5 + delincuencia×40/5
│ Si porcentaje >= 78:
│ ├─ Crear alerta ZAR
│ ├─ Agregar tag id=11 al usuario
│ ├─ Lambda: TRANSACTION_HIGH_RISK_AREA (correo PLD)
│ └─ Lambda PubSub: WebSocket al portal admin
Backend Finalitix
{ success: true, status: 201, message: "Transaccion guardada." }

Cuando limit_state = "director_to_approve", el flujo se pausa hasta que el admin llame:

POST /api/v1/connection
{ module: "transaction", method: "postAdminTransaction",
params: { transaction_id, action: "approve" | "deny" } }
  • Si approve: se envía la orden a STP y continúa el flujo normal desde el paso 8
  • Si deny: limit_state = "director_denied", se devuelve el monto congelado a amount
NivelCondiciónAcción
AutomáticoDentro del límite personallimit_state = "approved"
Root userSupera límite personallimit_state = "to_approve"
DirectorSupera límite generallimit_state = "director_to_approve"

Si después de restar el plan quedan exactamente 50 o 20 transacciones:

  • Lambda: LOW_REMAINING_TRANSACTIONS (notificación al usuario)