Máquina de estados y manejo de errores
12.1 Estados y responsable de la transición
| Estado | Significado | Componente que puede transicionar hacia él |
|---|---|---|
RECEIVED | Solicitud recibida e idempotencia validada (ingesta). | Purchase Order API |
VALIDATING | Motor de validaciones está evaluando reglas. | Purchase Order API (síncrono) |
VALIDATION_FAILED | Errores de reglas funcionales; no se envía a Pub/Sub. | Purchase Order API + Validation Engine |
REJECTED | Regla de negocio grave NO_RETRYABLE lo marcó como rechazo inmediato. | Validation Engine (policy por regla severidad FATAL) |
VALIDATED | Todas las reglas pasaron. | Validation Engine |
QUEUED | Outbox event creado; pendiente de publicación y entrega a worker. | Purchase Order API (transaction commit) |
PROCESSING | Fusion Worker ha tomado el mensaje y está invocando Oracle Fusion. | Oracle Fusion Worker |
CREATED | Oracle Fusion creó la OC; número de OC disponible. | Oracle Fusion Worker |
RETRY_PENDING | Error TEMPORARY_ERROR; en espera de retry automático o manual. | Oracle Fusion Worker o Manual Retry API |
FAILED | Exhaustos reintentos, o error NO_RETRYABLE. | Oracle Fusion Worker |
12.2 Transiciones permitidas
12.3 Taxonomía de errores
| Categoría | Descripción | Retry | Estado | HTTP | Log | Alerta |
|---|---|---|---|---|---|---|
VALIDATION_ERROR | Errores de reglas funcionales | No | VALIDATION_FAILED | 422 | WARN | Opcional |
BUSINESS_ERROR | Políticas de negocio no cumplen | No | REJECTED / FAILED | 409 / 422 | WARN | TBD |
TEMPORARY_ERROR | Timeouts / 5xx / unavailable | Sí | RETRY_PENDING → FAILED | 502/504 | ERROR | Sí |
INTEGRATION_ERROR | Fusion 4xx (ej: supplier no existe) | Depende: generalmente No; excepción TBD | FAILED | 422 | ERROR | Sí |
AUTHENTICATION_ERROR | Token inválido/expirado | Sí si refresh; No si credenciales mal | FAILED | 401 | ERROR | Sí |
AUTHORIZATION_ERROR | Permisos / scopes insuficientes | No | FAILED | 403 | ERROR | Sí |
TECHNICAL_ERROR | DB / NullPointer / ClassCast / UnknownHostException | Opcional (con límite) | RETRY_PENDING → FAILED | 500 | ERROR | Sí |
NON_RETRYABLE_ERROR | Clasificación explícita por configuración | No | FAILED → DLQ | 422 / 500 | FATAL | Sí |
12.4 Estrategia de retries y DLQ matriz
| Error | Auto retry | Manual retry | DLQ |
|---|---|---|---|
| VALIDATION_ERROR | No | Sí (después de corregir reglas) | No |
| BUSINESS_ERROR | No | Sí (override por regla TBD) | Sí |
| TEMPORARY_ERROR | Sí (Pub/Sub retry policy) | Sí | Sí (tras límite) |
| INTEGRATION_ERROR | Configurable; por defecto No | Sí | Sí |
| AUTHENTICATION_ERROR | Sí si transient; No si credenciales rotas | Sí (post rotación secret) | Sí |
| AUTHORIZATION_ERROR | No | Sí (fix scopes) | Sí |
| TECHNICAL_ERROR | Sí (límite) | Sí | Sí |
| NON_RETRYABLE_ERROR | No | Sí | Sí (inmediato o configurable) |
12.5 API Error Model único
{
"requestId": "bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41",
"timestamp": "2026-08-12T18:00:00Z",
"code": "VALIDATION_ERROR",
"message": "La solicitud contiene errores",
"errors": [
{ "field": "supplier.code", "code": "REQUIRED", "message": "El proveedor es obligatorio" }
]
}