April 4, 2021

Всё, что нужно знать разработчику про типы оплат и сдачу в Айко

Что делать, если сумма по типам оплаты не сходится с суммой заказа? Как рассчитать сдачу для заказа в Айко?

Отправная точка для знакомства с типами (формами) оплат в Айко — конечно же, документация. Ссылка для версии iikoOffice 7.6: https://ru.iiko.help/articles/#!iikooffice-7-6/topic-103

Но если всё так просто, зачем этот пост? Как всегда, дьявол в деталях.

Пример создания типа оплаты в iikoOffice 7.6

Как в Айко рассчитать сдачу для заказа

Задача. Используя 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 Айко узнать сдачу. Если кто-то из читателей знает — поделитесь в комментариях!

Поступаем следующим образом: предполагаем, что сдача может возникнуть только для типа оплаты "Наличные", остальные типы оплат — без сдачи, под расчет. Тогда алгоритм расчета сдачи такой:

  1. Из суммы заказа вычитаем суммы всех типов оплаты, кроме типа "Наличные".
  2. Если остаток суммы заказа = сумме типа оплаты "Наличные", значит, сдачи нет.
  3. Если остаток суммы заказа больше суммы типа оплаты "Наличные", значит, мы где-то ошиблись 😄
  4. Случай со сдачей: если остаток суммы заказа меньше суммы типа оплаты "Наличные". Тогда разница и будет величиной сдачи.

Не забываем, что в организации может быть несколько типов оплат "Наличные". Например, "Наличные" и "Наличные, не учитываются" "Наличные 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] => Наличные
                    )
            )
    )

Для расчета сдачи действуем по алгоритму:

  1. Из суммы заказа вычитаем суммы всех типов оплаты, кроме типа "Наличные". 74.85 - 34.85 = 40.
  2. Остаток суммы заказа 40 меньше суммы типа оплаты "Наличные" 50. Значит, клиенту необходимо предоставить сдачу: 50 - 40 = 10.

Вместо заключения

И еще несколько советов и наблюдений:

  1. Ключом в справочнике типов оплат должен быть атрибут id, а не code! Помним, что атрибут code не является обязательным для заполнения при создании типов оплат в iikoOffice!
  2. Мы в справочнике поддерживаем элемент "Неизвестный тип оплаты". Например, форма оплаты была удалена, а в истории заказов остались заказы, которые были оплачены этой формой. Чтобы легче было разобраться при подведении итогов за день (период), мы отдельно подводим статистику неизвестных форм оплат с указанием номеров заказов.
  3. Когда курьер уже доставил заказ, а клиент в момент оплаты решил вместо наличных рассчитаться картой, то форму (тип) оплаты нужно заменить. Раньше это был болезненный сценарий, а в новых версиях Айко такая возможность добавлена в iikoTransport API (метод /api/1/deliveries/update_order_payments). В ближайшее время оттестируем эту возможность и расскажем подробно.