Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция

Управление финансовыми потоками — важный аспект ведения бизнеса, особенно в условиях электронной коммерции, когда каждые 0,5% комиссий могут превратиться в серьезные денежные суммы. Если ваша компания продает товары от нескольких юридических лиц, то правильное разделение платежей в интернет-магазине может значительно упростить финансовые процессы и сэкономить время бухгалтерии и деньги на лишних комиссиях. В статье мы обсудим, как правильно настроить разделение оплаты между несколькими юрлицами на платформе Битрикс.

120 открытий2К показов
Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция

Бизнес, работающий с физическим товаром покупает его, хранит и продает от конкретного юридического лица. Однако бывает необходимость делать все это от нескольких юридических лиц.

В классическом интернет-магазине техническая реализация предполагает продажу товара только от одного юрлица, но это бы означало с точки зрения бухгалтерии необходимость переместить товар с одного юрлица на другое, что является не только головной болью бухгалтера, но и предполагает денежные потери на такой транзакции.

Важность реализации функционала разделения оплаты

1. Упрощение бухгалтерского учета

Разделение платежей между двумя юридическими лицами позволяет более четко отслеживать финансовые потоки. Каждое юридическое лицо может вести отдельный бухгалтерский учет, что упрощает процесс отчетности и минимизирует риски ошибок. Это особенно актуально для компаний, работающих в разных регионах, где налоговые правила могут значительно отличаться.

2. Снижение налоговых рисков

Разделение оплат позволяет более эффективно управлять налоговыми обязательствами. Каждое юридическое лицо может оптимизировать свои налоговые расходы в соответствии с действующим законодательством. Это снижает риск налоговых проверок и штрафов, так как каждая компания отвечает только за свои финансовые операции.

3. Гибкость в управлении финансами

Разделение платежей дает возможность более гибко управлять финансами. Например, одно юридическое лицо может заниматься продажами одних групп товаров, а другое — других групп товаров, к примеру от разных поставщиков.

4. Легкость в масштабировании бизнеса

При расширении бизнеса или выходе на новые рынки наличие нескольких юридических лиц может стать значительным преимуществом. Каждое из них может адаптироваться к специфике нового рынка, что позволяет легче и быстрее реагировать на изменения и потребности клиентов.

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 1

Настройка функционала разделения оплаты

Теперь поговорим о том, как же всю эту красоту настроить технически на платформе Bitrix.

В настройках платежных систем мы добавили два способа оплаты. В нашем случае это платежные системы с ID 10 и 11:

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 2

Обработчик, название и описание у них одинаковые:

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 3

Отличаются только настройки платежной системы, которые были предоставлены Paykeeper:

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 4

Затем мы внесли изменения в шаблон страницы оформления заказа, в нашем случае это компонент sale.order.ajax. Мы сделали, чтобы для пользователя отображалась всегда одна из платежный систем.

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 5

То есть, если в корзине есть товары, которые принадлежат только первому складу или обоим складам одновременно, то в этом случае отображалась платежная система с ID 10.

В остальных случаях c ID 11.

Таким образом, если у пользователя в корзине были товары только с первого или только со второго склада, то алгоритм оформления заказа никак не менялся с точки зрения пользователя. Ему автоматически подставлялась необходимая платежная система, и далее он оформлял заказ, проходя штатный механизм Битрикс.

Вся магия начиналась, когда у пользователя в корзине были товары с обоих складов. Так как Битрикс при оформлении заказа всегда создает одну оплату, то нам необходимо сразу после оформления заказа разделять ее на две отдельных оплаты.

Для этого мы в файле init.php на событие OnSaleOrderSaved создаем обработчик, в котором все изменения делаем для только для новых заказов:

			function saleOrderSaved(Main\Event $event) {

    if ($event->getParameter('IS_NEW')) {
        // Делаем разбиение на две оплаты только для новых заказов
    }
}
		

Далее получаем заказ, товары из него и коллекцию оплат:

			$order = $event->getParameter("ENTITY");
$basket = $order->getBasket();
$paymentCollection = $order->getPaymentCollection();
		

Товары складываем в массив $arBasketItems, чтобы потом с ним было проще работать:

			$arBasketItems = [];

