From b6f59380b8ecc0a8216ce293b2438bd42c043aaf Mon Sep 17 00:00:00 2001 From: "sergio.teruel" Date: Sun, 26 Aug 2018 09:45:55 +0200 Subject: [PATCH 01/30] [11.0][NEW] sale_order_general_discount: New module for apply a discount for all sale order lines --- sale_order_general_discount/README.rst | 1 + sale_order_general_discount/__init__.py | 3 + sale_order_general_discount/__manifest__.py | 21 ++++++ sale_order_general_discount/i18n/es.po | 40 ++++++++++ .../models/__init__.py | 3 + .../models/res_partner.py | 15 ++++ sale_order_general_discount/models/sale.py | 48 ++++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 + sale_order_general_discount/readme/USAGE.rst | 6 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes sale_order_general_discount/tests/__init__.py | 3 + .../tests/test_sale_order_general_discount.py | 71 ++++++++++++++++++ .../views/res_partner_view.xml | 17 +++++ .../views/sale_order_view.xml | 18 +++++ 15 files changed, 251 insertions(+) create mode 100644 sale_order_general_discount/README.rst create mode 100644 sale_order_general_discount/__init__.py create mode 100644 sale_order_general_discount/__manifest__.py create mode 100644 sale_order_general_discount/i18n/es.po create mode 100644 sale_order_general_discount/models/__init__.py create mode 100644 sale_order_general_discount/models/res_partner.py create mode 100644 sale_order_general_discount/models/sale.py create mode 100644 sale_order_general_discount/readme/CONTRIBUTORS.rst create mode 100644 sale_order_general_discount/readme/DESCRIPTION.rst create mode 100644 sale_order_general_discount/readme/USAGE.rst create mode 100644 sale_order_general_discount/static/description/icon.png create mode 100644 sale_order_general_discount/tests/__init__.py create mode 100644 sale_order_general_discount/tests/test_sale_order_general_discount.py create mode 100644 sale_order_general_discount/views/res_partner_view.xml create mode 100644 sale_order_general_discount/views/sale_order_view.xml diff --git a/sale_order_general_discount/README.rst b/sale_order_general_discount/README.rst new file mode 100644 index 00000000000..3f626252963 --- /dev/null +++ b/sale_order_general_discount/README.rst @@ -0,0 +1 @@ +**This file is going to be generated by oca-gen-addon-readme.** diff --git a/sale_order_general_discount/__init__.py b/sale_order_general_discount/__init__.py new file mode 100644 index 00000000000..31660d6a965 --- /dev/null +++ b/sale_order_general_discount/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/sale_order_general_discount/__manifest__.py b/sale_order_general_discount/__manifest__.py new file mode 100644 index 00000000000..acfa1a1a46d --- /dev/null +++ b/sale_order_general_discount/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + 'name': 'Sale Order General Discount', + 'summary': 'General discount per sale order', + 'version': '11.0.1.0.0', + 'development_status': 'Production/Stable', + 'category': 'Sales', + 'website': 'https://github.com/OCA/sale-workflow', + 'author': 'Tecnativa, Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'application': False, + 'installable': True, + 'depends': [ + 'sale', + ], + 'data': [ + 'views/sale_order_view.xml', + 'views/res_partner_view.xml', + ], +} diff --git a/sale_order_general_discount/i18n/es.po b/sale_order_general_discount/i18n/es.po new file mode 100644 index 00000000000..a5fa930e225 --- /dev/null +++ b/sale_order_general_discount/i18n/es.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_general_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-31 09:08+0200\n" +"PO-Revision-Date: 2018-07-31 09:09+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.7.1\n" +"Last-Translator: Sergio Teruel \n" +"Language: es\n" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_discount +msgid "Discount (%)" +msgstr "Descuento (%)" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order +msgid "Quotation" +msgstr "Presupuesto" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order_line +msgid "Sales Order Line" +msgstr "Líneas de pedido" diff --git a/sale_order_general_discount/models/__init__.py b/sale_order_general_discount/models/__init__.py new file mode 100644 index 00000000000..31431c32a45 --- /dev/null +++ b/sale_order_general_discount/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import res_partner +from . import sale diff --git a/sale_order_general_discount/models/res_partner.py b/sale_order_general_discount/models/res_partner.py new file mode 100644 index 00000000000..b5658e77fc4 --- /dev/null +++ b/sale_order_general_discount/models/res_partner.py @@ -0,0 +1,15 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models +from odoo.addons import decimal_precision as dp + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + sale_discount = fields.Float( + digits=dp.get_precision('Discount'), + string='Discount (%)', + company_dependent=True, + ) diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale.py new file mode 100644 index 00000000000..796fb09e880 --- /dev/null +++ b/sale_order_general_discount/models/sale.py @@ -0,0 +1,48 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models +from odoo.addons import decimal_precision as dp +from lxml import etree + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + general_discount = fields.Float( + digits=dp.get_precision('Discount'), + string='Discount (%)', + ) + + @api.onchange('partner_id') + def onchange_partner_id(self): + super().onchange_partner_id() + self.general_discount = self.partner_id.sale_discount + + @api.onchange('general_discount') + def onchange_general_discount(self): + self.mapped('order_line').update({ + 'discount': self.general_discount, + }) + + @api.model + def fields_view_get(self, view_id=None, view_type='form', toolbar=False, + submenu=False): + """The purpose of this is write a context on order_line field + respecting other contexts on this field. + There is PR (https://github.com/odoo/odoo/pull/26607) to odoo for + avoid this, only update field in xml view and remove this method""" + res = super(SaleOrder, self).fields_view_get( + view_id, view_type, toolbar, submenu) + if view_type == 'form': + order_xml = etree.XML(res['arch']) + order_line_path = "//field[@name='order_line']" + order_line_fields = order_xml.xpath(order_line_path) + if order_line_fields: + order_line_field = order_line_fields[0] + context = order_line_field.attrib.get("context", "{}") + context = context.replace( + "{", + "{'default_discount': general_discount, ", 1) + order_line_field.attrib['context'] = context + res['arch'] = etree.tostring(order_xml) + return res diff --git a/sale_order_general_discount/readme/CONTRIBUTORS.rst b/sale_order_general_discount/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..f24a0b0dc74 --- /dev/null +++ b/sale_order_general_discount/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Sergio Teruel diff --git a/sale_order_general_discount/readme/DESCRIPTION.rst b/sale_order_general_discount/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..4fb3a80f7e2 --- /dev/null +++ b/sale_order_general_discount/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module allows to set a general discount in a sales order. This general +discount is set to each line order in the standard `discount` field. + +You can also set a default general discount on customers. diff --git a/sale_order_general_discount/readme/USAGE.rst b/sale_order_general_discount/readme/USAGE.rst new file mode 100644 index 00000000000..9275da26896 --- /dev/null +++ b/sale_order_general_discount/readme/USAGE.rst @@ -0,0 +1,6 @@ +To use this module, you need to: + +#. Create a sale order and set a discount in "sales and purchase" tab, this +discount will be set in all lines. +#. Also you can set a discount in a partner. + diff --git a/sale_order_general_discount/static/description/icon.png b/sale_order_general_discount/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_order_general_discount/tests/__init__.py b/sale_order_general_discount/tests/__init__.py new file mode 100644 index 00000000000..59f14ef51a4 --- /dev/null +++ b/sale_order_general_discount/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_sale_order_general_discount diff --git a/sale_order_general_discount/tests/test_sale_order_general_discount.py b/sale_order_general_discount/tests/test_sale_order_general_discount.py new file mode 100644 index 00000000000..5767ccb1933 --- /dev/null +++ b/sale_order_general_discount/tests/test_sale_order_general_discount.py @@ -0,0 +1,71 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import SavepointCase +from lxml import etree + + +class TestSaleOrderLineInput(SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env['res.partner'].create({ + 'name': 'Test', + 'sale_discount': 10.0, + }) + cls.product = cls.env['product.product'].create({ + 'name': 'test_product', + 'type': 'service', + }) + cls.order = cls.env['sale.order'].create({ + 'partner_id': cls.partner.id, + 'order_line': [(0, 0, { + 'name': cls.product.name, + 'product_id': cls.product.id, + 'product_uom_qty': 1, + 'product_uom': cls.product.uom_id.id, + 'price_unit': 1000.00, + })], + 'pricelist_id': cls.env.ref('product.list0').id, + }) + cls.View = cls.env['ir.ui.view'] + + def test_default_partner_discount(self): + self.order.onchange_partner_id() + self.assertEqual( + self.order.general_discount, self.partner.sale_discount) + + def test_sale_order_values(self): + self.order.general_discount = 10 + self.order.onchange_general_discount() + self.assertEqual(self.order.order_line.price_reduce, 900.00) + + def _get_ctx_from_view(self, res): + order_xml = etree.XML(res['arch']) + order_line_path = "//field[@name='order_line']" + order_line_field = order_xml.xpath(order_line_path)[0] + return order_line_field.attrib.get("context", "{}") + + def test_default_line_discount_value(self): + + res = self.order.fields_view_get( + view_id=self.env.ref('sale_order_general_discount.' + 'sale_order_general_discount_form_view').id, + view_type='form') + ctx = self._get_ctx_from_view(res) + self.assertTrue('default_discount' in ctx) + view = self.View.create({ + 'name': "test", + 'type': "form", + 'model': 'sale.order', + 'arch': """ + + + + + """ + }) + res = self.order.fields_view_get(view_id=view.id, view_type='form') + ctx = self._get_ctx_from_view(res) + self.assertTrue('default_discount' in ctx) diff --git a/sale_order_general_discount/views/res_partner_view.xml b/sale_order_general_discount/views/res_partner_view.xml new file mode 100644 index 00000000000..4a3cdf43254 --- /dev/null +++ b/sale_order_general_discount/views/res_partner_view.xml @@ -0,0 +1,17 @@ + + + + + + + res.partner + + + + + + + + + diff --git a/sale_order_general_discount/views/sale_order_view.xml b/sale_order_general_discount/views/sale_order_view.xml new file mode 100644 index 00000000000..30e7c91de49 --- /dev/null +++ b/sale_order_general_discount/views/sale_order_view.xml @@ -0,0 +1,18 @@ + + + + + + + sale.order.general.discount.form + sale.order + + + + + + + + + From 096f83c15e1a111f1c56c74f95ce48c93ac2e838 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 30 Aug 2018 13:11:33 +0200 Subject: [PATCH 02/30] [IMP] sale_order_general_discount: Improve fields_view_get --- sale_order_general_discount/README.rst | 87 +++- sale_order_general_discount/models/sale.py | 22 +- .../static/description/index.html | 429 ++++++++++++++++++ 3 files changed, 527 insertions(+), 11 deletions(-) create mode 100644 sale_order_general_discount/static/description/index.html diff --git a/sale_order_general_discount/README.rst b/sale_order_general_discount/README.rst index 3f626252963..80afe7038a9 100644 --- a/sale_order_general_discount/README.rst +++ b/sale_order_general_discount/README.rst @@ -1 +1,86 @@ -**This file is going to be generated by oca-gen-addon-readme.** +=========================== +Sale Order General Discount +=========================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/11.0/sale_order_general_discount + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-11-0/sale-workflow-11-0-sale_order_general_discount + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/167/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to set a general discount in a sales order. This general +discount is set to each line order in the standard `discount` field. + +You can also set a default general discount on customers. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Create a sale order and set a discount in "sales and purchase" tab, this +discount will be set in all lines. +#. Also you can set a discount in a partner. + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* Sergio Teruel + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale.py index 796fb09e880..ba5d294e196 100644 --- a/sale_order_general_discount/models/sale.py +++ b/sale_order_general_discount/models/sale.py @@ -27,22 +27,24 @@ def onchange_general_discount(self): @api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): - """The purpose of this is write a context on order_line field + """The purpose of this is to write a context on "order_line" field respecting other contexts on this field. - There is PR (https://github.com/odoo/odoo/pull/26607) to odoo for - avoid this, only update field in xml view and remove this method""" + There is a PR (https://github.com/odoo/odoo/pull/26607) to odoo for + avoiding this. If merged, remove this method and add the attribute + in the field. + """ res = super(SaleOrder, self).fields_view_get( - view_id, view_type, toolbar, submenu) + view_id=view_id, view_type=view_type, toolbar=toolbar, + submenu=submenu, + ) if view_type == 'form': order_xml = etree.XML(res['arch']) - order_line_path = "//field[@name='order_line']" - order_line_fields = order_xml.xpath(order_line_path) + order_line_fields = order_xml.xpath("//field[@name='order_line']") if order_line_fields: order_line_field = order_line_fields[0] - context = order_line_field.attrib.get("context", "{}") - context = context.replace( - "{", - "{'default_discount': general_discount, ", 1) + context = order_line_field.attrib.get("context", "{}").replace( + "{", "{'default_discount': general_discount, ", 1, + ) order_line_field.attrib['context'] = context res['arch'] = etree.tostring(order_xml) return res diff --git a/sale_order_general_discount/static/description/index.html b/sale_order_general_discount/static/description/index.html new file mode 100644 index 00000000000..237ee83b2b5 --- /dev/null +++ b/sale_order_general_discount/static/description/index.html @@ -0,0 +1,429 @@ + + + + + + +Sale Order General Discount + + + +
+

