# Qoldiqlar va narxlar

> Do'konlar bo'yicha qoldiqlarni qanday olish va vitrinada yo'q narsani ko'rsatmaslik.

BILLZ’da qoldiq va narx faqat **do’kon kesimida** mavjud.

## Qoldiqlar qayerdan olinadi

`GET /v2/products` metodi har bir mahsulotda ikkita massivni qaytaradi:

```json
{
  "shop_measurement_values": [
    { "shop_id": "...", "shop_name": "Nike Store", "active_measurement_value": 5 }
  ],
  "shop_prices": [
    {
      "shop_id": "...",
      "retail_price": 1000000,
      "retail_currency": "UZS",
      "supply_price": 600000,
      "promo_price": 500000,
      "promos": [
        { "id": "...", "name": "discount 50%", "discount_type": "PERCENTAGE", "discount_value": 50 }
      ]
    }
  ]
}
```

`active_measurement_value` — nuqtada sotish uchun mavjud bo’lgan qoldiq, kechiktirishlarni chegirgan holda; vitrina uchun shundan foydalaniladi.

Umumiy qoldiq quyidagicha taqsimlanadi:

| O’lchov    | Nimalar kiradi                                                       |
| ---------- | -------------------------------------------------------------------- |
| faol       | sotish uchun mavjud                                                  |
| **nofaol** | do’konlar orasida **yo’ldagi** mahsulotlar plyus **kechiktirishlar** |
| umumiy     | faol + nofaol                                                        |

> **Tugallanmagan yetkazib berish nofaol qoldiqqa kiritilmaydi**
>
> Uning miqdori — `import_started_measurement_value` metodining `/v2/product-search-with-filters` qismida.

`/v2/products` da taqsimot yo’q — faqat `active_measurement_value`. Batafsil o’lchovlar `/v2/product-search-with-filters` da ko’rinadi: `total_in_transfer_measurement_value`, `total_sold_measurement_value`, `total_written_off_measurement_value`, `total_imported_measurement_value`, `total_transfered_measurement_value`, `total_transfer_arrived_measurement_value`, `import_started_measurement_value`, shuningdek, `is_small_left` va `small_left_measurement_value`.

Qaytarilgan tovarlar mahsulot bo’yicha alohida raqam bilan yuklanmaydi.

`promo_price` **faqat `promos` to’ldirilganda** hisobga olinadi.

> **Aksiya narxi aksiyaning o’zidan kechikishi mumkin**
>
> Natijalarda `promo_price` va qoldiqlar kechikish bilan yangilanadi. Kritik narx buyurtmani rasmiylashtirishda qayta tekshiriladi.

Qanday hisoblanadi: `PERCENTAGE` → `retail_price − retail_price × discount_value / 100`; `FIXED PRICE` → `discount_value` qanday bo’lsa shunday. Agar ushbu do’konda mahsulot uchun bir nechta aksiya bo’lsa, eng past narx olinadi va `promos` ga faqat g’olib aksiya keladi. Qolgan turdagi aksiyalar (1+1, karusel, chek summasi bo’yicha, pozitsiyalar soni bo’yicha) `promo_price` ni shakllantirmaydi.

Agar kalit rolida tannarxni ko’rish ruxsati bo’lmasa, `supply_price` nol bo’lib, `supply_currency` esa bo’sh satr bo’lib keladi; sukut bo’yicha u olib tashlangan — [kalit rolining ruxsatlari](/uz/reference/role-permissions/)ga qarang.

> **Tannarxda nollar ruxsat mavjud bo’lganda ham uchraydi**
>
> Ruxsatni tekshirish 10 soniyalik taym-aut bilan amalga oshiriladi; xatolik yuz berganda maydonlar xuddi shunday nollashtiriladi.

## Vitrinaning standart strategiyalari

| Strategiya                                     | Qachon mos keladi                                  |
| ---------------------------------------------- | -------------------------------------------------- |
| Barcha do’konlar bo’yicha qoldiqlar yig’indisi | bitta jo’natish ombori, do’konlar — vitrinalar     |
| Bitta «onlayn do’kon» qoldig’i                 | onlayn-buyurtmalar uchun ajratilgan nuqta mavjud   |
| Nuqtalar bo’yicha maksimum + o’zi olib ketish  | xaridor rasmiylashtirish paytida do’konni tanlaydi |

Narx qoldiq hisoblanadigan nuqtadan olinadi.

## Yangilanish chastotasi

Har bir sotuvdagi qoldiq o’zgarishi [deltaga](/uz/guides/sync-catalog/#delta) `GET /v2/products` tushadi.

Umumiy limit — soniyasiga 2 ta so’rov; oshib ketganda — `429`.

Birlik pozitsiyalar qoldig’i buyurtmani rasmiylashtirish vaqtida qayta tekshiriladi.

## Zaxiralash

BILLZ’da zaxiralash — bu **kechiktirish**: `active_measurement_value` kechiktirilgan miqdorga kamayadi va u bekor qilinganda qaytariladi.

Bu qanday amalga oshiriladi:

1. sotuvni yaratish — `POST /v2/order` tanasi bilan `{shop_id, cashbox_id}`;
2. pozitsiyalarni qo’shish — **faqat** `POST /v2/order-product/:order_id` ([onlayn buyurtma](/uz/guides/ecommerce-order/)ga qarang);
3. chekni kechiktirish — `POST /v2/order/create_postpone`, tanasida `order_id` va `time`; `time` maydoni majburiy va qat’iy formatga ega.

Kechiktirilgan chekni ishga qaytarish — `POST /v2/order/return-postpone`, shundan so’ng chek oddiy sotuv kabi to’lanadi. Chek bosqichlari haqida batafsil — [sotuvning hayotiy siklida](/uz/concepts/sale-lifecycle/).