/** * @param int $id * @return bool */ public function correct($id) { if (!$id) { return false; } $id = (int) $id; $product = $this->getById($id); $product_skus_model = new shopProductSkusModel(); $skus = $product_skus_model->getDataByProductId($id, true); $currency_model = new shopCurrencyModel(); $currency = wa('shop')->getConfig()->getCurrency(); $price = array(); $update_product_data = array(); // aggregate count by stocks for product // Invariant: if at least one sku.count IS NULL this aggregate count IS NULL $product_count = 0; $available_sku_count = 0; foreach ($skus as $sku) { if ($sku['available']) { $available_sku_count++; } $price[] = $this->castValue('double', $sku['price']); $sku_count = 0; $num_of_null = 0; foreach ($sku['stock'] as $count) { if ($count === null) { // turn into NULL and is not longer changing $sku_count = null; $num_of_null++; } else { // Once turned into NULL value is not changed if ($sku_count !== null) { $sku_count += $count; } } } if ($num_of_null == count($sku['stock'])) { // all stock count is null means that not multistocking $sku_count = $sku['count']; } // maintain product_count invariant. See above if ($sku['available']) { if ($sku_count === null) { $product_count = null; } elseif ($product_count !== null) { $product_count += $sku_count; } } } if ($available_sku_count == 0) { $product_count = 0; } if (!$price) { $price[] = 0; } $update_product_data['sku_count'] = count($skus); $update_product_data['min_price'] = $currency_model->convert(min($price), $product['currency'], $currency); $update_product_data['max_price'] = $currency_model->convert(max($price), $product['currency'], $currency); $update_product_data['price'] = $currency_model->convert($skus[$product['sku_id']]['price'], $product['currency'], $currency); if (isset($skus[$product['sku_id']]['compare_price'])) { $update_product_data['compare_price'] = $currency_model->convert($skus[$product['sku_id']]['compare_price'], $product['currency'], $currency); } $update_product_data['count'] = $product_count; $this->updateById($product['id'], $update_product_data); return true; }
/** * @param $current_stage * @param $count * @param $processed * * @usedby shopYandexmarketPluginRunController::step() */ private function stepProduct(&$current_stage, &$count, &$processed) { static $products; static $sku_model; static $categories; if (!$products) { $products = $this->getCollection()->getProducts($this->getProductFields(), $current_stage, self::PRODUCT_PER_REQUEST, false); if (!$products) { $current_stage = $count['product']; } elseif (!empty($this->data['export']['sku'])) { if (empty($sku_model)) { $sku_model = new shopProductSkusModel(); } $skus = $sku_model->getDataByProductId(array_keys($products)); foreach ($skus as $sku_id => $sku) { if (isset($products[$sku['product_id']])) { if (!isset($products[$sku['product_id']]['skus'])) { $products[$sku['product_id']]['skus'] = array(); } $products[$sku['product_id']]['skus'][$sku_id] = $sku; if (count($products[$sku['product_id']]['skus']) > 1) { $group = false; switch (ifset($this->data['export']['sku_group'])) { case 'all': $group = $sku['product_id']; break; case 'category': // user primary product's category property if (!is_array($categories)) { $category_params_model = new shopCategoryParamsModel(); $categories = $category_params_model->getByField(array('name' => 'yandexmarket_group_skus', 'value' => 1), 'category_id'); if ($categories) { $categories = array_fill_keys(array_keys($categories), true); } } if (isset($categories[$products[$sku['product_id']]['category_id']])) { $group = $sku['product_id']; } break; case 'auto': $group = 'auto'; //use product property yandex_category for it break; default: break; } if ($group) { $products[$sku['product_id']]['_group_id'] = $group; } } } } } $params = array('products' => &$products, 'type' => 'YML'); wa('shop')->event('products_export', $params); } $check_stock = !empty($this->data['export']['zero_stock']) || !empty($this->data['app_settings']['ignore_stock_count']); $chunk = 100; while (--$chunk >= 0 && ($product = reset($products))) { $check_type = empty($this->data['type_id']) || in_array($product['type_id'], $this->data['type_id']); $check_price = $product['price'] >= 0.5; $check_category = !empty($product['category_id']) && isset($this->data['categories'][$product['category_id']]); if ($check_category && $product['category_id'] != $this->data['categories'][$product['category_id']]) { // remap product category $product['category_id'] = $this->data['categories'][$product['category_id']]; } if (false && $check_type && $check_price && !$check_category) { //debug option $this->error("Product #%d [%s] skipped because it's category %s is not available", $product['id'], $product['name'], var_export(ifset($product['category_id']), true)); } if ($check_type && $check_price && $check_category) { $type = ifempty($this->data['types'][$product['type_id']], 'simple'); if (!empty($this->data['export']['sku'])) { $skus = $product['skus']; unset($product['skus']); foreach ($skus as $sku) { $check_sku_price = $sku['price'] >= 0.5; if ($check_sku_price && ($check_stock || $sku['count'] === null || $sku['count'] > 0)) { if (count($skus) == 1) { $product['price'] = $sku['price']; $product['file_name'] = $sku['file_name']; $product['sku'] = $sku['sku']; $increment = false; } else { $increment = true; } $this->addOffer($product, $type, count($skus) > 1 ? $sku : null); ++$processed; if ($increment) { ++$count['product']; } } } } else { if ($check_stock || $product['count'] === null || $product['count'] > 0) { $this->addOffer($product, $type); ++$processed; } } } array_shift($products); ++$current_stage; } }
private function _getOrderData($order_id) { $order_model = new shopOrderModel(); $order = $order_model->getById($order_id); if (!$order) { return false; } $order_items_model = new shopOrderItemsModel(); $items_res = $order_items_model->getByField('order_id', $order_id, true); $items = array(); $total_price = 0; $sku_model = new shopProductSkusModel(); $ret = new stdClass(); foreach ($items_res as $product) { $skus = $sku_model->getDataByProductId($product['product_id']); $product['product'] = reset($skus); $product_id = $product['product_id']; if ($product['sku_id'] != $product['product']['id']) { $product_id .= 's' . $product['sku_id']; } $items[] = array('product_id' => $product_id, 'qnt' => $product['quantity'], 'price' => $product['price'], 'product_name' => $product['name']); $total_price = $total_price + $product['price'] * $product['quantity']; } $ret->order_id = $order_id; $ret->items = $items; $ret->revenue = $total_price; $ret->state = $this->_switchState($order['state_id']); $ret->order = $order; return $ret; }