Two gaps in the earlier i18n scaffolding: the Mini App's UA/EN switcher existed but most screens and all menu content stayed hardcoded Ukrainian. Menu content (business data, not UI chrome): - Category.name_en, Product.name_en/description_en (nullable, opt-in per item — untranslated items fall back to Ukrainian rather than showing blank). Editable from the existing category/product admin forms. - Allergen labels (a small fixed EU-mandated set) get an English label directly in ALLERGENS, no DB column needed. - /api/categories and /api/products take an optional ?locale= param (no session on these unauthenticated routes to read a stored preference from). Full EN coverage for everything else: - Every remaining webapp screen: MenuPage/ProductCard, CartItemRow (fixes a pre-existing gap in the "already translated" cart screen), OrdersPage, ContactsPage, ClosedScreen, BottomNav, AnnouncementPopup, plus app-level status/error text. - Every reachable bot message: /menu, /contacts (including its locale-dependent reply-keyboard button, matched by text across all locales since the label itself varies), and the rating thank-you flow. - Every customer-facing checkout/order error message (empty cart, closed, min order amount, payment/promo validation, cancel/pay errors) via locale params threaded through workhours.closed_message() and promo.validate_promo_code(). New: PATCH /api/me/locale persists an explicit in-app language choice back to TelegramUser.locale (fire-and-forget from the webapp switcher), so it also applies to the bot's own push notifications, not just the Mini App session that made the choice. Fixed a real bug caught while testing: product_form.html's allergen checklist unpacked ALLERGENS values as 2-tuples, which broke (ValueError) once they became 3-tuples (uk_label, emoji, en_label) — admin's "add product" page 500'd until this was caught in browser testing.
5 KiB
5 KiB
Що потрібно узгодити із замовником (розділ 22 ТЗ)
Код повністю робочий на демо-даних, але для запуску в продакшн потрібні
реальні дані замовника. Все нижче редагується або через .env, або через
адмінку (/admin/settings), або через сідинг реального меню — коду
чіпати не треба.
| # | Пункт ТЗ | Де налаштовується | Статус |
|---|---|---|---|
| 1 | Вартість доставки: фіксована / по зонах / від суми | Адмінка → Налаштування: delivery_fee, free_delivery_threshold |
Реалізовано найпростіший варіант — фіксована сума + безкоштовно від порогу. Логіка по зонах (наприклад, за районом) потребує окремого узгодження формату адрес і не закладена. |
| 2 | Місто та зона доставки | Наразі бот приймає будь-яке місто текстом, без валідації/обмеження зони | Потребує рішення замовника |
| 3 | Адреса закладу для самовивозу | Адмінка → Налаштування → address |
Заповнити |
| 4 | Телефон Bober BBQ | Адмінка → Налаштування → phone |
Заповнити |
| 5 | Telegram-акаунт/група менеджера (fallback) | .env → OWNER_IDS |
Заповнити |
| 6 | Окремий чат для доставки | Адмінка → Налаштування → Chat ID — Доставка |
Заповнити (додати бота адміном у чат) |
| 7 | Окремий чат для самовивозу | Адмінка → Налаштування → Chat ID — Самовивіз |
Заповнити (додати бота адміном у чат) |
| 8 | Реквізити ФОП / дані monobank | .env → MONOBANK_TOKEN |
Без цього оплата карткою недоступна — бот коректно переключається на «оплата при отриманні» і просить менеджера зв'язатися з клієнтом, нічого не падає |
| 9 | Фінальний перелік категорій меню | Адмінка → Категорії або bober_bbq/seed.py |
Зараз — демо-категорії (Шашлик, BBQ, Піца, Бургери, Гарніри, Закуски, Соуси, Напої) |
| 10 | Повний перелік товарів, цін, описів, фото | Адмінка → Товари |
Зараз — по 1-2 демо-товари на категорію |
| 11 | Прийом замовлень поза графіком з виконанням у робочий час | Адмінка → Налаштування → allow_orders_outside_hours |
Реалізовано як перемикач: вимкнено за замовчуванням (бот відмовляє поза графіком і пропонує лише перегляд меню) |
| 12 | Додаткові поля до замовлення (напр. коментар клієнта) | — | Коментар до адреси доставки вже є (розділ 5, крок 2). Окремого поля "коментар до всього замовлення" немає — додати за потреби |
Додатково варто уточнити
- Часовий пояс: за замовчуванням
Europe/Kyiv(.env → TIMEZONE). - Формат номера телефону: наразі приймається як є (текст або контакт
Telegram), без валідації на
+380.... Додати regex-перевірку, якщо потрібно жорсткіше. - Мова: базово інтерфейс українською, як і вимагає ТЗ. Додано повноцінний
перемикач UA/EN у Mini App (з синхронізацією вибору назад у Telegram-бота
через
TelegramUser.locale), що охоплює весь бот і весь клієнтський Mini App — усі екрани, повідомлення бота, помилки при оформленні замовлення. Назви й описи страв перекладаються опційно, по одному товару (Product.name_en/description_en, заповнюється в адмінці) — товар без перекладу просто показує українську версію в англійському інтерфейсі. Адмінка залишається лише українською (внутрішній інструмент для персоналу). Деталі: див.docs/I18N.md.