diff --git a/addons/product/models/res_config_settings.py b/addons/product/models/res_config_settings.py index f1c0c189ef1fc9dd7f17d0f3f7046c7f9549f63e..2ebc411fb4945ef5e4d7aa85cf19835de7619e99 100644 --- a/addons/product/models/res_config_settings.py +++ b/addons/product/models/res_config_settings.py @@ -7,6 +7,7 @@ from odoo import api, fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' + group_discount_per_so_line = fields.Boolean("Discounts", implied_group='product.group_discount_per_so_line') group_uom = fields.Boolean("Units of Measure", implied_group='uom.group_uom') group_product_variant = fields.Boolean("Variants", implied_group='product.group_product_variant') module_sale_product_configurator = fields.Boolean("Product Configurator") @@ -42,3 +43,9 @@ class ResConfigSettings(models.TransientModel): If the user enables the product configurator -> enable the product variants as well""" if self.module_sale_product_configurator and not self.group_product_variant: self.group_product_variant = True + + def set_values(self): + super(ResConfigSettings, self).set_values() + if not self.group_discount_per_so_line: + pl = self.env['product.pricelist'].search([('discount_policy', '=', 'without_discount')]) + pl.write({'discount_policy': 'with_discount'}) diff --git a/addons/product/security/product_security.xml b/addons/product/security/product_security.xml index 3ee6d0294a2a554254ce867ca40b91be6b33c8a7..bb995448b1f85b4a558854517dd695cbd52ad2de 100644 --- a/addons/product/security/product_security.xml +++ b/addons/product/security/product_security.xml @@ -27,6 +27,11 @@ <field name="category_id" ref="base.module_category_hidden"/> </record> + <record id="group_discount_per_so_line" model="res.groups"> + <field name="name">Discount on lines</field> + <field name="category_id" ref="base.module_category_hidden"/> + </record> + </data> <data noupdate="1"> diff --git a/addons/product/views/product_pricelist_views.xml b/addons/product/views/product_pricelist_views.xml index ba70836b1ac1b20cff7291f581d27b32d9954cb6..ce292af874934966468f7b1d79da450a55d94fa5 100644 --- a/addons/product/views/product_pricelist_views.xml +++ b/addons/product/views/product_pricelist_views.xml @@ -102,6 +102,7 @@ <tree string="Products Price List"> <field name="sequence" widget="handle" /> <field name="name"/> + <field name="discount_policy" groups="product.group_discount_per_so_line"/> <field name="currency_id" groups="base.group_multi_currency"/> <field name="company_id" groups="base.group_multi_company"/> </tree> @@ -122,6 +123,7 @@ </div> <strong><i class="fa fa-money" role="img" aria-label="Currency" title="Currency"></i> <field name="currency_id"/></strong> </div> + <field name="discount_policy" groups="product.group_discount_per_so_line"/> </div> </t> </templates> @@ -140,6 +142,7 @@ <h1><field name="name" placeholder="e.g. USD Retailers"/></h1> </div> <group> + <field name="discount_policy" groups="product.group_discount_per_so_line" widget="radio"/> <field name="currency_id" groups="base.group_multi_currency"/> <field name="active" invisible="1"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> diff --git a/addons/sale/models/res_config_settings.py b/addons/sale/models/res_config_settings.py index df64ec7667cf6911271828f3a0f5ef737453790c..b95a4be0215525119d57db94a9e24f79012c3992 100644 --- a/addons/sale/models/res_config_settings.py +++ b/addons/sale/models/res_config_settings.py @@ -7,7 +7,6 @@ from odoo import api, fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' - group_discount_per_so_line = fields.Boolean("Discounts", implied_group='sale.group_discount_per_so_line') module_sale_margin = fields.Boolean("Margins") quotation_validity_days = fields.Integer(related='company_id.quotation_validity_days', string="Default Quotation Validity (Days)", readonly=False) use_quotation_validity_days = fields.Boolean("Default Quotation Validity", config_parameter='sale.use_quotation_validity_days') @@ -80,9 +79,6 @@ class ResConfigSettings(models.TransientModel): super(ResConfigSettings, self).set_values() if self.default_invoice_policy != 'order': self.env['ir.config_parameter'].set_param('sale.automatic_invoice', False) - if not self.group_discount_per_so_line: - pl = self.env['product.pricelist'].search([('discount_policy', '=', 'without_discount')]) - pl.write({'discount_policy': 'with_discount'}) @api.onchange('multi_sales_price', 'multi_sales_price_method') def _onchange_sale_price(self): diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 17e0d632cba6232801490d976b4e4631cd66910c..18a9ed263980a7080c7f65b5c7052df9c3ac4fe4 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -1517,7 +1517,7 @@ class SaleOrderLine(models.Model): if not (self.product_id and self.product_uom and self.order_id.partner_id and self.order_id.pricelist_id and self.order_id.pricelist_id.discount_policy == 'without_discount' and - self.env.user.has_group('sale.group_discount_per_so_line')): + self.env.user.has_group('product.group_discount_per_so_line')): return self.discount = 0.0 diff --git a/addons/sale/report/sale_report_templates.xml b/addons/sale/report/sale_report_templates.xml index 8b4ff5e1ff30e2d84f947ba3b3b4c0b3c3da1363..6172f3df91cb0b76042263c134a6b7974850912d 100644 --- a/addons/sale/report/sale_report_templates.xml +++ b/addons/sale/report/sale_report_templates.xml @@ -69,7 +69,7 @@ <th class="text-left">Description</th> <th class="text-right">Quantity</th> <th class="text-right">Unit Price</th> - <th t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line"> + <th t-if="display_discount" class="text-right" groups="product.group_discount_per_so_line"> <span>Disc.%</span> </th> <th class="text-right">Taxes</th> @@ -98,7 +98,7 @@ <td class="text-right"> <span t-field="line.price_unit"/> </td> - <td t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line"> + <td t-if="display_discount" class="text-right" groups="product.group_discount_per_so_line"> <span t-field="line.discount"/> </td> <td class="text-right"> diff --git a/addons/sale/security/sale_security.xml b/addons/sale/security/sale_security.xml index 5a0ff95b13c0e41e6eeaa2809bc9264e93d50069..cbcd4baf8c30988b926b33bb3e26fc6307546150 100644 --- a/addons/sale/security/sale_security.xml +++ b/addons/sale/security/sale_security.xml @@ -6,11 +6,6 @@ <field name="category_id" ref="base.module_category_hidden"/> </record> - <record id="group_discount_per_so_line" model="res.groups"> - <field name="name">Discount on lines</field> - <field name="category_id" ref="base.module_category_hidden"/> - </record> - <record id="group_warning_sale" model="res.groups"> <field name="name">A warning can be set on a product or a customer (Sale)</field> <field name="category_id" ref="base.module_category_hidden"/> diff --git a/addons/sale/tests/test_onchange.py b/addons/sale/tests/test_onchange.py index 5e1f39036b0f23e31b4416d5a50ef5a9bbb15d74..978cde5321a929429de3c79977503bd4e3e5a2f0 100644 --- a/addons/sale/tests/test_onchange.py +++ b/addons/sale/tests/test_onchange.py @@ -119,7 +119,7 @@ class TestOnchangeProductId(TransactionCase): computer_case.list_price = 100 partner = self.res_partner_model.create(dict(name="George")) categ_unit_id = self.ref('uom.product_uom_categ_unit') - goup_discount_id = self.ref('sale.group_discount_per_so_line') + goup_discount_id = self.ref('product.group_discount_per_so_line') self.env.user.write({'groups_id': [(4, goup_discount_id, 0)]}) new_uom = self.env['uom.uom'].create({ 'name': '10 units', @@ -170,7 +170,7 @@ class TestOnchangeProductId(TransactionCase): computer_case = self.env.ref('product.product_product_16') computer_case.list_price = 100 partner = self.res_partner_model.create(dict(name="George")) - goup_discount_id = self.ref('sale.group_discount_per_so_line') + goup_discount_id = self.ref('product.group_discount_per_so_line') self.env.user.write({'groups_id': [(4, goup_discount_id, 0)]}) first_pricelist = self.env['product.pricelist'].create({ diff --git a/addons/sale/tests/test_sale_pricelist.py b/addons/sale/tests/test_sale_pricelist.py index 3ad91d7dccce438d7e9e6db27b7d28e186a41bb5..0544b43745a9dfcd6a59a052359c840661a4156c 100644 --- a/addons/sale/tests/test_sale_pricelist.py +++ b/addons/sale/tests/test_sale_pricelist.py @@ -150,7 +150,7 @@ class TestSaleOrder(TestCommonSaleNoChart): def test_sale_with_pricelist_discount_excluded(self): """ Test SO with the pricelist 'discount displayed' and check discount and unit price appeared on its lines """ # Add group 'Discount on Lines' to the user - self.env.user.write({'groups_id': [(4, self.env.ref('sale.group_discount_per_so_line').id)]}) + self.env.user.write({'groups_id': [(4, self.env.ref('product.group_discount_per_so_line').id)]}) # Set product category on consumable products (for the pricelist item applying on this category) self.product_order.write({'categ_id': self.product_category_1.id}) diff --git a/addons/sale/views/res_config_settings_views.xml b/addons/sale/views/res_config_settings_views.xml index 2fd14089b071d50149577e40cdb9b8db003eddd2..9b0d7e20b99dfa4e3cc3a03a95d8ab27f0d9e416 100644 --- a/addons/sale/views/res_config_settings_views.xml +++ b/addons/sale/views/res_config_settings_views.xml @@ -79,17 +79,17 @@ </div> <h2>Pricing</h2> <div class="row mt16 o_settings_container"> - <div class="col-12 col-lg-6 o_setting_box" title="Apply manual discounts on sales order lines or display discounts computed from pricelists (option to activate in the pricelist configuration)."> - <div class="o_setting_left_pane"> - <field name="group_discount_per_so_line"/> - </div> - <div class="o_setting_right_pane"> - <label for="group_discount_per_so_line"/> - <div class="text-muted"> - Grant discounts on sales order lines - </div> - </div> - </div> + <div class="col-12 col-lg-6 o_setting_box" title="Apply manual discounts on sales order lines or display discounts computed from pricelists (option to activate in the pricelist configuration)."> + <div class="o_setting_left_pane"> + <field name="group_discount_per_so_line"/> + </div> + <div class="o_setting_right_pane"> + <label for="group_discount_per_so_line"/> + <div class="text-muted"> + Grant discounts on sales order lines + </div> + </div> + </div> <div class="col-12 col-lg-6 o_setting_box" title="Boost your sales with two kinds of discount programs: promotions and coupon codes. Specific conditions can be set (products, customers, minimum purchase amount, period). Rewards can be discounts (% or amount) or free products."> <div class="o_setting_left_pane"> <field name="module_sale_coupon" widget="upgrade_boolean"/> diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml index 416daf68bcef3b8f2c097c860327a1f0527a73db..176910533a671d1b5746680bffecdb717c63f0d5 100644 --- a/addons/sale/views/sale_views.xml +++ b/addons/sale/views/sale_views.xml @@ -370,8 +370,8 @@ <field name="price_unit"/> <field name="tax_id" widget="many2many_tags" options="{'no_create': True}" context="{'search_view_ref': 'account.account_tax_view_search'}" domain="[('type_tax_use','=','sale'),('company_id','=',parent.company_id)]" attrs="{'readonly': [('qty_invoiced', '>', 0)]}"/> - <label for="discount" groups="sale.group_discount_per_so_line"/> - <div name="discount" groups="sale.group_discount_per_so_line"> + <label for="discount" groups="product.group_discount_per_so_line"/> + <div name="discount" groups="product.group_discount_per_so_line"> <field name="discount" class="oe_inline"/> %% </div> <!-- @@ -518,7 +518,7 @@ attrs="{'readonly': [('qty_invoiced', '>', 0)]}" optional="show" /> - <field name="discount" string="Disc.%" groups="sale.group_discount_per_so_line" optional="show"/> + <field name="discount" string="Disc.%" groups="product.group_discount_per_so_line" optional="show"/> <field name="price_subtotal" widget="monetary" groups="account.group_show_line_subtotals_tax_excluded"/> <field name="price_total" widget="monetary" groups="account.group_show_line_subtotals_tax_included"/> <field name="state" invisible="1"/> @@ -974,7 +974,7 @@ </group> <group> <field name="price_unit" readonly="1"/> - <field name="discount" groups="sale.group_discount_per_so_line" readonly="1"/> + <field name="discount" groups="product.group_discount_per_so_line" readonly="1"/> <field name="price_subtotal" widget="monetary"/> <field name="tax_id" widget="many2many_tags" readonly="1"/> <field name="price_tax" widget="monetary"/> @@ -1119,7 +1119,7 @@ attrs="{'invisible': [('type', 'not in', ('out_invoice', 'out_refund', 'in_invoice', 'in_refund'))]}"/> </xpath> <xpath expr="//field[@name='invoice_line_ids']//field[@name='discount']" position="attributes"> - <attribute name="groups">sale.group_discount_per_so_line</attribute> + <attribute name="groups">product.group_discount_per_so_line</attribute> </xpath> <xpath expr="//group[@name='sale_info_group']" position="inside"> <field name="team_id"/> @@ -1138,41 +1138,6 @@ </field> </record> - <record id="product_pricelist_view_tree" model="ir.ui.view"> - <field name="name">product.pricelist.tree.inherit.product</field> - <field name="model">product.pricelist</field> - <field name="inherit_id" ref="product.product_pricelist_view_tree"/> - <field name="arch" type="xml"> - <field name="currency_id" position="before"> - <field name="discount_policy" groups="sale.group_discount_per_so_line"/> - </field> - </field> - </record> - - <record id="product_pricelist_view_form" model="ir.ui.view"> - <field name="name">product.pricelist.form.inherit.product</field> - <field name="model">product.pricelist</field> - <field name="inherit_id" ref="product.product_pricelist_view"/> - <field name="arch" type="xml"> - <field name="currency_id" position="before"> - <field name="discount_policy" groups="sale.group_discount_per_so_line" widget="radio"/> - </field> - </field> - </record> - - <record model="ir.ui.view" id="product_pricelist_view_kanban"> - <field name="name">product.pricelist.kanban.inherit.product</field> - <field name="model">product.pricelist</field> - <field name="inherit_id" ref="product.product_pricelist_view_kanban"/> - <field name="arch" type="xml"> - <data> - <xpath expr='//div[contains(@id, "product_pricelist")]' position="after"> - <field name="discount_policy"/> - </xpath> - </data> - </field> - </record> - <!-- search by Salesteams --> <record id="action_orders_salesteams" model="ir.actions.act_window"> <field name="name">Sales Orders</field> diff --git a/addons/sale_management/report/sale_report_templates.xml b/addons/sale_management/report/sale_report_templates.xml index dda8a00d7d1dfddc0a9851b3bb5585d783511745..69a2575651f634f181b5ab994413dbc77b134ee7 100644 --- a/addons/sale_management/report/sale_report_templates.xml +++ b/addons/sale_management/report/sale_report_templates.xml @@ -11,7 +11,7 @@ <thead> <tr> <th class="text-left">Description</th> - <th t-if="has_option_discount" groups="sale.group_discount_per_so_line" class="text-left">Disc.%</th> + <th t-if="has_option_discount" groups="product.group_discount_per_so_line" class="text-left">Disc.%</th> <th class="text-right">Unit Price</th> </tr> </thead> @@ -20,7 +20,7 @@ <td> <span t-field="option.name"/> </td> - <td t-if="has_option_discount" groups="sale.group_discount_per_so_line"> + <td t-if="has_option_discount" groups="product.group_discount_per_so_line"> <strong t-if="option.discount != 0.0" class="text-info"> <t t-esc="((option.discount % 1) and '%s' or '%d') % option.discount"/>% </strong> diff --git a/addons/sale_management/views/sale_order_template_views.xml b/addons/sale_management/views/sale_order_template_views.xml index 290c604d9eccb3644c7294aa53fb68cb7b0cebdb..71924d58b9904ef6e7b74c7e5fbfa37a6429beb5 100644 --- a/addons/sale_management/views/sale_order_template_views.xml +++ b/addons/sale_management/views/sale_order_template_views.xml @@ -56,8 +56,8 @@ <field name="product_uom_qty" class="oe_inline"/> </div> <field name="price_unit"/> - <label for="discount" groups="sale.group_discount_per_so_line"/> - <div groups="sale.group_discount_per_so_line"> + <label for="discount" groups="product.group_discount_per_so_line"/> + <div groups="product.group_discount_per_so_line"> <field name="discount" class="oe_inline"/> %% </div> </group> @@ -92,7 +92,7 @@ groups="uom.group_uom" attrs="{'required': [('display_type', '=', False)]}" /> - <field name="discount" groups="sale.group_discount_per_so_line"/> + <field name="discount" groups="product.group_discount_per_so_line"/> <field name="price_unit"/> </tree> </field> @@ -106,7 +106,7 @@ <field name="product_uom_category_id" invisible="1"/> <field name="uom_id" groups="uom.group_uom"/> <field name="price_unit"/> - <field name="discount" groups="sale.group_discount_per_so_line"/> + <field name="discount" groups="product.group_discount_per_so_line"/> </tree> </field> </page> diff --git a/addons/sale_management/views/sale_order_views.xml b/addons/sale_management/views/sale_order_views.xml index 1a5da2b49ab000d2bba23b99f7856bf3bc7ed65e..f6bbf7b89d617c4853f8bd893490b42e4b03350e 100644 --- a/addons/sale_management/views/sale_order_views.xml +++ b/addons/sale_management/views/sale_order_views.xml @@ -17,7 +17,7 @@ <field name="product_uom_category_id" invisible="1"/> <field name="uom_id" groups="uom.group_uom"/> <field name="price_unit"/> - <field name="discount" groups="sale.group_discount_per_so_line"/> + <field name="discount" groups="product.group_discount_per_so_line"/> <field name="is_present" /> </group> </form> @@ -74,7 +74,7 @@ <field name="uom_id" string="UoM" groups="uom.group_uom" optional="show"/> <field name="product_uom_category_id" invisible="1"/> <field name="price_unit"/> - <field name="discount" string="Disc.%" groups="sale.group_discount_per_so_line" optional="show"/> + <field name="discount" string="Disc.%" groups="product.group_discount_per_so_line" optional="show"/> <field name="is_present" invisible="1" /> <button name="button_add_to_order" class="oe_link" icon="fa-shopping-cart" title="Add to order lines" type="object" attrs="{'invisible': [('is_present', '=', True)]}"/> </tree>