Добрый день, коллеги!
Создаю заказ примерно так.
$orderModel = new shopOrderModel();
$orderData = array(
//тут массив для заказа
);
$order_id = $orderModel->insert($orderData);
$orderItemModel = new shopOrderItemsModel();
$productData = array(
//тут массив 1 позиции
);
$orderItemModel->insert($productData);
$order_log_model = new shopOrderLogModel();
$order_log_model->add(array(
'order_id' => $order_id,
'contact_id' => $result['contact_id'],
'before_state_id' => 'new',
'after_state_id' => 'new',
'text' => 'Автоматическое создание заказа',
'action_id' => '',
));
Всё хорошо, кроме одного. Списание товара не происходит. Что нужно добавить или как нужно создавать заказ, чтобы списание товара происходило. А также, чтобы при удалении заказа количество увеличивалось.
/** * Update items of order * Also update stock counts if it's necessary */ shopOrderItemsModel::update($items, $order_id);Для этого заказ надо создавать через workflow. Гляньте например shopFrontendCheckout.action.php
$workflow = new shopWorkflow(); if ($order_id = $workflow->getActionById('create')->run($order)) { <заказ создан, что-то делаем> } else { <заказ не создан, тоже что-то делаем или просто > return false; }Спасибо, коллеги! Посмотрю...
Если кто разобрался как создавать через workflow был бы признателен за примеры. Пока сделал через API shop.order.add
В доках более-менее понятно расписано. Переводим заказ в статус указанный в настройках складов:
$settings = new waAppSettingsModel; $settings->get('shop', 'disable_stock_count'); $settings->get('shop', 'update_stock_count_on_create_order');и вызовом соответствующего действия
Но по сути workflow вызывает
// Логи shopProductStocksLogModel::setContext( shopProductStocksLogModel::TYPE_ORDER, 'Order %s was completed', // 'Order %s was closed' ['order_id' => $order_id] ); // Списание wao(new shopOrderModel)->reduceProductsFromStocks($order_id); // Возврат $reduced = wao(new shopOrderParamsModel)->getOne($order_id, 'reduced'); if ($reduced) { wao(new shopOrderModel)->returnProductsToStocks($order_id); } // Логи shopProductStocksLogModel::clearContext();т.ч. если не нужны сопутствующие действия, то можно обновить кол-во напрямую.
Не факт, что я делаю идеально, но приведу пример кода из плагина, где я создаю заказы через наполнение корзины.
$cart = new shopCart('auction'); $cart->clear(); $sku_model = new shopProductSkusModel(); $product_model = new shopProductModel(); $product = new shopProduct($result['product_id']); $sku = $sku_model->getById($product['sku_id']); $data = array( 'create_datetime' => date('Y-m-d H:i:s'), 'product_id' => $product['id'], 'sku_id' => $sku['id'], 'quantity' => 1, 'type' => 'product' ); $data_services = array(); $cart->addItem($data, $data_services); $contact = new waContact($result['contact_id']); $items = $cart->items(false); foreach ($items as &$item) { unset($item['id']); unset($item['parent_id']); $item['price'] = $item['product']['price']; } unset($item); $order = array( 'contact' => $contact, 'items' => $items, 'total' => $result['bid'], 'params' => isset($checkout_data['params']) ? $checkout_data['params'] : array(), ); $order['discount_description'] = null; $order['discount'] = null; $order['shipping'] = 0; $workflow = new shopWorkflow(); $order_id = $workflow->getActionById('create')->run($order);creativit.ru я же говорю - момент списание кол-ва зависит от настроек в настройках складов