id) return array(); // Product cache must be strictly compared to NULL, or else an empty cart will add dozens of queries if ($this->_products !== NULL AND !$refresh) return $this->_products; $sql = ' SELECT cp.`id_product_attribute`, cp.`id_product`, cu.`id_customization`, cp.`quantity` AS cart_quantity, cu.`quantity` AS customization_quantity, pl.`name`, pl.`description_short`, pl.`available_now`, pl.`available_later`, p.`id_product`, p.`id_category_default`, p.`id_supplier`, p.`id_manufacturer`, p.`on_sale`, p.`ecotax`, p.`additional_shipping_cost`, p.`available_for_order`, p.`quantity`, p.`price`, p.`weight`, p.`width`, p.`height`, p.`depth`, p.`out_of_stock`, p.`active`, p.`date_add`, p.`date_upd`, IFNULL(pa.`minimal_quantity`, p.`minimal_quantity`) as minimal_quantity, t.`id_tax`, tl.`name` AS tax, t.`rate`, pa.`price` AS price_attribute, pa.`quantity` AS quantity_attribute, pa.`ecotax` AS ecotax_attr, pl.`link_rewrite`, cl.`link_rewrite` AS category, CONCAT(cp.`id_product`, cp.`id_product_attribute`) AS unique_id, IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference, IF (IFNULL(pa.`supplier_reference`, \'\') = \'\', p.`supplier_reference`, pa.`supplier_reference`) AS supplier_reference, (p.`weight`+ pa.`weight`) weight_attribute, IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13, IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc, pai.`id_image` pai_id_image, il.`legend` pai_legend FROM `'._DB_PREFIX_.'cart_product` cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$this->id_lang.') LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.`id_product_attribute` = cp.`id_product_attribute`) LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$this->id_lang.') LEFT JOIN `'._DB_PREFIX_.'customization` cu ON (cp.`id_product` = cu.`id_product` AND cp.`id_product_attribute` = cu.`id_product_attribute` AND cu.`id_cart` = cp.`id_cart`) LEFT JOIN `'._DB_PREFIX_.'product_attribute_image` pai ON (pai.`id_product_attribute` = pa.`id_product_attribute`) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (il.`id_image` = pai.`id_image` AND il.`id_lang` = '.(int)$this->id_lang.') LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$this->id_lang.') WHERE cp.`id_cart` = '.(int)$this->id.' '.($id_product ? ' AND cp.`id_product` = '.(int)$id_product : '').' AND p.`id_product` IS NOT NULL GROUP BY unique_id ORDER BY cp.date_add ASC'; $result = Db::getInstance()->ExecuteS($sql); // Reset the cache before the following return, or else an empty cart will add dozens of queries $productsIds = array(); $paIds = array(); foreach ($result as $row) { $productsIds[] = $row['id_product']; $paIds[] = $row['id_product_attribute']; } // Thus you can avoid one query per product, because there will be only one query for all the products of the cart Product::cacheProductsFeatures($productsIds); self::cacheSomeAttributesLists($paIds, $this->id_lang); $this->_products = array(); if (empty($result)) return array(); foreach ($result AS $row) { if (isset($row['ecotax_attr']) AND $row['ecotax_attr'] > 0) $row['ecotax'] = (float)($row['ecotax_attr']); $row['stock_quantity'] = (int)($row['quantity']); // for compatibility with 1.2 themes $row['quantity'] = (int)($row['cart_quantity']); if (isset($row['id_product_attribute']) AND (int)$row['id_product_attribute']) { $row['weight'] = $row['weight_attribute']; $row['stock_quantity'] = $row['quantity_attribute']; } if ($this->_taxCalculationMethod == PS_TAX_EXC) { $row['price'] = Product::getPriceStatic((int)$row['id_product'], false, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, true, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL), $specificPriceOutput); // Here taxes are computed only once the quantity has been applied to the product price $row['price_wt'] = Product::getPriceStatic((int)$row['id_product'], true, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, true, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); $row['price_without_reduc'] = Product::getPriceStatic((int)$row['id_product'], true, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, false, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); $tax_rate = Tax::getProductTaxRate((int)$row['id_product'], (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); $row['total_wt'] = Tools::ps_round($row['price'] * (float)$row['cart_quantity'] * (1 + (float)($tax_rate) / 100), 2); $row['total'] = $row['price'] * (int)($row['cart_quantity']); } else { $row['price'] = Product::getPriceStatic((int)$row['id_product'], false, (int)$row['id_product_attribute'], 6, NULL, false, true, $row['cart_quantity'], false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL), $specificPriceOutput); $row['price_wt'] = Product::getPriceStatic((int)$row['id_product'], true, (int)$row['id_product_attribute'], 2, NULL, false, true, $row['cart_quantity'], false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); $row['price_without_reduc'] = Product::getPriceStatic((int)$row['id_product'], true, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, false, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); /* In case when you use QuantityDiscount, getPriceStatic() can be return more of 2 decimals */ $row['price_wt'] = Tools::ps_round($row['price_wt'], 2); $row['total_wt'] = $row['price_wt'] * (int)($row['cart_quantity']); $row['total'] = Tools::ps_round($row['price'] * (int)($row['cart_quantity']), 2); } if (!isset($row['pai_id_image']) OR $row['pai_id_image'] == 0) { $row2 = Db::getInstance()->getRow(' SELECT i.`id_image`, il.`legend` FROM `'._DB_PREFIX_.'image` i LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$this->id_lang.') WHERE i.`id_product` = '.(int)$row['id_product'].' AND i.`cover` = 1'); if (!$row2) $row2 = array('id_image' => false, 'legend' => false); else $row = array_merge($row, $row2); } else { $row['id_image'] = $row['pai_id_image']; $row['legend'] = $row['pai_legend']; } $row['reduction_applies'] = ($specificPriceOutput AND (float)$specificPriceOutput['reduction']); $row['id_image'] = Product::defineProductImage($row, $this->id_lang); $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); $row['features'] = Product::getFeaturesStatic((int)$row['id_product']); if (array_key_exists($row['id_product_attribute'].'-'.$this->id_lang, self::$_attributesLists)) $row = array_merge($row, self::$_attributesLists[$row['id_product_attribute'].'-'.$this->id_lang]); $this->_products[] = $row; } return $this->_products; } function getOrderShippingCost($id_carrier=NULL, $useTax=TRUE, $add_carrier_cost = true) { global $defaultCountry; if ($this->isVirtualCart()) return 0; // Checking discounts in cart $products = $this->getProducts(); $discounts = $this->getDiscounts(TRUE); if($discounts) { foreach($discounts as $id_discount) { if($id_discount['id_discount_type'] == 3) { if ($id_discount['minimal'] > 0) { $total_cart = 0; foreach($products as $product) { $total_cart += $product['total_wt']; } if($total_cart >= $id_discount['minimal']) { return 0; } } else { return 0; } } } } // Order total in default currency without fees $order_total = $this->getOrderTotal(TRUE, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING); // Start with shipping cost at 0 $shipping_cost = 0; // If no product added, return 0 if ($order_total <= 0 && !(int)(self::getNbProducts($this->id))) { return $shipping_cost; } // Get id zone if(isset($this->id_address_delivery) && $this->id_address_delivery && Customer::customerHasAddress($this->id_customer, $this->id_address_delivery)) { $id_zone = Address::getZoneById((int)($this->id_address_delivery)); } else { // This method can be called from the backend, and $defaultCountry won't be defined if(!Validate::isLoadedObject($defaultCountry)) { $defaultCountry = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); } $id_zone = (int)$defaultCountry->id_zone; } // If no carrier, select default one if(!$id_carrier) { $id_carrier = $this->id_carrier; } if($id_carrier && !$this->isCarrierInRange($id_carrier, $id_zone)) { $id_carrier = ''; } if(empty($id_carrier) && $this->isCarrierInRange(Configuration::get('PS_CARRIER_DEFAULT'), $id_zone)) { $id_carrier = (int)(Configuration::get('PS_CARRIER_DEFAULT')); } if(empty($id_carrier)) { if((int)($this->id_customer)) { $customer = new Customer((int)($this->id_customer)); $result = Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), TRUE, FALSE, (int)($id_zone), $customer->getGroups()); unset($customer); } else { $result = Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), TRUE, FALSE, (int)($id_zone)); } foreach ($result as $k => $row) { if ($row['id_carrier'] == Configuration::get('PS_CARRIER_DEFAULT')) { continue; } if (!isset(self::$_carriers[$row['id_carrier']])) { self::$_carriers[$row['id_carrier']] = new Carrier((int)($row['id_carrier'])); } $carrier = self::$_carriers[$row['id_carrier']]; // Get only carriers that are compliant with shipping method if(($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT && $carrier->getMaxDeliveryPriceByWeight($id_zone) === FALSE) || ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE && $carrier->getMaxDeliveryPriceByPrice($id_zone) === FALSE)) { unset($result[$k]); continue ; } // If out-of-range behavior carrier is set on "Desactivate carrier" if($row['range_behavior']) { // Get only carriers that have a range compatible with cart if(($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT && (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $this->getTotalWeight(), $id_zone))) || ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE && (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $this->getOrderTotal(TRUE, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, (int)($this->id_currency))))) { unset($result[$k]); continue ; } } if($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) { $shipping = $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); } else { $shipping = $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); } if(!isset($minShippingPrice)) { $minShippingPrice = $shipping; } if($shipping <= $minShippingPrice) { $id_carrier = (int)($row['id_carrier']); $minShippingPrice = $shipping; } } } if(empty($id_carrier)) { $id_carrier = Configuration::get('PS_CARRIER_DEFAULT'); } if(!isset(self::$_carriers[$id_carrier])) { self::$_carriers[$id_carrier] = new Carrier((int)($id_carrier), Configuration::get('PS_LANG_DEFAULT')); } $carrier = self::$_carriers[$id_carrier]; if(!Validate::isLoadedObject($carrier)) { die(Tools::displayError('Fatal error: "no default carrier"')); } if(!$carrier->active) { return $shipping_cost; } // Free fees if free carrier if($carrier->is_free == 1) { return 0; } // Select carrier tax if($useTax && !Tax::excludeTaxeOption()) { $carrierTax = Tax::getCarrierTaxRate((int)$carrier->id, (int)$this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); } $configuration = Configuration::getMultiple(array('PS_SHIPPING_FREE_PRICE', 'PS_SHIPPING_HANDLING', 'PS_SHIPPING_METHOD', 'PS_SHIPPING_FREE_WEIGHT')); include_once(dirname(__FILE__).'/../../modules/giftvoucher/giftvoucher.php'); $dgv = new GiftVoucher(); if ($dgv->checkFreeShippingPriceCart($this)) return 0; // Free fees $free_fees_price = 0; if(isset($configuration['PS_SHIPPING_FREE_PRICE'])) { $free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency))); } $orderTotalwithDiscounts = $this->getOrderTotal(TRUE, Cart::BOTH_WITHOUT_SHIPPING); if($orderTotalwithDiscounts >= (float)($free_fees_price) && (float)($free_fees_price) > 0) { return $shipping_cost; } if(isset($configuration['PS_SHIPPING_FREE_WEIGHT']) && $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) && (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0) { return $shipping_cost; } // Get shipping cost using correct method if($carrier->range_behavior) { // Get id zone if( isset($this->id_address_delivery) && $this->id_address_delivery && Customer::customerHasAddress($this->id_customer, $this->id_address_delivery) ) { $id_zone = Address::getZoneById((int)($this->id_address_delivery)); } else { $id_zone = (int)$defaultCountry->id_zone; } if(($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT && (!Carrier::checkDeliveryPriceByWeight($carrier->id, $this->getTotalWeight(), $id_zone))) || ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE && (!Carrier::checkDeliveryPriceByPrice($carrier->id, $this->getOrderTotal(TRUE, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, (int)($this->id_currency))))) { $shipping_cost += 0; } else { if ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) { $shipping_cost += $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); } else { // by price $shipping_cost += $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); } } } else { if($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) { $shipping_cost += $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); } else { $shipping_cost += $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); } } // Adding handling charges if(isset($configuration['PS_SHIPPING_HANDLING']) && $carrier->shipping_handling) { $shipping_cost += (float)($configuration['PS_SHIPPING_HANDLING']); } // Additional Shipping Cost per product foreach($products as $product) { $shipping_cost += $product['additional_shipping_cost'] * $product['cart_quantity']; } $shipping_cost = Tools::convertPrice($shipping_cost, Currency::getCurrencyInstance((int)($this->id_currency))); //get external shipping cost from module if($carrier->shipping_external) { $moduleName = $carrier->external_module_name; $module = Module::getInstanceByName($moduleName); if(Validate::isLoadedObject($module)) { if(array_key_exists('id_carrier', $module)) { $module->id_carrier = $carrier->id; } if($carrier->need_range) { $shipping_cost = $module->getOrderShippingCost($this, $shipping_cost); } else { $shipping_cost = $module->getOrderShippingCostExternal($this); } // Check if carrier is available if($shipping_cost === FALSE) { return FALSE; } } else { return FALSE; } } if(Module::isInstalled('privatesales')) { $product_cats = array(); foreach($products as $product) { $product_cats[] = $product['id_category_default']; } $sales = Db::getInstance()->ExecuteS(' SELECT DISTINCT `id_sale` FROM `'._DB_PREFIX_.'privatesale_category` WHERE `id_category` IN ('.implode(', ', $product_cats).') '); $cpt_sales = count($sales); // si consommables forcer à 5euros /*if ($cpt_sales==1) { foreach ($sales as $key => $sale) { if ((int) $sale['id_sale'] == (int) _SHOP_PRIVATESALES_CONSUMABLE) { $sale = new Sale((int)$sale['id_sale']); $sale_carriers = $sale->getCarriers(); foreach ($sale_carriers as $id_c) { if ((int) $carrier->id == (int) $id_c) { $shipping_cost = 5; $shipping_cost = Tools::convertPrice($shipping_cost, Currency::getCurrencyInstance((int)($this->id_currency))); return $shipping_cost; } } unset($sale_carriers); } } }*/ // Surcout transporteur classique // if ($carrier->id == 33 // || $carrier->id == 24 // || $carrier->id == 37 // || $carrier->id == 45) { // if ($carrier->id == 28 // || $carrier->id == 24 // || $carrier->id == 27) // if ($carrier->id == 45 // || $carrier->id == 46 // || $carrier->id == 47 // || $carrier->id == 48) { if($cpt_sales == 2) { $shipping_cost += (float) Configuration::get('PS_SHIPPING_HANDLING_PS_1'); } elseif($cpt_sales == 3) { $shipping_cost += (float) Configuration::get('PS_SHIPPING_HANDLING_PS_2'); } elseif($cpt_sales == 4) { $shipping_cost += (float) Configuration::get('PS_SHIPPING_HANDLING_PS_3'); } elseif($cpt_sales == 5) { $shipping_cost += (float) Configuration::get('PS_SHIPPING_HANDLING_PS_4'); } elseif($cpt_sales >= 6) { $shipping_cost += (float) Configuration::get('PS_SHIPPING_HANDLING_PS_4'); } // } } // Apply tax if(isset($carrierTax)) { $shipping_cost *= 1 + ($carrierTax / 100); } if(Module::isInstalled('privatesales') && $add_carrier_cost) { if (class_exists('Sale')) { if (in_array($carrier->id, self::$carrier_special)) { if(Configuration::get('PRIVATESALES_CARRIERFENCE') ) { $cart_products = $this->getProducts(); if(count($cart_products) > 0) { $_carriers = array(); foreach ($cart_products as $key => $cart_product) { $sale = Sale::getSaleFromCategory($cart_product['id_category_default']); if($sale) { $sale_carriers = $sale->getCarriers(); foreach ($sale_carriers as $carrier_test) { if (!in_array($carrier_test, $_carriers)) { $_carriers[] = $carrier_test; } } unset($sale_carriers); } } // not add self surcout $delete_self = array_search($carrier->id, $_carriers); unset($_carriers[$delete_self]); // ajout du surcout // $socolissimo_carriers = array(45, 33, 37, 22); // $socolissimo_carriers = array(24, 27, 28, 22); $socolissimo_carriers = array(87, 88, 89, 22); $socolissimo_found = false; foreach ($_carriers as $key => $carrier_to_add) { if (in_array($carrier_to_add, $socolissimo_carriers) ) { if (!$socolissimo_found ) { $cart = new Cart($this->id); // $total = $cart->getOrderShippingCost((int)$carrier_to_add, true, false); // $total = $cart->getOrderShippingCost(45, true, false); // $shipping_cost += $total; $shipping_cost += 8; $socolissimo_found = true; } else { continue; } } else { $cart = new Cart($this->id); $total = $cart->getOrderShippingCost((int)$carrier_to_add, true, false); $shipping_cost += $total; } } } } } } } return (float)(Tools::ps_round((float)($shipping_cost), 2)); } public function checkQuantitiesDetails() { if(Configuration::get('PS_CATALOG_MODE')) { return FALSE; } foreach($this->getProducts() as $product) { if(!$product['active'] || (!$product['allow_oosp'] && $product['stock_quantity'] < $product['cart_quantity']) || !$product['available_for_order']) { return $product; } } return TRUE; } function checkDiscountValidity($discountObj, $discounts, $order_total, $products, $checkCartDiscount = false) { global $cookie; if (!$order_total) return Tools::displayError('Cannot add voucher if order is free.'); if (!$discountObj->active) return Tools::displayError('This voucher has already been used or is disabled.'); if (!$discountObj->quantity) return Tools::displayError('This voucher has expired (usage limit attained).'); if ($discountObj->id_discount_type == 2 AND $this->id_currency != $discountObj->id_currency) return Tools::displayError('This voucher can only be used in the following currency:').' '.Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT `name` FROM `'._DB_PREFIX_.'currency` WHERE id_currency = '.(int)$discountObj->id_currency); if ($checkCartDiscount AND ( $this->getDiscountsCustomer($discountObj->id) >= $discountObj->quantity_per_user OR (Order::getDiscountsCustomer((int)($cookie->id_customer), $discountObj->id) + $this->getDiscountsCustomer($discountObj->id) >= $discountObj->quantity_per_user) >= $discountObj->quantity_per_user ) ) return Tools::displayError('You cannot use this voucher anymore (usage limit attained).'); if (strtotime($discountObj->date_from) > time()) return Tools::displayError('This voucher is not yet valid'); if (strtotime($discountObj->date_to) < time()) return Tools::displayError('This voucher has expired.'); if (sizeof($discounts) >= 1 AND $checkCartDiscount) { if (!$discountObj->cumulable) return Tools::displayError('This voucher is not valid with other current discounts.'); foreach ($discounts as $discount) if (!$discount['cumulable']) return Tools::displayError('Voucher is not valid with other discounts.'); foreach($discounts as $discount) if ($discount['id_discount'] == $discountObj->id) return Tools::displayError('This voucher is already in your cart'); } $groups = Customer::getGroupsStatic($this->id_customer); if (($discountObj->id_customer OR $discountObj->id_group) AND ((($this->id_customer != $discountObj->id_customer) OR ($this->id_customer == 0)) AND !in_array($discountObj->id_group, $groups))) { if (!$cookie->isLogged()) return Tools::displayError('You cannot use this voucher.').' - '.Tools::displayError('Please log in.'); return Tools::displayError('You cannot use this voucher.'); } $onlyProductWithDiscount = false; if (!$discountObj->cumulable_reduction) { foreach ($products as $product) if ($product['reduction_applies'] OR $product['on_sale']) $onlyProductWithDiscount = true; } if (!$discountObj->cumulable_reduction AND $onlyProductWithDiscount) return Tools::displayError('This voucher is not valid for marked or reduced products.'); $total_cart = 0; foreach($products AS $product) { if ((!$discountObj->cumulable_reduction AND !$product['reduction_applies'] AND !$product['on_sale']) OR $discountObj->cumulable_reduction) $total_cart += $discountObj->include_tax ? $product['total_wt'] : $product['total']; } // $categories = Discount::getCategories($discountObj->id); // $returnErrorNoProductCategory = true; // foreach($products AS $product) // { // if (count($categories)) // if (Product::idIsOnCategoryId($product['id_product'], $categories)) // { // if ((!$discountObj->cumulable_reduction AND !$product['reduction_applies'] AND !$product['on_sale']) OR $discountObj->cumulable_reduction) // $total_cart += $discountObj->include_tax ? $product['total_wt'] : $product['total']; // $returnErrorNoProductCategory = false; // } // } // if ($returnErrorNoProductCategory) // return Tools::displayError('This discount does not apply to that product category.'); if ($total_cart < $discountObj->minimal) return Tools::displayError('The order total is not high enough or this voucher cannot be used with those products.'); return false; } public function getDiscounts($lite = false, $refresh = false) { if (!$this->id) return array(); if (!$refresh) { if (!$lite AND isset(self::$_discounts[$this->id])) return self::$_discounts[$this->id]; if ($lite AND isset(self::$_discountsLite[$this->id])) return self::$_discountsLite[$this->id]; } $result = Db::getInstance()->ExecuteS(' SELECT d.*, `id_cart` FROM `'._DB_PREFIX_.'cart_discount` c LEFT JOIN `'._DB_PREFIX_.'discount` d ON c.`id_discount` = d.`id_discount` WHERE `id_cart` = '.(int)($this->id)); // $products = $this->getProducts(); // foreach ($result AS $k => $discount) // { // $categories = Discount::getCategories((int)($discount['id_discount'])); // $in_category = false; // foreach ($products AS $product) // if (Product::idIsOnCategoryId((int)($product['id_product']), $categories)) // { // $in_category = true; // break; // } // if (!$in_category) // unset($result[$k]); // } if ($lite) { self::$_discountsLite[$this->id] = $result; return $result; } $total_products_wt = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS); $total_products = $this->getOrderTotal(false, Cart::ONLY_PRODUCTS); $shipping_wt = $this->getOrderShippingCost(); $shipping = $this->getOrderShippingCost(NULL, false); self::$_discounts[$this->id] = array(); foreach ($result as $row) { $discount = new Discount($row['id_discount'], (int)($this->id_lang)); $row['description'] = $discount->description ? $discount->description : $discount->name; $row['value_real'] = $discount->getValue(sizeof($result), $total_products_wt, $shipping_wt, $this->id); $row['value_tax_exc'] = $discount->getValue(sizeof($result), $total_products, $shipping, $this->id, false); if ($row['value_real'] !== 0) self::$_discounts[$this->id][] = $row; else $this->deleteDiscount($row['id_discount']); } return isset(self::$_discounts[$this->id]) ? self::$_discounts[$this->id] : NULL; } /** * Return useful informations for cart * * @return array Cart details */ function getSummaryDetails() { global $cookie; $delivery = new Address((int)($this->id_address_delivery)); $invoice = new Address((int)($this->id_address_invoice)); // New layout system with personalization fields $formattedAddresses['invoice'] = AddressFormat::getFormattedLayoutData($invoice); $formattedAddresses['delivery'] = AddressFormat::getFormattedLayoutData($delivery); $total_tax = $this->getOrderTotal() - $this->getOrderTotal(false); if ($total_tax < 0) $total_tax = 0; $total_free_ship = 0; if ($free_ship = Tools::convertPrice((float)(Configuration::get('PS_SHIPPING_FREE_PRICE')), new Currency((int)($this->id_currency)))) { $discounts = $this->getDiscounts(); $total_free_ship = $free_ship - ($this->getOrderTotal(true, Cart::ONLY_PRODUCTS) + $this->getOrderTotal(true, Cart::ONLY_DISCOUNTS)); foreach ($discounts as $discount) if ($discount['id_discount_type'] == 3) { $total_free_ship = 0; break; } } $products = $this->getProducts(false); // assign delay to Products if (Module::isInstalled('privatesales_delay')) { require _PS_ROOT_DIR_.'/modules/privatesales_delay/saledelay.php'; $products = SaleDelay::associateDelay($products); } return array( 'delivery' => $delivery, 'delivery_state' => State::getNameById($delivery->id_state), 'invoice' => $invoice, 'invoice_state' => State::getNameById($invoice->id_state), 'formattedAddresses' => $formattedAddresses, 'carrier' => new Carrier((int)($this->id_carrier), $cookie->id_lang), 'products' => $products, 'discounts' => $this->getDiscounts(false, true), 'is_virtual_cart' => (int)$this->isVirtualCart(), 'total_discounts' => $this->getOrderTotal(true, Cart::ONLY_DISCOUNTS), 'total_discounts_tax_exc' => $this->getOrderTotal(false, Cart::ONLY_DISCOUNTS), 'total_wrapping' => $this->getOrderTotal(true, Cart::ONLY_WRAPPING), 'total_wrapping_tax_exc' => $this->getOrderTotal(false, Cart::ONLY_WRAPPING), 'total_shipping' => $this->getOrderShippingCost(), 'total_shipping_tax_exc' => $this->getOrderShippingCost(NULL, false), 'total_products_wt' => $this->getOrderTotal(true, Cart::ONLY_PRODUCTS), 'total_products' => $this->getOrderTotal(false, Cart::ONLY_PRODUCTS), 'total_price' => $this->getOrderTotal(), 'total_tax' => $total_tax, 'total_price_without_tax' => $this->getOrderTotal(false), 'free_ship' => $total_free_ship); } public function printVersion($value, $params) { $versions = array( 'en' => 1, 'fr' => 2, 'es' => 3, 'it' => 5, ); return ''; } }