Skip to main content

Estados de la Operación

Una vez creada la operación, InvWallet ejecuta los steps de forma asíncrona. La billetera debe hacer polling para conocer el estado actual.

Polling de estado

Método: GET
URL: /api/v1/mep/operations/{id}/

Retorna el estado actual de la operación, con result y final_amount_* actualizados a medida que avanza.

Sin webhooks

InvWallet no envía callbacks. La billetera debe hacer polling sobre este endpoint para conocer el estado. Frecuencia recomendada: cada 30 segundos durante la fase activa (BUY/SELL), cada hora durante PARK.

Estados posibles

stateDescripción
pendingOperación creada, esperando ejecución del primer step
buyingComprando bono ARS en el mercado
parkingEn período de parking normativo (esperando días hábiles)
sellingVendiendo bono USD en el mercado
cashing_outTransfiriendo USD al CBU del inversor
completedOperación finalizada exitosamente ✓
cancelledOperación cancelada (terminal)
failedUn step falló — requiere intervención manual (terminal)

Flujo de estados

CREAR OPERACIÓN


┌──────────────┐
│ BUY pending │ ◄── único estado cancelable
└──────┬───────┘
│ Tarea asíncrona

┌──────────────────┐
│ BUY processing │
└──────┬───────────┘
│ Evento FILLED del OMS

┌──────────────────┐
│ BUY completed │
└──────┬───────────┘
│ (si parking_days > 0)

┌──────────────────┐
│ PARK pending │ ◄── espera N días hábiles
└──────┬───────────┘
│ Cron diario

┌──────────────────┐
│ PARK completed │
└──────┬───────────┘


┌──────────────────┐
│ SELL processing │
└──────┬───────────┘
│ Evento FILLED del OMS

┌──────────────────┐
│ SELL completed │
└──────┬───────────┘
│ (si do_cashout=true)

┌──────────────────────┐
│ CASHOUT processing │
└──────┬───────────────┘

┌──────────────────────┐
│ CASHOUT completed │ → state: "completed" ✓
└──────────────────────┘

En cualquier step:
→ FAILED → state: "failed" ✗ (requiere intervención de InvWallet)
Aclaración

Si parking_days = 0, el step PARK se omite y la operación avanza directamente de BUY a SELL.

Campo result

El campo result es un JSON que se completa a medida que avanzan los steps. Ejemplo de operación completada:

{
"buy": {
"status": "completed",
"timestamp": "2026-04-28T14:32:45Z",
"order_id": "OMS-BUY-00123",
"price": 1095.50,
"quantity": 45.63
},
"park": null,
"sell": {
"status": "completed",
"timestamp": "2026-05-03T15:10:22Z",
"order_id": "OMS-SELL-00456",
"price": 68.15,
"quantity": 45.63
},
"cashout": {
"status": "completed",
"timestamp": "2026-05-03T15:15:01Z",
"amount_usd": "44.76",
"bank_ref": "TRF-CBU-789"
}
}

En caso de falla, el step fallido incluye el error:

{
"buy": {
"status": "failed",
"timestamp": "2026-04-28T14:33:02Z",
"error": "OMS rejected order: insufficient holdings"
}
}

Operaciones fallidas

Cuando state = "failed", el campo result contiene el detalle del error en el step que falló. No hay retry automático.

La billetera debe:

  1. Detectar state = "failed" vía polling
  2. Notificar al usuario final que la operación no pudo completarse
  3. Contactar a InvWallet para que un operador revise el caso desde el backoffice

Textos sugeridos para la UX

stateTexto sugerido
pending"Operación creada, iniciando..."
buying"Comprando bono en el mercado..."
parking"En período de espera normativo ({N} días hábiles restantes)"
selling"Vendiendo bono USD..."
cashing_out"Transfiriendo USD a tu cuenta..."
completed"¡Operación completada! Recibiste {final_amount_usd} USD"
failed"La operación encontró un error. Nuestro equipo está revisando el caso."
cancelled"Operación cancelada"