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

# Recetas de menú

> Fragmentos de menú resueltos para los escenarios que necesitan los restaurantes reales: modificadores de selección múltiple, opciones anidadas, especiales por horario y descuentos de happy hour.

Estos son fragmentos para copiar y adaptar en escenarios comunes de menú. Cada uno muestra solo la parte relevante del documento del menú: insértela en la estructura completa de [Publicar un menú](/es/developer-api/guides/publish-menu). Para conocer el modelo que hay detrás, consulte [El modelo de menú](/es/developer-api/concepts/the-menu-model).

Todos los precios son enteros en unidades menores (`450` = \$4.50) y cada objeto lleva un `externalId` que es suyo.

## Selección múltiple: elegir hasta 3, máximo 2 distintos

"Elija sus ingredientes: hasta 3 en total, pero no más de 2 tipos diferentes." El conteo total y el conteo de opciones distintas son reglas separadas:

```json theme={null}
{
  "externalId": "grp-toppings",
  "name": "Toppings",
  "minSelections": 0,
  "maxSelections": 3,
  "maxUniqueSelections": 2,
  "options": [
    { "externalId": "top-mushroom", "name": "Mushroom", "maxQuantity": 3, "price": { "amount": { "amountMinor": 150, "currency": "USD" } } },
    { "externalId": "top-pepperoni", "name": "Pepperoni", "maxQuantity": 3, "price": { "amount": { "amountMinor": 200, "currency": "USD" } } },
    { "externalId": "top-olives", "name": "Olives", "maxQuantity": 3, "price": { "amount": { "amountMinor": 100, "currency": "USD" } } }
  ]
}
```

* `maxSelections: 3` limita la cantidad **total** seleccionada.
* `maxUniqueSelections: 2` limita el número de opciones **distintas**. Un cliente puede elegir 2× Mushroom + 1× Olives (3 en total, 2 tipos), pero no tres ingredientes diferentes.
* `maxQuantity: 3` en cada opción permite pedir doble o triple de un mismo ingrediente.

<Tip>
  Haga gratis las primeras selecciones con `freeSelectionCount`. Por ejemplo, `"freeSelectionCount": 1` cobra solo a
  partir del segundo ingrediente.
</Tip>

## Modificadores anidados

Una opción que abre más opciones: elegir un acompañamiento y, si es la ensalada, elegir un aderezo. Las opciones pueden llevar sus propios grupos de modificadores:

```json theme={null}
{
  "externalId": "itm-combo",
  "name": "Burger Combo",
  "variations": [{ "externalId": "var-combo", "name": "Regular", "price": { "amount": { "amountMinor": 1200, "currency": "USD" } } }],
  "modifierGroups": [
    {
      "externalId": "grp-side",
      "name": "Choose your side",
      "minSelections": 1,
      "maxSelections": 1,
      "options": [
        { "externalId": "side-fries", "name": "Fries" },
        {
          "externalId": "side-salad",
          "name": "Side salad",
          "modifierGroups": [
            {
              "externalId": "grp-dressing",
              "name": "Dressing",
              "minSelections": 1,
              "maxSelections": 1,
              "options": [
                { "externalId": "drs-ranch", "name": "Ranch" },
                { "externalId": "drs-vinaigrette", "name": "Vinaigrette" }
              ]
            }
          ]
        }
      ]
    }
  ]
}
```

Elegir **Side salad** muestra una opción obligatoria de **Dressing**; elegir **Fries** no. Anide tan profundo como lo necesite el menú.

<Note>
  Por ahora, los recursos de pedido exponen los modificadores de primer nivel seleccionados directamente en cada
  partida; las selecciones anidadas más profundas todavía no se expanden en el recurso del pedido.
</Note>

## Disponibilidad: especiales del día

Una sección de desayuno que solo aparece por las mañanas de lunes a viernes. Coloque la ventana en la categoría (restringe todo lo que contiene) o en un solo artículo:

