name: stage-enter
description: |
  Enter (Оприходование) на test.admin.food-market.kz: CRUD драфт,
  проведение → Stock + StockMovement, отмена проведения (Unpost),
  edge — negative qty/zero qty в строке, post пустого, multi-tenant
  изоляция (org B не видит документы org A), параллельный PUT
  («второй должен получить 409 Conflict»). Enter сам по себе не
  IVersionedEntity — два параллельных PUT успешны без конфликта;
  если нашей модели нужен concurrency-токен на Enter, это logic gap.

preconditions:
  reset_db: false
  smoke_login_super_admin: false

steps:
  - id: ent01_setup
    title: Создать org с admin + продукт (для строк) + storeId — все ref'ы для теста
  - id: ent02_create_draft
    title: POST /api/inventory/enters → Draft с 2 строками, номер сгенерирован "О-YYYY-NNNNNN"
  - id: ent03_update_draft
    title: PUT — поменять Notes, заменить строки, проверить пересчёт Total
  - id: ent04_post
    title: POST {id}/post → Status=Posted, Stock.Quantity += sum(line.Quantity), StockMovement[type=Enter]
  - id: ent05_post_idempotent_or_conflict
    title: Повторный POST/post проведённого → 409 «Документ уже проведён»
  - id: ent06_unpost
    title: POST {id}/unpost → Status=Draft, StockMovement[type=enter-reversal] с -Quantity
  - id: ent07_unpost_negative_guard
    title: Если после Post часть товара продана (Stock < Quantity) — Unpost = 409 с conflicts
  - id: ent08_validation_edge_cases
    title: Edge — пустые Lines → 400; POST пустого draft → 400 «без строк»
  - id: ent09_multi_tenant_isolation
    title: Org B не видит enter org A (list пустой; GET by id → 404; POST/post → 404)
  - id: ent10_concurrent_put_no_version
    title: "Два параллельных PUT (без RowVersion) — оба 204. Logic gap: Enter без IVersionedEntity, транзакция не защищает от lost-update."
