Обучаю битриксу программистов, интеграторов

Разрешение оплаты после согласования менеджером

Когда товар под заказ, и нужно уточнить наличие у поставщика, лучше разрешать оплату (эквайринг, счет), после подтверждения менеджером.
А еще удобнее клиенту отправлять сразу ссылку на оплату, или сгенерированный счет.

Инструкция
Сначала создадим нужные статусы
В настройках (настройки -> настройки модулей -> интернет-магазин -> настройки -> Статус, начиная с которого можно оплатить заказ (указать)
Сделать настройки в типах событий (добавить в нужном событии поле ORDER_PAYMENT
В почтовых шаблонах добавить в тело письма данное поле



Письмо клиенту, что может оплатить.
Файл /bitrix/php_interface/init.php

use Bitrix\Main,
    Bitrix\Main\Loader,
    Bitrix\Sale\PaySystem,
    Bitrix\Sale,
    Bitrix\Sale\Order;

AddEventHandler("main", "OnBeforeEventAdd", "MyOnBeforeEventAdd");

вариант 1. событие SALE_ORDER_ALLOW_PAY
function MyOnBeforeEventAdd(&$event, &$lid, &$arFields){
    if($event == "SALE_ORDER_ALLOW_PAY" && isset($arFields["ORDER_REAL_ID"]) && intval($arFields["ORDER_REAL_ID"])>0 && 
        (!isset($arFields["ORDER_PAYMENT"]) || $arFields["ORDER_PAYMENT"]=='')
    ){
        $order = Sale\Order::load(intval($arFields["ORDER_REAL_ID"]));
        $paymentCollection = $order->getPaymentCollection();
        $paySystemService = PaySystem\Manager::getObjectById($paymentCollection->current()->getPaymentSystemId());       
        if($paySystemService->getField("IS_CASH")=="Y"){
            //если наличные
            $arFields["ORDER_PAYMENT"] = "Вы можете оплатить в офисе по адресу: Тут адрес";
        }
        elseif($paySystemService->getField("ACTION_FILE")=="bill"){
            //если счет
            $arPdf = $paySystemService->getPdf($paymentCollection->current());
            if(isset($arPdf["SRC"]) && $arPdf["SRC"]!=''){
                $arFields["ORDER_PAYMENT"] = "<a href='https://адрес_сайта".$arPdf["SRC"]."' target='_blank'>Ссылка на счет pdf</a>";
            }
        }
        elseif ($paySystemService->getField('NEW_WINDOW') === 'N' || $paySystemService->getField('ID') == 9){
            $initResult = $paySystemService->initiatePay($paymentCollection->current(), null, PaySystem\BaseServiceHandler::STRING);
            if ($initResult->isSuccess()){
                $arFields["ORDER_PAYMENT"] = $initResult->getTemplate();
            } 
        }
        else{
            $arFields["ORDER_PAYMENT"] = "Вы можете оплатить, перейдя по ссылке на заказ";
        }          

    }   
}
вариант 2. событие SALE_STATUS_CHANGED_XX где XX, ваш код статуса, с которого можно оплачивать
тут ограничение для платежной системы ID 9
function MyOnBeforeEventAdd(&$event, &$lid, &$arFields){    
    if($event == "SALE_STATUS_CHANGED_NP" && isset($arFields["ORDER_REAL_ID"]) && intval($arFields["ORDER_REAL_ID"])>0){
        $order = Sale\Order::load(intval($arFields["ORDER_REAL_ID"]));
       
        if($order->getField('PAYED') == "N"){
            $paymentCollection = $order->getPaymentCollection();
            $paySystemService = PaySystem\Manager::getObjectById($paymentCollection->current()->getPaymentSystemId());        
            if ($paySystemService->getField('NEW_WINDOW') === 'N' || $paySystemService->getField('ID') == 9){
                $initResult = $paySystemService->initiatePay($paymentCollection->current(), null, PaySystem\BaseServiceHandler::STRING);
                if ($initResult->isSuccess()){
                    $arFields["ORDER_PAYMENT"] = $initResult->getTemplate();
                } 
            }
            else{
                $arFields["ORDER_PAYMENT"] = "Вы можете оплатить, перейдя по ссылке на заказ";
            }    
        }      

    }   
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!