Обмены
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": "Обмен на другой размер с доплатой"
}