Sale Order General Discount

+ + +

Production/Stable License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

This module allows to set a general discount in a sales order. This general +discount is set to each line order in the standard discount field.

+

You can also set a default general discount on customers.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+

#. Create a sale order and set a discount in “sales and purchase” tab, this +discount will be set in all lines. +#. Also you can set a discount in a partner.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/sale-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 520c0682e5f7655275746e20bd0f69bd2842aef5 Mon Sep 17 00:00:00 2001 From: Raf Ven Date: Wed, 26 Dec 2018 21:02:39 +0100 Subject: [PATCH 03/30] [MIG] sale_order_general_discount: Migration to 12.0 --- sale_order_general_discount/README.rst | 20 ++++++--- sale_order_general_discount/__manifest__.py | 2 +- sale_order_general_discount/models/sale.py | 1 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/INSTALL.rst | 1 + sale_order_general_discount/readme/USAGE.rst | 4 +- .../static/description/index.html | 44 +++++++++++-------- .../views/res_partner_view.xml | 3 +- .../views/sale_order_view.xml | 2 +- 9 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 sale_order_general_discount/readme/INSTALL.rst diff --git a/sale_order_general_discount/README.rst b/sale_order_general_discount/README.rst index 80afe7038a9..58477754712 100644 --- a/sale_order_general_discount/README.rst +++ b/sale_order_general_discount/README.rst @@ -14,13 +14,13 @@ Sale Order General Discount :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/sale-workflow/tree/11.0/sale_order_general_discount + :target: https://github.com/OCA/sale-workflow/tree/12.0/sale_order_general_discount :alt: OCA/sale-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/sale-workflow-11-0/sale-workflow-11-0-sale_order_general_discount + :target: https://translation.odoo-community.org/projects/sale-workflow-12-0/sale-workflow-12-0-sale_order_general_discount :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/167/11.0 + :target: https://runbot.odoo-community.org/runbot/167/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -35,13 +35,18 @@ You can also set a default general discount on customers. .. contents:: :local: +Installation +============ + +You need to install sale_management module for accessing the needed menus. + Usage ===== To use this module, you need to: -#. Create a sale order and set a discount in "sales and purchase" tab, this -discount will be set in all lines. +#. Create a sale order and set a discount, + this discount will be set in all lines. #. Also you can set a discount in a partner. @@ -51,7 +56,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -67,6 +72,7 @@ Contributors ~~~~~~~~~~~~ * Sergio Teruel +* Raf Ven Maintainers ~~~~~~~~~~~ @@ -81,6 +87,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/sale-workflow `_ project on GitHub. +This module is part of the `OCA/sale-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_general_discount/__manifest__.py b/sale_order_general_discount/__manifest__.py index acfa1a1a46d..7266f7406e1 100644 --- a/sale_order_general_discount/__manifest__.py +++ b/sale_order_general_discount/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Sale Order General Discount', 'summary': 'General discount per sale order', - 'version': '11.0.1.0.0', + 'version': '12.0.1.0.0', 'development_status': 'Production/Stable', 'category': 'Sales', 'website': 'https://github.com/OCA/sale-workflow', diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale.py index ba5d294e196..c3b56b7ed18 100644 --- a/sale_order_general_discount/models/sale.py +++ b/sale_order_general_discount/models/sale.py @@ -17,6 +17,7 @@ class SaleOrder(models.Model): def onchange_partner_id(self): super().onchange_partner_id() self.general_discount = self.partner_id.sale_discount + return @api.onchange('general_discount') def onchange_general_discount(self): diff --git a/sale_order_general_discount/readme/CONTRIBUTORS.rst b/sale_order_general_discount/readme/CONTRIBUTORS.rst index f24a0b0dc74..36f58bf1780 100644 --- a/sale_order_general_discount/readme/CONTRIBUTORS.rst +++ b/sale_order_general_discount/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Sergio Teruel +* Raf Ven diff --git a/sale_order_general_discount/readme/INSTALL.rst b/sale_order_general_discount/readme/INSTALL.rst new file mode 100644 index 00000000000..4da360f7c83 --- /dev/null +++ b/sale_order_general_discount/readme/INSTALL.rst @@ -0,0 +1 @@ +You need to install sale_management module for accessing the needed menus. diff --git a/sale_order_general_discount/readme/USAGE.rst b/sale_order_general_discount/readme/USAGE.rst index 9275da26896..0674b6200f4 100644 --- a/sale_order_general_discount/readme/USAGE.rst +++ b/sale_order_general_discount/readme/USAGE.rst @@ -1,6 +1,6 @@ To use this module, you need to: -#. Create a sale order and set a discount in "sales and purchase" tab, this -discount will be set in all lines. +#. Create a sale order and set a discount, + this discount will be set in all lines. #. Also you can set a discount in a partner. diff --git a/sale_order_general_discount/static/description/index.html b/sale_order_general_discount/static/description/index.html index 237ee83b2b5..5ea6d244768 100644 --- a/sale_order_general_discount/static/description/index.html +++ b/sale_order_general_discount/static/description/index.html @@ -367,60 +367,68 @@

