zov-tech/docs/SELF_CHECK_RULE.md
wasrusgen 34b83899b5 fix client create — 7 багов + правило самопроверки
#7 — submit-flow:
  - При успехе скрываем CTA с «Сохраняем...» (style.display=none)
  - Обработчики «Ещё клиент» / «Открыть карточку» прикрепляются к
    result-блоку (был form.querySelector — там их нет)
  - Backend возвращает client_key = name.lower() — совместимо
    с тем как ищет _handle_clients
  - clientsCache = null после успеха

#3 — голос дублировался:
  - Переписан алгоритм: финальные транскрипты пересчитываются с нуля
    из ev.results[0..N] каждое событие (не аккумулируем дельтами).
  - confirmedFinal фиксируется в baseText только на onend.
  - Применено в measurements.js + clients.js

#2 — телефон:
  - Frontend normalizePhone: убирает не-цифры, +7/8 → +7, добавляет +7
    к 10-значным; auto-нормализация на blur
  - Backend _normalize_phone(): тот же алгоритм
  - Валидация: ровно 11 цифр начиная с 7
  - Field-error «Введите корректный российский номер...»

#1 — адрес:
  - Min 5 chars (улица + дом)
  - Backend проверка длины
  - Hint «Укажите город, улицу, дом, кв.»

#5 — номер клиента:
  - Новая колонка client_no
  - _next_client_no() — максимум для текущего менеджера + 1
  - Шильд #N рядом с именем в карточке клиента

#6 — номер договора:
  - Новые колонки contract_no, contract_date
  - Поля в форме «Новый клиент» (опционально)
  - Шильд «📋 договор N» в карточке клиента

#4 — удаление клиента:
  - Soft-delete через колонку archived_at
  - Endpoint /api/client_delete
  - «⚠️ Опасная зона» в карточке клиента (collapsible)
  - Confirm dialog через Telegram.WebApp.showConfirm
  - Архивированные клиенты не показываются в /api/clients

#8 — правило самопроверки:
  - docs/SELF_CHECK_RULE.md — 10 пунктов чек-листа перед «готово»
    (end-to-end, ключи, UI-состояния, валидация, голос, deploy, логи)

Cache bust v=20260514a.
2026-05-14 00:09:14 +03:00

77 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Правило самопроверки перед выдачей на тест
**Действует на каждый коммит/PR в `master`.**
## Чек-лист перед «готово, тестируй»
### 1. Поток end-to-end на бумаге
Каждое новое действие пользователя пройти мысленно от UI до Sheets:
- ✅ Пользователь нажимает «Сохранить»
- ✅ Frontend отправляет POST → правильный endpoint + правильный body
- ✅ Backend валидирует → пишет в Sheets с правильным набором колонок
- ✅ Backend возвращает ответ → frontend меняет UI (НЕ зависает «Сохраняем...»)
- ✅ Следующее действие (например «Открыть карточку») находит ровно эту запись
### 2. Ключи и идентификаторы
При создании сущности проверить что **возвращаемый ID/key совпадает с тем по которому потом ищется**:
- Если backend возвращает `client_key`, а frontend ищет по `name.lower()` — БАГ
- Если создаём `Measurement` с `manager_tg_id=A`, а `/api/measurements` фильтрует по `requested_by_tg_id` — БАГ
### 3. Состояния UI
После любого POST:
- Кнопка «Сохраняем...» должна СБРОСИТЬСЯ (или замениться, или скрыться)
- Не должно быть «зависших» загрузчиков
- Сообщение об ошибке/успехе должно быть видно
- Обработчики новых кнопок должны привязываться к НУЖНОМУ контейнеру (`result.querySelector` ≠ `form.querySelector`)
### 4. Валидация ввода
Для каждого поля формы спросить:
- Минимальная длина / формат?
- Нормализация (телефон в +7XXXXXXXXXX, имя trim'ить)?
- Дубликаты (тот же телефон уже есть)?
- XSS-эскейпинг при отображении?
### 5. Удаление и редактирование
Для каждой создаваемой сущности заложить:
- Возможность удалить (с подтверждением)
- Возможность отредактировать
- Soft-delete (флаг `archived`) предпочтительнее hard-delete
### 6. Нумерация
Для бизнес-сущностей (клиент, замер, договор) — **последовательный человекочитаемый номер** в дополнение к UUID. Иначе пользователь не сможет ссылаться на «клиента №123».
### 7. Голосовой ввод
При работе с SpeechRecognition:
- Финальные транскрипты не должны дублироваться
- Промежуточные не должны накапливаться
- При повторных запусках записи — продолжение, не сброс
### 8. Деплой и кэш
- Bump `v=...` в `index.html` для каждого изменения статики
- Дождаться раскатки GH Pages (~30 сек) перед уведомлением о готовности
- Backend redeploy: `docker compose build && up -d` ИЛИ `docker cp` + `restart` если Docker Hub rate-limit
### 9. Логи и наблюдение
После деплоя — заглянуть в `docker logs zov-backend --tail 20`:
- Нет ли `[WARN]` про новые endpoints
- При первом тестовом запросе — увидеть его в логах
### 10. Документация
Если коммит вводит **новый workflow** — описать его краткое:
- В коммит-сообщении
- В README или CHANGELOG если есть
---
**Применять до каждого «готово, тестируй» сообщения пользователю.**