Flujo de Transferencia Saliente
Flujo principal
Sección titulada «Flujo principal»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." }Flujo de aprobación por director
Sección titulada «Flujo de aprobación por director»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 aamount
Límites de aprobación
Sección titulada «Límites de aprobación»| Nivel | Condición | Acción |
|---|---|---|
| Automático | Dentro del límite personal | limit_state = "approved" |
| Root user | Supera límite personal | limit_state = "to_approve" |
| Director | Supera límite general | limit_state = "director_to_approve" |
Alerta de transacciones restantes
Sección titulada «Alerta de transacciones restantes»Si después de restar el plan quedan exactamente 50 o 20 transacciones:
- Lambda:
LOW_REMAINING_TRANSACTIONS(notificación al usuario)