C&C

Ветка delivery_type CLICK_AND_COLLECT - самовывоз с точки продавца.

Сценарий C&C-1: самовывоз с точки продавца — happy path

Click & Collect — delivery_type: "CLICK_AND_COLLECT": покупатель забирает заказ на точке продавца, а не в ПВЗ сети и не курьером. В OpenAPI тип локации CLICK_AND_COLLECT одновременно является складом и пунктом вывоза — отдельный WAREHOUSE для той же точки не создают.

DBS Seller API — это API витрины. Мерчант вызывает эти методы у витрины.

Заказ ORD-DBS-2026-303 приходит в NEW на локацию cnc-msk-tverskaya-01. Допустимы два пути:

  1. NEW → CONFIRMED → PACKED → DELIVERING → READY_FOR_PICKUP → DELIVERED или CANCELLED (не забрал или отказался).
  2. NEW → CONFIRMED → PACKED → READY_FOR_PICKUP → DELIVERED или CANCELLED (не забрал или отказался). Второй путь — тот же, но шаг DELIVERING пропускают.

Покупатель забирает заказ в магазине → DELIVERED. Код вручения (handover-code/set) — опционально: по договорённости витрины и мерчанта мерчант может передать код покупателю или витрине.

Диаграмма последовательности

Пошаговое описание

  1. Опрос обновлений. На MVP — POST /v1/order/dbs/list (filter, limit; опционально cursor). В будущем опрос изменений статусов — POST /v1/order/dbs/status/list (filter, limit; в filter — status, опционально updated_at; ответ — массив order_updates).
  2. Карточка заказа. POST /v1/order/dbs/list — в delivery только обязательное delivery_type: "CLICK_AND_COLLECT". Точка выдачи в заказе — location_id (локация типа CLICK_AND_COLLECT). Поле delivery.provider_location_id в схеме есть, но as-is привязывает его к PICKUP_POINT. Для C&C точку идентифицируют через location_id, не через provider_location_id. address_tail в delivery для C&C не обязателен (в отличие от COURIER и EXPRESS).
  3. Подтверждение. POST /v1/order/dbs/status/update → CONFIRMED, changed_by: "MERCHANT", changed_at (RFC3339).
  4. Экземпляр товара (опционально). POST /v1/order/dbs/exemplar/set — если есть необходимость (например requirements.requires_imei: true), до PACKED.
  5. Упаковка. POST /v1/order/dbs/status/update → PACKED. Заказ собран в магазине и готов к выкладке на выдачу.
  6. В пути на точку. POST /v1/order/dbs/status/update → DELIVERING. Товар передан к выдаче на точке C&C. Шаг можно пропустить и из PACKED сразу поставить READY_FOR_PICKUP.
  7. Код вручения опционально. POST /v1/order/dbs/handover-code/set — после PACKED. Мерчант передаёт код витрине. По договорённости витрины и мерчанта код показывают покупателю. Касса точки этот код из витрины не получает: сверка на точке. Если код записан, показать его кассе C&C.
  8. Готов к выдаче. POST /v1/order/dbs/status/update → READY_FOR_PICKUP. Статус ставят из DELIVERING или сразу из PACKED.
  9. Выдан. POST /v1/order/dbs/status/update → DELIVERED — покупатель забрал заказ.

Полигон доставки для точки C&C не создавать: витрина берёт локации в статусе ACTIVE, у которых в location_types есть CLICK_AND_COLLECT. Остатки грузят на эту же локацию (stock/update с location_id).

Возврат: тип обратной доставки CLICK_AND_COLLECT в схеме не используется (return.delivery).

Порядок работы в магазине

  1. Точка C&C создана (location_types содержит CLICK_AND_COLLECT), остатки прогружены на этот location_id.
  2. Заказ NEW — list (MVP); в будущем status/list.
  3. status/update → CONFIRMED.
  4. Опционально exemplar/set, если есть необходимость.
  5. Сборка в магазине cnc-msk-tverskaya-01.
  6. status/update → PACKED.
  7. status/update → DELIVERING, либо сразу READY_FOR_PICKUP, без DELIVERING.
  8. Опционально handover-code/set: мерчант передаёт код витрине. По договорённости витрины и мерчанта код показывают покупателю. Касса этот код из витрины не получает.
  9. Передача на точку выдачи.
  10. status/update → READY_FOR_PICKUP.
  11. Выдача покупателю, сверка кода на точке.
  12. status/update → DELIVERED.

