User Service — X/Z отчёты смены

Контракт

Задачи

OrderServiceClient

  • Новый метод getShiftReport(storeId, employeeId, from, to) в OrderServiceClient
  • Конфигурация: ORDER_SERVICE_URL в application.yml (если ещё нет)
  • DTO: ShiftReportResponse (total_revenue, cash/card/qr_amount, orders count, top_items)

Endpoint

  • GET /api/v1/shift-records/{id}/report — новый public endpoint
    • Получить shift_record по id
    • Проверить ролевой доступ (franchise — все, franchisee — свои ТТ, manager — своя ТТ, cashier — 403)
    • Определить report_type: clock_out IS NULL → x_report, иначе → z_report
    • Определить период: from = clock_in, to = clock_out ?? now()
    • Вызвать OrderServiceClient.getShiftReport(store_id, employee_id, from, to)
    • Собрать ответ: shift data + financials + top_items

Ролевой доступ

  • Franchise — все смены
  • Franchisee — только смены сотрудников своих ТТ
  • Manager — только смены своей ТТ
  • Cashier — 403

Тесты

  • Unit-тест: X-отчёт (clock_out = null, period = clock_in..now)
  • Unit-тест: Z-отчёт (clock_out set, period = clock_in..clock_out)
  • Unit-тест: ролевой доступ (403 для чужой ТТ)
  • Integration-тест: endpoint + mock OrderServiceClient