Я поэкспериментировал и внешне кажется что почти все есть, надо немного костылей сделать (со службой доставки).
В функции \Bitrix\Sale\Order::create третий параметр - валюта заказа, т.е. кажется - указывай валюту и все будет нормально.
Исходные данные:- для оформления используется кастомный компонент (не шаблон, а компонент полностью самописный)
- тип платильщика на сайте один - дефолтный, задан в константах
- валюта сайта HKD
- доступные валюты на сайте HKD, EUR, USD
Какая задача: сохранение заказа в EUR.
Зачем: фиксация курса валюты, дальнейшая работа с заказом без изменения цены, возможность оплаты в конкретной валюте, без конвертации на стороне платежных систем (для пользователя).
Реализация:При создании заказа указываю нужную валюту
Код |
---|
// CURRENCY - текущая валюта выбранная пользователем на сайте, в данный момент - EUR. определена в init.php
// DEFAULT_PERSON_TYPE_ID - тип платильщика, задан в init.php, не выбирается пользователем
$siteId = \Bitrix\Main\Context::getCurrent()->getSite(); // идентификатор сайта
$userid = $GLOBALS['USER']->getID(); // ID текущего пользователя
// Создаем заказ
$order = \Bitrix\Sale\Order::create($siteId, $userId, CURRENCY);
// Устанавливаем тип платильщика
$order->setPersonTypeId(DEFAULT_PERSON_TYPE_ID);
// Загружаем в заказ товары и корзины
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), $siteId)->getOrderableItems();
$order->setBasket($basket);
|
Вот до этого этапе все нормально отрабатывает и внешне выглядит хорошо, все функции \Sale\Order работают корректно в соответствии с валютой:
- ::getPrice отдает цену соответствующую EUR
- ::getCurrency отдает 'EUR'
Оплата вроде автоматом подхватывает валюту, не разбирался в деталях.
С доставкой сложнее, т.к. валюта там указывается в настройках службы доставки и расчет идет в соответствии с этой валютой.
Этот вопрос я решил через событие 'onSaleDeliveryServiceCalculate', примерно так:
Код |
---|
$eventManager->addEventHandler("sale", "onSaleDeliveryServiceCalculate", function($event)
{
$parameters = $event->getParameters();
/** @var \Bitrix\Sale\Shipment $shipment */
$shipment = $parameters['SHIPMENT'];
$delivery = $shipment->getDelivery();
if ($shipment->getCurrency() != $delivery->getCurrency())
{
$priceRate = \CCurrencyRates::GetConvertFactorEx($delivery->getCurrency(), $shipment->getCurrency())
/** @var \Bitrix\Sale\Delivery\CalculationResult $parameters['RESULT'] */
$parameters['RESULT']->setDeliveryPrice($price*$priceRate);
return new EventResult(
EventResult::SUCCESS,
$parameters,
'sale'
);
}
// Изменения применяются только при EventResult::SUCCESS
// Остальные игнорируются
return new EventResult(
EventResult::UNDEFINED
);
} |
И в целом все вроде работает, но надо проверять сейчас, раз из коробке это не поддерживается - могут быть проблемы.
Я проверил сейчас:
- Создал заказ (кастомный компонент, с указанием нужной мне валюты)
- В админке заказ отображается в EUR
- В админке оплата в EUR
- В админке доставка в EUR
- При пересчете заказа в админке - все остается на местах
- При изменении службы доставки у отгрузки - валюта сохраняется, рассчитывается корректно
- При добавлении новой отгрузки - валюта также EUR
Кажется что при таком создании через админку все работает хорошо, а это значит что не конфликтует ни с чем и может использоваться в работе.Вопрос:Есть ли какие-то серьезные причины не поступать таким образом? Или моменты которые я не учел?
Кажется через чур просто как то у меня это получилось, не должно было так получиться исходя из того, что "возможность сохранять заказ в валюте отличной от валюты сайта - не поддерживается".