Открыть главное меню

Изменения

API Offers

10 431 байт добавлено, 05:40, 2 июня 2022
==Обзор==
Данный документ описывает методы для работы поставщика/дистрибьютора по получению списка предложений, а также изменению, удалению и импорту предложений поставщиком в системе Smart Satu. Предложение - это цена, которую предлагает поставщик за определенный товар. Также система Smart Satu позволяет загружать как общие предложения, которые доступны всем торговым точкам, так индивидуальные для конкретных магазинов. Больше информации по предложениям находится по ссылке: [http://docs.smartsatu.com/wiki/SmartSatuSupplier#.D0.A0.D0.B0.D0.B1.D0.BE.D1.82.D0.B0_.D1.81_.D0.BF.D1.80.D0.B5.D0.B4.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F.D0.BC.D0.B8 Работа с предложениями]
'''Версия'''
'''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, который зыкрывает очередь и является тригером для обработчика на загрузку предложений в систему. Если очередь не будет закрыта, то она не будет обработана и загружена в систему. Чтобы удалить старый прайс-лист, нужно послать флаг удаления с первым или последним чанком 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). Кроме того, предложение дополнительно помечается иконкой акции "%".
В атрибуте'comment' Для временно отсутствующего у поставщика товара в JSON-ответе описываются причины ошибокполе <code>quantity</code> предложения указывается значение <code>0</code> (ноль). Торговым точкам товар будет отображен с пометкой "нет в наличии". Добавить в корзину и заказать такой товар торговые точки не смогут.
Для того чтобы осуществить батчевую загрузку персональных прайсов ВАЖНО: значение Quantum (количество товара в фасовке/упаковке) обязательно должно быть кратно значению minQuantity (минимальное количество данного товара, которое ТТ обязано купить для конкретной торговой точкиоформления заказа) необходимо указать в параметрах запроса ?store_id. Если значения не пройдут валидацию, то добавится только значение Quantum. https Например://food Поставщик выставил предложение на товар по цене 1100 руб за единицу. Фасовка (quantum) осуществляется по 10 шт.smartsatuМинимальное количество в заказе (minQuantity) - 30 шт.com/api/offers/import?start=1&store_id=80Для успешного заказа торговая точка первоначально добавляет в корзину 30 шт товара (сумма заказа составит 1100 * 30), далее добавление в корзину будет происходить с шагом в 10 шт.
Значение Quantum(количество товара в фасовке) обязательно должно быть кратно значению minQuantity (минимальное количество товара). Если значения не пройдут валидацию, то добавится только значение Quantum.
===Получение списка предложений===
Для того чтобы получить список всех предложений, необходимо отправить GET-запрос c пустым телом по URL: https://food.smartsatu.com/api/offers. Ответом от сервера будет являться массив данных со списком всех ваших предложений в системе Smart Satu с их данными.
Вместе с данным параметром мы отправляем 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''
 
==Безопасность==
В headers запроса обязательно должна передаваться страна пользователя, а также уникальный токен авторизации, который был получен при входе в систему. Ответом от сервера будет являться массив данных с измененными данными заказа.
| 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;" | 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
| Выгодная цена| decimal(19,2)| float / null|-| style="font-weight:bold;" | price_without_vat| Цена 5без НДС (РФ)| stringdecimal(19,2)| float / null
|-
| style="font-weight:bold;" | pricepromotion_price_without_vat| Цена для текущей ТТПромо цена без НДС (РФ)| stringdecimal(19,2)| 888float / 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С.'''| varchar(255)| string / null
|-
| style="font-weight:bold;" | quantum
| Квантпоставки| stringdecimal(19,3)| 5.000|-| style="font-weight:bold;" | isImport| Импортировать предложение (да/нет)| boolean| 1 / 0,5
|-
| style="font-weight:bold;" | minQuantity
| Минимальное количество товара для заказа
| stringdecimal(19,3)| 5.500000
|-
| style="font-weight:bold;" | status
| Активность предложения (да/нет)'''Если нужно скрыть товарную карточку из каталога, то выставляем 0 (нет).'''| stringtinyint(1)| 1/ 0
|}
Пример запроса:
"name": "product1",
"sku": "9876786897623",
"store_id": null
"unit": "",
"manufacturer": "",
"price_3": null,
"price_4": null,
"price_5": null*Указание выгодной цены, "priceprice_without_vat": 888null, "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
}
]
 ===OffersRequest =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
}
]
 ===OffersImportResponse=Offers Response==== '''NB!''' Ответ приходит в json и по факту это string. За парсинг и выбор типа значений отвечает сторона поставщика.
{| 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
|-
}
===Delete Offer===
===401===
{| class="wikitable"
| 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
|-