# Decisiones y aprobaciones

Pide un veredicto — aprobar, rechazar o cambios — y deja que tu flujo de trabajo ramifique sin tener que leer etiquetas.

## Decisiones y aprobaciones

Muchas solicitudes existen para conseguir una sola cosa: un sí, un no, o un 'así no'. La pregunta de decisión captura ese veredicto en una forma sobre la que tu automatización puede ramificar directamente, sin adivinar qué campo tenía la respuesta.

<h2 id="why">Por qué una pregunta especial</h2>

<p>
  Toda opción ya tiene una <a href="/es/requests/field-keys#option-keys">clave de opción</a>, así que un flujo de trabajo puede ramificar
  sobre cualquier radio. Lo que un flujo de trabajo no puede hacer es saber, en cada formulario que tenga una aprobación, qué clave
  significa "sí": el radio de un autor dice <code>sign_off</code>, el de otro <code>approved</code>.
</p>

<p>
  La <strong>pregunta de decisión</strong> fija los nombres. Es una pregunta de opción única con la clave de campo <code>decision</code>,
  cuyas tres opciones llevan las claves de opción <code>approve</code>, <code>decline</code> y <code>changes</code>. Sus etiquetas siguen
  siendo tuyas para reescribir y traducir; las claves de debajo nunca cambian. Cuando el destinatario elige una, la solicitud termina con un{' '}
  <strong>resultado</strong>. Cualquier radio con la clave <code>decision</code> cuyas opciones lleven esas tres claves cuenta — el preset
  solo te las pone.
</p>

<h2 id="insert">Añade una a tu formulario</h2>

/</strong> en el editor y elige <strong>Decision</strong> — "Aprobar, rechazar o pedir cambios".',
    },
    {
      title: 'Reescribe las etiquetas',
      description:
        'Obtienes una pregunta titulada "¿Apruebas?" con las opciones Aprobar, Rechazar y Pedir cambios. Reescribe cualquiera con tu propia redacción — "Dar el visto bueno", "Rechazar", "Devolver para editar". Tradúcelas como cualquier otro contenido.',
    },
    {
      title: 'Pregunta por qué, si lo necesitas',
      description:
        'Un veredicto solo rara vez se explica por sí mismo. Añade una pregunta de texto largo después, y muéstrala solo para rechazo y cambios con <a href="/es/building-forms/conditional-logic">lógica condicional</a>.',
    },
    {
      title: 'Publica',
      description:
        'Las solicitudes creadas desde esta versión publicada terminan con un resultado. Como cualquier clave de campo, decision solo existe una vez publicado el formulario.',
    },
  ]}
/>

> ⚠️ **Solo el preset produce un resultado**
> <p>
>     El resultado se lee de la pregunta cuya clave de campo es <code>decision</code>, y solo cuando la clave de la opción elegida es una de
>     las tres. Un radio que construyas a mano con opciones etiquetadas Aprobar, Rechazar y Cambios deriva exactamente esas claves, así que
>     funciona sin el preset; un radio con otras etiquetas funciona en cuanto escribes las tres claves en la{' '}
>     <a href="/es/requests/field-keys#option-keys">tabla de Claves</a>.
>   </p>
>   <ul>
>     <li>
>       Elimina una de las tres opciones, o vuelve a escribir su clave, y publicar te avisa: "A la pregunta de decisión le falta una opción
>       approve, decline o changes, así que las solicitudes pueden completarse sin resultado." Las tres deben estar — una decisión que solo
>       puede aprobar no puede rechazar.
>     </li>
>     <li>
>       Una pregunta de decisión dentro de un <a href="/es/building-forms/repeating-groups">grupo repetible</a> es una pregunta normal y se
>       ignora para el resultado.
>     </li>
>   </ul>

<h2 id="values">Los tres valores</h2>

<p>
  Estos tres valores son un contrato público, como una clave de campo: una automatización, un agente y una fórmula de hoja de cálculo los
  leen todos. <strong>Añade una cuarta opción y elegirla es una respuesta normal, no un veredicto</strong> — esa solicitud se completa sin
  resultado, en lugar de con un valor del que tu receptor nunca ha oído hablar.
</p>

<h2 id="where">Dónde aparece el resultado</h2>

```
{
  "id": "evt_...",
  "type": "request.completed",
  "test": false,
  "data": {
    "request": {
      "id": "kd7...",
      "externalId": "run-42",
      "status": "completed",
      "outcome": "changes",
      "context": { "case_id": "CASE-9" }
    },
    "answers": {
      "decision": "changes",
      "reason": "Please split the line items per site."
    }
  }
}
```

<p>
  Ramifica según <code>data.request.outcome</code>. <strong>status</strong> dice si la solicitud terminó; <strong>outcome</strong> dice qué
  decidió el destinatario. Una solicitud expirada o cancelada tiene un status y ningún outcome, y lo mismo una solicitud completada en un
  formulario sin pregunta de decisión.
</p>

<h2 id="agents">Desde un agente</h2>

<p>
  La herramienta MCP es <code>editor_insertDecisionQuestion</code>, que toma un título y las tres etiquetas en el idioma del formulario. Un
  agente que no puede alojar un endpoint de callback sondea <code>request_get</code> en su lugar y lee <code>outcome</code> cuando el status
  deja de ser <code>pending</code>. <a href="/es/developers/mcp-server#requests">Solicitudes en el servidor MCP →</a>
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Callbacks y firma](/es/requests/callbacks) — El payload completo y cómo verificarlo.
  - [La página de Solicitudes](/es/requests/managing-requests) — Filtra por resultado y sigue una solicitud.
  - [Lógica condicional](/es/building-forms/conditional-logic) — Pide un motivo solo cuando se necesita.
  - [Tipos de pregunta](/es/building-forms/field-types) — Cualquier otra pregunta que puedas hacer.
</div>
