// Fix some bug within sharing orders between shops
This commit is contained in:
+55
-14
@@ -205,12 +205,12 @@ class CartCore extends ObjectModel
|
|||||||
public function updateAddressId($id_address, $id_address_new)
|
public function updateAddressId($id_address, $id_address_new)
|
||||||
{
|
{
|
||||||
$to_update = false;
|
$to_update = false;
|
||||||
if ($this->id_address_invoice == $id_address)
|
if (!isset($this->id_address_invoice) || $this->id_address_invoice == $id_address)
|
||||||
{
|
{
|
||||||
$to_update = true;
|
$to_update = true;
|
||||||
$this->context->cart->id_address_invoice = $id_address_new;
|
$this->context->cart->id_address_invoice = $id_address_new;
|
||||||
}
|
}
|
||||||
if ($this->id_address_delivery == $id_address)
|
if (!isset($this->id_address_delivery) || $this->id_address_delivery == $id_address)
|
||||||
{
|
{
|
||||||
$to_update = true;
|
$to_update = true;
|
||||||
$this->id_address_delivery = $id_address_new;
|
$this->id_address_delivery = $id_address_new;
|
||||||
@@ -223,6 +223,12 @@ class CartCore extends ObjectModel
|
|||||||
WHERE `id_cart` = '.(int)$this->id.'
|
WHERE `id_cart` = '.(int)$this->id.'
|
||||||
AND `id_address_delivery` = '.(int)$id_address;
|
AND `id_address_delivery` = '.(int)$id_address;
|
||||||
Db::getInstance()->execute($sql);
|
Db::getInstance()->execute($sql);
|
||||||
|
|
||||||
|
$sql = 'UPDATE `'._DB_PREFIX_.'customization`
|
||||||
|
SET `id_address_delivery` = '.(int)$id_address_new.'
|
||||||
|
WHERE `id_cart` = '.(int)$this->id.'
|
||||||
|
AND `id_address_delivery` = '.(int)$id_address;
|
||||||
|
Db::getInstance()->execute($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
@@ -411,6 +417,12 @@ class CartCore extends ObjectModel
|
|||||||
return $this->_products;
|
return $this->_products;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$shop_group = Shop::getGroupFromShop(Shop::getContextShopID(), false);
|
||||||
|
if ($shop_group['share_order'])
|
||||||
|
$id_shop = 'cp.id_shop';
|
||||||
|
else
|
||||||
|
$id_shop = (int)Shop::getContextShopID();
|
||||||
|
|
||||||
if (!$id_country)
|
if (!$id_country)
|
||||||
$id_country = Context::getContext()->country->id;
|
$id_country = Context::getContext()->country->id;
|
||||||
|
|
||||||
@@ -431,10 +443,10 @@ class CartCore extends ObjectModel
|
|||||||
|
|
||||||
// Build JOIN
|
// Build JOIN
|
||||||
$sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
|
$sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
|
||||||
$sql->join(Shop::addSqlAssociation('product', 'p'));
|
$sql->innerJoin('product_shop', 'product_shop', 'product_shop.id_shop='.$id_shop);
|
||||||
$sql->leftJoin('product_lang', 'pl', '
|
$sql->leftJoin('product_lang', 'pl', '
|
||||||
p.`id_product` = pl.`id_product`
|
p.`id_product` = pl.`id_product`
|
||||||
AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl')
|
AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl', $id_shop)
|
||||||
);
|
);
|
||||||
|
|
||||||
$sql->leftJoin('tax_rule', 'tr', '
|
$sql->leftJoin('tax_rule', 'tr', '
|
||||||
@@ -451,7 +463,7 @@ class CartCore extends ObjectModel
|
|||||||
|
|
||||||
$sql->leftJoin('category_lang', 'cl', '
|
$sql->leftJoin('category_lang', 'cl', '
|
||||||
product_shop.`id_category_default` = cl.`id_category`
|
product_shop.`id_category_default` = cl.`id_category`
|
||||||
AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl')
|
AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl', $id_shop)
|
||||||
);
|
);
|
||||||
|
|
||||||
// @todo test if everything is ok, then refactorise call of this method
|
// @todo test if everything is ok, then refactorise call of this method
|
||||||
@@ -492,7 +504,7 @@ class CartCore extends ObjectModel
|
|||||||
');
|
');
|
||||||
|
|
||||||
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`');
|
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`');
|
||||||
$sql->join(Shop::addSqlAssociation('product_attribute', 'pa', false));
|
$sql->leftJoin('product_attribute_shop', 'product_attribute_shop', 'product_attribute_shop.id_shop='.$id_shop);
|
||||||
$sql->leftJoin('product_attribute_image', 'pai', 'pai.`id_product_attribute` = pa.`id_product_attribute`');
|
$sql->leftJoin('product_attribute_image', 'pai', 'pai.`id_product_attribute` = pa.`id_product_attribute`');
|
||||||
$sql->leftJoin('image_lang', 'il', 'il.id_image = pai.id_image AND il.id_lang = '.(int)$this->id_lang);
|
$sql->leftJoin('image_lang', 'il', 'il.id_image = pai.id_image AND il.id_lang = '.(int)$this->id_lang);
|
||||||
}
|
}
|
||||||
@@ -519,6 +531,7 @@ class CartCore extends ObjectModel
|
|||||||
if (empty($result))
|
if (empty($result))
|
||||||
return array();
|
return array();
|
||||||
|
|
||||||
|
$cart_shop_context = Context::getContext()->cloneContext();
|
||||||
foreach ($result as $row)
|
foreach ($result as $row)
|
||||||
{
|
{
|
||||||
if (isset($row['ecotax_attr']) && $row['ecotax_attr'] > 0)
|
if (isset($row['ecotax_attr']) && $row['ecotax_attr'] > 0)
|
||||||
@@ -538,6 +551,9 @@ class CartCore extends ObjectModel
|
|||||||
if (!Address::addressExists($address_id))
|
if (!Address::addressExists($address_id))
|
||||||
$address_id = null;
|
$address_id = null;
|
||||||
|
|
||||||
|
if ($cart_shop_context->shop->id != $row['id_shop'])
|
||||||
|
$cart_shop_context->shop = new Shop((int)$row['id_shop']);
|
||||||
|
|
||||||
if ($this->_taxCalculationMethod == PS_TAX_EXC)
|
if ($this->_taxCalculationMethod == PS_TAX_EXC)
|
||||||
{
|
{
|
||||||
$row['price'] = Product::getPriceStatic(
|
$row['price'] = Product::getPriceStatic(
|
||||||
@@ -553,7 +569,10 @@ class CartCore extends ObjectModel
|
|||||||
((int)$this->id_customer ? (int)$this->id_customer : null),
|
((int)$this->id_customer ? (int)$this->id_customer : null),
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
((int)$address_id ? (int)$address_id : null),
|
((int)$address_id ? (int)$address_id : null),
|
||||||
$specific_price_output
|
$specific_price_output,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$cart_shop_context
|
||||||
); // Here taxes are computed only once the quantity has been applied to the product price
|
); // Here taxes are computed only once the quantity has been applied to the product price
|
||||||
|
|
||||||
$row['price_wt'] = Product::getPriceStatic(
|
$row['price_wt'] = Product::getPriceStatic(
|
||||||
@@ -568,7 +587,11 @@ class CartCore extends ObjectModel
|
|||||||
false,
|
false,
|
||||||
((int)$this->id_customer ? (int)$this->id_customer : null),
|
((int)$this->id_customer ? (int)$this->id_customer : null),
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
((int)$address_id ? (int)$address_id : null)
|
((int)$address_id ? (int)$address_id : null),
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$cart_shop_context
|
||||||
);
|
);
|
||||||
|
|
||||||
$tax_rate = Tax::getProductTaxRate((int)$row['id_product'], (int)$address_id);
|
$tax_rate = Tax::getProductTaxRate((int)$row['id_product'], (int)$address_id);
|
||||||
@@ -591,7 +614,10 @@ class CartCore extends ObjectModel
|
|||||||
((int)$this->id_customer ? (int)$this->id_customer : null),
|
((int)$this->id_customer ? (int)$this->id_customer : null),
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
((int)$address_id ? (int)$address_id : null),
|
((int)$address_id ? (int)$address_id : null),
|
||||||
$specific_price_output
|
$specific_price_output,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$cart_shop_context
|
||||||
);
|
);
|
||||||
|
|
||||||
$row['price_wt'] = Product::getPriceStatic(
|
$row['price_wt'] = Product::getPriceStatic(
|
||||||
@@ -606,7 +632,11 @@ class CartCore extends ObjectModel
|
|||||||
false,
|
false,
|
||||||
((int)$this->id_customer ? (int)$this->id_customer : null),
|
((int)$this->id_customer ? (int)$this->id_customer : null),
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
((int)$address_id ? (int)$address_id : null)
|
((int)$address_id ? (int)$address_id : null),
|
||||||
|
$null,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$cart_shop_context
|
||||||
);
|
);
|
||||||
|
|
||||||
// In case when you use QuantityDiscount, getPriceStatic() can be return more of 2 decimals
|
// In case when you use QuantityDiscount, getPriceStatic() can be return more of 2 decimals
|
||||||
@@ -1338,6 +1368,9 @@ class CartCore extends ObjectModel
|
|||||||
|
|
||||||
foreach ($products as $product) // products refer to the cart details
|
foreach ($products as $product) // products refer to the cart details
|
||||||
{
|
{
|
||||||
|
if ($virtual_context->shop->id != $product['id_shop'])
|
||||||
|
$virtual_context->shop = new Shop((int)$product['id_shop']);
|
||||||
|
|
||||||
if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_invoice')
|
if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_invoice')
|
||||||
$address_id = (int)$this->id_address_invoice;
|
$address_id = (int)$this->id_address_invoice;
|
||||||
else
|
else
|
||||||
@@ -1360,7 +1393,11 @@ class CartCore extends ObjectModel
|
|||||||
false,
|
false,
|
||||||
(int)$this->id_customer ? (int)$this->id_customer : null,
|
(int)$this->id_customer ? (int)$this->id_customer : null,
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
$address_id
|
$address_id,
|
||||||
|
$null,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$virtual_context
|
||||||
);
|
);
|
||||||
|
|
||||||
$total_ecotax = $product['ecotax'] * (int)$product['cart_quantity'];
|
$total_ecotax = $product['ecotax'] * (int)$product['cart_quantity'];
|
||||||
@@ -1368,7 +1405,7 @@ class CartCore extends ObjectModel
|
|||||||
|
|
||||||
if ($with_taxes)
|
if ($with_taxes)
|
||||||
{
|
{
|
||||||
$product_tax_rate = (float)Tax::getProductTaxRate((int)$product['id_product'], (int)$address_id);
|
$product_tax_rate = (float)Tax::getProductTaxRate((int)$product['id_product'], (int)$address_id, $virtual_context);
|
||||||
$product_eco_tax_rate = Tax::getProductEcotaxRate((int)$address_id);
|
$product_eco_tax_rate = Tax::getProductEcotaxRate((int)$address_id);
|
||||||
|
|
||||||
$total_price = ($total_price - $total_ecotax) * (1 + $product_tax_rate / 100);
|
$total_price = ($total_price - $total_ecotax) * (1 + $product_tax_rate / 100);
|
||||||
@@ -1390,14 +1427,18 @@ class CartCore extends ObjectModel
|
|||||||
false,
|
false,
|
||||||
((int)$this->id_customer ? (int)$this->id_customer : null),
|
((int)$this->id_customer ? (int)$this->id_customer : null),
|
||||||
(int)$this->id,
|
(int)$this->id,
|
||||||
((int)$address_id ? (int)$address_id : null)
|
((int)$address_id ? (int)$address_id : null),
|
||||||
|
$null,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$virtual_context
|
||||||
);
|
);
|
||||||
|
|
||||||
$total_price = Tools::ps_round($price, 2) * (int)$product['cart_quantity'];
|
$total_price = Tools::ps_round($price, 2) * (int)$product['cart_quantity'];
|
||||||
|
|
||||||
if (!$with_taxes)
|
if (!$with_taxes)
|
||||||
{
|
{
|
||||||
$product_tax_rate = (float)Tax::getProductTaxRate((int)$product['id_product'], (int)$address_id);
|
$product_tax_rate = (float)Tax::getProductTaxRate((int)$product['id_product'], (int)$address_id, $virtual_context);
|
||||||
$total_price = Tools::ps_round($total_price / (1 + ($product_tax_rate / 100)), 2);
|
$total_price = Tools::ps_round($total_price / (1 + ($product_tax_rate / 100)), 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-6
@@ -2487,10 +2487,17 @@ class ProductCore extends ObjectModel
|
|||||||
$id_customer = 0, $use_customer_price = true, $id_cart = 0, $real_quantity = 0)
|
$id_customer = 0, $use_customer_price = true, $id_cart = 0, $real_quantity = 0)
|
||||||
{
|
{
|
||||||
static $address = null;
|
static $address = null;
|
||||||
|
static $context = null;
|
||||||
|
|
||||||
if ($address === null)
|
if ($address === null)
|
||||||
$address = new Address();
|
$address = new Address();
|
||||||
|
|
||||||
|
if ($context == null)
|
||||||
|
$context = Context::getContext()->cloneContext();
|
||||||
|
|
||||||
|
if ($context->shop->id != (int)$id_shop)
|
||||||
|
$context->shop = new Shop((int)$id_shop);
|
||||||
|
|
||||||
if (!$use_customer_price)
|
if (!$use_customer_price)
|
||||||
$id_customer = 0;
|
$id_customer = 0;
|
||||||
|
|
||||||
@@ -2522,17 +2529,16 @@ class ProductCore extends ObjectModel
|
|||||||
$sql = new DbQuery();
|
$sql = new DbQuery();
|
||||||
$sql->select('product_shop.`price`, product_shop.`ecotax`');
|
$sql->select('product_shop.`price`, product_shop.`ecotax`');
|
||||||
$sql->from('product', 'p');
|
$sql->from('product', 'p');
|
||||||
$sql->join(Shop::addSqlAssociation('product', 'p'));
|
$sql->innerJoin('product_shop', 'product_shop', '(product_shop.id_product=p.id_product AND product_shop.id_shop='.(int)$id_shop.')');
|
||||||
$sql->where('p.`id_product` = '.(int)$id_product);
|
$sql->where('p.`id_product` = '.(int)$id_product);
|
||||||
if (Combination::isFeatureActive())
|
if (Combination::isFeatureActive())
|
||||||
{
|
{
|
||||||
$sql->select('product_attribute_shop.id_product_attribute, product_attribute_shop.`price` AS attribute_price, product_attribute_shop.default_on');
|
$sql->select('product_attribute_shop.id_product_attribute, product_attribute_shop.`price` AS attribute_price, product_attribute_shop.default_on');
|
||||||
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product` = p.`id_product`');
|
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product` = p.`id_product`');
|
||||||
$sql->join(Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.id_shop ='.(int)$id_shop));
|
$sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.id_product_attribute=pa.id_product AND product_attribute_shop.id_shop='.(int)$id_shop.')');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$sql->select('0 as id_product_attribute');
|
$sql->select('0 as id_product_attribute');
|
||||||
|
|
||||||
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
||||||
foreach ($res as $row)
|
foreach ($res as $row)
|
||||||
{
|
{
|
||||||
@@ -2573,7 +2579,7 @@ class ProductCore extends ObjectModel
|
|||||||
$address->id_state = $id_state;
|
$address->id_state = $id_state;
|
||||||
$address->postcode = $zipcode;
|
$address->postcode = $zipcode;
|
||||||
|
|
||||||
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int)$id_product));
|
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int)$id_product, $context));
|
||||||
$product_tax_calculator = $tax_manager->getTaxCalculator();
|
$product_tax_calculator = $tax_manager->getTaxCalculator();
|
||||||
|
|
||||||
// Add Tax
|
// Add Tax
|
||||||
@@ -4197,14 +4203,13 @@ class ProductCore extends ObjectModel
|
|||||||
{
|
{
|
||||||
if (!$context)
|
if (!$context)
|
||||||
$context = Context::getContext();
|
$context = Context::getContext();
|
||||||
|
|
||||||
$key = 'product_id_tax_rules_group_'.(int)$id_product.'_'.(int)$context->shop->id;
|
$key = 'product_id_tax_rules_group_'.(int)$id_product.'_'.(int)$context->shop->id;
|
||||||
if (!Cache::isStored($key))
|
if (!Cache::isStored($key))
|
||||||
Cache::store($key,
|
Cache::store($key,
|
||||||
Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
|
||||||
SELECT `id_tax_rules_group`
|
SELECT `id_tax_rules_group`
|
||||||
FROM `'._DB_PREFIX_.'product_shop`
|
FROM `'._DB_PREFIX_.'product_shop`
|
||||||
WHERE `id_product` = '.(int)$id_product.' AND id_shop='.(int)Context::getContext()->shop->id));
|
WHERE `id_product` = '.(int)$id_product.' AND id_shop='.(int)$context->shop->id));
|
||||||
|
|
||||||
return Cache::retrieve($key);
|
return Cache::retrieve($key);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -250,10 +250,13 @@ class TaxCore extends ObjectModel
|
|||||||
* @param integer $id_country
|
* @param integer $id_country
|
||||||
* @return Tax
|
* @return Tax
|
||||||
*/
|
*/
|
||||||
public static function getProductTaxRate($id_product, $id_address = null)
|
public static function getProductTaxRate($id_product, $id_address = null, Context $context = null)
|
||||||
{
|
{
|
||||||
|
if ($context == null)
|
||||||
|
$context = Context::getContext();
|
||||||
|
|
||||||
$address = Address::initialize($id_address);
|
$address = Address::initialize($id_address);
|
||||||
$id_tax_rules = (int)Product::getIdTaxRulesGroupByIdProduct($id_product);
|
$id_tax_rules = (int)Product::getIdTaxRulesGroupByIdProduct($id_product, $context);
|
||||||
|
|
||||||
$tax_manager = TaxManagerFactory::getManager($address, $id_tax_rules);
|
$tax_manager = TaxManagerFactory::getManager($address, $id_tax_rules);
|
||||||
$tax_calculator = $tax_manager->getTaxCalculator();
|
$tax_calculator = $tax_manager->getTaxCalculator();
|
||||||
|
|||||||
@@ -288,10 +288,30 @@ class ParentOrderControllerCore extends FrontController
|
|||||||
Product::addCustomizationPrice($summary['products'], $customizedDatas);
|
Product::addCustomizationPrice($summary['products'], $customizedDatas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cart_product_context = Context::getContext()->cloneContext();
|
||||||
foreach ($summary['products'] as $key => &$product)
|
foreach ($summary['products'] as $key => &$product)
|
||||||
{
|
{
|
||||||
$product['quantity'] = $product['cart_quantity'];// for compatibility with 1.2 themes
|
$product['quantity'] = $product['cart_quantity'];// for compatibility with 1.2 themes
|
||||||
$product['price_without_specific_price'] = Product::getPriceStatic($product['id_product'], !Product::getTaxCalculationMethod(), $product['id_product_attribute'], 2, null, false, false);
|
|
||||||
|
if ($cart_product_context->shop->id != $product['id_shop'])
|
||||||
|
$cart_product_context->shop = new Shop((int)$product['id_shop']);
|
||||||
|
$product['price_without_specific_price'] = Product::getPriceStatic($product['id_product'],
|
||||||
|
!Product::getTaxCalculationMethod(),
|
||||||
|
$product['id_product_attribute'],
|
||||||
|
2,
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
$null,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
$cart_product_context);
|
||||||
|
|
||||||
if (Product::getTaxCalculationMethod())
|
if (Product::getTaxCalculationMethod())
|
||||||
$product['is_discounted'] = $product['price_without_specific_price'] != $product['price'];
|
$product['is_discounted'] = $product['price_without_specific_price'] != $product['price'];
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user