exemplar/set — опционально, если есть необходимость, до PACKED. handover-code/set — опционально, после PACKED.

JSON-примеры

В примерах запроса — все поля из required соответствующей схемы. Поля вне required в тексте помечены как опциональные.

Шаг 0 — POST /v1/location/create (точка C&C)

У LocationCreateItem обязательны location_types, name, latitude, longitude, limits (length, width, height, weight), working_schedule (day, schedule.time_start, schedule.time_end), is_accepts_returns. Опционально: merchant_location_id, address_tail, payment_methods, storage_period_days, instruction.

{
  "locations": [
    {
      "merchant_location_id": "cnc-msk-tverskaya-01",
      "location_types": [
        "CLICK_AND_COLLECT"
      ],
      "name": "Самовывоз DBS Тверская",
      "address_tail": "125009, г. Москва, ул. Тверская, д. 1",
      "latitude": 55.757,
      "longitude": 37.615,
      "is_accepts_returns": false,
      "limits": {
        "length": 80,
        "width": 60,
        "height": 60,
        "weight": 20
      },
      "working_schedule": [
        {
          "day": "MONDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "21:00"
          }
        },
        {
          "day": "TUESDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "21:00"
          }
        },
        {
          "day": "WEDNESDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "21:00"
          }
        },
        {
          "day": "THURSDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "21:00"
          }
        },
        {
          "day": "FRIDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "21:00"
          }
        },
        {
          "day": "SATURDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "20:00"
          }
        },
        {
          "day": "SUNDAY",
          "schedule": {
            "time_start": "10:00",
            "time_end": "20:00"
          }
        }
      ],
      "payment_methods": [
        "ALREADY_PAID",
        "CARD"
      ],
      "storage_period_days": 7,
      "instruction": "Вход со стороны Тверской, стойка «Самовывоз» справа от касс."
    }
  ]
}

Ответ create: у элемента обязательны name и status. location_id в required нет (пустая строка, если позиция не создана).

{
  "locations": [
    {
      "location_id": "cnc-msk-tverskaya-01",
      "merchant_location_id": "cnc-msk-tverskaya-01",
      "name": "Самовывоз DBS Тверская",
      "status": "DRAFT"
    }
  ]
}

Статус локации дальше — POST /v1/location/list (filter, limit). К выдаче на витрине локация должна стать ACTIVE (модерация витрины). Какие переходы статусов витрина разрешает — уточните у неё до реализации на своей стороне.

Сейчас все витрины работают по предоплате. payment_methods на локации — какие способы точка умеет принять, а не признак оплаты заказа. В карточке заказа такого признака нет: касса деньги не берёт.

Остатки на эту точку — POST /v1/product/stock/update. У элемента обязательны location_id и count. offer_id или product_id — хотя бы одно (если оба, приоритет у product_id).

{
  "items": [
    {
      "offer_id": "HEADPHONES-001",
      "product_id": "PRD-HEADPHONES-01",
      "location_id": "cnc-msk-tverskaya-01",
      "count": 20
    }
  ]
}

Цены — общие, см. Подготовка (price/update: currency, items; у элемента price).

Шаг 1 — POST /v1/order/dbs/list (MVP: опрос)

У OrderListRequest обязательны filter и limit. cursor опционален.

{
  "cursor": "",
  "limit": 100,
  "filter": {
    "status": [
      "NEW"
    ]
  }
}

Ответ. У OrderListItem обязательны merchant_order_id, client_order_id, location_id, status, customer, delivery, product_name, prices, delivery_date, created_at. У delivery обязателен только delivery_type. У элемента prices обязательны price_type и value. item_type, product_id, offer_id, requirements, actions — опционально.

