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
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.

  1. Elige Submitted. Como ese movimiento es directo, el informe pasa a Submitted en cuanto se guarda.
  2. 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.
  3. 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.