Всё, что нужно знать разработчику про типы оплат и сдачу в Айко
Что делать, если сумма по типам оплаты не сходится с суммой заказа? Как рассчитать сдачу для заказа в Айко?
Отправная точка для знакомства с типами (формами) оплат в Айко — конечно же, документация. Ссылка для версии iikoOffice 7.6: https://ru.iiko.help/articles/#!iikooffice-7-6/topic-103
Но если всё так просто, зачем этот пост? Как всегда, дьявол в деталях.
Как в Айко рассчитать сдачу для заказа
Задача. Используя iikoDelivery API (или новую версию — iikoTransport API), подвести статистику за день, сколько клиенты заплатили наличными, сколько по карте и др.
Решение. Ок, вызываем любой метод, возвращающий информацию о заказах. Например, /api/0/orders/deliveryOrders в iikoDelivery API или /api/1/deliveries/by_delivery_date_and_status в iikoTransport API. Смотрим на элемента заказа [payments]
, подводим итоги по каждому типу оплат, вуаля.
Проверяем, а суммы не сходятся! Дело в том, что бывают заказы, для которых сумма по примененным типам оплат больше суммы заказа. Такое возможно, когда клиент рассчитывается наличными, крупной купюрой, и ожидает сдачу. Оператор колл-центра при создании такого заказа добавляет тип оплаты "Наличные" и вручную задает сумму больше, чем стоимость всего заказа.
Вот пример, стоимость заказа 43.1, а единственный тип оплаты с суммой 50:
[sum] => 43.1 [payments] => Array ( [0] => Array ( [additionalData] => [chequeAdditionalInfo] => [isExternal] => 1 [isFiscalizedExternally] => [isPreliminary] => [isProcessedExternally] => [organizationDetailsInfo] => [paymentType] => Array ( [applicableMarketingCampaigns] => [code] => CASH [combinable] => 1 [comment] => [deleted] => [externalRevision] => 1529317 [id] => 09322f46-578a-d210-add7-123222a08871 [name] => Наличные ) [sum] => 50 ) )
Как определить размер сдачи? Мы не нашли, как напрямую в API Айко узнать сдачу. Если кто-то из читателей знает — поделитесь в комментариях!
Поступаем следующим образом: предполагаем, что сдача может возникнуть только для типа оплаты "Наличные", остальные типы оплат — без сдачи, под расчет. Тогда алгоритм расчета сдачи такой:
- Из суммы заказа вычитаем суммы всех типов оплаты, кроме типа "Наличные".
- Если остаток суммы заказа = сумме типа оплаты "Наличные", значит, сдачи нет.
- Если остаток суммы заказа больше суммы типа оплаты "Наличные", значит, мы где-то ошиблись 😄
- Случай со сдачей: если остаток суммы заказа меньше суммы типа оплаты "Наличные". Тогда разница и будет величиной сдачи.
Не забываем, что в организации может быть несколько типов оплат "Наличные". Например, "Наличные" и "Наличные, не учитываются" "Наличные 2". Нужно вести справочник таких типов оплат.
Пример заказа:
[sum] => 74.85 [payments] => Array ( [0] => Array ( [sum] => 34.85 [paymentType] => Array ( [id] => 12344e6c-10d5-a739-8fb1-b6674d1e65e7 [code] => CARD [name] => Банковские карты ) ) [1] => Array ( [sum] => 50 [paymentType] => Array ( [id] => 12342f46-578a-d210-add7-eec222a08871 [code] => CASH [name] => Наличные ) ) )
Для расчета сдачи действуем по алгоритму:
- Из суммы заказа вычитаем суммы всех типов оплаты, кроме типа "Наличные". 74.85 - 34.85 = 40.
- Остаток суммы заказа 40 меньше суммы типа оплаты "Наличные" 50. Значит, клиенту необходимо предоставить сдачу: 50 - 40 = 10.
Вместо заключения
И еще несколько советов и наблюдений:
- Ключом в справочнике типов оплат должен быть атрибут
id
, а неcode
! Помним, что атрибутcode
не является обязательным для заполнения при создании типов оплат в iikoOffice! - Мы в справочнике поддерживаем элемент "Неизвестный тип оплаты". Например, форма оплаты была удалена, а в истории заказов остались заказы, которые были оплачены этой формой. Чтобы легче было разобраться при подведении итогов за день (период), мы отдельно подводим статистику неизвестных форм оплат с указанием номеров заказов.
- Когда курьер уже доставил заказ, а клиент в момент оплаты решил вместо наличных рассчитаться картой, то форму (тип) оплаты нужно заменить. Раньше это был болезненный сценарий, а в новых версиях Айко такая возможность добавлена в iikoTransport API (метод /api/1/deliveries/update_order_payments). В ближайшее время оттестируем эту возможность и расскажем подробно.