'''URI схема'''
''Host : //food.smartsatu.com/api/ Schemes : HTTPS''
==Методы==
===Импорт предложений===
GET /offers
===Изменение предложений===
PUT /offers/{sku}
===Удаление предложений===
DELETE /offers/{sku}
==Описание==
===Батчевый импорт предложений===
Данный метод предназначен для оптового импорта предложений (batch) в систему с ограничением в 1000 предложенийв одном запросе.Первый запрос должен отправляться с параметром <code>start=1 (</code> <code>https://food.smartsatu.com/api/offers/import?start=1)</code>После В ответ первого запроса вы получите транзакционный идентификатор очереди вида:
{
'id': '98db89147d6cd0018417b71'
}
Для всех последующих запросов на импорт предложений, вам необходимо добавлять транзакционный идентификатор в параметры запроса.:(<code>https://food.smartsatu.com/api/offers/import?id=98db89147d6cd0018417b71)</code>Для того чтобы закончить оптовый импорт предложений в систему, необходимо отправить запрос с параметром end=1 (:<code>https://food.smartsatu.com/api/offers/import?id=98db89147d6cd0018417b71?&end=1)</code>Если вам необходимо удалить все старые предложения, то в последнем запросе необходимо передать параметр delete=1 (: <code>https://food.smartsatu.com/api/offers/import?id=98db89147d6cd0018417b71&end=1&delete=1)</code>
В атрибуте'comment' в JSON-ответе описываются причины ошибок.
Для того чтобы осуществить батчевую '''загрузку персональных прайсов (для конкретной торговой точки) ''' необходимо указать в get параметрах запроса ?<code>store_id</code> (id торговой точки):<code>https://food.smartsatu.com/api/offers/import?start=1&end=1&delete=1&store_id=80).</code>
Рекомендации по батчевой загрузке предложений:
Рекомендуем прогружать по 500-1000 предложений в одном чанкезапросе. Т.к. если прайс-лист до 1000 предложений, то его можно прогрузить одним чанкомзапросом. Для этого в запросе на батчевую загрузку вы устанавливает устанавливаются флаги старта и окончания очереди: offers/import? start=1&end=1. Прайс-лист может быть больше чем 1000 штук. Так, если прайс-лист содержит больше 1000 предложений, то открывается очередь с первым запросом с первой 1000 предложений: offers/import?start=1. В ответе вернется id очереди. С последующими запросами нужно будет слать id очереди в get параметрах offers/import?id=XXXX. C последним чанком большого прайс-листа нужно будет послать флаг окончания offers/import?id=XXXX&end=1. '''NB!''' Допустим нужно загрузить 5000 предложений. Мы отправляем первый запрос с 1000 предложений и получаем в ответ идентификатор очереди. Дальше посылаем еще 4 запроса с 1000 предложений в каждом запросе и идентификатором очереди. При этом в последнем запросе нужно отправить параметр end=1, который зыкрывает очередь и является тригером для обработчика на загрузку предложений в систему. Если очередь не будет закрыта, то она не будет обработана и загружена в систему.
Однако прайс-лист может быть больше чем 1000 штук. Так, если прайс-лист содержит больше 1000 предложений, то вы открываете очередь с первым чанком (в котором первые 1000 предложений) offers/import?start=1. Ответом на такой запрос мы вернем id очереди. С последующими чанками нужно будет слать id очереди offers/import?id=XXXX. C последним чанком большого прайс-листа нужно будет послать флаг окончания offers/import?id=XXXX&end=1. Чтобы удалить старый прайс-лист, нужно послать флаг удаления с первым или последним чанком offers/import?id=XXXX&delete=1. Если это маленький прайсзагружаемый одним запросом, то в get параметрах указываем все три флага (start, end, delete) offers/import?start=1&end=1&delete=1 В предложениях доступна загрузка '''Акций''' с типом '''"Выгодная цена"''' - фактическая скидка на товар. Для этого в предложении необходимо указать первоначальную цену Price 1 (для магазина), Price 2 (для ХоРеКа) и конечную промо-цену Price 5. Таким образом для Торговой точки в каталоге товаров предложения с Выгодной ценой отображаются с перечеркнутой старой ценой (Price 1 или Price 2) и итоговая промо-цена (Price 5). Кроме того, предложение дополнительно помечается иконкой акции "%". Для временно отсутствующего у поставщика товара в поле <code>quantity</code> предложения указывается значение <code>0</code> (ноль). Торговым точкам товар будет отображен с пометкой "нет в наличии". Добавить в корзину и заказать такой товар торговые точки не смогут.
Обратите внимание, что ВАЖНО: значение Quantum (количество товара в фасовке/упаковке) обязательно должно быть кратно значению minQuantity (минимальное количество данного товара, которое ТТ обязано купить для оформления заказа). Если значения не пройдут валидацию, то добавится только значение Quantum.
Например:
Поставщик выставил предложение на товар по цене 1100 рубза единицу. Фасовка (quantum) осуществляется по 10 шт. Минимальное количество в заказе (minQuantity) - 30 шт. Для успешного заказа торговая точка первоначально добавляет в корзину 30 шт товара (сумма заказа составит 1100 * 30), далее добавление в корзину будет происходить с шагом в 10 шт.
===Получение списка предложений===
Вместе с данным параметром мы отправляем JSON-тело запроса на изменение.
===Обновление остатков===
Для загрузки измененного количества товара (остатков) необходимо использовать API https://food.smartsatu.com/api/offers/import-only-quantity?start=1&end=1, в запросе к которому передается массив товаров ('''sku''' либо '''unique_code''') с актуальными значениями остатков:
[
{
"sku": null,
"unique_code": "48700034204351",
"quantity": 30,
}
]
Для обновления остатков в определенном персональном прайслисте необходимо в параметре '''store_id''' указать идентификатор торговой точки:
https://food.smartsatu.com/api/offers/import-only-quantity?start=1&end=1&store_id=9576
===Удаление предложения===
Для того чтобы изменить предложение, необходимо отправить PUT-запрос c JSON-телом по URL: https://food.smartsatu.com/api/offers/{sku}, где sku - это штрих-код предложения, которое необходимо изменить.
Ответом от сервера будет являться массив данных с измененными данными предложения.
Для удаления конкретного предложения из всех прайс-листов (как общих, так и индивидульных) необходимо отправить PUT-запрос c JSON-телом по URL: https://food.smartsatu.com/api/offers/{sku}/all, где sku - это штрих-код предложения, которое необходимо изменить.''Пример: https://food.smartsatu.com/api/offers/5053990106868/all''
==Безопасность==
| style="font-weight:bold;" | 200
| Ok
| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#Response_Orders_Items Offers_Import_Response Offers Import Response Order Items]
|-
| style="font-weight:bold;" | 401
| style="font-weight:bold;" | 200
| Ok
| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#Response_Orders_Items Offers_Response Offers Response Order Items]
|-
| style="font-weight:bold;" | 401
| Unauthorized
| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#401 401]
|}
'''Offers Response (изменение):'''
| style="font-weight:bold;" | 401
| Unauthorized
| [[http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#401 401]
|-
| style="font-weight:bold;" | 403
| Forbidden
| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#403 403]
|}
'''Delete Offer:'''
| style="font-weight:bold;" | 401
| Unauthorized
| [[http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#401 401]
|-
| style="font-weight:bold;" | 403
| Forbidden
| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#403 403]
|-
| style="font-weight:bold;" | 404
| ForbiddenNot Found| [http://docs.smartsatu.com/wiki/API_OrdersAPI_Offers#403 404 404]
|}
'''Принимаемые ресурсом типы MIME'''
'''Возвращаемые ресурсом типы MIME'''
*application/json
==Определения==
===Импорт предложений===POST /offers/import?start=1 ====Offers Import Request====
{| class="wikitable"
! style="font-weight:bold;" | Name
| style="font-weight:bold;" | name
| Название предложения
| stringvarchar(255)
| product1
|-
| style="font-weight:bold;" | sku
| Штрих-код предложения
| stringvarchar(255)
| 9876786897623
|-
| style="font-weight:bold;" | store_id
| Идентификационный номер магазина (индивидуальное предложение)
| string
| null
|-
| style="font-weight:bold;" | unit
| Единица измерения
| stringvarchar(50)| nullшт / кг
|-
| style="font-weight:bold;" | manufacturer
| Производитель
| stringvarchar(255)
| null
|-
| style="font-weight:bold;" | quantity
| Количество'''Для учета остатков. Пока слать 1 (есть в наличии) или 0 (нет в наличии).'''| stringsmallint(6)| 1/ 0
|-
| style="font-weight:bold;" | expires_at
| Годен до
| stringint(10)| null/ unixtimestamp
|-
| style="font-weight:bold;" | price_1
| Цена 1 (для магазиновторговых точек в типом Магазин)| stringdecimal(19,2)| 555float / null
|-
| style="font-weight:bold;" | price_2
| Цена 2 (для для торговых точек в типом HoReCa)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_3
| Цена 3 (для рынковдля торговых точек в типом Рынок)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_4
| Цена 4(только в случае заведения Акции)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_5
| Цена 5Выгодная цена| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_without_vat
| Цена без НДС(РФ)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | promotion_price_without_vat
| Промо цена без НДС(РФ)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | delivery_days
| Дни доставки* '''На данный момент данный параметр не используется! Вся функциональность по настройке дней доставки регулируется через WEB-интерфейс'''| stringvarchar(127)| "1,2,3,4,5,6,0"
|-
| style="font-weight:bold;" | unique_code
| Уникальный код предложения'''Сервисное поле поставщика. Возвращается в заказе. Например, GUID для 1С.'''| stringvarchar(255)| string / null
|-
| style="font-weight:bold;" | quantum
| Квантпоставки| stringdecimal(19,3)| 0,5.000
|-
| style="font-weight:bold;" | isImport
| Импортировать предложение (да/нет)
| boolean
| 1/ 0
|-
| style="font-weight:bold;" | minQuantity
| Минимальное количество товара для заказа
| stringdecimal(19,3)| 5.500000
|-
| style="font-weight:bold;" | status
| Активность предложения (да/нет)'''Если нужно скрыть товарную карточку из каталога, то выставляем 0 (нет).'''| stringtinyint(1)| 1/ 0
|}
Пример запроса:
"price_3": null,
"price_4": null,
"price_5": null, "price": 888*Указание выгодной цены,
"price_without_vat": null,
"promotion_price_without_vat": null,
"delivery_days": "1,2,3,4,5,6,0",
"unique_code": null,//тут может быть GUID "quantum": 05.5000,
"isImport": "1",
"minQuantity": 5.500000,
"status": 1
}
]
====Offers Import Response===={| class="wikitable"|-! Name !! Description !! Schema !! Example|-| '''id''' || Идентификатор очереди || string || 5d720cfee9d7c84ad038ff41|-| '''count''' || Количество предложений || integer || 2|-| '''comment''' || Комментарий || string || null|}Пример ответа: { "id": "5d720cfee9d7c84ad038ff41", "count": 2, "comment": null } ===Изменение предложений===PUT /offers/{sku} ====Offers Request (изменение)====
{| class="wikitable"
! style="font-weight:bold;" | Name
| style="font-weight:bold;" | name
| Название предложения
| stringvarchar(255)
| product1
|-
| style="font-weight:bold;" | manufacturer
| Производитель
| stringvarchar(255)
| null
|-
| style="font-weight:bold;" | quantity
| Количество'''Для учета остатков. 0 (нет в наличии), 1 или более (есть в наличии).'''| stringsmallint(6)| 1/ 0
|-
| style="font-weight:bold;" | expires_at
| Годен до
| stringint(10)| null/ unixtimestamp
|-
| style="font-weight:bold;" | price_1
| Цена 1 (для магазиновторговых точек в типом Магазин)| stringdecimal(19,2)| 555float / null
|-
| style="font-weight:bold;" | price_2
| Цена 2 (для для торговых точек в типом HoReCa)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_3
| Цена 3 (для рынковдля торговых точек в типом Рынок)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_4
| Цена 4(только в случае заведения Акции)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | price_5
| Цена 5Выгодная цена| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | status
| style="font-weight:bold;" | quantum
| Квант
| stringdecimal(19,3)
| 8.0
|-
| style="font-weight:bold;" | minQuantity
| Минимальное количество товара для заказа
| decimal(19,3)
| null
|-
| style="font-weight:bold;" | status
| Активность предложения (да/нет) '''Если нужно скрыть товарную карточку из каталога, то выставляем 0 (нет).'''
| tinyint(1)
| 1 / 0
|}
Пример запроса:
"status": 1
"quantum": 8.0,
"minQuantity": null, //нет требования по минимальному количеству в заказе
"status": 1
}
]
====Offers Import Response==={| class="wikitable"|-! Name !! Description !! Schema !! Example|-| '''id''' || Идентификатор наименования || integer($int32) || 5d720cfee9d7c84ad038ff41|-| '''count''' || Количество предложений || integer($int32) || Текст ячейки|-| '''commentNB!''' || Комментарий || Ответ приходит в json и по факту это string || null|}Пример ответа: { "id": "5d720cfee9d7c84ad038ff41", "count": 2, "comment": null }===Offers Response===. За парсинг и выбор типа значений отвечает сторона поставщика.
{| class="wikitable"
! style="font-weight:bold;" | Name
|-
| style="font-weight:bold;" | id
| Идентификатор наименования предложенияв системе SmartSatu| integer($int32)
| 4317231
|-
|-
| style="font-weight:bold;" | sku
| Штрих-код Артикул предложения
| string
| 4870007151458
| Единица измерения предложения
| string
| nullшт
|-
| style="font-weight:bold;" | manufacturer
| Количество
| string
| 01
|-
| style="font-weight:bold;" | expires_at
| Цена 3 (для рынков)
| string
| 329null
|-
| style="font-weight:bold;" | price_4
|-
| style="font-weight:bold;" | unique_code
| Уникальный код предложения'''Идентификатор предложения у поставщика'''
| string
| 141209
|-
| style="font-weight:bold;" | product_id
| Идентификатор продукта(идентификатор товарной карточки в системе SmartSatu)
| string
| 28952
|-
| style="font-weight:bold;" | step
| ШагКвант поставки (quantum)
| string
| null
| string
| null
|-
| style="font-weight:bold;" | price
| Цена для текущей ТТ
| string
| 329
|}
Пример ответа:
"name": "425МЛ ЗЕЛЕНЫЙ ГОРОШЕК GREEN GA",
"sku": 870007151458,
"unit": "шт",
"manufacturer": "",
"quantity": 01,
"expires_at": null,
"price_1": 329,
"price_2": 329,
"price_3": 329null,
"price_4": null,
"price_5": null,
"unique_code": "151885141209",
"product_id": null,
"step": null,
"minQuantity": null, "price": 329,
}
]
===Удаление предложений===DELETE /offers/{sku}====Delete Offer====
{| class="wikitable"
! style="font-weight:bold;" | Name
| style="font-weight:bold;" | status
| Код
| stringinteger
| 204
|-
| style="font-weight:bold;" | code
| Код
| integer($int32)
| 0
|-
| style="font-weight:bold;" | status
| Статус
| integer($int32)
| 401
|-
"type": "yii\\web\\UnauthorizedHttpException"
}
===403===
{| class="wikitable"
| style="font-weight:bold;" | code
| Код
| integer($int32)
| 0
|-
| style="font-weight:bold;" | status
| Статус
| integer($int32)
| 403
|-
"type": "yii\\\\web\\\\HttpException"
}
===404===
{| class="wikitable"
| style="font-weight:bold;" | code
| Код
| integer($int32)
| 0
|-
| style="font-weight:bold;" | status
| Статус
| integer($int32)
| 404
|-