Публичное пространство
SetOmni ◾️ API SetOmni
- 1 Описание процессов
- 2 Описание веб-сервиса
- 2.1 Метод doProcessPurchase
- 2.1.1 Описание входящих параметров
- 2.1.1.1 Пример вызова метода
- 2.1.2 Возвращаемые параметры
- 2.1.3 Учет скидки по сроку годности
- 2.1.3.1 Ограничения
- 2.1.4 Срабатывание ограничения по акции
- 2.1.5 Запрет на расчет скидок и начисление бонусов
- 2.1.5.1 Пример запроса
- 2.1.5.2 Пример ответа
- 2.1.5.3 Ограничения
- 2.1.6 Применение скидки по решению покупателя
- 2.1.1 Описание входящих параметров
- 2.2 Метод commitPurchase
- 2.3 Метод rollbackPendingTransaction
- 2.3.1 Пример запроса
- 2.4 Метод doReturnPurchase
- 2.4.1 Пример запроса
- 2.4.2 Пример ответа
- 2.5 Метод doProcessPurchase
- 2.1 Метод doProcessPurchase
- 3 Возможные варианты работы с API серверного расчета скидок
- 3.1 1. Скидка на товарный набор (фиксированная цена)
- 3.1.1 Посылаем запрос вида
- 3.1.2 Получаем ответ вида
- 3.2 2. Расчет скидок с учетом заданного магазина
- 3.2.1 Пример запроса
- 3.3 3. Расчет скидок на указанную дату и времени
- 3.4 4. Расчет бонусов для списания
- 3.4.1 Пример запроса
- 3.4.2 Пример ответа
- 3.5 5. Расчет бонусов для начисления
- 3.5.1 Пример запроса
- 3.5.2 Пример ответа
- 3.6 6. Расчёт скидок без указания цены
- 3.6.1 Пример ошибки
- 3.7 7. Отмена начислений бонусов
- 3.1 1. Скидка на товарный набор (фиксированная цена)
Начиная с версии 10.3.1.0 при включенной опции "Выравнивать размеры скидок в соответствии с требованиями 54-ФЗ" (Лояльность → Общие настройки) в настройках лояльности будет происходить разбиение позиций.
При разбиении позиций производится перерасчет номеров всех позиций в чеке и они могут не совпадать с номерами позиций в исходном чеке.
Описание процессов
Методы серверного расчёта скидок позволяют производить их предоставление посредством веб-сервиса для корзин и заказов, оформленных в интернет-магазине, мобильном приложении или ином внешнем по отношению к SetRetail10 сервисе.
Серверный расчёт скидок позволяет произвести:
Предварительный расчёт скидок, а также суммы списания и начисления бонусов для не оформленного заказа (корзины).
Расчёт скидок, а также суммы списания и начисления бонусов для оформленного заказа, с присвоением идентификатора транзакции.
Подтверждение транзакции для активации преференций покупателю за оформленный заказ (начисление бонусов).
Отмену расчёта скидок не подтверждённой транзакции (в случае отмены заказа или его изменения).
Описание веб-сервиса
Веб-сервис состоит из методов:
doProcessPurchase
commitPurchase
rollbackPendingTransaction
doReturnPurchase
Для работы с серверным калькулятором скидок выполните следующее:
Получите WSDL-структуру веб-сервиса по адресу http://SERVER_IP:8090/SET-ProcessingDiscount/ProcessingPurchaseWS?wsdl.
Создайте хотя бы один магазин с кассой, реквизиты которых (номер магазина и кассы) будут использоваться серверным калькулятором. Создание магазина также поможет производить поиск рекламных акций так, чтобы они действовали только в серверном калькуляторе.
Если нет цели передать необязательные атрибуты, тогда не указывайте эти атрибуты в запросе. Например: нельзя отправить пустой параметр amount=""
.
Метод doProcessPurchase
Метод doProcessPurchase позволяет:
производить расчёт скидок на товары в корзине или оформленном заказе;
работать с внутренними картами и купонами.
Существуют два варианта использования этого метода:
параметр
check
отвечает за необходимость сохранения результата расчёта;Проверка:
false
- метод выполняет предварительный расчётtrue
- результат расчёта сохраняется в виде транзакции лояльности в БД.
Описание входящих параметров
Поле | Тип данных | Обязательно | Описание |
---|---|---|---|
Purchase – общие данные чека | |||
| long | Нет | Идентификатор транзакции (не заполняется при передаче, заполняется Процессингом и только в том случае, если по чеку были какие-либо скидки или операции с бонусными баллами) |
| long | Centrum - да | Номер магазина |
| long | Нет | Номер чека |
| long | Нет | Номер смены |
| long | Нет | Номер кассы |
| double | Нет | Сумма чека (в рублях). Должна равняться сумме стоимости всех позиций в чеке. |
| Double | Нет | Сумма скидок по чеку https://crystals.atlassian.net/browse/SR-5612 https://crystals.atlassian.net/browse/CR-7898 10.3.14.0 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:doProcessPurchaseResponse xmlns:ns2="http://listners.discount.crystals.ru/">
<return amount="37.32" discountAmount="4.14" number="123" saletime="2017-06-20T21:56:12.000" shift="1" cash="1" shop="6502">
<position discountable="true" amount="12.81" cost="14.23" count="1.0" goodsCode="00001" departNumber="1" order="1" id="1"/>
<position discountable="true" amount="24.51" cost="27.23" count="1.0" goodsCode="00002" departNumber="1" order="2" id="2"/>
<advertise operation="accept">
<appliedAction actionGuid="13597" actionName="Безусловная скидка 10%" actionType="DISCOUNT_GOODS"/>
<discount posID="1" amount="1.42" quantity="1.0" actionGuid="13597"/>
<discount posID="2" amount="2.72" quantity="1.0" actionGuid="13597"/>
</advertise>
</return>
</ns2:doProcessPurchaseResponse>
</soap:Body>
</soap:Envelope> |
| datetime | Да | Дата регистрации чека. Дата и время записываются в формате ISO-8601, пример: 2017-07-20T10:45:15.000+06:00, однако не следует передавать таймзону здесь. |
| boolean | Нет | Игнорировать дополнительные карты/купоны клиента. https://crystals.atlassian.net/browse/SLS-1242 https://crystals.atlassian.net/browse/CR-5582 Вместе с основной картой клиента приходят и его купоны, флаг со значением Важно! Флаг не касается основной карты, номер которой в запросе, только дополнительные карты/купоны.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:lis="http://listners.discount.crystals.ru/">
<soapenv:Header/>
<soapenv:Body>
<lis:doProcessPurchase>
<purchase amount="14.23" number="123" saletime="2021-10-05T21:56:12.000" shift="1" cash="1" shop="1328" ignoreAdditionalClientCards="true">
<position discountable="true" amount="14.23" cost="14.23" count="1" goodsCode="00001" departNumber="1" order="1"/>
<discountCard cardNumber="22020000"/>
</purchase>
<check>false</check>
</lis:doProcessPurchase>
</soapenv:Body>
</soapenv:Envelope>
|
Position – данные позиции чека | |||
| long | Нет | Возвращается номер позиции, если в результате расчета было произведено разделение позиций (не заполняется при передаче, заполняется Процессингом) |
| string | Да | Код товара |
| double | Нет | Стоимость единицы товара в данной позиции, используется для расчета скидок (в рублях). Если не указана, то возьмётся из бд Set10. |
| double | Да | Количество товаров в позиции чека, может быть нецелым (для весового товара, например). Десятичный разделитель - точка. |
| long | Да | Номер отдела |
| long | Да | Оригинальный номер позиции в исходном чеке |
| boolean | Да | Признак участия товара в расчете скидок. true если участвует и false в противном случае. |
positionalActionRestriction – запрет применения определенного типа акций на конкретную позицию https://crystals.atlassian.net/browse/SR-7175 https://crystals.atlassian.net/browse/CR-10343 10.4.4.0 | |||
| комплексный | Нет | Тип запрета на конкретную позицию товара из корзины. Возможные значения:
|
Payment – данные оплат чека | |||
| string | Нет | Код типа оплаты |
| string | Нет | Не используется, заполнять не требуется |
| double | Нет | Сумма оплаты данным типом оплат |
DiscountCard – данные дисконтных карт и купонов | |||
| string | Нет | Номер дисконтной карты или купона |
| double | Нет | Заполняется серверным калькулятором, содержит величину активных бонусных баллов на счете клиента. Активные бонусные баллы могут быть использованы немедленно. Величина в рублях с точностью до двух знаков после запятой. |
| double | Нет | Заполняется серверным калькулятором, содержит суммарную величину активных и неактивных бонусных баллов на счету клиента. В отличие от активных, неактивные баллы не могут быть использованы немедленно, но станут доступны в будущем. Величина в рублях с точностью до двух знаков после запятой. |
| double | Нет | Это поле используется и клиентом, и процессингом. В случае, если это поле не задано, при наличии действующей акции "Бонусы как скидка", оно будет заполнено максимальной величиной бонусных баллов, доступных для списания в данном чеке. Если действует та же акция и это поле заполнено клиентом, калькулятор принимает величину в поле amountToWriteoff как величину, которую необходимо списать с бонусного баланса клиента, тем самым применив бонусы как скидку. Если оплата была равна максимальной величине списания бонусов для данного чека, в ответе это поле не возвращается. В противном случае, если оплата оказалась меньше максимальной, возвращается величина баллов, всё ещё доступных для оплаты в данном чеке. Попытка оплатить бонусными баллами величиной большей, чем максимально допустимая, приведёт к ошибке. |
| string | Нет | Заполняется только процессингом и только в случае, если переданный купон или карта не участвовали в расчете скидок. Если это поле не заполнено, купон или карта участвовали в расчете скидок. Поле принимает фиксированный диапазон значений:
|
| Date | Нет | Заполняется только процессингом и только в случае, если карта или купон не применены по причинам DOES_NOT_FIT или MORE_PROFITABLE_DISCOUNT_APPLIED. Поле не заполняется при условии, если купон действует бессрочно. Отображает дату, до которой действует карта или купон. |
clientDecision – решение покупателя о применении акции https://crystals.atlassian.net/browse/SR-5928 https://crystals.atlassian.net/browse/CR-11099 10.4.4.0 | |||
| Long | Да | Идентификатор акции |
| Комплексный | Да | Решение о применении акции
|
Пример вызова метода
В исходном чеке должен быть как минимум один элемент position.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:lis="http://listners.discount.crystals.ru/">
<soapenv:Header/>
<soapenv:Body>
<lis:doProcessPurchase>
<purchase amount="41.46" number="123" saletime="2017-06-20T21:56:12.000" shift="1" cash="1" shop="6502">
<position discountable="true" amount="14.23" cost="14.23" count="1" goodsCode="00001" departNumber="1" order="1"/>
<position discountable="true" amount="27.23" cost="27.23" count="1" goodsCode="00002" departNumber="1" order="2"/>
</purchase>
<check>false</check>
</lis:doProcessPurchase>
</soapenv:Body>
</soapenv:Envelope>
Возвращаемые параметры
Поле или структура | Тип данных | Описание |
---|---|---|
advertise – данные рассчитанных РА | ||
| String | Признак проведения операции расчета РА (accept– успешно, reject– неуспешно) |
| String | Описание причины неуспешного проведения операции расчета. Актуально при operation = ‘reject’ |
customer – данные о владельце Внутренних карт | ||
| Long | Идентификатор клиента |
| String | Имя владельца ДК |
| String | Номер Внутренней карты |
appliedAction – описание примененных в чеке рекламных акций | ||
| Комплексный | Тип скидки
|
| String | Название акции |
| Long | Идентификатор акции |
| String | Идентификатор акции в внешней системе |
| Datetime | Дата и время начала действия рекламной акции |
| Datetime | Дата и время окончания действия рекламной акции. null, если акция действует бесконечно |
appliedCard – описание карт и купонов, по которым сработала описываемая акция (если акция действует не по карте, блок не заполняется) | ||
| String | Тип карты (InternalCard – внутренняя дисконтная карта, ExternalCard - внешняя карта, Coupon – купон) |
| String | Номер карты |
actionLabels – метки рекламной акции https://crystals.atlassian.net/browse/SR-7018 https://crystals.atlassian.net/browse/CR-9324 10.4.2.0 | ||
| String | Метка рекламной акции |
discount – данные о рассчитанных в чеке скидках | ||
| Integer | Номер позиции, на которую применена скидка. Если 0 – скидка применена на весь чек |
| Long | Сумма скидки |
| Long | Идентификатор РА (описание акции в секции appliedAction) |
| Integer | Количество товара, на которое применена скидка |
bonus – данные о бонусных операциях | ||
| Double | Количество начисленных баллов в "рублях" |
| String | Номер карты, на которую начислены баллы |
| Datetime | Дата начала действия начисленных баллов (не заполняется, если начисленные бонусы действуют с текущего момента) |
| Datetime | Дата окончания действия начисленных баллов (не заполняется, если начисленные бонусы действуют бессрочно) |
| Long | Код типа бонусного счета |
| Long | Идентификатор РА (описание акции в секции appliedAction) |
bonusPosition – информация о том, как распределились бонусы по позициям | ||
| Double | Количество бонусов. Если начисленные бонусы, то значение больше нуля. Если списанные - меньше |
| Integer | Номер позиции, на которой распределились бонусы |
сообщения кассиру и покупателю | ||
| String | Сообщение кассиру |
| String | Сообщение покупателю |
coupons – список купонов, которые являлись результатом применения рекламной акции | ||
| String | Баркод купона. Заполняется только при операции commit. При операции doProcessDiscount с параметром check=true, даже если результатом применения рекламной акции был купон, его номер не показывается, поскольку на этом этапе ещё можно отменить транзакцию. Выполнение операции commit означает, что транзакция завершена, заказ оплачен и только тогда пользователь может получить номер купона, который можно использовать. |
| String | Название купона. Купон может не иметь названия. |
| String | Описание купона. Купон может не иметь описания. |
| Datetime | Дата и время без учета таймзоны, при наступлении которой купон становится активным. null, если становится активным сразу по выдаче. |
| Datetime | Дата и время без учета таймзоны, по истечении которой купон перестаёт быть активным. null, если купон бессрочный. |
| Long | (только для скидочных купонов) Величина скидки, которую предоставляет этот купон. Единицы величины описываются полем type купона. |
| Long | (только для скидочных купонов) Максимальная величина скидки, которую предоставляет этот купон. |
| String | (только для скидочных купонов) Тип скидки купона. Возможные значения:
|
| String | Определяет категорию купонов. Это поле необходимо для того, чтобы различать типы купонов между собой. Возможные значения:
|
| Long | Guid акции, результатом которой стала выдача этого купона. |
notAppliedAction – акции, которые не применились в чеке из-за срабатывания ограничения https://crystals.atlassian.net/browse/SR-7018 https://crystals.atlassian.net/browse/CR-9324 10.4.2.0 | ||
| Long | Идентификатор акции |
| String | Название акции |
| Комплексный | Тип скидки
|
| String | Идентификатор акции в внешней системе. |
| Datetime | Дата и время начала действия рекламной акции |
| Datetime | Дата и время окончания действия рекламной акции. null, если акция действует бесконечно. |
appliedLoyaltyRestriction – текущее ограничение по покупателю, установленное в рамках рекламной акции https://crystals.atlassian.net/browse/SR-7018 https://crystals.atlassian.net/browse/CR-9324 10.4.2.0 | ||
| Integer | Остаток по лимиту для покупателя |
| Datetime | Дата и время ближайшего обновления лимита |
position – дополнительные возвращаемые значения в позиции | ||
| Double | Ставка НДС по позиции |
| Double | Сумма НДС по позиции |
| Double | Итоговая стоимость позиции (в рублях) |
10.3.1.0 | Double | Цена товара с учетом всех скидок. Пример запроса: Пример ответа на этот запрос с указанием параметра: |
discountable | Boolean | Применена скидка |
cost | Double | Стоимость позиции |
count | Double | Количество товара в позиции |
departNumber | Integer | Номер отдела |
goodsCode | String | Код товара |
id | Integer | Код позиции в строке |
order | String | Номер заказа |
Примера ответа на этот вызов (на сервере была заведена безусловная акция со скидкой 10% на все товары)
Учет скидки по сроку годности
https://crystals.atlassian.net/browse/SR-4685
https://crystals.atlassian.net/browse/CR-5394
10.2.97.0
Атрибут добавляется в блок позиций чека в методе doProcessPurchase, для возможности передачи срока годности конкретной позиции в SetOmni и расчёта скидки по сроку годности.
Данный атрибут должен быть также указан в возвращаемом блоке позиций для рассчитанного чека.
Блок размещения: Position
Название поля: expirationDate
Тип поля: datetime
Обязательность: нет
По умолчанию: атрибут отсутствует
Формат: 'YYYY-MM-DDTHH:MM:SS.ZZZ'
Варианты указания даты:
без секунд, YYYY-MM-DDTHH:MM:00.000'
без времени, YYYY-MM-DDT00:00:00.000'
Описание: Дата и время окончания срока годности товара - всего количества товара в позиции. Используется для запрета продажи а также для расчёта скидки по сроку годности
Пример запроса с указанием параметра:
Пример ответа с с указанием параметра:
Принцип - алгоритм работы с данным атрибутом:
В поле expirationDate может быть указана только дата или дата со временем.
Если для позиции указана дата окончания срока годности, то по данной позиции необходимо рассчитать скидку по сроку годности, если действует такая рекламная акция.
Информацию о самой акции необходимо указать в соответствующем блоке advertise, appliedAction и discountЕсли для позиции указана дата окончания срока годности не указана, то данная позиция не участвует в расчёте скидок по сроку годности.
Если указана не корректная дата окончания срока, дата указана не по формату, то необходимо вернуть ошибку указания данных в блоке Fault с указанием соответствующей ошибки.
Например “Дата окончания срока годности задана не корректно“, и далее в блоке faultgood перечислить коды товаров из позиций для которых дата задана не корректно.
Пример ошибки:
Если для позиции указана дата окончания срока годности в прошлом, относительно момента запроса, то такая позиция участвует в расчёте всех остальных скидок, кроме скидки по сроку годности. продажа такого товара не запрещена, так как запрет продажи просроченного товара лежит на кассовой программе.
Ограничения
Контроль самого срока годности лежит на кассовой части реализации, т.е. в запросе не должны быть товаров у которых срок годности в прошлом. Для таких товаров скидка по сроку годности рассчитана не будет, но будут рассчитаны другие скидки, и товар не будет удалён из чека или как-то помечен, что он просрочен!
Необходимо понимать что если на товаре дата указана в виде “2021-01-10”, то это означает срок годности до 10-го января включительно,
и соответственно у товара срок годности заканчивается после 2021-01-10 23:59:59.999, т.е. в запросе у позиции должна быть указана дата в полном формате:
expirationDate = “2021-01-10T23:59:59.999“ или начало следующего дня “2021-01-11T00:00:00.000“
Срабатывание ограничения по акции
https://crystals.atlassian.net/browse/SR-7018
https://crystals.atlassian.net/browse/CR-9324
10.4.2.0
Для передачи информации о действующих ограничениях по рекламным акциям в секцию advertise добавлен элемент appliedLoyaltyRestriction, а также элемент notAppliedAction для указания акций, которые не сработали из-за превышения покупателем заданного ограничения.
Пример запроса:
Пример ответа:
Запрет на расчет скидок и начисление бонусов
https://crystals.atlassian.net/browse/SR-7175
https://crystals.atlassian.net/browse/CR-10343
10.4.4.0
Начиная с версии 10.4.4.0 во входящие параметры добавлен опциональный атрибут positionalActionRestriction
, при передаче которого система будет запрещать применение определенного типа акций на конкретную позицию товара из корзины.
Возможные типы запрета:
positionalActionRestriction type="DISCOUNTS"
- запрет на применение скидок на позицию (включает в себя списание бонусов и фишек);positionalActionRestriction type="BONUSES_CHARGE_ON"
- запрет расчета начисления бонусов и электронных фишек.
Новый признак дополняет уже существующий признак discountable
(признак участия товара в расчете скидок - true
, если участвует, и false
в противном случае).
Атрибуты у позиции | Действие системы с позицией из корзины | |
---|---|---|
1 |
|
|
2 |
|
|
3 |
| Рассчитаются все доступные типы механик (скидки, начисление бонусов и фишек) для позиции |
4 |
| Позиция не участвует в расчете скидок |
Пример запроса
Пример ответа
Ограничения
Прочие результаты расчета корзины (выдача купонов, информационные сообщения кассиру/покупателю) будут рассчитаны системой вне зависимости от значений атрибутов discountable
, positionalActionRestriction
, поскольку эти результаты создаются на корзину целиком, а не на конкретные позиции.