Обмены

Exchange vertical теперь коммитит единый документ с return component + replacement sale component, считает delta settlement, двигает inventory в обе стороны, пишет cash ledger только на delta и сохраняет referential linkage к source sale.

Guardrails

  • exchange must reference source sale
  • return part and replacement part validate independently
  • delta settlement must equal replacement minus return
  • negative stock on replacement requires privileged override

What is next

  • scan/search UX
  • zero-delta exchange fast path
  • exchange analytics and anomaly reporting
  • owner policy matrix UI for manager exchange rights

API example

POST /v1/exchanges
Headers:
  x-telegram-id: 100000002
  x-location-id: <location-id>
Body:
{
  "sourceSaleId": "<sale-id>",
  "locationId": "<location-id>",
  "shiftId": "<active-shift-id>",
  "idempotencyKey": "exchange-20260324-0001",
  "linesToReturn": [
    { "saleLineId": "<sale-line-id>", "quantity": 1 }
  ],
  "replacementLines": [
    { "skuId": "sku_demo_tshirt_m_black", "quantity": 1, "unitPriceMinor": 199900, "discountPercent": 0 }
  ],
  "settlement": { "method": "cash", "amountMinor": 25000 },
  "note": "Обмен на другой размер с доплатой"
}