Пример #1
0
 function loadFullOrder($order_id, $additionalData = false, $checkUser = true)
 {
     $order = $this->get($order_id);
     $app = JFactory::getApplication();
     $type = 'frontcomp';
     if (empty($order)) {
         return null;
     }
     $userClass = hikashop_get('class.user');
     $order->customer = $userClass->get($order->order_user_id);
     if ($app->isAdmin()) {
         if (hikashop_level(1)) {
             $query = 'SELECT * FROM ' . hikashop_table('geolocation') . ' WHERE geolocation_type=\'order\' AND geolocation_ref_id=' . $order_id;
             $this->database->setQuery($query);
             $order->geolocation = $this->database->loadObject();
         }
         $query = 'SELECT * FROM ' . hikashop_table('history') . ' WHERE history_order_id=' . $order_id . ' ORDER BY history_created DESC';
         $this->database->setQuery($query);
         $order->history = $this->database->loadObjectList();
         if (!empty($order->order_partner_id)) {
             $order->partner = $userClass->get($order->order_partner_id);
         }
         $type = 'backend';
     } elseif ($checkUser && hikashop_loadUser() != $order->order_user_id) {
         return null;
     }
     $this->orderNumber($order);
     $order->order_subtotal = $order->order_full_price + $order->order_discount_price - $order->order_shipping_price - $order->order_payment_price;
     $this->loadAddress($order->order_shipping_address_id, $order, 'shipping', 'name', $type);
     $this->loadAddress($order->order_billing_address_id, $order, 'billing', 'name', $type);
     if (empty($order->fields)) {
         $fieldClass = hikashop_get('class.field');
         $order->fields = $fieldClass->getData($type, 'address');
     }
     if (!empty($order->order_payment_params) && is_string($order->order_payment_params)) {
         $order->order_payment_params = unserialize($order->order_payment_params);
     }
     if (!empty($order->order_shipping_params) && is_string($order->order_shipping_params)) {
         $order->order_shipping_params = unserialize($order->order_shipping_params);
     }
     if (!empty($order->order_shipping_id)) {
         $order->shippings = array();
         if (strpos($order->order_shipping_id, ';') !== false) {
             $shipping_ids = explode(';', $order->order_shipping_id);
         } else {
             $shipping_ids = array($order->order_shipping_id);
         }
         JArrayHelper::toInteger($shipping_ids);
         $query = 'SELECT * FROM ' . hikashop_table('shipping') . ' WHERE shipping_id IN (' . implode(',', $shipping_ids) . ')';
         $this->database->setQuery($query);
         $order->shippings = $this->database->loadObjectList('shipping_id');
     }
     if (!empty($order->order_shipping_method)) {
         $currentShipping = hikashop_import('hikashopshipping', $order->order_shipping_method);
         if (method_exists($currentShipping, 'getShippingAddress')) {
             $override = $currentShipping->getShippingAddress($order->order_shipping_id);
             if ($override !== false) {
                 $order->override_shipping_address = $override;
             }
         }
     }
     $this->loadProducts($order);
     if (!empty($order->additional)) {
         foreach ($order->additional as $additional) {
             $order->order_subtotal -= $additional->order_product_price - $additional->order_product_tax;
         }
     }
     $order->order_subtotal_no_vat = 0;
     JPluginHelper::importPlugin('hikashop');
     $dispatcher = JDispatcher::getInstance();
     foreach ($order->products as $k => $product) {
         $dispatcher->trigger('onBeforeCalculateProductPriceForQuantityInOrder', array(&$order->products[$k]));
         if (function_exists('hikashop_product_price_for_quantity_in_order')) {
             hikashop_product_price_for_quantity_in_order($order->products[$k]);
         } else {
             $order->products[$k]->order_product_total_price_no_vat = $product->order_product_price * $product->order_product_quantity;
             $order->products[$k]->order_product_total_price = ($product->order_product_price + $product->order_product_tax) * $product->order_product_quantity;
         }
         $dispatcher->trigger('onAfterCalculateProductPriceForQuantityInOrder', array(&$order->products[$k]));
         $order->order_subtotal_no_vat += $order->products[$k]->order_product_total_price_no_vat;
         if (!empty($product->order_product_options)) {
             $order->products[$k]->order_product_options = unserialize($product->order_product_options);
         }
     }
     if ($additionalData) {
         $this->getOrderAdditionalInfo($order);
     }
     return $order;
 }
