name: stage-pos
description: |
  POS Sync API на test.admin.food-market.kz.
  GET /api/pos/v1/sync с storeId возвращает товары/цены/остатки/контрагентов.
  POST /api/pos/v1/sales с idempotency-key создаёт RetailSale; повтор того же
  ключа возвращает кешированный response с replayedFromCache=true (не
  дублирует продажу). Тест per-sale ClientSaleId-идемпотентности тоже.

preconditions:
  reset_db: false
  smoke_login_super_admin: false

steps:
  - id: pos01_setup
    title: org + продукт + Enter 100, валидный JWT с org_id для POS-запросов
  - id: pos02_sync_full
    title: GET /api/pos/v1/sync?storeId=… → 200, products содержит наш товар, stocks.qty=100
  - id: pos03_sync_incremental
    title: GET /sync?since=ServerTime → 200, products пустой (с последнего вызова не было изменений)
  - id: pos04_sales_create
    title: POST /api/pos/v1/sales {idempotencyKey, sales[1]} → 200, accepted=1, RetailSale создан
  - id: pos05_sales_replay_same_key
    title: Повтор того же ключа — replayedFromCache=true, RetailSale НЕ дублируется
  - id: pos06_sales_new_key_same_client_sale_id
    title: Новый idempotencyKey + тот же ClientSaleId → accepted с тем же ServerSaleId (per-sale дедуп)
  - id: pos07_sales_insufficient_stock
    title: Продажа с qty > stock → failed запись c error «Недостаточно остатка»
