BR 3.1 — POS (BFF + UI)

Репо erp-pos — в bootstrap-стадии. POS-экраны пока не специфицированы кроме flow прикрепления клиента к заказу (BR 3.1). Задачи ниже — только та часть, что нужна для BR 3.1.

Контракты


POS BFF задачи

1. Proxy routes

  • /api/v1/pos/customers/search?phone=... — прокси в GET /api/v1/customers/search Customer Service
  • /api/v1/pos/customers (POST) — прокси в POST /api/v1/customers
    • Устанавливать registration_source='pos' и registered_by_employee_id из JWT кассира
  • /api/v1/pos/orders/{id}/customer (PATCH) — прокси в PATCH /api/v1/orders/{id}/customer Order Service
  • /api/v1/pos/orders/{id}/customer (DELETE) — прокси в DELETE /api/v1/orders/{id}/customer

2. Авторизация

  • Проверка permission customers.create_quick в JWT перед проксированием — если нет, BFF возвращает 403 без обращения к backend

3. Тесты

  • Моки backend-сервисов, проверка прокси + установка registration_source

POS UI задачи

В зависимости от готовности POS-фронта — можно реализовать параллельно или отложить после других POS-экранов.

1. Экран заказа — шапка с клиентом

  • На шапке текущего заказа — компонент OrderCustomerBadge:
    • Если order.customer_id == null и permission customers.create_quick → кнопка «Клиент» (открывает модалку)
    • Если order.customer_id != null → имя клиента + chips групп + бейдж «🎂» если ДР в ±14 дней + крестик «×» для открепления
    • Если нет permission customers.create_quick → компонент не рендерится

2. Модалка «Найти клиента»

  • Компонент CustomerSearchModal со состояниями: default / searching / found / not_found / creating
  • Поле ввода телефона с маской +7 (___) ___-__-__
  • Утилита normalizePhoneE164 (та же что в Admin Web — общий shared модуль, если есть)
  • По заполнении 10 цифр — автоматический вызов GET /pos/customers/search?phone=...
  • Рендер результата:
    • found → карточка-мини (имя, phone, chips групп, LTV, бейджи, кнопка «Прикрепить»)
    • not_found → форма quick-create (имя обязательное, email/ДР опциональные, кнопка «Создать и прикрепить»)
  • После успеха — toast + модалка закрывается + шапка заказа перерисовывается

3. Открепление

  • Клик по «×» на шапке → DELETE /pos/orders/{id}/customer → toast «Клиент откреплён» (без модалки подтверждения)

4. Compliance-нотификация

  • После успешного quick-create — toast на 3 сек: «Клиент создан. Убедитесь, что собрано согласие на обработку ПД»

5. Тесты

  • Unit: валидация phone, состояния модалки
  • Integration (когда появится e2e-инфра POS): mock server + прогон flow

Definition of Done

  • Кассир с customers.create_quick видит кнопку «Клиент» на экране заказа
  • Можно найти существующего клиента и прикрепить к заказу
  • Можно создать нового клиента через quick-form и прикрепить
  • Клиент виден в шапке заказа, можно открепить
  • Без permission кнопка скрыта