diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index e675ea343aa..5027f89cf86 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -66,9 +66,15 @@ class sale_configuration(osv.TransientModel):
(1, 'Display 3 fields on sales orders: customer, invoice address, delivery address')
], "Addresses", implied_group='sale.group_delivery_invoice_address'),
'sale_pricelist_setting': fields.selection([('fixed', 'A single sale price per product'), ('percentage', 'Different prices per customer segment'), ('formula', 'Advanced pricing based on formula')], required=True,
- help='Fix Price: all price manage from products sale price.\n'
- 'Different prices per Customer: you can assign price on buying of minimum quantity in products sale tab.\n'
- 'Advanced pricing based on formula: You can have all the rights on pricelist'),
+ help='Fix Price: all price manage from products sale price.\n'
+ 'Different prices per Customer: you can assign price on buying of minimum quantity in products sale tab.\n'
+ 'Advanced pricing based on formula: You can have all the rights on pricelist'),
+ 'group_show_price_subtotal': fields.boolean("Show subtotal", implied_group='sale.group_show_price_subtotal', group='base.group_portal,base.group_user,base.group_public'),
+ 'group_show_price_total': fields.boolean("Show total", implied_group='sale.group_show_price_total', group='base.group_portal,base.group_user,base.group_public'),
+ 'sale_show_tax': fields.selection([
+ ('total', 'Show line subtotals with taxes included (B2C)'),
+ ('subtotal', 'Show line subtotals without taxes (except if unit price includes taxes) (B2B)')], "Tax Display",
+ required=True),
'default_invoice_policy': fields.selection([
('order', 'Invoice ordered quantities'),
('delivery', 'Invoice delivered quantities')
@@ -87,6 +93,7 @@ class sale_configuration(osv.TransientModel):
_defaults = {
'sale_pricelist_setting': 'fixed',
+ 'sale_show_tax': 'subtotal',
'default_invoice_policy': 'order',
}
@@ -111,3 +118,13 @@ class sale_configuration(osv.TransientModel):
if sale_pricelist_setting == 'formula':
return {'value': {'group_pricelist_item': True, 'group_sale_pricelist': True, 'group_product_pricelist': False}}
return {'value': {'group_pricelist_item': False, 'group_sale_pricelist': False, 'group_product_pricelist': False}}
+
+ def set_sale_tax_defaults(self, cr, uid, ids, context=None):
+ sale_tax = self.browse(cr, uid, ids, context=context).sale_show_tax
+ res = self.pool.get('ir.values').set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'sale_show_tax', sale_tax)
+ return res
+
+ def onchange_sale_tax(self, cr, uid, ids, sale_show_tax, context=None):
+ res = {'value': dict(group_show_price_subtotal=False, group_show_price_total=False)}
+ res['value']['group_show_price_%s' % sale_show_tax] = True
+ return res
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index cb58e4ae0b6..7377bdbbeb6 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -22,6 +22,12 @@
+
+
+
+
+
+
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index c23326d1239..978edf40b2d 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -618,10 +618,20 @@ class SaleOrderLine(models.Model):
qty_invoiced -= self.env['product.uom']._compute_qty_obj(invoice_line.uom_id, invoice_line.quantity, line.product_uom)
line.qty_invoiced = qty_invoiced
- @api.depends('price_subtotal', 'product_uom_qty')
+ @api.depends('price_unit', 'discount')
def _get_price_reduce(self):
for line in self:
- line.price_reduce = line.price_subtotal / line.product_uom_qty if line.product_uom_qty else 0.0
+ line.price_reduce = line.price_unit * (1.0 - line.discount / 100.0)
+
+ @api.depends('price_total', 'product_uom_qty')
+ def _get_price_reduce_tax(self):
+ for line in self:
+ line.price_reduce_taxinc = line.price_total / line.product_uom_qty if line.product_uom_qty else 0.0
+
+ @api.depends('price_subtotal', 'product_uom_qty')
+ def _get_price_reduce_notax(self):
+ for line in self:
+ line.price_reduce_taxexcl = line.price_subtotal / line.product_uom_qty if line.product_uom_qty else 0.0
@api.multi
def _compute_tax_id(self):
@@ -723,6 +733,8 @@ class SaleOrderLine(models.Model):
price_reduce = fields.Monetary(compute='_get_price_reduce', string='Price Reduce', readonly=True, store=True)
tax_id = fields.Many2many('account.tax', string='Taxes', domain=['|', ('active', '=', False), ('active', '=', True)])
+ price_reduce_taxinc = fields.Monetary(compute='_get_price_reduce_tax', string='Price Reduce Tax inc', readonly=True, store=True)
+ price_reduce_taxexcl = fields.Monetary(compute='_get_price_reduce_notax', string='Price Reduce Tax excl', readonly=True, store=True)
discount = fields.Float(string='Discount (%)', digits=dp.get_precision('Discount'), default=0.0)
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 9f0e26b787b..20aec255e8b 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -282,7 +282,8 @@
-
+
+
diff --git a/addons/sale/security/sale_security.xml b/addons/sale/security/sale_security.xml
index 15d4be9dc1f..1c3c4c5fa69 100644
--- a/addons/sale/security/sale_security.xml
+++ b/addons/sale/security/sale_security.xml
@@ -13,6 +13,20 @@
+
+ Show subtotal
+
+
+ Only included taxes in the subtotal that are already included in the unit price.
+
+
+
+
+ Show total (tax inc)
+
+ Display the total of the line with all taxes included
+
+
Properties on lines
diff --git a/addons/sale/views/report_invoice_layouted.xml b/addons/sale/views/report_invoice_layouted.xml
index 4aee0b8f698..3f492f8de8e 100644
--- a/addons/sale/views/report_invoice_layouted.xml
+++ b/addons/sale/views/report_invoice_layouted.xml
@@ -15,7 +15,8 @@