zov-tech/backend-py/app
wasrusgen 4612c3a4e4 fix: карточка клиента — данные, редактирование, удаление по правилам
Bug 1: «Завожу клиента и не вижу данных»
Причина: 3 эндпоинта проверяли user.get('role') == 'manager' напрямую,
вместо sheets.has_role(user, 'manager'). У админа теперь multi-role
(manager,measurer,assembler) → проверка падала с only_manager,
/api/measurements возвращало ошибку → таймлайн/файлы пустые.

Backend fixes:
- _handle_measurements_list: has_role + initDataUnsafe fallback + фильтр archived_at + возвращает client_name, client_phone, address, scheduled_at, client_no, contract_no, contract_date, assigned_to_tg_id
- _handle_measurement_request: has_role вместо ==
- _handle_measurement_detail: has_role + поддержка assigned_to_tg_id для мастера
- _handle_clients: возвращает address, contract_date, measurements_count, in_work
  in_work=True если: есть лиды ∨ есть не-draft замер ∨ есть сборка

Bug 2: «Не могу удалить клиента»
Причина: была спрятана в expand «Опасная зона» внизу страницы.

Новая логика прав (по запросу):
- Клиент не в работе → ✏️ Редактировать + 🗑 Удалить
- Клиент в работе → только ✏️ Редактировать
- Бэкенд тоже enforce: client_delete отвечает {error: 'in_work'}
  если есть лиды/сборки/не-draft замеры

Новые эндпоинты:
- POST /api/client_update — обновляет имя/телефон/адрес/договор
  во всех Measurements этого клиента. Возвращает обновлённый client_key
  если имя изменилось

Frontend:
- Секция «⚙️ Управление карточкой» вместо «Опасной зоны»
- Кнопка ✏️ Редактировать всегда видна, 🗑 Удалить только если !in_work
- renderEditClient — форма редактирования (имя, тел, адрес, договор № + дата)
- В шапке карточки теперь видны адрес и (если не в работе) бейдж «ещё не в работе»
- Draft-карточки скрыты из таймлайна (это техническая строка, не событие)

index.html: cache bump v=20260514d
2026-05-14 11:42:27 +03:00
..
parsers parsers: better image extraction — real product photos in report cards 2026-05-11 23:43:25 +03:00
__init__.py feat(infra): Python FastAPI backend + Docker compose for VPS deploy (GigaChat with Russian root CA) 2026-05-10 17:44:21 +03:00
ai.py remove duplicate vent question + AI must propose charcoal filter on recirc hood 2026-05-12 17:22:59 +03:00
auth.py cleanup: drop debug prints — auth fallback verified working 2026-05-12 21:56:53 +03:00
catalog.py catalog: filter junk + background refresh + clear endpoint 2026-05-12 07:09:33 +03:00
config.py backend: proxy_pool supports PROXY_LIST_FILE + format auto-conversion 2026-05-11 15:52:02 +03:00
gcalendar.py A+B: голос в мастере замера + Google Calendar события 2026-05-13 23:49:20 +03:00
geocoder.py geocoder: порт из проекта СЕКРЕТАРЬ + кнопка «По адресу» 2026-05-13 17:55:34 +03:00
main.py fix: карточка клиента — данные, редактирование, удаление по правилам 2026-05-14 11:42:27 +03:00
proxy_pool.py backend: proxy_pool supports PROXY_LIST_FILE + format auto-conversion 2026-05-11 15:52:02 +03:00
sheets.py Phase 4 stage 1: Сборки — модель + создание + список 2026-05-14 09:53:40 +03:00
telegram.py feat(infra): Python FastAPI backend + Docker compose for VPS deploy (GigaChat with Russian root CA) 2026-05-10 17:44:21 +03:00