{
  "schemaVersion": 1,
  "id": "P27-C06",
  "title": "Кейтеринг: количество порций видно до суммы",
  "author": {
    "id": "P27",
    "name": "Филипп Нестеров"
  },
  "specialty": "Калькуляторы и подборщики для продаж",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P27-C06",
    "title": "Кейтеринг на мероприятие",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Для 30 гостей выбраны три закуски по 75 ₽ и один десерт по 160 ₽. Доставка добавляет 1500 ₽.",
  "decision": "Сначала считаю порции: 90 закусок и 30 десертов. Потом стоимость каждой группы и доставку. Десертов может быть ноль; количество гостей должно быть целым и не меньше десяти по условиям модели.",
  "constraint": "Самостоятельный калькулятор использует заданные допущения. Он не является коммерческой сметой, инженерным заключением или подтверждением условий поставщика.",
  "steps": [
    "Исходные значения: 90 закусок, 30 десертов, сумма 13 050 ₽.",
    "Десертов на гостя 0: их стоимость становится нулевой.",
    "Гостей 5: расчет отклоняется по минимальной группе."
  ],
  "inspection": [
    "Исходные значения: 90 закусок, 30 десертов, сумма 13 050 ₽.",
    "Десертов на гостя 0: их стоимость становится нулевой.",
    "Гостей 5: расчет отклоняется по минимальной группе.",
    "Гостей 30,5: требуется целое количество."
  ],
  "sample": {
    "headers": [
      "Действие",
      "Наблюдаемый результат"
    ],
    "rows": [
      [
        "1",
        "Исходные значения: 90 закусок, 30 десертов, сумма 13 050 ₽."
      ],
      [
        "2",
        "Десертов на гостя 0: их стоимость становится нулевой."
      ],
      [
        "3",
        "Гостей 5: расчет отклоняется по минимальной группе."
      ],
      [
        "4",
        "Гостей 30,5: требуется целое количество."
      ]
    ]
  },
  "sampleNote": "Самостоятельный проект на подготовленных исходных данных. Действия выполняются локально.",
  "caseStudy": {
    "role": "Разработка расчётной модели",
    "contribution": "Реализовал открытые формулы, промежуточные значения, проверку диапазонов и граничные случаи именно этой модели.",
    "objective": "Закуски, десерты и доставка дают раздельные составляющие.",
    "problem": "Для 30 гостей выбраны три закуски по 75 ₽ и один десерт по 160 ₽. Доставка добавляет 1500 ₽.",
    "result": "Исходный состав дает 13 050 ₽. Пользователь видит, как изменится число порций и цена при другой группе, а не только новую общую сумму.",
    "deliverables": [
      "Проверяемая модель",
      "Сохраняемый результат взаимодействия",
      "Исходные данные и порядок самостоятельной проверки"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Порции видны до общей суммы",
        "text": "Сначала считаю порции: 90 закусок и 30 десертов. Потом стоимость каждой группы и доставку. Десертов может быть ноль; количество гостей должно быть целым и не меньше десяти по условиям модели."
      },
      {
        "type": "text",
        "title": "Десерты можно исключить",
        "text": "Ноль десертов убирает их количество и стоимость, но не закуски и доставку. Девять гостей расчёт не принимает: нижняя граница этой модели — десять."
      },
      {
        "type": "callout",
        "title": "Граница работы",
        "text": "Самостоятельный калькулятор использует заданные допущения. Он не является коммерческой сметой, инженерным заключением или подтверждением условий поставщика."
      }
    ]
  },
  "deliverable": {
    "type": "calculator",
    "entry": "/catalogue/deliverables/p27-c06/index.html",
    "label": "Открыть работающий результат",
    "files": [
      {
        "path": "/catalogue/deliverables/p27-c06/index.html",
        "name": "Интерактивный результат",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p27-c06/source.json",
        "name": "Исходные условия и модель",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p27-c06/README.html",
        "name": "Повторить проверку",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p27-c06/starter-data.json",
        "name": "Исходный набор для повторного использования",
        "mimeType": "application/json"
      }
    ],
    "summary": "Исходный состав дает 13 050 ₽. Пользователь видит, как изменится число порций и цена при другой группе, а не только новую общую сумму."
  },
  "calculator": {
    "kind": "catering",
    "title": "Порции и отдельная доставка",
    "inputs": [
      {
        "id": "guests",
        "label": "Количество гостей",
        "type": "number",
        "value": 30,
        "unit": "чел.",
        "min": 10,
        "max": 500,
        "step": 1
      },
      {
        "id": "snacksEach",
        "label": "Закусок на человека",
        "type": "number",
        "value": 3,
        "unit": "шт.",
        "min": 1,
        "max": 10,
        "step": 1
      },
      {
        "id": "dessertsEach",
        "label": "Десертов на человека",
        "type": "number",
        "value": 1,
        "unit": "шт.",
        "min": 0,
        "max": 5,
        "step": 1
      },
      {
        "id": "snackPrice",
        "label": "Цена закуски",
        "type": "number",
        "value": 75,
        "unit": "₽",
        "min": 0,
        "max": 10000,
        "step": 1
      },
      {
        "id": "dessertPrice",
        "label": "Цена десерта",
        "type": "number",
        "value": 160,
        "unit": "₽",
        "min": 0,
        "max": 10000,
        "step": 1
      },
      {
        "id": "delivery",
        "label": "Доставка",
        "type": "number",
        "value": 1500,
        "unit": "₽",
        "min": 0,
        "max": 100000,
        "step": 100
      }
    ],
    "formula": "Закуски = гости × закусок на человека; десерты = гости × десертов на человека. Сумма = закуски × цена + десерты × цена + доставка.",
    "assumptions": [
      "Минимальный заказ модели —10 гостей; меньший заказ требует отдельного согласования.",
      "Цены условные и доступны для изменения.",
      "Посуда, персонал, текстиль, напитки и диетические требования не включены автоматически."
    ],
    "tests": [
      {
        "values": {
          "guests": 30,
          "snacksEach": 3,
          "dessertsEach": 1,
          "snackPrice": 75,
          "dessertPrice": 160,
          "delivery": 1500
        },
        "expected": {
          "snacks": 90,
          "desserts": 30,
          "total": 13050
        }
      },
      {
        "values": {
          "guests": 5
        },
        "expected": {
          "error": true
        }
      }
    ]
  },
  "takeaway": "Исходный состав дает 13 050 ₽. Пользователь видит, как изменится число порций и цена при другой группе, а не только новую общую сумму.",
  "capabilities": [
    "completed_calculator",
    "live_calculation",
    "input_validation"
  ],
  "externalConnections": []
}
