В этой заметке я расскажу, как без труда сделать автоматический расчет выгоды от заказа в 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.