BUG-016: Декомпозиция
Диагностика (выполнена)
- Воспроизвести через API — воспроизведено, текущая версия возвращает 422
INVALID_STORE_IDS - Проверить создание без store_ids (franchisee) — работает (201)
- Проверить создание с любым store_id (cashier/manager) — всегда 422
INVALID_STORE_IDS - Определить корневую причину —
StoreServiceClient.validateStoreIds()всегда false - Найти баг с PIN — фронт отправляет
pin_code, бэкенд ожидаетpin
Баг 1: validateStoreIds всегда false (P0)
Причина
StoreServiceClient.validateStoreIds() вызывает POST /internal/stores/validate на Store Service. Если endpoint не реализован или возвращает неожиданный формат — catch возвращает false → INVALID_STORE_IDS (422).
Store Service (erp-store-service)
- Проверить: существует ли endpoint
POST /internal/stores/validate - Если нет — реализовать: принимает
{ store_ids: UUID[], franchise_id: UUID }, возвращает{ data: { valid: true/false } } - Если есть — проверить формат ответа:
StoreServiceClientожидаетresponse.data.valid = true
Применённый фикс
- В
StoreServiceClient.validateStoreIds()заменилPOST /internal/stores/validateна проверку черезGET /internal/stores/{id}для каждого store_id + проверкуfranchise_id(endpoint уже работает)
Баг 2: pin_code → pin маппинг (P1)
Причина
По API-контракту поле называется pin. Фронтенд и shared types используют pin_code.
| Слой | Поле | Правильно? |
|---|---|---|
| API контракт | pin | ✅ Источник правды |
Бэкенд DTO (CreateEmployeeRequest.java) | pin | ✅ |
Shared types (employee.ts) | pin_code | ❌ Должно быть pin |
| Фронт CreatePage | pin_code | ❌ Должно быть pin |
| Фронт EditPage | pin_code | ❌ Должно быть pin |
Admin Franchise (erp-admin)
-
shared/src/types/employee.ts: переименованоpin_code→pinвEmployeeCreateRequestиEmployeeUpdateRequest -
web/src/pages/employees/CreatePage.tsx: переименованоpin_code→pinво всех местах -
web/src/pages/employees/EditPage.tsx: переименованоpin_code→pinво всех местах
Тестирование
- Создать кассира с store_id — ожидается 201
- Создать менеджера с store_id — ожидается 201
- Создать кассира с PIN — проверить что PIN сохраняется (видно в ViewPage: has_pin = true)
- Создать с дублирующим email — ожидается 409
- Создать с дублирующим PIN на той же ТТ — ожидается 409
- Создать с несуществующим store_id — ожидается 422
Спеки
Контракты корректны (pin в API.md). Баг только в коде фронтенда.