BR 2.1 — Order Service

Репозиторий

  • Создать репозиторий nearbyErp/erp-order-service
  • Инициализировать Spring Boot проект (Java 21, Gradle)
  • Dockerfile + docker-compose в erp-infrastructure
  • .claude/ — правила для Claude Code (init-service-repo)

Миграция

  • Создать таблицу orders (id, franchise_id, store_id, order_number, order_type, status, total, payment_method, paid_amount, rrn, card_last4, comment, cancel_reason, created_by, paid_at, completed_at, cancelled_at, timestamps)
  • CHECK constraint на order_type IN (‘takeaway’, ‘dine_in’, ‘delivery’)
  • CHECK constraint на status IN (‘new’, ‘in_progress’, ‘ready’, ‘closed’, ‘cancelled’)
  • Индекс idx_orders_franchise_store_status на (franchise_id, store_id, status)
  • Индекс idx_orders_store_created_at на (store_id, created_at)
  • Создать таблицу order_items (id, order_id FK CASCADE, product_id, product_name, quantity, unit_price, total_price, modifiers jsonb, notes, created_at)
  • Индекс idx_order_items_order_id на (order_id)

Entity / DTO

  • Создать Order entity
  • Создать OrderItem entity
  • Создать OrderResponse DTO (с items)
  • Создать OrderListItemResponse DTO (без items, для списка)
  • Создать OrderItemResponse DTO
  • Создать CreateOrderRequest DTO (store_id, order_type, comment?)
  • Создать UpdateOrderRequest DTO (comment?)
  • Создать CreateOrderItemRequest DTO (product_id, product_name, quantity, unit_price, modifiers?, notes?)
  • Создать PayOrderRequest DTO (method, amount, rrn?, card_last4?)
  • Создать CancelOrderRequest DTO (reason)

Repository

  • Создать OrderRepository (findByFranchiseId с фильтрами store_id, status, date_from, date_to, пагинация)
  • Метод для генерации order_number: подсчёт заказов per-store per-day + инкремент
  • Создать OrderItemRepository (findByOrderId)

Service

  • Создать OrderService:
    • createOrder — создать заказ в статусе new, сгенерировать order_number
    • getOrder — получить заказ с items, ролевая проверка store_id
    • listOrders — список с фильтрами, ролевая фильтрация по store_ids
    • updateOrder — обновить comment (только в new)
    • addItem — добавить позицию (только в new), пересчитать total
    • removeItem — удалить позицию (только в new), пересчитать total
    • payOrder — записать payment_method, paid_amount, rrn, card_last4, paid_at; статус ready
    • completeOrder — статус ready closed, записать completed_at
    • cancelOrder — статус cancelled (из new/in_progress/ready), записать cancel_reason, cancelled_at
  • Валидация статусных переходов (status machine)
  • Пересчёт total при добавлении/удалении позиций

Controller

  • Создать OrderController:
    • POST /api/v1/orders — createOrder
    • GET /api/v1/orders/{id} — getOrder
    • GET /api/v1/orders — listOrders (с фильтрами, пагинация)
    • PATCH /api/v1/orders/{id} — updateOrder
    • POST /api/v1/orders/{id}/items — addItem
    • DELETE /api/v1/orders/{id}/items/{itemId} — removeItem
    • POST /api/v1/orders/{id}/pay — payOrder
    • POST /api/v1/orders/{id}/complete — completeOrder
    • POST /api/v1/orders/{id}/cancel — cancelOrder

Security

  • Настроить JWT-фильтр (как в других сервисах)
  • Ролевая проверка store_id из JWT: franchise=все, franchisee=свои store_ids, manager/cashier=своя ТТ
  • Service token для inter-service вызовов (подготовка)

Конфигурация

  • application.yml — DB, JWT, порт 3005
  • application-dev.yml — локальная конфигурация
  • Kafka producer config (для событий order.created, order.paid, order.completed, order.cancelled)

Kafka Events

  • Публикация order.created при создании заказа
  • Публикация order.paid при фиксации оплаты
  • Публикация order.completed при завершении
  • Публикация order.cancelled при отмене

Ссылки