Flujos de negocio
Ciclo de vida de una remesa
crear remesa payin.completed
┌─────────┐ ┌─────────┐ ┌────────────┐
│ (quote) │ ─────▶ │ PENDING │ ─────────────▶ │ PROCESSING │
└─────────┘ └────┬────┘ └─────┬──────┘
│ cancel / payin.failed │
▼ │ ¿espera receptor? ──▶ sigue PROCESSING
CANCELLED / FAILED │ ¿requiere review? ──▶ sigue PROCESSING
▼ (auto si no hay retenciones)
┌──────┐ payout.completed ┌───────────┐
│ SENT │ ─────────────────▶ │ DELIVERED │
└──┬───┘ └───────────┘
│ payout.failed
▼
FAILEDReglas de avance (en RemittanceService.advanceProcessing):
awaitingRecipient(smart link sin elección) → se queda en PROCESSING.requiresReview(alerta AML abierta) → se queda en PROCESSING hasta que un admin apruebe (/admin/remittances/:id/approve) o rechace.- Sin retenciones →
createPayouten Cashela →SENT.
Cada transición escribe un RemittanceEvent (timeline del cliente) y emite
una notificación (puerto Notifier).
Smart Recipient Flow
- El remitente crea la remesa con
smartRecipient: { fullName, phone }. - El API genera
recipientTokeny devuelverecipientLink(WEB_URL/r/<token>); se comparte por WhatsApp. - El receptor abre el link (público), ve cuánto recibe y elige banco / wallet / USDT con sus datos.
- El API revalida el corredor, recalcula la entrega con el método elegido y, si el pago ya se confirmó, dispara el payout inmediatamente.
Orden flexible: la elección puede ocurrir antes o después del pago del remitente — ambos caminos están cubiertos por tests.
KYC / KYB
- Persona: sube documento + selfie + prueba de residencia → cola del
backoffice → APPROVED/REJECTED (con nota). Sin KYC aprobado el API rechaza
el envío con
KYC_REQUIRED. - Empresa: el registro crea
CompanyconkybStatus=PENDING. Un admin aprueba el KYB; hasta entonces los envíos devuelvenKYB_REQUIRED.
Compliance
| Control | Implementación |
|---|---|
| Umbral AML | amountEur ≥ 1000 → ComplianceAlert + requiresReview |
| Límite mensual | suma de amountEur del mes natural vs monthlyLimitEur (CANCELLED/FAILED no cuentan) |
| Aprobación | resuelve alertas y lanza el payout si nada más retiene |
| Rechazo | remesa a FAILED + alertas resueltas con el motivo |
B2B (empresa → persona)
Mismo POST /remittances, con el JWT de un usuario BUSINESS: la remesa se
etiqueta con companyId, el receptor ve el nombre de la empresa en el
smart link, y el portal B2B (/b2b/company) agrega el volumen. Mass payouts
(lotes) quedan para Fase 6 — batchId ya existe en el esquema.
Last updated on