Пример #2
0
 function _checkQuantity(&$product, &$quantity, &$cartContent, $cart_product_id_for_product)
 {
     if ($quantity < 0) {
         $quantity = 0;
     }
     $config =& hikashop_config();
     $product->wanted_quantity = $wantedQuantity = $quantity;
     if (!empty($this->options[$product->product_id])) {
         $parent = $this->options[$product->product_id];
         $group_options = (int) $config->get('group_options', 0);
         if (isset($this->new_quantities[$parent]) && $quantity > $this->new_quantities[$parent] && $group_options == 1) {
             $quantity = $this->new_quantities[$parent];
         }
     }
     $item_limit = (int) $config->get('cart_item_limit', 0);
     if (!empty($item_limit) && hikashop_level(1)) {
         $current_items = 0;
         if (!empty($cartContent)) {
             foreach ($cartContent as $element) {
                 if ($element->product_id != $product->product_id) {
                     $current_items += (int) $element->cart_product_quantity;
                 }
             }
         }
         $possible_quantity = $item_limit - $current_items;
         if ($quantity > $possible_quantity) {
             if ($possible_quantity < 0) {
                 $possible_quantity = 0;
             }
             $quantity = $possible_quantity;
         }
     }
     $database = JFactory::getDBO();
     if (hikashop_level(1)) {
         $productIds = array((int) $product->product_id);
         if ($product->product_parent_id > 0) {
             $productIds[] = (int) $product->product_parent_id;
         }
         $productCartIds = array((int) $product->product_id);
         if (is_array($cartContent)) {
             foreach ($cartContent as $cart_product_id => $prod) {
                 if (!in_array($prod->product_id, $productCartIds)) {
                     $productCartIds[] = (int) $prod->product_id;
                 }
                 if ($prod->product_parent_id > 0 && !in_array($prod->product_parent_id, $productCartIds)) {
                     $productCartIds[] = (int) $prod->product_parent_id;
                 }
             }
         }
         $database->setQuery('SELECT category_id, product_id FROM ' . hikashop_table('product_category') . ' WHERE product_id IN (' . implode(',', $productCartIds) . ');');
         $categoryIds = array();
         $cartCategoryLink = array();
         $catIds = '';
         $ret = $database->loadObjectList();
         $acceptedCategory = array();
         foreach ($ret as $c) {
             if ($c->product_id == $product->product_id || $c->product_id == $product->product_parent_id) {
                 $acceptedCategory[$c->category_id] = $c->category_id;
             }
         }
         foreach ($ret as $c) {
             if (isset($acceptedCategory[$c->category_id])) {
                 $categoryIds[] = (int) $c->category_id;
                 if (!isset($cartCategoryLink[$c->product_id])) {
                     $cartCategoryLink[$c->product_id] = array($c->category_id);
                 } else {
                     $cartCategoryLink[$c->product_id][] = $c->category_id;
                 }
             }
         }
         unset($acceptedCategory);
         unset($c);
         unset($ret);
         $filters = array();
         hikashop_addACLFilters($filters, 'limit_access', 'a');
         $query = ' FROM ' . hikashop_table('limit') . ' AS a WHERE a.limit_published = 1 AND (a.limit_start = 0 OR a.limit_start <= ' . time() . ') AND (a.limit_end = 0 OR a.limit_end >= ' . time() . ') AND a.limit_product_id IN (' . implode(',', $productIds) . ',0)';
         if (count($categoryIds) > 0) {
             $catIds = implode(',', $categoryIds) . ',';
         }
         $query .= ' AND limit_category_id IN (' . $catIds . '0)';
         $filters = implode(' AND ', $filters);
         if (!empty($filters)) {
             $query .= ' AND ' . $filters;
         }
         $database->setQuery('SELECT count(*)' . $query);
         $limiters = $database->loadResult();
         if ($limiters > 0) {
             $database->setQuery('SELECT a.*' . $query);
             $limiters = $database->loadObjectList();
             $periodicity = array('forever' => 0, 'yearly' => 1, 'quarterly' => 2, 'monthly' => 3, 'weekly' => 4, 'daily' => 5, 'cart' => 6);
             $limiterTypes = array('price' => false, 'quantity' => false, 'weight' => false);
             $dateLimiter = 0;
             $categoryIds = array();
             $limit_statuses = array();
             foreach ($limiters as $limiter) {
                 if ($limiter->limit_category_id > 0) {
                     $categoryIds[] = (int) $limiter->limit_category_id;
                 }
                 $limiterTypes[$limiter->limit_type] = true;
                 $dateLimiter = $dateLimiter > 0 && $dateLimiter < $periodicity[$limiter->limit_periodicity] ? $dateLimiter : $periodicity[$limiter->limit_periodicity];
                 $statuses = explode(',', $limiter->limit_status);
                 foreach ($statuses as $s) {
                     if (!empty($s)) {
                         $limit_statuses[$s] = $s;
                     }
                 }
                 unset($s);
                 unset($statuses);
             }
             $d = getdate();
             $baseDates = array(0 => 0, 1 => mktime(0, 0, 0, 1, 1, $d['year']), 2 => mktime(0, 0, 0, $d['mon'] - ($d['mon'] - 1) % 4, 1, $d['year']), 3 => mktime(0, 0, 0, $d['mon'], 1, $d['year']), 4 => mktime(0, 0, 0, $d['mon'], $d['mday'] - $d['wday'], $d['year']), 5 => mktime(0, 0, 0, $d['mon'], $d['mday'], $d['year']), 6 => -1);
             $user = JFactory::getUser();
             if (!empty($user->id) && $baseDates[$dateLimiter] >= 0) {
                 $query = 'SELECT a.order_product_id, a.product_id, a.order_product_quantity, a.order_product_price, a.order_product_tax, b.order_currency_id, b.order_created, b.order_status, c.product_parent_id, d.category_id FROM ';
                 $query .= hikashop_table('order_product') . ' AS a';
                 $query .= ' INNER JOIN ' . hikashop_table('order') . ' AS b ON a.order_id = b.order_id ';
                 if (count($limit_statuses) > 0) {
                     $query .= "AND b.order_status IN ('" . implode("','", $limit_statuses) . "')";
                 }
                 $query .= ' AND b.order_user_id = ' . (int) hikashop_loadUser();
                 $query .= ' AND b.order_created >= ' . $baseDates[$dateLimiter];
                 $query .= ' INNER JOIN ' . hikashop_table('product') . ' AS c ON (a.product_id = c.product_id) OR (a.product_id = c.product_parent_id)';
                 $query .= ' INNER JOIN ' . hikashop_table('product_category') . ' AS d ON (c.product_parent_id = 0 AND c.product_id = d.product_id) OR (c.product_parent_id = d.product_id) ';
                 $query .= ' WHERE a.product_id IN (' . implode(',', $productIds) . ')';
                 if (count($categoryIds) > 0) {
                     $query .= 'OR category_id IN (' . implode(',', $categoryIds) . ')';
                 }
                 $query .= ';';
                 $database->setQuery($query);
                 $rows = $database->loadObjectList();
                 $productIds = array();
                 foreach ($rows as $p) {
                     if (empty($p->product_parent_id)) {
                         $productIds[$p->product_id] = $p->product_id;
                     } else {
                         $productIds[$p->product_parent_id] = $p->product_parent_id;
                     }
                 }
             } else {
                 $rows = array();
                 $productIds = array();
             }
             if ($limiterTypes['weight'] || $limiterTypes['price']) {
                 if (count($rows)) {
                     $productClass = hikashop_get('class.product');
                     $productClass->getProducts($productIds);
                 }
                 $fullcart = $this->loadFullCart(false, true, true);
             }
             JPluginHelper::importPlugin('hikashop');
             $dispatcher = JDispatcher::getInstance();
             foreach ($limiters as $limiter) {
                 $baseDate = $baseDates[$periodicity[$limiter->limit_periodicity]];
                 $value = 0;
                 $countedOrderProductIds = array();
                 foreach ($rows as $r) {
                     if ($baseDate >= 0 && $r->order_created >= $baseDate && (empty($limiter->limit_status) || strpos(',' . $limiter->limit_status . ',', ',' . $r->order_status . ',') !== false)) {
                         if ($limiter->limit_product_id == 0 && $limiter->limit_category_id == 0 || $limiter->limit_product_id > 0 && ($limiter->limit_product_id == $r->product_id || $limiter->limit_product_id == $r->product_parent_id) || $limiter->limit_category_id > 0 && $limiter->limit_category_id == $r->category_id) {
                             if (isset($countedOrderProductIds[$r->order_product_id])) {
                                 continue;
                             }
                             $countedOrderProductIds[$r->order_product_id] = $r->order_product_id;
                             switch ($limiter->limit_type) {
                                 case 'quantity':
                                     $value += $r->order_product_quantity;
                                     break;
                                 case 'price':
                                     $dispatcher->trigger('onBeforeCalculateProductPriceForQuantityInOrder', array(&$r));
                                     if (function_exists('hikashop_product_price_for_quantity_in_order')) {
                                         hikashop_product_price_for_quantity_in_order($r);
                                     } else {
                                         $r->order_product_total_price_no_vat = $r->order_product_price * $r->order_product_quantity;
                                         $r->order_product_total_price = ($r->order_product_price + $r->order_product_tax) * $r->order_product_quantity;
                                     }
                                     $dispatcher->trigger('onAfterCalculateProductPriceForQuantityInOrder', array(&$r));
                                     $value += $r->order_product_total_price;
                                 case 'weight':
                                     $id = $r->product_parent_id == 0 ? $r->product_id : $r->product_parent_id;
                                     if (!empty($productClass->products[$id])) {
                                         $p =& $productClass->products[$id];
                                         if (empty($p->product_weight) && $r->product_parent_id != 0 && !empty($productClass->products[$r->product_parent_id])) {
                                             $p =& $productClass->products[$r->product_parent_id];
                                         }
                                         if ($p->product_weight_unit == $limiter->limit_unit) {
                                             $value += $p->product_weight * $r->order_product_quantity;
                                         }
                                         unset($p);
                                     }
                                     break;
                             }
                         }
                     }
                 }
                 if (isset($fullcart)) {
                     foreach ($fullcart->products as $cc) {
                         if ($cart_product_id_for_product > 0) {
                             if ($cc->cart_product_id == $cart_product_id_for_product) {
                                 continue;
                             }
                         }
                         $id = $cc->product_parent_id == 0 ? $cc->product_id : $cc->product_parent_id;
                         if (($limiter->limit_product_id == 0 || $limiter->limit_product_id == $id) && ($limiter->limit_category_id == 0 || isset($cartCategoryLink[$id]) && is_array($cartCategoryLink[$id]) && in_array($limiter->limit_category_id, $cartCategoryLink[$id]))) {
                             switch ($limiter->limit_type) {
                                 case 'quantity':
                                     $value += $cc->cart_product_quantity;
                                     break;
                                 case 'price':
                                     if (isset($cc->prices) && is_array($cc->prices) && count($cc->prices)) {
                                         $value += $cc->prices[0]->price_value_with_tax;
                                     }
                                     break;
                                 case 'weight':
                                     if (isset($cc->product_weight_unit) && $cc->product_weight_unit == $limiter->limit_unit) {
                                         $value += $cc->product_weight * $cc->cart_product_total_quantity;
                                     }
                                     break;
                             }
                         }
                     }
                 } elseif (isset($cartContent) && is_array($cartContent)) {
                     foreach ($cartContent as $cc) {
                         if ($cart_product_id_for_product > 0) {
                             if ($cc->cart_product_id == $cart_product_id_for_product) {
                                 continue;
                             }
                         }
                         $id = $cc->product_parent_id == 0 ? $cc->product_id : $cc->product_parent_id;
                         if ($limiter->limit_product_id > 0 && $limiter->limit_product_id == $id || $limiter->limit_category_id > 0 && isset($cartCategoryLink[$id]) && is_array($cartCategoryLink[$id]) && in_array($limiter->limit_category_id, $cartCategoryLink[$id])) {
                             switch ($limiter->limit_type) {
                                 case 'quantity':
                                     $value += $cc->cart_product_quantity;
                                     break;
                                 case 'price':
                                     $value += $cc->prices[0]->price_value_with_tax * $cc->cart_product_quantity;
                                     break;
                                 case 'weight':
                                     $value += $cc->product_weight * $cc->cart_product_quantity;
                                     break;
                             }
                         }
                     }
                 }
                 if ($cart_product_id_for_product == -1 && $product->product_type == "variant") {
                     $productClass = hikashop_get('class.product');
                     $parent = $productClass->get($product->product_parent_id);
                     $ids = array($parent->product_id);
                     $currencyClass = hikashop_get('class.currency');
                     $config =& hikashop_config();
                     $main_currency = (int) $config->get('main_currency', 1);
                     $currency_id = hikashop_getCurrency();
                     if (!in_array($currency_id, $currencyClass->publishedCurrencies())) {
                         $currency_id = $main_currency;
                     }
                     $zone_id = hikashop_getZone('shipping');
                     if ($config->get('tax_zone_type', 'shipping') == 'billing') {
                         $tax_zone_id = hikashop_getZone('billing');
                     } else {
                         $tax_zone_id = $zone_id;
                     }
                     $discount_before_tax = (int) $config->get('discount_before_tax', 0);
                     $currencyClass->getPrices($parent, $ids, $currency_id, $main_currency, $zone_id, $discount_before_tax);
                     $productClass->checkVariant($product, $parent);
                 }
                 switch ($limiter->limit_type) {
                     case 'quantity':
                         if ($value + $quantity > $limiter->limit_value) {
                             $quantity = $limiter->limit_value - $value;
                         }
                         break;
                     case 'price':
                         $currencyClass = hikashop_get('class.currency');
                         $product->cart_product_quantity = $quantity;
                         $product->cart_product_total_quantity = $quantity;
                         if (!isset($product->prices)) {
                             $ids = array($product->product_id);
                             $config =& hikashop_config();
                             $main_currency = (int) $config->get('main_currency', 1);
                             $currency_id = hikashop_getCurrency();
                             if (!in_array($currency_id, $currencyClass->publishedCurrencies())) {
                                 $currency_id = $main_currency;
                             }
                             $zone_id = hikashop_getZone('shipping');
                             if ($config->get('tax_zone_type', 'shipping') == 'billing') {
                                 $tax_zone_id = hikashop_getZone('billing');
                             } else {
                                 $tax_zone_id = $zone_id;
                             }
                             $discount_before_tax = (int) $config->get('discount_before_tax', 0);
                             $currencyClass->getPrices($product, $ids, $currency_id, $main_currency, $tax_zone_id, $discount_before_tax);
                         }
                         $currencyClass->calculateProductPriceForQuantity($product);
                         if (isset($product->prices) && is_array($product->prices) && count($product->prices)) {
                             if ($value + $product->prices[0]->price_value_with_tax > $limiter->limit_value) {
                                 while ($product->cart_product_quantity > 0 && $value + $product->prices[0]->price_value_with_tax > $limiter->limit_value) {
                                     $product->cart_product_quantity--;
                                     $currencyClass->calculateProductPriceForQuantity($product);
                                 }
                                 $quantity = $product->cart_product_quantity;
                             }
                         }
                         break;
                     case 'weight':
                         if ($product->product_weight > 0 && $product->product_weight_unit == $limiter->limit_unit && $value + $quantity * $product->product_weight > $limiter->limit_value) {
                             $quantity = floor(($limiter->limit_value - $value) / $product->product_weight);
                         }
                         break;
                 }
                 if ($quantity < 0) {
                     $quantity = 0;
                 }
             }
         }
     }
     if ($product->product_type == 'variant') {
         $class = hikashop_get('class.product');
         $parentProduct = $class->get($product->product_parent_id);
         $database->setQuery('SELECT * FROM ' . hikashop_table('variant') . ' AS a LEFT JOIN ' . hikashop_table('characteristic') . ' AS b ON a.variant_characteristic_id=b.characteristic_id WHERE a.variant_product_id=' . (int) $product->product_id . ' ORDER BY a.ordering');
         $product->characteristics = $database->loadObjectList();
         $class->checkVariant($product, $parentProduct);
         if ($product->product_quantity == -1 && $parentProduct->product_quantity != -1) {
             $product->product_quantity = $parentProduct->product_quantity;
             $quantity_for_same_main_product =& $this->_getGlobalQuantityOfVariants($cartContent, $product, $cart_product_id_for_product);
             if ($quantity_for_same_main_product > $product->product_quantity) {
                 $in_excess = $quantity_for_same_main_product - $product->product_quantity;
                 if ($quantity > $in_excess) {
                     $quantity = $product->wanted_quantity = $quantity - $in_excess;
                     $quantity_for_same_main_product = $quantity_for_same_main_product - $in_excess;
                 } else {
                     $quantity_for_same_main_product = $quantity_for_same_main_product - $quantity;
                     $quantity = $product->wanted_quantity = 0;
                 }
             }
         }
         if (!empty($parentProduct->product_min_per_order)) {
             $quantity_for_same_main_product =& $this->_getGlobalQuantityOfVariants($cartContent, $product, $cart_product_id_for_product);
             if ($parentProduct->product_min_per_order > 1 && $quantity_for_same_main_product < $parentProduct->product_min_per_order - $quantity) {
                 $quantity = $product->wanted_quantity = 0;
             }
         }
         if (!empty($parentProduct->product_max_per_order)) {
             $quantity_for_same_main_product =& $this->_getGlobalQuantityOfVariants($cartContent, $product, $cart_product_id_for_product);
             if ($quantity_for_same_main_product > $parentProduct->product_max_per_order) {
                 $in_excess = $quantity_for_same_main_product - $parentProduct->product_max_per_order;
                 if ($quantity > $in_excess) {
                     $quantity = $product->wanted_quantity = $quantity - $in_excess;
                     $quantity_for_same_main_product -= $in_excess;
                 } else {
                     $quantity_for_same_main_product -= $quantity;
                     $quantity = $product->wanted_quantity = 0;
                 }
             }
         }
         if ($product->product_max_per_order == 0) {
             $product->product_max_per_order = $parentProduct->product_max_per_order;
         }
     }
     if ($product->product_quantity >= 0 && $product->product_quantity < $quantity) {
         $product->wanted_quantity = $quantity = $product->product_quantity;
     }
     $quantity_for_same_product =& $this->_getGlobalQuantityOfProducts($cartContent, $product, $cart_product_id_for_product);
     if ($product->product_min_per_order > 1 && $product->product_min_per_order > $quantity_for_same_product) {
         $quantity = $product->product_min_per_order;
         if ($product->product_quantity >= 0 && $product->product_quantity < $quantity_for_same_product) {
             $quantity = 0;
         }
     }
     if ($product->product_max_per_order > 0 && $quantity_for_same_product > $product->product_max_per_order) {
         $in_excess = $quantity_for_same_product - $product->product_max_per_order;
         if ($quantity > $in_excess) {
             $quantity -= $in_excess;
             $quantity_for_same_product -= $in_excess;
         } else {
             $quantity_for_same_product -= $quantity;
             $quantity = 0;
         }
     }
     if (hikashop_level(1)) {
         $config =& hikashop_config();
         $item_limit = $config->get('cart_item_limit', 0);
         if (!empty($item_limit)) {
             $current_items = 0;
             if (!empty($cartContent)) {
                 foreach ($cartContent as $element) {
                     if ($element->product_id != $product->product_id) {
                         $current_items += (int) $element->cart_product_quantity;
                     }
                 }
             }
             $possible_quantity = $item_limit - $current_items;
             if ($quantity > $possible_quantity) {
                 if ($possible_quantity < 0) {
                     $possible_quantity = 0;
                 }
                 $quantity = $possible_quantity;
             }
         }
     }
     JPluginHelper::importPlugin('hikashop');
     $dispatcher = JDispatcher::getInstance();
     $displayErrors = true;
     $dispatcher->trigger('onAfterProductQuantityCheck', array(&$product, &$wantedQuantity, &$quantity, &$cartContent, &$cart_product_id_for_product, &$displayErrors));
     if ($displayErrors && $wantedQuantity > $quantity) {
         $app = JFactory::getApplication();
         if ($quantity == 0) {
             $app->enqueueMessage(JText::sprintf('LIMIT_REACHED_REMOVED', $product->product_name));
         } else {
             $app->enqueueMessage(JText::sprintf('LIMIT_REACHED', $product->product_name));
         }
     }
     $this->new_quantities[$product->product_id] = $quantity;
 }