Компоненты цены drupal commerce

Главные вкладки

Аватар пользователя mozh mozh 17 ноября 2016 в 15:18

в общем проблема была в следующем
имеется сайт + сommerce multicurrency

цены в админке задаются в usd, при помощи модуля цены пересчитываются в другие по курсу
вот здесь начинаем веселиться
в корзине можно увидеть такие значения
unit price 7.18 JOD - total line item 14.37 - ЧЕ? а оказывается проблема вот в чем:
при переводе в другую валюту модуль берет amount который хранится в БД (значение INT), но при переводе в другую валюту это значение становится float
допустим 10USD = 1000amount = 718.46 JOD amount - проблема в остатке .46. Друпал округляет цену через round и мы получаем цену 7.1846 JOD что равно unit price 7.18 если сделать round.
но при этом если у вас quantity позиции >1. например 2x718.46 amount = 1436.92 и это уже равно в price 14.37))) итог unit price 7.18, но 2x = 14.37. Юзеру весело)

Долго искал где бы округлить в commerce_multicurrency результат после умножения на rate, и вроде нашел функцию, но что-то не заработало.
Идем в правила admin/commerce/config/product-pricing и ищем Set the currency price добавляем Action PHP код

<?php//dpm($commerce_line_item);
$commerce_line_item->commerce_unit_price['und']['0']['data']['components']['0']['price']['amount'] = ceil($commerce_line_item->commerce_unit_price['und']['0']['data']['components']['0']['price']['amount']);
//total unit price
$commerce_line_item->commerce_unit_price['und']['0']['amount'] = $commerce_line_item->commerce_unit_price['und']['0']['data']['components']['0']['price']['amount'];
if(isset($commerce_line_item->commerce_unit_price['und']['0']['data']['components']['1']['price']['amount'])){
  $commerce_line_item->commerce_unit_price['und']['0']['data']['components']['1']['price']['amount'] = ceil($commerce_line_item->commerce_unit_price['und']['0']['data']['components']['1']['price']['amount']);
  $commerce_line_item->commerce_unit_price['und']['0']['amount'] = $commerce_line_item->commerce_unit_price['und']['0']['data']['components']['0']['price']['amount'] + $commerce_line_item->commerce_unit_price['und']['0']['data']['components']['1']['price']['amount'];
}
//dpm($commerce_line_item);?>

в коде нужно округлить все компоненты цены, что бы у нас нормально считался total для line item и общий total заказ.
код примерный, зависит есть ли у вас налоги.
В этом топике хотел лишь показать принцип.
с удовольствием выслушаю всех, может кто-то поможет сделать нормальный патч на multicurrency модуль после умножения на rate делать ceil()

решение пришло отсюда https://www.drupal.org/node/1697378