```json theme={null}
{
  "externalId": "cat-breakfast",
  "name": "Breakfast",
  "availability": {
    "windows": [
      { "dayOfWeek": 1, "startTime": "07:00", "endTime": "11:00" },
      { "dayOfWeek": 2, "startTime": "07:00", "endTime": "11:00" },
      { "dayOfWeek": 3, "startTime": "07:00", "endTime": "11:00" },
      { "dayOfWeek": 4, "startTime": "07:00", "endTime": "11:00" },
      { "dayOfWeek": 5, "startTime": "07:00", "endTime": "11:00" }
    ]
  },
  "items": [{ "externalId": "itm-pancakes", "name": "Pancakes", "variations": [{ "externalId": "var-pancakes", "name": "Regular", "price": { "amount": { "amountMinor": 950, "currency": "USD" } } }] }]
}
```

* `dayOfWeek` va de `0` (domingo) a `6` (sábado); agregue una ventana por cada día activo.
* `startTime` / `endTime` son hora local `HH:MM` (formato de 24 horas), en la zona horaria del menú: establezca el campo de nivel superior `timezone` (por [defecto es UTC](/es/developer-api/guides/publish-menu)).
* Un objeto sin `availability` siempre está disponible.

Así funcionan los menús por horario del día: hay [un menú por local](/es/developer-api/concepts/the-menu-model) y las ventanas de disponibilidad lo dividen.

## Happy hour: un descuento recurrente

Un descuento recurrente requiere tres objetos de nivel superior que trabajan juntos: a qué se aplica (un conjunto de productos), el cálculo del descuento y cuándo está activo (la promoción):

```json theme={null}
{
  "productSets": [
    { "externalId": "set-drinks", "name": "All drinks", "itemIdsAny": ["itm-latte", "itm-cold-brew"] }
  ],
  "discounts": [
    {
      "externalId": "disc-happy-hour",
      "name": "20% off drinks",
      "benefitType": "percentage",
      "percentage": 20,
      "benefitTargetProductSetId": "set-drinks"
    }
  ],
  "promotions": [
    {
      "externalId": "promo-happy-hour",
      "name": "Happy hour",
      "discountId": "disc-happy-hour",
      "applicationMode": "automatic",
      "availability": {
        "windows": [
          { "dayOfWeek": 1, "startTime": "16:00", "endTime": "18:00" },
          { "dayOfWeek": 2, "startTime": "16:00", "endTime": "18:00" },
          { "dayOfWeek": 3, "startTime": "16:00", "endTime": "18:00" },
          { "dayOfWeek": 4, "startTime": "16:00", "endTime": "18:00" },
          { "dayOfWeek": 5, "startTime": "16:00", "endTime": "18:00" }
        ]
      }
    }
  ]
}
```

* El **conjunto de productos** indica *a qué* se aplica el descuento (aquí, dos bebidas; use `"allProducts": true` para todo el menú).
* El **descuento** indica *cuánto* (20 % de descuento). Otros `benefitType` son `amount`, `set_price`, `free_item` y `bxgy`.
* La **promoción** los une e indica *cuándo*: `applicationMode: "automatic"` la aplica sin un código y `availability` define las ventanas semanales recurrentes. Use `validFrom` / `validUntil` para una campaña de una sola vez.

<Note>
  Los ID que conectan todo esto (`discountId`, `benefitTargetProductSetId` y los miembros de `itemIdsAny`) son los
  `externalId` que usted asignó. Las referencias cruzadas en un menú siempre usan sus ID, nunca los de Maple. Las
  ventanas de `availability` de la promoción usan la zona horaria del menú (establezca `timezone` en el nivel superior;
  por defecto es UTC).
</Note>

## Marcar un artículo como agotado (86)

Marque algo como agotado sin reestructurar el menú: establezca `stockStatus` en el artículo (o la variante):

```json theme={null}
{ "externalId": "itm-latte", "name": "Latte", "stockStatus": "out_of_stock", "variations": [{ "externalId": "var-latte", "name": "Regular", "price": { "amount": { "amountMinor": 450, "currency": "USD" } } }] }
```

`stockStatus` es `in_stock`, `out_of_stock` o `low_stock`. Si lo omite al volver a publicar, se conserva el valor actual, así que una actualización de inventario puede ser una publicación pequeña y específica.

## Combínelas

Estas recetas se pueden combinar. Una categoría de desayuno (disponibilidad) puede contener un artículo armable (modificadores anidados) con un grupo de "primer ingrediente gratis" (`freeSelectionCount`), mientras una promoción de happy hour se aplica a las bebidas. Publique el menú completo y Maple lo aplica como un solo diff; consulte [Publicar un menú](/es/developer-api/guides/publish-menu).


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