// Fix some bug within sharing orders between shops

This commit is contained in:
rGaillard
2012-10-02 10:21:04 +00:00
parent 0aa2aa5a86
commit dbc87aa0b0
4 changed files with 93 additions and 24 deletions
+56 -15
View File
@@ -205,12 +205,12 @@ class CartCore extends ObjectModel
public function updateAddressId($id_address, $id_address_new)
{
$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;
$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;
$this->id_address_delivery = $id_address_new;
@@ -223,6 +223,12 @@ class CartCore extends ObjectModel
WHERE `id_cart` = '.(int)$this->id.'
AND `id_address_delivery` = '.(int)$id_address;
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()
@@ -411,6 +417,12 @@ class CartCore extends ObjectModel
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)
$id_country = Context::getContext()->country->id;
@@ -431,10 +443,10 @@ class CartCore extends ObjectModel
// Build JOIN
$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', '
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', '
@@ -451,7 +463,7 @@ class CartCore extends ObjectModel
$sql->leftJoin('category_lang', 'cl', '
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
@@ -492,7 +504,7 @@ class CartCore extends ObjectModel
');
$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('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))
return array();
$cart_shop_context = Context::getContext()->cloneContext();
foreach ($result as $row)
{
if (isset($row['ecotax_attr']) && $row['ecotax_attr'] > 0)
@@ -538,6 +551,9 @@ class CartCore extends ObjectModel
if (!Address::addressExists($address_id))
$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)
{
$row['price'] = Product::getPriceStatic(
@@ -553,7 +569,10 @@ class CartCore extends ObjectModel
((int)$this->id_customer ? (int)$this->id_customer : null),
(int)$this->id,
((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
$row['price_wt'] = Product::getPriceStatic(
@@ -568,7 +587,11 @@ class CartCore extends ObjectModel
false,
((int)$this->id_customer ? (int)$this->id_customer : null),
(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);
@@ -591,7 +614,10 @@ class CartCore extends ObjectModel
((int)$this->id_customer ? (int)$this->id_customer : null),
(int)$this->id,
((int)$address_id ? (int)$address_id : null),
$specific_price_output
$specific_price_output,
true,
true,
$cart_shop_context
);
$row['price_wt'] = Product::getPriceStatic(
@@ -606,9 +632,13 @@ class CartCore extends ObjectModel
false,
((int)$this->id_customer ? (int)$this->id_customer : null),
(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
$row['price_wt'] = Tools::ps_round($row['price_wt'], 2);
$row['total_wt'] = $row['price_wt'] * (int)$row['cart_quantity'];
@@ -1338,6 +1368,9 @@ class CartCore extends ObjectModel
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')
$address_id = (int)$this->id_address_invoice;
else
@@ -1360,7 +1393,11 @@ class CartCore extends ObjectModel
false,
(int)$this->id_customer ? (int)$this->id_customer : null,
(int)$this->id,
$address_id
$address_id,
$null,
true,
true,
$virtual_context
);
$total_ecotax = $product['ecotax'] * (int)$product['cart_quantity'];
@@ -1368,7 +1405,7 @@ class CartCore extends ObjectModel
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);
$total_price = ($total_price - $total_ecotax) * (1 + $product_tax_rate / 100);
@@ -1390,14 +1427,18 @@ class CartCore extends ObjectModel
false,
((int)$this->id_customer ? (int)$this->id_customer : null),
(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'];
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);
}
}
+11 -6
View File
@@ -2487,10 +2487,17 @@ class ProductCore extends ObjectModel
$id_customer = 0, $use_customer_price = true, $id_cart = 0, $real_quantity = 0)
{
static $address = null;
static $context = null;
if ($address === null)
$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)
$id_customer = 0;
@@ -2522,17 +2529,16 @@ class ProductCore extends ObjectModel
$sql = new DbQuery();
$sql->select('product_shop.`price`, product_shop.`ecotax`');
$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);
if (Combination::isFeatureActive())
{
$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->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
$sql->select('0 as id_product_attribute');
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
foreach ($res as $row)
{
@@ -2573,7 +2579,7 @@ class ProductCore extends ObjectModel
$address->id_state = $id_state;
$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();
// Add Tax
@@ -4197,14 +4203,13 @@ class ProductCore extends ObjectModel
{
if (!$context)
$context = Context::getContext();
$key = 'product_id_tax_rules_group_'.(int)$id_product.'_'.(int)$context->shop->id;
if (!Cache::isStored($key))
Cache::store($key,
Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `id_tax_rules_group`
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);
}
+5 -2
View File
@@ -250,10 +250,13 @@ class TaxCore extends ObjectModel
* @param integer $id_country
* @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);
$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_calculator = $tax_manager->getTaxCalculator();
+21 -1
View File
@@ -288,10 +288,30 @@ class ParentOrderControllerCore extends FrontController
Product::addCustomizationPrice($summary['products'], $customizedDatas);
}
$cart_product_context = Context::getContext()->cloneContext();
foreach ($summary['products'] as $key => &$product)
{
$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())
$product['is_discounted'] = $product['price_without_specific_price'] != $product['price'];
else