В этой заметке я расскажу, как без труда сделать автоматический расчет выгоды от заказа в Drupal Commerce. Сразу оговорюсь, что рассматриваемый сценарий сам по себе может быть полезен не всем магазинам. Владелец может захотеть интеграцию в 1С, владелец может скидывать заказы в свою бухгалтерию сам, владелец, наконец, может просто рассчитывать их карандашом на бумаге. Но, так или иначе, данный пример демонстрирует работу с вычисляемыми полями, а также — базовое взаимодействие с Commerce API.
Для начала, нам понадобятся два модуля: Field Permissions и Computed Field. Скачаем и установим их. Строго говоря, модуль Field Permissions для вычислений не нужен, но мы ведь не хотим, чтобы жадные покупатели видели страшнейший капиталистический навар, который на них делают. А этот модуль — простой способ спрятать все расчеты от беспокойных глаз.
Чтобы вычислять выгоду от заказа, владелец магазина, очевидно, должен ввести не только розничную, но и закупочную цену. Для этого создадим новое поле типа «Десятичное число» и назовем его hidden_price. Можно конечно создать и поле типа «Цена», но нам не понадобится производить с ним расчетов скидки и т.п., поэтому float-а вполне хватит.
Теперь зайдем в настройки полей товара (product) и добавим новое поле типа «Вычисляемое» (computed). Назовем его profit и в появившихся благодаря Field Permissions настройках сразу укажем custom-доступ к полю только для администраторской роли. Теперь введем для вычисляемого поля вот такой простой код:
//получим розничную цену товара
$price = array_pop(field_get_items($entity_type, $entity, 'commerce_price'));
//получим закупочную цену
$hidden_price = array_pop(field_get_items($entity_type, $entity, 'field_hidden_price'));
//зададим значение computed_field
$entity_field[0]['value'] = ($price['amount'] / 100) - $hidden_price['value'];
Заметим, что при вычислении розничная цена делится на 100. Это потому что Commerce Price хранит цены в целочисленном виде — в «копейках». И не забудем, что вычисляемое поле field_profit тоже должно быть видно только администрации.
Такими нехитрыми действиями мы уже рассчитали выгоду от продажи одного товара. Теперь рассчитаем выгоду от всего заказа. Пройдем по адресу admin/commerce/config/order/fields и добавим к заказу вычисляемое поле order_profit. Опять же, не забудем сделать его видимым только админам. Для этого поля введем код посложнее:
//получим id line_item-ов в заказе
$line_item_ids = array();
foreach(field_get_items($entity_type, $entity, 'commerce_line_items') as $line_item) {
$line_item_ids[] = $line_item['line_item_id'];
}
//загрузим line_item-ы заказа
$line_items = commerce_line_item_load_multiple($line_item_ids, array());
//получим id товаров в line_item-ах и загрузим эти товары
$product_ids = array();
$product_quantities = array();
foreach($line_items as $line_item) {
if (count($line_item->commerce_product)) {
//количество пригодится нам позже
$product_ids[] = $line_item->commerce_product['und'][0]['product_id'];
$product_quantities[$line_item->commerce_product['und'][0]['product_id']] = $line_item->quantity; //чтобы определить количество
}
}
$products = commerce_product_load_multiple($product_ids, array());
//пройдемся по всем загруженным товарам
$hidden_price = 0;
foreach($products as $product) {
if (count($product->field_hidden_price)) {
//соберем совокупную закупочную цену, не забудем учесть количество товара в заказе
$hidden_price += ($product->field_hidden_price['und'][0]['value'] * $product_quantities[$product->product_id]);
}
}
//получим общую цену реализации заказа
$order_total = array_pop(field_get_items($entity_type, $entity, 'commerce_order_total'));
//вычислим выгоду
$entity_field[0]['value'] = ($order_total['amount']/100) - $hidden_price;
Собственно, вот и все. В заключение скажу, что если в настройке вычисляемых полей поставить галочку «хранить в базе данных» — выгоду от заказа можно вывести в соответствующую административную таблицу Views.