Публичное пространство
SetOmni ◾️ API SetOmni
- 1 Описание процессов
- 2 Описание веб-сервиса
- 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 Вместе с основной картой клиента приходят и его купоны, флаг со значением Важно! Флаг не касается основной карты, номер которой в запросе, только дополнительные карты/купоны.
<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 в противном случае. |
10.3.1.0 | Double | Да | Цена товара с учетом всех скидок. |
Payment – данные оплат чека | |||
| string | Нет | Код типа оплаты |
| string | Нет | Не используется, заполнять не требуется |
| double | Нет | Сумма оплаты данным типом оплат |
DiscountCard – данные дисконтных карт и купонов | |||
| string | Нет | Номер дисконтной карты или купона |
| double | Нет | Заполняется серверным калькулятором, содержит величину активных бонусных баллов на счете клиента. Активные бонусные баллы могут быть использованы немедленно. Величина в рублях с точностью до двух знаков после запятой. |
| double | Нет | Заполняется серверным калькулятором, содержит суммарную величину активных и неактивных бонусных баллов на счету клиента. В отличие от активных, неактивные баллы не могут быть использованы немедленно, но станут доступны в будущем. Величина в рублях с точностью до двух знаков после запятой. |
| double | Нет | Это поле используется и клиентом, и процессингом. В случае, если это поле не задано, при наличии действующей акции "Бонусы как скидка", оно будет заполнено максимальной величиной бонусных баллов, доступных для списания в данном чеке. Если действует та же акция и это поле заполнено клиентом, калькулятор принимает величину в поле amountToWriteoff как величину, которую необходимо списать с бонусного баланса клиента, тем самым применив бонусы как скидку. Если оплата была равна максимальной величине списания бонусов для данного чека, в ответе это поле не возвращается. В противном случае, если оплата оказалась меньше максимальной, возвращается величина баллов, всё ещё доступных для оплаты в данном чеке. Попытка оплатить бонусными баллами величиной большей, чем максимально допустимая, приведёт к ошибке. |
| string | Нет | Заполняется только процессингом и только в случае, если переданный купон или карта не участвовали в расчете скидок. Если это поле не заполнено, купон или карта участвовали в расчете скидок. Поле принимает фиксированный диапазон значений:
|
| Date | Нет | Заполняется только процессингом и только в случае, если карта или купон не применены по причинам DOES_NOT_FIT или MORE_PROFITABLE_DISCOUNT_APPLIED. Поле не заполняется при условии, если купон действует бессрочно. Отображает дату, до которой действует карта или купон. |
Пример вызова метода
В исходном чеке должен быть как минимум один элемент 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 | Тип скидки
|
| String | Название акции |
| Long | Идентификатор акции |
| String | Идентификатор акции в внешней системе. |
| Datetime | Дата и время начала действия рекламной акции |
| Datetime | Дата и время окончания действия рекламной акции. null, если акция действует бесконечно. |
appliedCard- описание карт и купонов, по которым сработала описываемая акция (если акция действует не по карте, блок не заполняется) | ||
| String | Тип карты (InternalCard – внутренняя дисконтная карта, ExternalCard - внешняя карта, Coupon – купон) |
| 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 акции, результатом которой стала выдача этого купона. |
position - дополнительные возвращаемые значения в позиции | ||
| Double | ставка НДС по позиции |
| Double | сумма НДС по позиции |
| Double | Итоговая стоимость позиции (в рублях). |
discountable | Boolean | Применена скидка |
cost | Double | Стоимость позиции |
count | Double | Количество товара в позиции |
departNumber | Integer | Номер отдела |
goodsCode | String | Код товара |
id | Integer | Код позиции в строке |
order | String | Номер заказа |
Примера ответа на этот вызов (на сервере была заведена безусловная акция со скидкой 10% на все товары)
Учет скидки по сроку годности
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“
Метод commitPurchase
Метод позволяет подтвердить ранее созданную транзакцию лояльности, используется для зачисления бонусных баллов по решению внешней системы.
Пример подтверждения транзакции
transactionId берется из атрибута id поля return ответа метода doProcessPurchase, в данном случае он равен 148. Ответ должен вернуться вида
В случае, если результатом действия РА являлись купоны, их баркод и тип будет сообщен клиенту на этапе коммита транзакции:
После подтверждения транзакции производится начисление бонусов.
Метод rollbackPendingTransaction
Метод позволяет отменить транзакцию лояльности, созданную ранее в ходе расчёта скидок, но не подтверждённую.
Пример запроса
Метод doReturnPurchase
Создает новую транзакцию лояльности, которая полностью или частично отменяет результаты ранее зафиксированной транзакции: начисления или списание бонусов, оптовые пороги.
Пример запроса
Где:
Наименование атрибута | Тип данных | Обязательно | Описание |
---|---|---|---|
| Long | Да | Идентификатор транзакции лояльности |
| String | Нет | Артикул товара. Обязателен при возврате позиций |
| Double | Нет | Количество товара в ед.изм. Обязателен при возврате позиций |
Пример ответа
Пример
Метод doProcessPurchase
Возможные варианты работы с API серверного расчета скидок
1. Скидка на товарный набор (фиксированная цена)
Создаем РА, в результате которой у товарного набора будет фиксированная цена, например, 100р.
Товарный набор состоит из товаров 00044 и 00055
Посылаем запрос вида
Получаем ответ вида
2. Расчет скидок с учетом заданного магазина
Создаем безусловную рекламную акцию:
Скидка 5% на весь товарный справочник с зоной охвата магазин 99.
Посылаем запрос на расчет скидок с указанием номера магазина 1 (shop="1")
Проверяем, что на товары НЕ предоставилась скидка
Изменяем в запросе на расчет скидок номер магазина на 99 и повторно посылаем запрос
Проверяем, что на товары предоставилась скидка 5%
Пример запроса
3. Расчет скидок на указанную дату и времени
Создаем безусловную рекламную акцию: скидка 10% на весь товарный справочник с окончанием срока действия через месяц от текущей даты (сегодня 20.04.2017 , срок окончания действия РА 20.05.2017 00:00)
Посылаем запрос на расчет скидок с указанием даты 21.05.2017
Проверяем, что на товары скидка не предоставлена
Посылаем запрос на предварительный расчет скидок с указанием даты 19.04.2017
Проверяем, что на товары скидка не предоставлена
Посылаем запрос на предварительный расчет скидок с указанием даты 25.04.2017
Проверяем, что на товары предоставилась скидка 10%
4. Расчет бонусов для списания
На сервере должна быть бонусная карта с активными бонусами. Создаем РА на списание бонусных 99% баллов с этой категории карт.
Посылаем запрос на предварительный расчет скидок с указанием номера внутренней карты
Проверяем, что предоставилась информация о возможности списать бонусы в количестве 99% баллов от суммы товара
Пример запроса
Пример ответа
5. Расчет бонусов для начисления
Создаем РА на начисление 100 бонусных баллов при применении карты.
Посылаем запрос на расчет скидок с указанием номера внутренней карты
Проверяем, что отобразилась информация о начисленных бонусах в кол-ве 10% от суммы чека
Пример запроса
Пример ответа
На карте было 1000 бонусов, начислили сверху 100
Если нужен не просто расчет, а реальное начисление бонусов, необходимо подтвердить транзакцию вызовом метода commitPurchase. Необходимо обратить внимание, что у атрибута check состояние true.
6. Расчёт скидок без указания цены
Если необходимо, чтобы цена товаров использовалась из SetRetail10, то в позициях не надо передавать cost.
Цены должны быть загружены на SetRetail. Если это условие нарушено, то будет следующая ошибка:
Пример ошибки
7. Отмена начислений бонусов
Создаем РА на начисление 100 бонусных баллов при применении карты.
Посылаем запрос на расчет скидок с указанием номера внутренней карты
Проверяем, что отобразилась информация о начисленных бонусах в кол-ве 100 баллов. Проверяем, что в БД в таблице loy_transaction появилась новая транзакция со статусом отправки на сервер = 6 и статусом транзакции = 0.
Посылаем запрос на отмену расчета скидок с указанием номера транзакции
В результате транзакция лояльности целиком удаляется из базы.
Потоварный учёт начисленных и списанных бонусов
Пример запроса
Пример ответа
Информация о начисленных/списанных бонусах хранится в bonusPosition, который находится внутри bonus.
© 1994-2023, ООО «Кристалл Сервис Интеграция».
Все права защищены..