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; }
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; }