{
  "orders": [
    {
      "merchant_order_id": "ORD-DBS-2026-303",
      "client_order_id": "CLT-80003",
      "location_id": "cnc-msk-tverskaya-01",
      "status": "NEW",
      "customer": {
        "name": "Анна Соколова",
        "phone": "+79005551212"
      },
      "delivery": {
        "delivery_type": "CLICK_AND_COLLECT"
      },
      "item_type": "PRODUCT",
      "product_id": "PRD-HEADPHONES-01",
      "offer_id": "HEADPHONES-001",
      "product_name": "Наушники",
      "prices": [
        {
          "price_type": "CUSTOMER_FINAL_PRICE",
          "value": 1299000
        }
      ],
      "requirements": {
        "requires_imei": false,
        "requires_mandatory_mark": false
      },
      "actions": [
        {
          "type": "cancel",
          "enabled": true
        }
      ],
      "delivery_date": {
        "delivery_date_begin": "2026-06-15T10:00:00+03:00",
        "delivery_date_end": "2026-06-15T21:00:00+03:00"
      },
      "created_at": "2026-06-14T12:10:00+03:00"
    }
  ],
  "next_cursor": "",
  "total": 1
}

Опрос заказов на полке выдачи — тот же метод, в filter.status значение READY_FOR_PICKUP (плюс обязательный limit).

В будущем — POST /v1/order/dbs/status/list. У OrderUpdatesListRequest обязательны filter и limit.

{
  "cursor": "",
  "limit": 100,
  "filter": {
    "status": [
      "NEW"
    ],
    "updated_at": "2026-06-14T00:00:00+03:00"
  }
}

Ответ: у OrderUpdatesListResponse обязателен order_updates. У элемента обязательны merchant_order_id, client_order_id, status, changed_at, changed_by.

{
  "order_updates": [
    {
      "merchant_order_id": "ORD-DBS-2026-303",
      "client_order_id": "CLT-80003",
      "status": "NEW",
      "changed_at": "2026-06-14T12:10:00+03:00",
      "changed_by": "MARKET"
    }
  ]
}

Шаг 3 — POST /v1/order/dbs/status/update (CONFIRMED)

У OrderStatusUpdateRequest обязательны merchant_order_id, status, changed_at, changed_by.

{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "CONFIRMED",
  "changed_at": "2026-06-14T12:25:00+03:00",
  "changed_by": "MERCHANT"
}

Ответ (успех): обязателен merchant_order_id; status только при успехе.

{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "CONFIRMED"
}

Шаг 6 (опционально) — POST /v1/order/dbs/handover-code/set

{
  "handoverCodes": [
    {
      "merchant_order_id": "ORD-DBS-2026-303",
      "code": "619204"
    }
  ]
}

После записи код читается опциональным полем handover_code у элемента orders в list.

Шаги 5, 6, 8–9 — смена статусов (PACKED → DELIVERING → READY_FOR_PICKUP → DELIVERED)

{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "PACKED",
  "changed_at": "2026-06-15T09:40:00+03:00",
  "changed_by": "MERCHANT"
}
{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "DELIVERING",
  "changed_at": "2026-06-15T09:45:00+03:00",
  "changed_by": "MERCHANT"
}
{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "READY_FOR_PICKUP",
  "changed_at": "2026-06-15T09:50:00+03:00",
  "changed_by": "MERCHANT"
}

Ответ (успех):

{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "READY_FOR_PICKUP"
}
{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "DELIVERED",
  "changed_at": "2026-06-15T16:05:00+03:00",
  "changed_by": "MERCHANT"
}

Сценарий C&C-2: покупатель не забрал заказ или отказался

Из READY_FOR_PICKUP мерчант переводит заказ в CANCELLED, если покупатель не пришёл в срок или отказался на точке. Отдельная заявка cancellation не нужна: это путь мерчанта через status/update. Срок хранения на точке спецификация не фиксирует: поле локации storage_period_days опционально. Ориентир — storage_period_days точки и правила витрины.

{
  "merchant_order_id": "ORD-DBS-2026-303",
  "status": "CANCELLED",
  "changed_at": "2026-06-22T21:05:00+03:00",
  "changed_by": "MERCHANT"
}

Отмена до выдачи по заявке покупателя — Отмены (cancellation/list и cancellation/update). Отмена мерчантом из NEW, CONFIRMED или PACKED — тот же status/update → CANCELLED.