Construye un flujo de trabajo: aprobación de informes de gastos
Una máquina de estados convierte un simple campo de estado en un flujo de trabajo guiado: una instancia solo puede moverse entre estados siguiendo las transiciones que defines, y cada movimiento puede ejecutar comprobaciones o pasos posteriores antes de confirmarse. Este tutorial construye un ejemplo completo — un informe de gastos (ExpenseReport) que va de Borrador → Enviado → Aprobado o Rechazado → Pagado — para que veas cómo encaja cada pieza.
Combinarás bloques que Yellow ya ofrece:
- una enumeración cuyos ítems son los estados,
- una restricción de máquina de estados que dice "el estado de este modelo vive en esta propiedad y usa esta enumeración",
- registros de transición que definen los movimientos permitidos, y
- una restricción de referencia para que el campo de estado se muestre como un desplegable.
Qué construirás
| Pieza | Función |
|---|---|
Modelo ExpenseReport |
El elemento que tiene un flujo de trabajo — Title, Amount, Submitter y una propiedad State. |
Enumeración ExpenseReportStatus |
El conjunto de estados: Draft, Submitted, Approved, Rejected, Paid. |
| Restricción de máquina de estados | Vincula la propiedad State de ExpenseReport con la enumeración ExpenseReportStatus. |
| Transiciones | Los movimientos permitidos entre estados. |
Modelo RejectionInfo |
Datos adicionales que se capturan al rechazar un informe. |
Paso 1 — Crea la enumeración de estados
Crea una enumeración llamada ExpenseReportStatus y añade un ítem por estado. Da a cada ítem un Name (lo que ven los usuarios) y un Id (un número que eliges, usado para ordenar):
| Ítem | Id |
|---|---|
| Draft | 1 |
| Submitted | 2 |
| Approved | 3 |
| Rejected | 4 |
| Paid | 5 |
Resultado: una enumeración con cinco ítems, ordenados por Id.
Paso 2 — Crea el modelo ExpenseReport
Crea un modelo llamado ExpenseReport con estas propiedades:
| Propiedad | Tipo | Qué hace |
|---|---|---|
| Title | Texto | Un título breve del informe. |
| Amount | Número | El importe total. |
| Submitter | Texto | Quién lo envió. |
| State | Referencia | Contiene el estado actual — apunta a un ítem de ExpenseReportStatus. |
La propiedad State es la que mueve el flujo de trabajo; las otras tres son campos normales.
Paso 3 — Haz que State sea un desplegable
Añade una restricción de referencia a la propiedad State para que solo acepte los estados:
- Modelo objetivo:
EnumerationItem - Enumeración:
ExpenseReportStatus - Obligatorio: sí
Resultado: al editar un informe de gastos, State se muestra como un desplegable con los cinco estados, en lugar de un selector de referencia libre.
Paso 4 — Declara la máquina de estados
Añade una restricción de máquina de estados con:
- Modelo:
ExpenseReport - Propiedad:
State - Máquina de estados:
ExpenseReportStatus
Esto indica a Yellow que ExpenseReport tiene un flujo de trabajo y qué propiedad contiene su estado.
Paso 5 — Define las transiciones
Crea una transición por cada movimiento permitido. Cada transición indica la máquina de estados, un estado inicial, un estado final y una opción Direct. Algunas también apuntan a un modelo de Additional Info para datos adicionales.
| De | A | Direct | Additional Info |
|---|---|---|---|
| Draft | Submitted | Sí | — |
| Submitted | Approved | No | — |
| Submitted | Rejected | No | RejectionInfo |
| Approved | Paid | No | — |
Para la transición de rechazo, crea primero un modelo pequeño RejectionInfo con Reason (Texto) y Rejected By (Texto). Quien rechace un informe los rellenará.
Movimientos directos y no directos
La opción Direct decide cómo se aplica un movimiento:
- Direct = Sí — el movimiento ocurre de inmediato al guardar. Draft → Submitted es directo: enviar siempre está permitido, así que el estado cambia al instante.
- Direct = No — el movimiento se registra como una solicitud y se aplica después, una vez que Yellow ha ejecutado las validaciones del modelo y los pasos posteriores. Submitted → Approved no es directo: la aprobación puede depender de reglas, por eso se comprueba antes de cambiar el estado.
Un movimiento no directo que no puede completarse vuelve con el motivo, y el estado se queda donde estaba.
Cómo usarlo
Abre un informe de gastos en estado Draft y busca el menú Save & transition junto a Save. Solo lista los estados a los que puedes llegar desde el actual — desde Draft verás Submitted.
- Elige Submitted. Como ese movimiento es directo, el informe pasa a Submitted en cuanto se guarda.
- Desde Submitted, elige Approved o Rejected. Estos no son directos: Yellow registra la solicitud y la resuelve, y luego actualiza el estado si se cumplen las reglas.
- Si eliges Rejected, primero se abre un formulario pequeño — los campos de RejectionInfo — para que anotes el motivo. Rellénalo y confirma.
El campo State es de solo lectura en el editor a propósito: la única forma de cambiarlo es mediante una transición, lo que mantiene vigentes las reglas del flujo de trabajo.
Dónde encontrarlo
La enumeración de estados y sus ítems están en el área de Enumeraciones. El modelo, su propiedad State y las dos restricciones se editan en el editor de modelos. Las transiciones son instancias normales del modelo StateMachineTransition, así que las creas y editas como cualquier otro dato.
Relacionado
- Enumeraciones — los estados son los ítems de una enumeración.
- Restricciones — las restricciones de referencia y de máquina de estados que se usan aquí.
- Tipos de propiedad — referencias y otros tipos de propiedad.