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 возвращает falseINVALID_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
Фронт CreatePagepin_code❌ Должно быть pin
Фронт EditPagepin_code❌ Должно быть pin

Admin Franchise (erp-admin)

  • shared/src/types/employee.ts: переименовано pin_codepin в EmployeeCreateRequest и EmployeeUpdateRequest
  • web/src/pages/employees/CreatePage.tsx: переименовано pin_codepin во всех местах
  • web/src/pages/employees/EditPage.tsx: переименовано pin_codepin во всех местах

Тестирование

  • Создать кассира с store_id — ожидается 201
  • Создать менеджера с store_id — ожидается 201
  • Создать кассира с PIN — проверить что PIN сохраняется (видно в ViewPage: has_pin = true)
  • Создать с дублирующим email — ожидается 409
  • Создать с дублирующим PIN на той же ТТ — ожидается 409
  • Создать с несуществующим store_id — ожидается 422

Спеки

Контракты корректны (pin в API.md). Баг только в коде фронтенда.