Esempio n. 1
0
 /**
  * @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;
 }