Commit Graph

11 Commits

Author SHA1 Message Date
wasrusgen
b352c4927f universal entry: bot menu button + role chooser в MiniApp
Перешли на единый универсальный паттерн вместо reply/inline-keyboard:

1. Bot menu-button — постоянная кнопка «ЗОВ» слева от input в чате
   (set_chat_menu_button с WebAppInfo). Видна на ВСЕХ платформах:
   Telegram Desktop, iOS, Android, Web. Один тап — открывает MiniApp.

2. MiniApp без ?role= в URL показывает role chooser как первый экран:
   три большие карточки [Я менеджер] [Я клиент] [Я сотрудник].
   Тап → URL получает ?role=X → re-run init() → загрузка кабинета
   с правильно подписанным initData.

Решение универсальное — не зависит от reply/inline-кнопок и их
поведения с initData на разных клиентах Telegram.

Cache bust v=20260513n.
2026-05-13 07:36:55 +03:00
wasrusgen
d6fbc3df13 bot: убрать reply-keyboard, оставить только inline buttons
Reply-keyboard web_app кнопки на мобиле тоже не передают initData
(или с issues). Оставляем только inline-кнопки в самом сообщении —
они работают на Telegram Desktop side-panel + на мобильных.

/start теперь шлёт ОДНО сообщение с inline-keyboard внутри.
/menu — пере-открыть выбор роли.
/hide — убрать reply-keyboard (если осталась от предыдущих версий).
2026-05-13 07:34:25 +03:00
wasrusgen
8bf18c00b0 bot: add inline keyboard for role choice (Telegram Desktop fix)
Telegram Desktop side-panel does NOT forward initData when WebApp is
opened via ReplyKeyboardButton.web_app. Resulting in empty initData
and falling back to client cabinet for everyone.

Inline-keyboard buttons (web_app inside the message) open the MiniApp
in modal mode where initData is correctly forwarded.

/start now sends two messages:
1. Welcome + reply-keyboard at bottom (works on mobile)
2. Inline-keyboard with role buttons (works on Desktop too)
2026-05-12 21:49:18 +03:00
wasrusgen
d859e9791c roles: multi-role foundation (manager / client / measurer / assembler)
Users.role теперь хранит CSV-список ролей: 'manager,measurer'.
Парсим, добавляем, отзываем — все через sheets.parse_roles / grant_role /
revoke_role / list_users_with_role. Старые однострочные значения работают
как раньше (legacy compat).

Backend:
- /api/me возвращает roles[] (массив), role (главная для legacy-UI),
  plus capabilities {measurer, assembler} для staff
- /api/grant_role (admin-only) — добавить/отозвать роль
- /api/staff_list (manager-only) — список сотрудников по роли
  (будет использоваться в dropdown «выбрать замерщика»)
- При role=staff отдаём отдельный кабинет; если у юзера нет measurer/
  assembler — возвращаем error=no_staff_role

Bot:
- /start — 3-я reply-кнопка [🔧 Я сотрудник]. При тапе MiniApp получает
  ?role=staff и решает кабинет по capabilities.
- /whoami — сотрудник присылает свой Telegram ID, пересылает куратору
  чтобы тот выдал роль через /api/grant_role.

MiniApp:
- renderStaff() — заглушка кабинета сотрудника с шапкой (имя, аватар,
  список ролей) и пустым inbox («Пока пусто»). Если есть measurer —
  быстрая кнопка «Сделать новый замер».
- При error=no_staff_role — экран с инструкцией как получить роль.
- CSS .staff-head / .staff-no-role.

Cache bust v=20260513f.
2026-05-12 19:14:39 +03:00
wasrusgen
1ca8b3a5a1 bot: role buttons → MiniApp directly + branded splash loader
Bot: упрощён до одного шага — /start показывает 2 reply-кнопки
[👤 Я менеджер] [🏠 Я клиент], обе уже WebApp — открывают кабинет
сразу с нужным role= в query. Никаких промежуточных меню.

MiniApp: новый брендированный загрузочный экран с логотипом ZOV
(inline SVG, fill = walnut #6B4A2B), дыхательной анимацией 2.2s,
тонкой полоской прогресса и подписью «Открываем кабинет · ZOV».
Splash прячется (350мс минимум + fade-out) после рендера главного
экрана или маунта подэкрана (Podbor/Clients/Measurements).

Cache bust v=20260513c.
2026-05-12 18:54:09 +03:00
wasrusgen
8f6b5e56bb bot: 3-уровневое меню — роль → action → MiniApp
/start теперь показывает только две reply-кнопки внизу:
  [👤 Я менеджер] [🏠 Я клиент]

Тап «Я менеджер» → меню менеджера (4 ряда):
  🤖 Подбор техники | 📐 Новый замер   ← WebApp
  👥 Мои клиенты   | 🏠 Кабинет        ← WebApp
  ℹ️ Что умеет бот?| 📞 Куратор         ← текст
  📋 Чек-лист встречи | ⬅️ Сменить роль ← текст

Тап «Я клиент» → меню клиента (3 ряда):
  🏠 Мой кабинет  | 📐 Мой замер    ← WebApp
  📞 Связь с менеджером | ℹ️ О сервисе ← текст
  ⬅️ Сменить роль

«⬅️ Сменить роль» в любом меню → возврат к выбору роли.

Заменён inline-keyboard на reply-keyboard (постоянная панель снизу).
2026-05-12 18:46:30 +03:00
wasrusgen
b2438507c3 bot: persistent reply keyboard with WebApp buttons + info actions
Now after /start, manager sees a bottom keyboard (4 rows) for fast access:
  Row 1: 🤖 Подбор техники | 📐 Новый замер   ← WebApp
  Row 2: 👥 Мои клиенты    | 🏠 Кабинет       ← WebApp
  Row 3: ℹ️ Что умеет бот? | 📞 Куратор       ← text
  Row 4: 📋 Чек-лист встречи                  ← text

WebApp buttons jump straight to a MiniApp screen via ?go=<podbor|measure|clients>;
app.js parses ?go on load and pre-sets location.hash so the right module mounts.

Added /menu (re-show keyboard) and /hide (remove). Text buttons trigger
in-chat info responses (bot description, contact, meeting checklist).

Cache bust v=20260513b.
2026-05-12 18:37:24 +03:00
wasrusgen
0e5895bdc4 feat(infra): Python FastAPI backend + Docker compose for VPS deploy (GigaChat with Russian root CA) 2026-05-10 17:44:21 +03:00
wasrusgen
af7dc07720 feat: one-tap role buttons (WebApp directly, no intermediate step) + role param in URL/backend 2026-05-09 13:05:20 +03:00
wasrusgen
747e90de41 feat(bot): personalized greeting; relax env requirements for MVP 2026-05-09 01:03:03 +03:00
wasrusgen
0c5ed48303 chore: initial scaffold (bot, miniapp, backend, docs) 2026-05-08 23:56:48 +03:00