name: stock-concurrency
description: |
  Конкурентные операции со складом на стороне ПРИЁМОК (Supply.Post).
  RetailSale.Post уже под Serializable (см. stock-invariant-deep step09),
  а Supply.Post исторически шёл на дефолтной изоляции — отсюда потеря
  обновлений Stock и гонка в расчёте скользящего среднего Cost при
  одновременном проведении. Проверяем главный инвариант
  Stock.Quantity == Σ StockMovement.Quantity под нагрузкой:
    - две РАЗНЫЕ приёмки одного товара проводятся одновременно,
    - одна и та же приёмка проводится дважды одновременно (double-post).

preconditions:
  reset_db: true
  smoke_login_super_admin: true

steps:
  - id: step01_bootstrap
    title: "Орг + товар + стартовая приёмка qty=5 @100 (Stock=5, Cost=100)"
  - id: step02_concurrent_distinct_supplies
    title: "Две разные приёмки (10@100 и 10@120) одновременно → Stock=25, инвариант, Cost=108"
  - id: step03_double_post_same_supply
    title: "Двойное проведение ОДНОЙ приёмки (7@100) одновременно → применяется один раз"
  - id: step04_final_invariant
    title: "Финальный инвариант Stock == Σ StockMovement"
