среда, 22 сентября 2021 г.

Bitrix оплата половины заказа баллами

 Итак задача: при заказе если человек использует внутренний счёт можно оплатить только половину заказа без учёта доставки
например заказан товар на 120р
доставка 270
итого 390руб

пользователь может оплатить баллами не больше половины заказа т.е. 60руб от 120руб

для начала копируем весь компонент(не только шаблон)

/bitrix/components/bitrix/sale.order.ajax/
к себе например
/bitrix/components/my/sale.order.ajax/
*my вы создаёте сами

дальше чтобы не путаться переименовал шаблон .default в custom

/bitrix/components/my/sale.order.ajax/templates/.default
в
/bitrix/components/my/sale.order.ajax/templates/custom

в файле .parameters.php добавляем поле для управления сколько процентов пользователь может потратить на заказ

$arTemplateParameters["MAXPAYINNER"] =  array(

"NAME" => 'Максимальный % оплатой баллами',

"TYPE" => "STRING",

"DEFAULT" => 100

);

тут можно сразу указать процент в нашем случае это будет 50


дальше открываем файл /bitrix/components/my/sale.order.ajax/ajax.php внизу прописываем наш шаблон должно получиться так

$APPLICATION->IncludeComponent(

'my:sale.order.ajax',

'custom',

$params

);

и последний файл /bitrix/components/my/sale.order.ajax/class.php собственно из за него и пришлось копировать весь компонент

ищем protected function obtainPaySystem()

меняем 

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($innerPayment->getSum(), $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $this->order->getPrice() - $innerPayment->getSum();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($this->order->getPrice() - $innerPayment->getSum(), $this->order->getCurrency());

на

$maxPayInner = ($this->arParams['MAXPAYINNER'] > 0)? $this->arParams['MAXPAYINNER'] : 100;

$halfTotalPrice = ($this->order->getPrice()-$this->order->getDeliveryPrice())*$maxPayInner/100;

if ($halfTotalPrice >= $innerPayment->getSum()) {

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($innerPayment->getSum(), $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $this->order->getPrice() - $innerPayment->getSum();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($this->order->getPrice() - $innerPayment->getSum(), $this->order->getCurrency());

}else{

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($halfTotalPrice, $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $halfTotalPrice + $this->order->getDeliveryPrice();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($halfTotalPrice + $this->order->getDeliveryPrice(), $this->order->getCurrency());

}

 теперь ищем 

$remainingSum = empty($innerPayment) ? $order->getPrice() : $order->getPrice() - $innerPayment->getSum();

заменяем на

if (!empty($innerPayment)) {

$maxPayInner = ($this->arParams['MAXPAYINNER'] > 0)? $this->arParams['MAXPAYINNER'] : 100;

$halfTotalPrice = ($order->getPrice()-$order->getDeliveryPrice())*$maxPayInner/100;

if ($halfTotalPrice >= $innerPayment->getSum()) {

$remainingSum = $order->getPrice() - $innerPayment->getSum();

}else{

$remainingSum = $halfTotalPrice + $order->getDeliveryPrice();

}

}else{

$remainingSum = $order->getPrice();

Всё применяем новый шаблон, устанавливаем максимальный процент(если процент не установлен или равен 0 то пользователь может оплатить полный заказ без учета доставки) 

Комментариев нет:

Отправить комментарий