Как уменьшать количество товара при автоматическом создании заказа?

creativit.ru

Добрый день, коллеги!

Создаю заказ примерно так.

$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' => '', ));

Всё хорошо, кроме одного. Списание товара не происходит. Что нужно добавить или как нужно создавать заказ, чтобы списание товара происходило. А также, чтобы при удалении заказа количество увеличивалось.

15 сентября 2016
  • info@ravencode.ru 16 сентября 2016 08:39
        /**
         * Update items of order
         * Also update stock counts if it's necessary
         */
        shopOrderItemsModel::update($items, $order_id);
  • Николай Иванов 16 сентября 2016 13:21

    Для этого заказ надо создавать через workflow. Гляньте например shopFrontendCheckout.action.php

    $workflow = new shopWorkflow();
    if ($order_id = $workflow->getActionById('create')->run($order)) {
            <заказ создан, что-то делаем>
    } else {
            <заказ не создан, тоже что-то делаем или просто > 
            return false;
    }
    
  • creativit.ru 18 сентября 2016 19:48

    Спасибо, коллеги! Посмотрю...

  • Upsale 12 мая 2019 14:44

    Если кто разобрался как создавать через workflow был бы признателен за примеры. Пока сделал через API shop.order.add

  • enso_studio@mail.ru 12 мая 2019 15:54

    В доках более-менее понятно расписано. Переводим заказ в статус указанный в настройках складов:

    $settings = new waAppSettingsModel;
    $settings->get('shop', 'disable_stock_count');
    $settings->get('shop', 'update_stock_count_on_create_order');

    и вызовом соответствующего действия

    $workflow->getActionById($action_id)->run($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();

    т.ч. если не нужны сопутствующие действия, то можно обновить кол-во напрямую.

  • creativit.ru 13 мая 2019 08:44

    Не факт, что я делаю идеально, но приведу пример кода из плагина, где я создаю заказы через наполнение корзины.

    $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);

  • enso_studio@mail.ru 13 мая 2019 15:41

    creativit.ru я же говорю - момент списание кол-ва зависит от настроек в настройках  складов



Чтобы добавить комментарий, зарегистрируйтесь или войдите