Sale Order General Discount

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

Production/Stable License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

This module allows to set a general discount in a sales order. This general discount is set to each line order in the standard discount field.

You can also set a default general discount on customers.

Table of contents

+
+

Installation

+

You need to install sale_management module for accessing the needed menus.

+
-

Usage

+

Usage

To use this module, you need to:

-

#. Create a sale order and set a discount in “sales and purchase” tab, this -discount will be set in all lines. -#. Also you can set a discount in a partner.

+
    +
  1. Create a sale order and set a discount, +this discount will be set in all lines.
  2. +
  3. Also you can set a discount in a partner.
  4. +
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/sale-workflow project on GitHub.

+

This module is part of the OCA/sale-workflow project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/sale_order_general_discount/views/res_partner_view.xml b/sale_order_general_discount/views/res_partner_view.xml index 4a3cdf43254..c0262b534f3 100644 --- a/sale_order_general_discount/views/res_partner_view.xml +++ b/sale_order_general_discount/views/res_partner_view.xml @@ -8,7 +8,8 @@ res.partner - + diff --git a/sale_order_general_discount/views/sale_order_view.xml b/sale_order_general_discount/views/sale_order_view.xml index 30e7c91de49..57831334fb6 100644 --- a/sale_order_general_discount/views/sale_order_view.xml +++ b/sale_order_general_discount/views/sale_order_view.xml @@ -7,7 +7,7 @@ sale.order.general.discount.form sale.order - + From eed473389617973daaa9dcc88c0096e7afd6bb5f Mon Sep 17 00:00:00 2001 From: Sergio Teruel Date: Tue, 27 Aug 2019 11:51:54 +0200 Subject: [PATCH 04/30] [IMP] sale_order_general_discount: Apply general discount to order lines created without UI form view --- sale_order_general_discount/__manifest__.py | 2 +- sale_order_general_discount/models/sale.py | 15 +++++++++++++++ .../tests/test_sale_order_general_discount.py | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/sale_order_general_discount/__manifest__.py b/sale_order_general_discount/__manifest__.py index 7266f7406e1..36a2c94dc3b 100644 --- a/sale_order_general_discount/__manifest__.py +++ b/sale_order_general_discount/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Sale Order General Discount', 'summary': 'General discount per sale order', - 'version': '12.0.1.0.0', + 'version': '12.0.1.0.1', 'development_status': 'Production/Stable', 'category': 'Sales', 'website': 'https://github.com/OCA/sale-workflow', diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale.py index c3b56b7ed18..242dec18904 100644 --- a/sale_order_general_discount/models/sale.py +++ b/sale_order_general_discount/models/sale.py @@ -49,3 +49,18 @@ def fields_view_get(self, view_id=None, view_type='form', toolbar=False, order_line_field.attrib['context'] = context res['arch'] = etree.tostring(order_xml) return res + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + @api.model + def create(self, vals): + """Apply general discount for sale order lines which are not created + from sale order form view. + """ + if 'discount' not in vals and 'order_id' in vals: + sale_order = self.env['sale.order'].browse(vals['order_id']) + if sale_order.general_discount: + vals['discount'] = sale_order.general_discount + return super().create(vals) diff --git a/sale_order_general_discount/tests/test_sale_order_general_discount.py b/sale_order_general_discount/tests/test_sale_order_general_discount.py index 5767ccb1933..195fef04faa 100644 --- a/sale_order_general_discount/tests/test_sale_order_general_discount.py +++ b/sale_order_general_discount/tests/test_sale_order_general_discount.py @@ -69,3 +69,21 @@ def test_default_line_discount_value(self): res = self.order.fields_view_get(view_id=view.id, view_type='form') ctx = self._get_ctx_from_view(res) self.assertTrue('default_discount' in ctx) + + def test_sale_order_line_wo_form_view(self): + self.order.general_discount = 10 + vals = { + 'name': self.product.name, + 'product_id': self.product.id, + 'product_uom_qty': 1, + 'product_uom': self.product.uom_id.id, + 'price_unit': 1000.00, + 'order_id': self.order.id, + } + order_line = self.env['sale.order.line'].create(vals) + self.assertEqual(order_line.price_subtotal, 900.00) + self.assertEqual(order_line.discount, 10) + vals['discount'] = 20 + order_line2 = self.env['sale.order.line'].create(vals) + self.assertEqual(order_line2.price_subtotal, 800.00) + self.assertEqual(order_line2.discount, 20) From 5033f25183c9115d1939f0d3d35c9893cb774f90 Mon Sep 17 00:00:00 2001 From: Oriana Maita Date: Wed, 7 Oct 2020 13:17:27 -0300 Subject: [PATCH 05/30] [IMP] sale_order_general_discount: black, isort, prettier --- sale_order_general_discount/__manifest__.py | 29 ++--- .../models/res_partner.py | 7 +- sale_order_general_discount/models/sale.py | 43 ++++---- sale_order_general_discount/readme/USAGE.rst | 1 - .../tests/test_sale_order_general_discount.py | 103 ++++++++++-------- .../views/res_partner_view.xml | 15 ++- .../views/sale_order_view.xml | 9 +- 7 files changed, 104 insertions(+), 103 deletions(-) diff --git a/sale_order_general_discount/__manifest__.py b/sale_order_general_discount/__manifest__.py index 36a2c94dc3b..9da0ca2bdc6 100644 --- a/sale_order_general_discount/__manifest__.py +++ b/sale_order_general_discount/__manifest__.py @@ -1,21 +1,16 @@ # Copyright 2018 Tecnativa - Sergio Teruel # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - 'name': 'Sale Order General Discount', - 'summary': 'General discount per sale order', - 'version': '12.0.1.0.1', - 'development_status': 'Production/Stable', - 'category': 'Sales', - 'website': 'https://github.com/OCA/sale-workflow', - 'author': 'Tecnativa, Odoo Community Association (OCA)', - 'license': 'AGPL-3', - 'application': False, - 'installable': True, - 'depends': [ - 'sale', - ], - 'data': [ - 'views/sale_order_view.xml', - 'views/res_partner_view.xml', - ], + "name": "Sale Order General Discount", + "summary": "General discount per sale order", + "version": "12.0.1.0.1", + "development_status": "Production/Stable", + "category": "Sales", + "website": "https://github.com/OCA/sale-workflow", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["sale",], + "data": ["views/sale_order_view.xml", "views/res_partner_view.xml",], } diff --git a/sale_order_general_discount/models/res_partner.py b/sale_order_general_discount/models/res_partner.py index b5658e77fc4..154bfb007b7 100644 --- a/sale_order_general_discount/models/res_partner.py +++ b/sale_order_general_discount/models/res_partner.py @@ -2,14 +2,15 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models + from odoo.addons import decimal_precision as dp class ResPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" sale_discount = fields.Float( - digits=dp.get_precision('Discount'), - string='Discount (%)', + digits=dp.get_precision("Discount"), + string="Discount (%)", company_dependent=True, ) diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale.py index 242dec18904..50743dc6f6a 100644 --- a/sale_order_general_discount/models/sale.py +++ b/sale_order_general_discount/models/sale.py @@ -1,33 +1,35 @@ # Copyright 2018 Tecnativa - Sergio Teruel # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from lxml import etree + from odoo import api, fields, models + from odoo.addons import decimal_precision as dp -from lxml import etree class SaleOrder(models.Model): - _inherit = 'sale.order' + _inherit = "sale.order" general_discount = fields.Float( - digits=dp.get_precision('Discount'), - string='Discount (%)', + digits=dp.get_precision("Discount"), string="Discount (%)", ) - @api.onchange('partner_id') + @api.onchange("partner_id") def onchange_partner_id(self): super().onchange_partner_id() self.general_discount = self.partner_id.sale_discount return - @api.onchange('general_discount') + @api.onchange("general_discount") def onchange_general_discount(self): - self.mapped('order_line').update({ - 'discount': self.general_discount, - }) + self.mapped("order_line").update( + {"discount": self.general_discount,} + ) @api.model - def fields_view_get(self, view_id=None, view_type='form', toolbar=False, - submenu=False): + def fields_view_get( + self, view_id=None, view_type="form", toolbar=False, submenu=False + ): """The purpose of this is to write a context on "order_line" field respecting other contexts on this field. There is a PR (https://github.com/odoo/odoo/pull/26607) to odoo for @@ -35,32 +37,31 @@ def fields_view_get(self, view_id=None, view_type='form', toolbar=False, in the field. """ res = super(SaleOrder, self).fields_view_get( - view_id=view_id, view_type=view_type, toolbar=toolbar, - submenu=submenu, + view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu, ) - if view_type == 'form': - order_xml = etree.XML(res['arch']) + if view_type == "form": + order_xml = etree.XML(res["arch"]) order_line_fields = order_xml.xpath("//field[@name='order_line']") if order_line_fields: order_line_field = order_line_fields[0] context = order_line_field.attrib.get("context", "{}").replace( "{", "{'default_discount': general_discount, ", 1, ) - order_line_field.attrib['context'] = context - res['arch'] = etree.tostring(order_xml) + order_line_field.attrib["context"] = context + res["arch"] = etree.tostring(order_xml) return res class SaleOrderLine(models.Model): - _inherit = 'sale.order.line' + _inherit = "sale.order.line" @api.model def create(self, vals): """Apply general discount for sale order lines which are not created from sale order form view. """ - if 'discount' not in vals and 'order_id' in vals: - sale_order = self.env['sale.order'].browse(vals['order_id']) + if "discount" not in vals and "order_id" in vals: + sale_order = self.env["sale.order"].browse(vals["order_id"]) if sale_order.general_discount: - vals['discount'] = sale_order.general_discount + vals["discount"] = sale_order.general_discount return super().create(vals) diff --git a/sale_order_general_discount/readme/USAGE.rst b/sale_order_general_discount/readme/USAGE.rst index 0674b6200f4..f4c81f3fb18 100644 --- a/sale_order_general_discount/readme/USAGE.rst +++ b/sale_order_general_discount/readme/USAGE.rst @@ -3,4 +3,3 @@ To use this module, you need to: #. Create a sale order and set a discount, this discount will be set in all lines. #. Also you can set a discount in a partner. - diff --git a/sale_order_general_discount/tests/test_sale_order_general_discount.py b/sale_order_general_discount/tests/test_sale_order_general_discount.py index 195fef04faa..ade794b2ee0 100644 --- a/sale_order_general_discount/tests/test_sale_order_general_discount.py +++ b/sale_order_general_discount/tests/test_sale_order_general_discount.py @@ -1,39 +1,44 @@ # Copyright 2018 Tecnativa - Sergio Teruel # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.tests import SavepointCase from lxml import etree +from odoo.tests import SavepointCase + class TestSaleOrderLineInput(SavepointCase): - @classmethod def setUpClass(cls): super().setUpClass() - cls.partner = cls.env['res.partner'].create({ - 'name': 'Test', - 'sale_discount': 10.0, - }) - cls.product = cls.env['product.product'].create({ - 'name': 'test_product', - 'type': 'service', - }) - cls.order = cls.env['sale.order'].create({ - 'partner_id': cls.partner.id, - 'order_line': [(0, 0, { - 'name': cls.product.name, - 'product_id': cls.product.id, - 'product_uom_qty': 1, - 'product_uom': cls.product.uom_id.id, - 'price_unit': 1000.00, - })], - 'pricelist_id': cls.env.ref('product.list0').id, - }) - cls.View = cls.env['ir.ui.view'] + cls.partner = cls.env["res.partner"].create( + {"name": "Test", "sale_discount": 10.0,} + ) + cls.product = cls.env["product.product"].create( + {"name": "test_product", "type": "service",} + ) + cls.order = cls.env["sale.order"].create( + { + "partner_id": cls.partner.id, + "order_line": [ + ( + 0, + 0, + { + "name": cls.product.name, + "product_id": cls.product.id, + "product_uom_qty": 1, + "product_uom": cls.product.uom_id.id, + "price_unit": 1000.00, + }, + ) + ], + "pricelist_id": cls.env.ref("product.list0").id, + } + ) + cls.View = cls.env["ir.ui.view"] def test_default_partner_discount(self): self.order.onchange_partner_id() - self.assertEqual( - self.order.general_discount, self.partner.sale_discount) + self.assertEqual(self.order.general_discount, self.partner.sale_discount) def test_sale_order_values(self): self.order.general_discount = 10 @@ -41,7 +46,7 @@ def test_sale_order_values(self): self.assertEqual(self.order.order_line.price_reduce, 900.00) def _get_ctx_from_view(self, res): - order_xml = etree.XML(res['arch']) + order_xml = etree.XML(res["arch"]) order_line_path = "//field[@name='order_line']" order_line_field = order_xml.xpath(order_line_path)[0] return order_line_field.attrib.get("context", "{}") @@ -49,41 +54,45 @@ def _get_ctx_from_view(self, res): def test_default_line_discount_value(self): res = self.order.fields_view_get( - view_id=self.env.ref('sale_order_general_discount.' - 'sale_order_general_discount_form_view').id, - view_type='form') + view_id=self.env.ref( + "sale_order_general_discount." "sale_order_general_discount_form_view" + ).id, + view_type="form", + ) ctx = self._get_ctx_from_view(res) - self.assertTrue('default_discount' in ctx) - view = self.View.create({ - 'name': "test", - 'type': "form", - 'model': 'sale.order', - 'arch': """ + self.assertTrue("default_discount" in ctx) + view = self.View.create( + { + "name": "test", + "type": "form", + "model": "sale.order", + "arch": """ - """ - }) - res = self.order.fields_view_get(view_id=view.id, view_type='form') + """, + } + ) + res = self.order.fields_view_get(view_id=view.id, view_type="form") ctx = self._get_ctx_from_view(res) - self.assertTrue('default_discount' in ctx) + self.assertTrue("default_discount" in ctx) def test_sale_order_line_wo_form_view(self): self.order.general_discount = 10 vals = { - 'name': self.product.name, - 'product_id': self.product.id, - 'product_uom_qty': 1, - 'product_uom': self.product.uom_id.id, - 'price_unit': 1000.00, - 'order_id': self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_uom_qty": 1, + "product_uom": self.product.uom_id.id, + "price_unit": 1000.00, + "order_id": self.order.id, } - order_line = self.env['sale.order.line'].create(vals) + order_line = self.env["sale.order.line"].create(vals) self.assertEqual(order_line.price_subtotal, 900.00) self.assertEqual(order_line.discount, 10) - vals['discount'] = 20 - order_line2 = self.env['sale.order.line'].create(vals) + vals["discount"] = 20 + order_line2 = self.env["sale.order.line"].create(vals) self.assertEqual(order_line2.price_subtotal, 800.00) self.assertEqual(order_line2.discount, 20) diff --git a/sale_order_general_discount/views/res_partner_view.xml b/sale_order_general_discount/views/res_partner_view.xml index c0262b534f3..733ac31287b 100644 --- a/sale_order_general_discount/views/res_partner_view.xml +++ b/sale_order_general_discount/views/res_partner_view.xml @@ -1,18 +1,17 @@ - + - - res.partner - + - - + + - diff --git a/sale_order_general_discount/views/sale_order_view.xml b/sale_order_general_discount/views/sale_order_view.xml index 57831334fb6..62d5b0e9e35 100644 --- a/sale_order_general_discount/views/sale_order_view.xml +++ b/sale_order_general_discount/views/sale_order_view.xml @@ -1,18 +1,15 @@ - + - - sale.order.general.discount.form sale.order - + - + - From dc84aedfc92232ad31ae5d11e36b5c98e4e5b567 Mon Sep 17 00:00:00 2001 From: sudhir-erpharbor Date: Sat, 2 Nov 2019 18:41:55 +0530 Subject: [PATCH 06/30] [MIG] sale_order_general_discount: Migration to 13.0 [MIG] Migrated sale_order_general_discount to v13. [IMP] Improved code as per request. [IMP][13.0] sale_order_general_discount: rebase with OCA/13.0 + apply pre-commit [UPD] sale_order_general_discount: update view to display percentage correctly --- sale_order_general_discount/README.rst | 12 ++--- sale_order_general_discount/__manifest__.py | 6 +-- sale_order_general_discount/i18n/de.po | 47 +++++++++++++++++++ sale_order_general_discount/i18n/es.po | 30 +++++++----- sale_order_general_discount/i18n/it.po | 47 +++++++++++++++++++ .../i18n/sale_order_general_discount.pot | 41 ++++++++++++++++ sale_order_general_discount/i18n/zh_CN.po | 47 +++++++++++++++++++ .../models/__init__.py | 3 +- .../models/res_partner.py | 6 +-- .../models/{sale.py => sale_order.py} | 38 ++++----------- .../models/sale_order_line.py | 27 +++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 9 ++-- .../tests/test_sale_order_general_discount.py | 6 +-- .../views/res_partner_view.xml | 5 +- 15 files changed, 261 insertions(+), 64 deletions(-) create mode 100644 sale_order_general_discount/i18n/de.po create mode 100644 sale_order_general_discount/i18n/it.po create mode 100644 sale_order_general_discount/i18n/sale_order_general_discount.pot create mode 100644 sale_order_general_discount/i18n/zh_CN.po rename sale_order_general_discount/models/{sale.py => sale_order.py} (58%) create mode 100644 sale_order_general_discount/models/sale_order_line.py diff --git a/sale_order_general_discount/README.rst b/sale_order_general_discount/README.rst index 58477754712..32fcce5e516 100644 --- a/sale_order_general_discount/README.rst +++ b/sale_order_general_discount/README.rst @@ -14,13 +14,13 @@ Sale Order General Discount :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/sale-workflow/tree/12.0/sale_order_general_discount + :target: https://github.com/OCA/sale-workflow/tree/13.0/sale_order_general_discount :alt: OCA/sale-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/sale-workflow-12-0/sale-workflow-12-0-sale_order_general_discount + :target: https://translation.odoo-community.org/projects/sale-workflow-13-0/sale-workflow-13-0-sale_order_general_discount :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/167/12.0 + :target: https://runbot.odoo-community.org/runbot/167/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -49,14 +49,13 @@ To use this module, you need to: this discount will be set in all lines. #. Also you can set a discount in a partner. - Bug Tracker =========== Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -73,6 +72,7 @@ Contributors * Sergio Teruel * Raf Ven +* Sudhir Arya Maintainers ~~~~~~~~~~~ @@ -87,6 +87,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/sale-workflow `_ project on GitHub. +This module is part of the `OCA/sale-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_general_discount/__manifest__.py b/sale_order_general_discount/__manifest__.py index 9da0ca2bdc6..59c715f8aa6 100644 --- a/sale_order_general_discount/__manifest__.py +++ b/sale_order_general_discount/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Order General Discount", "summary": "General discount per sale order", - "version": "12.0.1.0.1", + "version": "13.0.1.0.0", "development_status": "Production/Stable", "category": "Sales", "website": "https://github.com/OCA/sale-workflow", @@ -11,6 +11,6 @@ "license": "AGPL-3", "application": False, "installable": True, - "depends": ["sale",], - "data": ["views/sale_order_view.xml", "views/res_partner_view.xml",], + "depends": ["sale"], + "data": ["views/sale_order_view.xml", "views/res_partner_view.xml"], } diff --git a/sale_order_general_discount/i18n/de.po b/sale_order_general_discount/i18n/de.po new file mode 100644 index 00000000000..339707d6d4d --- /dev/null +++ b/sale_order_general_discount/i18n/de.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_general_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-07-15 13:43+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.7.1\n" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner__sale_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users__sale_discount +#, fuzzy +msgid "Discount" +msgstr "Rabatt (%)" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order__general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_line__discount +msgid "Discount (%)" +msgstr "Rabatt (%)" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order +#, fuzzy +msgid "Sales Order" +msgstr "Verkaufsauftrag" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order_line +#, fuzzy +msgid "Sales Order Line" +msgstr "Verkaufsauftrag" diff --git a/sale_order_general_discount/i18n/es.po b/sale_order_general_discount/i18n/es.po index a5fa930e225..9321f5bd896 100644 --- a/sale_order_general_discount/i18n/es.po +++ b/sale_order_general_discount/i18n/es.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-31 09:08+0200\n" -"PO-Revision-Date: 2018-07-31 09:09+0200\n" +"PO-Revision-Date: 2020-10-26 12:08+0000\n" +"Last-Translator: Daniel Martinez Vila \n" "Language-Team: \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.7.1\n" -"Last-Translator: Sergio Teruel \n" -"Language: es\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" #. module: sale_order_general_discount #: model:ir.model,name:sale_order_general_discount.model_res_partner @@ -23,18 +23,26 @@ msgid "Contact" msgstr "Contacto" #. module: sale_order_general_discount -#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner_discount -#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users_discount -#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner__sale_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users__sale_discount +msgid "Discount" +msgstr "Descuento" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order__general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_line__discount msgid "Discount (%)" msgstr "Descuento (%)" #. module: sale_order_general_discount #: model:ir.model,name:sale_order_general_discount.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" +msgid "Sales Order" +msgstr "Pedido de venta" #. module: sale_order_general_discount #: model:ir.model,name:sale_order_general_discount.model_sale_order_line msgid "Sales Order Line" -msgstr "Líneas de pedido" +msgstr "Línea Pedido de Venta" + +#~ msgid "Quotation" +#~ msgstr "Presupuesto" diff --git a/sale_order_general_discount/i18n/it.po b/sale_order_general_discount/i18n/it.po new file mode 100644 index 00000000000..4fff0dd9796 --- /dev/null +++ b/sale_order_general_discount/i18n/it.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_general_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-18 17:13+0000\n" +"Last-Translator: Francesco Foresti \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner__sale_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users__sale_discount +#, fuzzy +msgid "Discount" +msgstr "Sconto (%)" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order__general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_line__discount +msgid "Discount (%)" +msgstr "Sconto (%)" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order +#, fuzzy +msgid "Sales Order" +msgstr "Ordine di Vendita" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order_line +#, fuzzy +msgid "Sales Order Line" +msgstr "Ordine di Vendita" diff --git a/sale_order_general_discount/i18n/sale_order_general_discount.pot b/sale_order_general_discount/i18n/sale_order_general_discount.pot new file mode 100644 index 00000000000..16ab177ac24 --- /dev/null +++ b/sale_order_general_discount/i18n/sale_order_general_discount.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_general_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner__sale_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users__sale_discount +msgid "Discount" +msgstr "" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order__general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_line__discount +msgid "Discount (%)" +msgstr "" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order_line +msgid "Sales Order Line" +msgstr "" diff --git a/sale_order_general_discount/i18n/zh_CN.po b/sale_order_general_discount/i18n/zh_CN.po new file mode 100644 index 00000000000..693b0f84437 --- /dev/null +++ b/sale_order_general_discount/i18n/zh_CN.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_general_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-01 11:23+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_res_partner +msgid "Contact" +msgstr "联系人" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_partner__sale_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_res_users__sale_discount +#, fuzzy +msgid "Discount" +msgstr "折扣(%)" + +#. module: sale_order_general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order__general_discount +#: model:ir.model.fields,field_description:sale_order_general_discount.field_sale_order_line__discount +msgid "Discount (%)" +msgstr "折扣(%)" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order +#, fuzzy +msgid "Sales Order" +msgstr "销售订单" + +#. module: sale_order_general_discount +#: model:ir.model,name:sale_order_general_discount.model_sale_order_line +#, fuzzy +msgid "Sales Order Line" +msgstr "销售订单" diff --git a/sale_order_general_discount/models/__init__.py b/sale_order_general_discount/models/__init__.py index 31431c32a45..bccb67dd972 100644 --- a/sale_order_general_discount/models/__init__.py +++ b/sale_order_general_discount/models/__init__.py @@ -1,3 +1,4 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import res_partner -from . import sale +from . import sale_order +from . import sale_order_line diff --git a/sale_order_general_discount/models/res_partner.py b/sale_order_general_discount/models/res_partner.py index 154bfb007b7..4a4b04ea663 100644 --- a/sale_order_general_discount/models/res_partner.py +++ b/sale_order_general_discount/models/res_partner.py @@ -3,14 +3,10 @@ from odoo import fields, models -from odoo.addons import decimal_precision as dp - class ResPartner(models.Model): _inherit = "res.partner" sale_discount = fields.Float( - digits=dp.get_precision("Discount"), - string="Discount (%)", - company_dependent=True, + string="Discount", digits="Discount", company_dependent=True, ) diff --git a/sale_order_general_discount/models/sale.py b/sale_order_general_discount/models/sale_order.py similarity index 58% rename from sale_order_general_discount/models/sale.py rename to sale_order_general_discount/models/sale_order.py index 50743dc6f6a..27078355679 100644 --- a/sale_order_general_discount/models/sale.py +++ b/sale_order_general_discount/models/sale_order.py @@ -4,27 +4,22 @@ from odoo import api, fields, models -from odoo.addons import decimal_precision as dp - class SaleOrder(models.Model): _inherit = "sale.order" general_discount = fields.Float( - digits=dp.get_precision("Discount"), string="Discount (%)", + string="Discount (%)", + compute="_compute_general_discount", + store=True, + readonly=False, + digits="Discount", ) - @api.onchange("partner_id") - def onchange_partner_id(self): - super().onchange_partner_id() - self.general_discount = self.partner_id.sale_discount - return - - @api.onchange("general_discount") - def onchange_general_discount(self): - self.mapped("order_line").update( - {"discount": self.general_discount,} - ) + @api.depends("partner_id") + def _compute_general_discount(self): + for so in self: + so.general_discount = so.partner_id.sale_discount @api.model def fields_view_get( @@ -50,18 +45,3 @@ def fields_view_get( order_line_field.attrib["context"] = context res["arch"] = etree.tostring(order_xml) return res - - -class SaleOrderLine(models.Model): - _inherit = "sale.order.line" - - @api.model - def create(self, vals): - """Apply general discount for sale order lines which are not created - from sale order form view. - """ - if "discount" not in vals and "order_id" in vals: - sale_order = self.env["sale.order"].browse(vals["order_id"]) - if sale_order.general_discount: - vals["discount"] = sale_order.general_discount - return super().create(vals) diff --git a/sale_order_general_discount/models/sale_order_line.py b/sale_order_general_discount/models/sale_order_line.py new file mode 100644 index 00000000000..18d2b5f2d10 --- /dev/null +++ b/sale_order_general_discount/models/sale_order_line.py @@ -0,0 +1,27 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + discount = fields.Float(compute="_compute_discount", store=True, readonly=False,) + + @api.model + def create(self, vals): + """Apply general discount for sale order lines which are not created + from sale order form view. + """ + if "discount" not in vals and "order_id" in vals: + sale_order = self.env["sale.order"].browse(vals["order_id"]) + if sale_order.general_discount: + vals["discount"] = sale_order.general_discount + return super().create(vals) + + @api.depends("order_id", "order_id.general_discount") + def _compute_discount(self): + if hasattr(super(), "_compute_discount"): + super()._compute_discount() + for line in self: + line.discount = line.order_id.general_discount diff --git a/sale_order_general_discount/readme/CONTRIBUTORS.rst b/sale_order_general_discount/readme/CONTRIBUTORS.rst index 36f58bf1780..4c19d34c3cb 100644 --- a/sale_order_general_discount/readme/CONTRIBUTORS.rst +++ b/sale_order_general_discount/readme/CONTRIBUTORS.rst @@ -1,2 +1,3 @@ * Sergio Teruel * Raf Ven +* Sudhir Arya diff --git a/sale_order_general_discount/static/description/index.html b/sale_order_general_discount/static/description/index.html index 5ea6d244768..2dae9ec82d8 100644 --- a/sale_order_general_discount/static/description/index.html +++ b/sale_order_general_discount/static/description/index.html @@ -3,7 +3,7 @@ - + Sale Order General Discount