Импорт меню и API
Как заполнить меню из Excel, CSV или JSON, подобрать фото по имени файла, дописать тексты с ИИ и загружать меню из своих программ через API и MCP.
Меню можно заполнить не по одному блюду, а сразу целиком: из таблицы Excel, CSV или JSON. Импорт находит каждое блюдо в r_keeper, показывает, что изменится, и только после кнопки «Применить» записывает. Цены и состав меню по-прежнему берутся из r_keeper, импорт меняет только оформление: названия на трёх языках, описания, состав, категории, метки и фото.
Импорт в админке
- Откройте админку меню, раздел Меню → Импорт меню. Он есть и в админке сервера ресторана, и в облачной админке.
- Нажмите «Скачать шаблон / текущее меню». Скачается файл Excel со всеми блюдами r_keeper и тем, что уже заполнено. Это и шаблон, и резервная копия.
- Заполните нужные ячейки и загрузите файл кнопкой «Загрузить файл». Пустые ячейки ничего не меняют.
- Посмотрите проверку: для каждой строки видно, какое блюдо r_keeper найдено, что изменится, и замечания. Строки с ошибками не запишутся.
- Нажмите «Применить». На планшеты изменения попадут при ближайшей синхронизации, в QR-меню тоже.
Колонки
| Колонка | Что это |
|---|---|
| sifr | Идентификатор блюда в r_keeper. Самый точный способ найти блюдо |
| Код | Код блюда в r_keeper |
| Код/sifr | Одна колонка для обоих: сначала ищем по sifr, потом по коду |
| Название r_keeper | Название как в кассе. Если нет sifr и кода, блюдо ищется по нему (без учёта регистра) |
| Название RU, UZ, EN | Название в меню на каждом языке |
| Описание RU, UZ, EN | Короткое описание |
| Состав RU, UZ, EN | Состав через запятую |
| Категория | Название раздела меню. Если такого раздела нет, он будет создан |
| Метки | spicy, veg, halal, new, hit через запятую |
| Скрыто | 1, если блюдо не показывать |
| Фото (URL) | Ссылки на фото через пробел |
Второй лист «Разделы» (необязательно) задаёт разделы: название на трёх языках, родительский раздел, порядок, скрыт ли раздел.
Заголовки можно писать и по-узбекски: «Nomi UZ», «Tavsif UZ», «Tarkibi UZ», «Kategoriya», «Rasm».
Фото
- Файлы. Кнопки «Добавить фото» и «Папка с фото» подбирают фото к блюдам по имени файла:
Плов.jpg(название),101.jpg(код),Плов (2).jpg(второе фото того же блюда). Фото из файлов добавляются к уже загруженным. - Ссылки. Ссылки из колонки «Фото (URL)» заменяют фото блюда. Браузер скачивает фото сам, а если сайт не разрешает, его скачивает сервер.
- Все фото сжимаются в браузере так же, как при ручной загрузке: полное фото до 1280 px и миниатюра 420 px для списков. Ограничения по размеру нет.
Тексты с ИИ
Если ИИ подключён для вашего ресторана, в импорте и на странице «Блюда» есть кнопка «Заполнить с ИИ». ИИ пишет название, короткое описание и состав на русском, узбекском и английском по названию блюда из r_keeper, разделу и цене. Если текст уже есть на одном языке, ИИ его переводит. Заполненные поля не меняются, пока вы не отметите «Перезаписать заполненные поля». Каждое предложение можно поправить или снять галочку перед сохранением. Подключает ИИ поддержка SBG, есть дневной лимит блюд.
API для своих программ
Тот же импорт доступен программам по личному ключу из кабинета (раздел про ключи: White Server и AI). Ключ работает как Bearer-токен. Нужна роль владельца: ключ менеджера получит отказ.
curl -X POST https://rkpr.uz/api/r/<id ресторана>/menu/batch \
-H "Authorization: Bearer <ключ>" -H "Content-Type: application/json" \
-d '{
"dryRun": true,
"categories": [{ "name_ru": "Супы", "name_uz": "Sho‘rvalar", "name_en": "Soups" }],
"products": [
{ "rk7_sifr": 1001, "name_uz": "Toshkent palovi", "category": "Супы", "tags": ["hit"] },
{ "code": 102, "description_ru": "Тянутая лапша с говядиной", "images": ["https://example.com/lagman.jpg"] },
{ "name": "Самса", "name_en": "Samsa" }
]
}'
Ответ: отчёт по каждой строке.
{
"dryRun": true, "ok": false,
"summary": { "categories": { "create": 1, "update": 0, "unchanged": 0, "error": 0 },
"products": { "create": 1, "update": 1, "unchanged": 0, "error": 1 },
"images": { "stored": 0, "reused": 0, "download": 1, "skipped": 0 } },
"categories": [{ "index": 0, "input": "Супы", "action": "create", "changes": ["name_ru", "name_uz", "name_en"], "warnings": [] }],
"products": [
{ "index": 0, "input": "1001", "rk7_sifr": 1001, "rk7_name": "Плов", "matchedBy": "sifr", "action": "create", "changes": ["name_uz", "tags", "category_id", "name_ru"], "warnings": [] },
{ "index": 1, "input": "102", "rk7_sifr": 1002, "rk7_name": "Лагман", "matchedBy": "code", "action": "update", "changes": ["description_ru", "images"], "warnings": [] },
{ "index": 2, "input": "Самса", "action": "error", "error": "название «Самса» подходит к нескольким блюдам r_keeper: Самса (sifr 13), Самса (sifr 14). Укажите rk7_sifr", "warnings": [] }
]
}
Правила:
- Поиск блюда:
rk7_sifr, затемcode, затем точноеname, затемnameбез учёта регистра. Если название подходит к нескольким блюдам, строка вернётся с ошибкой. - Поиск раздела:
id, затемrk7_sifr, затемname_ruбез учёта регистра. Не нашли, значит создаём.parentиcategoryпринимают название или id. - Меняются только переданные поля. Пустая строка очищает поле.
imagesзаменяет список фото блюда. - Фото: ссылка
http(s)(облако скачивает до 10 МБ за 15 секунд, тип проверяется по содержимому: JPEG, PNG или WebP),data:image/...;base64,...или хэш уже загруженного фото. Облако не сжимает фото, поэтому фото больше 1,5 МБ не сохраняется, в отчёте будет предупреждение. Крупные фото загружайте через админку, там они сожмутся. Весь запрос не больше 6 МБ. - dryRun: true только проверяет и ничего не записывает. Ссылки на фото при этом не скачиваются.
- Изменения попадают на сервер ресторана и планшеты обычной синхронизацией.
Выгрузка текущего меню в том же формате (удобно скачать, поправить и отправить обратно):
curl -H "Authorization: Bearer <ключ>" https://rkpr.uz/api/r/<id ресторана>/menu/export
Коды ответа: 401 нет ключа или ключ неверный, 403 ресторан не ваш или у вас роль менеджера, 400 пустой запрос.
MCP
В MCP-сервере кабинета есть инструменты menu_export и menu_batch с тем же форматом. AI-ассистент может, например, прочитать меню, написать описания и загрузить их: сначала с dryRun: true, потом по вашему подтверждению.