diff --git a/addons/product/i18n/product.pot b/addons/product/i18n/product.pot
index 72db98d6569..8e9efa08c48 100644
--- a/addons/product/i18n/product.pot
+++ b/addons/product/i18n/product.pot
@@ -1854,6 +1854,18 @@ msgstr ""
msgid "You cannot define the decimal precision of 'Account' as greater than the rounding factor of the company's main currency"
msgstr ""
+#. module: product
+#: code:addons/product/wizard/product_price_list.py:26
+#, python-format
+msgid "You have to set a logo for your company."
+msgstr ""
+
+#. module: product
+#: code:addons/product/wizard/product_price_list.py:28
+#, python-format
+msgid "You have to set your reports's header and footer layout."
+msgstr ""
+
#. module: product
#: model:ir.actions.act_window,help:product.product_uom_form_action
msgid "You must define a conversion rate between several Units of\n"
diff --git a/addons/product/wizard/product_price_list.py b/addons/product/wizard/product_price_list.py
index de344bae5aa..8114c222ac6 100644
--- a/addons/product/wizard/product_price_list.py
+++ b/addons/product/wizard/product_price_list.py
@@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from odoo import api, fields, models
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
class product_price_list(models.TransientModel):
@@ -21,6 +22,11 @@ class product_price_list(models.TransientModel):
To get the date and print the report
@return : return report
"""
+ if (not self.env.user.company_id.logo):
+ raise UserError(_("You have to set a logo or a layout for your company."))
+ elif (not self.env.user.company_id.external_report_layout):
+ raise UserError(_("You have to set your reports's header and footer layout."))
+
datas = {'ids': self.env.context.get('active_ids', [])}
res = self.read(['price_list', 'qty1', 'qty2', 'qty3', 'qty4', 'qty5'])
res = res and res[0] or {}
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index a8136368b62..423e1f01a41 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -514,9 +514,10 @@ class SaleOrder(models.Model):
for tax in line.tax_id:
group = tax.tax_group_id
res.setdefault(group, 0.0)
- amount = tax.compute_all(line.price_reduce + base_tax, quantity=line.product_uom_qty,
- product=line.product_id, partner=self.partner_shipping_id)['taxes'][0]['amount']
- res[group] += amount
+ taxes = tax.compute_all(line.price_reduce + base_tax, quantity=line.product_uom_qty,
+ product=line.product_id, partner=self.partner_shipping_id)['taxes']
+ for t in taxes:
+ res[group] += t['amount']
if tax.include_base_amount:
base_tax += tax.compute_all(line.price_reduce + base_tax, quantity=1, product=line.product_id,
partner=self.partner_shipping_id)['taxes'][0]['amount']
diff --git a/addons/sale_margin/models/sale_order.py b/addons/sale_margin/models/sale_order.py
index 90f866ecfec..fe788d24bba 100644
--- a/addons/sale_margin/models/sale_order.py
+++ b/addons/sale_margin/models/sale_order.py
@@ -59,7 +59,12 @@ class SaleOrderLine(models.Model):
def _product_margin(self):
for line in self:
currency = line.order_id.pricelist_id.currency_id
- line.margin = currency.round(line.price_subtotal - ((line.purchase_price or line.product_id.standard_price) * line.product_uom_qty))
+ price = line.purchase_price
+ if not price:
+ from_cur = line.env.user.company_id.currency_id.with_context(date=line.order_id.date_order)
+ price = from_cur.compute(line.product_id.standard_price, currency, round=False)
+
+ line.margin = currency.round(line.price_subtotal - (price * line.product_uom_qty))
class SaleOrder(models.Model):
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 3b1b5511b38..e6d7017e6ef 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -142,16 +142,17 @@ class WebsiteSale(http.Controller):
(variant id, [visible attribute ids], variant price, variant sale price)
"""
# product attributes with at least two choices
- product = product.with_context(quantity=1)
+ quantity = product._context.get('quantity') or 1
+ product = product.with_context(quantity=quantity)
visible_attrs_ids = product.attribute_line_ids.filtered(lambda l: len(l.value_ids) > 1).mapped('attribute_id').ids
to_currency = request.website.get_current_pricelist().currency_id
attribute_value_ids = []
for variant in product.product_variant_ids:
if to_currency != product.currency_id:
- price = variant.currency_id.compute(variant.website_public_price, to_currency)
+ price = variant.currency_id.compute(variant.website_public_price, to_currency) / quantity
else:
- price = variant.website_public_price
+ price = variant.website_public_price / quantity
visible_attribute_ids = [v.id for v in variant.attribute_value_ids if v.attribute_id.id in visible_attrs_ids]
attribute_value_ids.append([variant.id, visible_attribute_ids, variant.website_price, price])
return attribute_value_ids
diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js
index 6ac948b4fe1..f7a8fa777bd 100644
--- a/addons/website_sale/static/src/js/website_sale.js
+++ b/addons/website_sale/static/src/js/website_sale.js
@@ -86,23 +86,30 @@ odoo.define('website_sale.website_sale', function (require) {
$(oe_website_sale).on("change", 'input[name="add_qty"]', function (event) {
var product_ids = [];
- var product_dom = $(".js_product .js_add_cart_variants[data-attribute_value_ids]").last();
+ var product_dom = $(".js_product .js_add_cart_variants[data-attribute_value_ids]");
+ var qty = $(event.target).closest('form').find('input[name="add_qty"]').val();
if (!product_dom.length) {
return;
}
- _.each(product_dom.data("attribute_value_ids"), function(entry) {
- product_ids.push(entry[0]);});
- var qty = $(event.target).closest('form').find('input[name="add_qty"]').val();
+ _.each(product_dom, function (prod) {
+ _.each($(prod).data("attribute_value_ids"), function(entry) {
+ if (product_ids.indexOf(entry[0]) === -1) {
+ product_ids.push(entry[0]);
+ }
+ });
+ });
if ($("#product_detail").length) {
// display the reduction from the pricelist in function of the quantity
ajax.jsonRpc("/shop/get_unit_price", 'call', {'product_ids': product_ids,'add_qty': parseInt(qty)})
.then(function (data) {
- var current = product_dom.data("attribute_value_ids");
- for(var j=0; j < current.length; j++){
- current[j][2] = data[current[j][0]];
- }
- product_dom.attr("data-attribute_value_ids", JSON.stringify(current)).trigger("change");
+ _.each(product_dom, function (prod) {
+ var current = $(prod).data("attribute_value_ids");
+ for(var j=0; j < current.length; j++){
+ current[j][2] = data[current[j][0]];
+ }
+ $(prod).trigger("change");
+ });
});
}
});
@@ -296,17 +303,18 @@ odoo.define('website_sale.website_sale', function (require) {
$(oe_website_sale).on('change', 'input.js_variant_change, select.js_variant_change, ul[data-attribute_value_ids]', function (ev) {
var $ul = $(ev.target).closest('.js_add_cart_variants');
var $parent = $ul.closest('.js_product');
- var $product_id = $parent.find('input.product_id').first();
- var $price = $parent.find(".oe_price:first .oe_currency_value")
- .add($('#product_confirmation').find(".oe_price"));
- var $default_price = $parent.find(".oe_default_price:first .oe_currency_value")
- .add($('#product_confirmation').find(".oe_default_price:first .oe_currency_value"));
+ var $product_id = $parent.find('.product_id').first();
+ var $price = $parent.find(".oe_price:first .oe_currency_value");
+ var $default_price = $parent.find(".oe_default_price:first .oe_currency_value");
var $optional_price = $parent.find(".oe_optional:first .oe_currency_value");
var variant_ids = $ul.data("attribute_value_ids");
var values = [];
+ var unchanged_values = $parent.find('div.oe_unchanged_value_ids').data('unchanged_value_ids') || [];
+
$parent.find('input.js_variant_change:checked, select.js_variant_change').each(function () {
values.push(+$(this).val());
});
+ values = values.concat(unchanged_values);
$parent.find("label").removeClass("text-muted css_not_available");
@@ -320,8 +328,10 @@ odoo.define('website_sale.website_sale', function (require) {
if (variant_ids[k][3]-variant_ids[k][2]>0.01) {
$default_price.closest('.oe_website_sale').addClass("discount");
$optional_price.closest('.oe_optional').show().css('text-decoration', 'line-through');
+ $default_price.parent().removeClass('hidden');
} else {
$optional_price.closest('.oe_optional').hide();
+ $default_price.parent().addClass('hidden');
}
product_id = variant_ids[k][0];
update_product_image(this, product_id);
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index 1ee297e52c5..5266bc486b7 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -451,7 +451,8 @@