foreach ($basket as $basketItem) {
    $arBasketItems[$basketItem->getProductId()] = [
        'ID' => $basketItem->getProductId(),
        'NAME' => $basketItem->getField('NAME'),
        'PRICE' => $basketItem->getFinalPrice(),
        'CURRENCY' => $basketItem->getCurrency(),
        'QUANTITY' => $basketItem->getQuantity(),
        'STORE_ID' => 0
    ];
}
		

Затем проверяем, на каких складах содержатся товары из массива $arBasketItems , и сохраняем итоговую сумму товаров по складам в массиве $arBillSum:

			$arBillSum = [];

$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
    'filter' => array('=PRODUCT_ID'=> array_keys($arBasketItems), 'STORE.ACTIVE'=>'Y'),
));

while ($arStoreProduct = $rsStoreProduct->fetch()) {

    if (
        isset($arBasketItems[$arStoreProduct['PRODUCT_ID']]['STORE_ID'])
        && $arBasketItems[$arStoreProduct['PRODUCT_ID']]['STORE_ID'] == 0 
        && $arStoreProduct['AMOUNT'] > 0
    ) {

        $arBasketItems[$arStoreProduct['PRODUCT_ID']]['STORE_ID'] = $arStoreProduct['STORE_ID'];

        if (!isset($arBillSum[$arStoreProduct['STORE_ID']]))
            $arBillSum[$arStoreProduct['STORE_ID']] = 0;

        $arBillSum[$arStoreProduct['STORE_ID']] += $arBasketItems[$arStoreProduct['PRODUCT_ID']]['PRICE'];
    }
}
		

Ключами массива $arBillSum являются ID складов, хранящиеся в Битрикс. В нашем случае есть два склада с ID 1 и 2.

Мы проверяем, если в заказе есть товары с обоих складов, то в этом случае делаем разбиение на два счета:

			if (
    count($arBillSum) == 2 
    && count($paymentCollection) == 1
) {

   // Делаем разбиение на 2 счета
}
		

Из текущей суммы оплаты вычитаем стоимость товаров, принадлежащих ко второму складу. Данная стоимость хранится в переменной $arBillSum[2]:

			foreach ($paymentCollection as $payment) {
    $payment->setField('SUM', $order->getPrice() - $arBillSum[2]);
}
		

Теперь создаем вторую оплату. ID 11 — это идентификатор второй платежной системы в Битрикс:

			$service = \Bitrix\Sale\PaySystem\Manager::getObjectById(11);
$newPayment = $paymentCollection->createItem($service);
$newPayment->setField('SUM', $arBillSum[2]);
		

Сохраняем заказ:

			$order->save();
		

После этого пользователь попадает в личный кабинет на страницу данного заказа, которая реализована через стандартный компонент sale.personal.order.detail:

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 6

Вверху мы выводим сообщение, в котором подробно описываем, почему у данного заказа две оплаты.

Ниже у него выводится две кнопки на оплату, а в правой части отображаются товары данного заказа, разбитые на две части.

Оплату мы принимаем через систему PayKeeper и на сайте используем ее модуль. Этот модуль, к сожалению, не поддерживает корректную работу при оплате двух счетов, поэтому нам пришлось его немного кастомизировать.

Для этого необходимо внести изменения в файле /bitrix/modules/ooopaykeeperprocessing.paykeeperpayment/install/bitrix/

modules/sale/handlers/paysystem/paykeeper/handler.php :

  • в методе initiatePay(), чтобы сумма оплата бралась не как сумма заказа, а как сумма конкретной платежки, 
  • в методе cart(), который формирует данные для чека — в него мы добавили проверку, чтобы он также возвращал не все товары, а только те, которые относятся к конкретной платежке.

После установки модуля этот файл будет скопирован в папку /bitrix/modules/sale/handlers/paysystem/paykeeper/handler.php — через нее он будет подключаться при оплате.

Разделение оплаты между юридическими лицами на Битрикс: пошаговая инструкция 7

Если у вас остались вопросы, с удовольствием ответим на них в комментариях!

Следите за новыми постами
Следите за новыми постами по любимым темам
120 открытий2К показов