> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Aprobaciones de revisión manual

> Cómo dos personas deciden una operación de Lerian SPI en revisión manual mediante la API de Cabine.

Una operación MED de Lerian SPI puede estar en revisión manual. Dos personas la resuelven mediante la API de Cabine. Una persona propone la resolución. Otra persona la aprueba o la rechaza. Después de una aprobación, la API de Cabine envía la decisión a [Lerian SPI](https://docs.lerian.studio/es/rails/spi/what-is-lerian-spi.md).

Cabine no tiene pantalla para estas aprobaciones: llama a la API de Cabine.

## Permisos

Concede `br-spi-operations:update` en Lerian SPI solo a la aplicación de la API de Cabine. Una aplicación que tiene este permiso puede resolver una revisión manual directamente, sin propuesta y sin una decisión separada.

La API de Cabine acepta una propuesta o una decisión solo del inicio de sesión de una persona, nunca de una credencial de aplicación. La persona que decide debe ser distinta de la persona que propuso.

Los miembros de `admin-group` (el grupo de administradores de Access Manager), `br-desk-admin-group` y `br-desk-operator-group` pueden proponer y decidir. Los miembros de `br-desk-viewer-group` pueden listar y leer las aprobaciones. Consulta [Acceso y roles](https://docs.lerian.studio/es/rails/cabine/cabine-access-and-roles.md).

## Proponer una resolución

[Propose an operation approval resolution](https://docs.lerian.studio/es/reference/rails/cabine/propose-an-operation-approval-resolution-maker.md) crea la aprobación. La solicitud lleva estos campos.

| Campo | Descripción |
| - | - |
| `operationId` | El UUID de la operación de Lerian SPI en revisión manual. |
| `action` | `ATTACH_BACEN_RESOURCE` vincula a la operación el recurso del BACEN que encontraste. `CONFIRM_NOT_APPLIED` declara que el BACEN nunca recibió el intento. |
| `bacenResourceId` | El UUID del recurso del BACEN. Envíalo con `ATTACH_BACEN_RESOURCE`. No lo envíes con `CONFIRM_NOT_APPLIED`. |
| `digest` | El `requestFingerprint` de la operación: 64 caracteres hexadecimales en minúscula. Léelo con [Get DICT MED operation status](https://docs.lerian.studio/es/reference/rails/spi/dict/get-regulatory-operation.md). |
| `note` | Un motivo opcional, de hasta 500 caracteres. |

```bash theme={null}
curl -X POST "$CABINE_API_URL/v1/operation-approvals" \
  -H "Authorization: Bearer $CABINE_BEARER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "operationId": "01930000-0000-7000-8000-000000000000",
    "action": "CONFIRM_NOT_APPLIED",
    "digest": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
    "note": "BACEN has no record of this attempt."
  }'
```

La respuesta trae el `approvalId` y el `decisionDeadline`. El estado es `requested`. Mientras una propuesta anterior para la misma operación espera una decisión dentro de su ventana, una propuesta nueva devuelve `409` con el código `DESK-0005`.

## Decidir

[Approve or reject an operation approval workflow](https://docs.lerian.studio/es/reference/rails/cabine/approve-or-reject-an-operation-approval-workflow-checker.md) registra la decisión. Envía `decision` como `approved` o `rejected`, con un `note` opcional de hasta 500 caracteres.

```bash theme={null}
curl -X POST "$CABINE_API_URL/v1/operation-approvals/$CABINE_APPROVAL_ID/decision" \
  -H "Authorization: Bearer $CABINE_BEARER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"decision": "approved"}'
```

Una decisión sobre una aprobación que ya está decidida devuelve `409` con el código `DESK-0005`. Un rechazo no se envía a Lerian SPI. La operación sigue en revisión manual.

Para encontrar aprobaciones, usa [List operation approval workflows](https://docs.lerian.studio/es/reference/rails/cabine/list-operation-approval-workflows.md). Filtra con `status` igual a `requested`, `approved`, `rejected` o `expired`. Para leer una aprobación, usa [Get one operation approval workflow](https://docs.lerian.studio/es/reference/rails/cabine/get-one-operation-approval-workflow.md).

## Ventana de decisión

La persona que decide tiene 24 horas desde la propuesta. Un administrador puede cambiar este período con `DESK_OPERATION_APPROVAL_DECISION_WINDOW`. Consulta [Variables de entorno de la API de Cabine](https://docs.lerian.studio/es/rails/cabine/cabine-environment-variables.md).

Una decisión después de la ventana devuelve `410` con el código `DESK-0006`. Propón la operación de nuevo. Después de la ventana, la API de Cabine define el estado como `expired` en su próxima verificación.

## Entrega a Lerian SPI

Una aprobación se envía a [Resolve regulatory operation](https://docs.lerian.studio/es/reference/rails/spi/dict/resolve-regulatory-operation.md) en Lerian SPI. La API de Cabine hace el primer intento cuando se registra la decisión. La respuesta de la decisión no trae la entrega. Lee la aprobación para ver el campo `delivery`. Aparece después del primer intento. Tiene `outcome`, `attemptCount`, `lastStatusCode` y `lastAttemptAt`.

| Resultado | Significado | Qué hacer |
| - | - | - |
| `pending` | Lerian SPI no aceptó la decisión. La API de Cabine lo intenta de nuevo. | Lee la aprobación de nuevo más tarde. |
| `succeeded` | Lerian SPI aceptó la decisión. | Nada. |
| `refused` | Lerian SPI respondió `422`: la decisión no es válida para la operación, por ejemplo porque el `digest` no coincide. La API de Cabine no lo intenta de nuevo. | Propón de nuevo con datos correctos. |
| `exhausted` | Todos los intentos fallaron. La API de Cabine no lo intenta de nuevo. | Lee la operación en Lerian SPI. Si todavía está en revisión manual, revisa la configuración de la API de Cabine para Lerian SPI y propón de nuevo. |

Por defecto, un reintento espera al menos 30 segundos después del primer intento que falló. La espera se duplica con cada fallo, hasta 30 minutos. La API de Cabine hace como máximo 20 intentos. Los administradores definen estos valores con las variables `DESK_APPROVAL_DELIVERY_*`.

## Errores

La API de Cabine devuelve los códigos de la [lista de errores de la API de Cabine](https://docs.lerian.studio/es/reference/rails/cabine/cabine-error-list.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.