From cf091c1e540ec179f2af41f3d28520ba9789071f Mon Sep 17 00:00:00 2001 From: sergiocorato Date: Fri, 14 Jan 2022 08:45:51 +0100 Subject: [PATCH 1/6] [12.0][FIX] get sequence from date order --- sale_order_revision/models/sale_order.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sale_order_revision/models/sale_order.py b/sale_order_revision/models/sale_order.py index 95c65f33a4b..6b2b3b9c4c8 100644 --- a/sale_order_revision/models/sale_order.py +++ b/sale_order_revision/models/sale_order.py @@ -87,7 +87,11 @@ def create(self, values): if 'unrevisioned_name' not in values: if values.get('name', '/') == '/': seq = self.env['ir.sequence'] - values['name'] = seq.next_by_code('sale.order') or '/' + date_order = values.get('date_order', fields.Date.today()) + values['name'] = seq.with_context( + ir_sequence_date=date_order, + ir_sequence_date_range=date_order, + ).next_by_code('sale.order') or '/' values['unrevisioned_name'] = values['name'] return super(SaleOrder, self).create(values) From a386122bf1b0cb3b1c5111b2b494e8648bbf5f74 Mon Sep 17 00:00:00 2001 From: sergiocorato Date: Wed, 5 Apr 2023 17:57:28 +0200 Subject: [PATCH 2/6] [12.0][FIX] sale_order_revision copy of revisioned sale --- sale_order_revision/models/sale_order.py | 2 +- .../tests/test_sale_order_revision.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sale_order_revision/models/sale_order.py b/sale_order_revision/models/sale_order.py index 6b2b3b9c4c8..ac018c2ccca 100644 --- a/sale_order_revision/models/sale_order.py +++ b/sale_order_revision/models/sale_order.py @@ -54,7 +54,7 @@ def _compute_has_old_revisions(self): @api.returns('self', lambda value: value.id) def copy(self, default=None): if default is None: - default = {} + default = {'current_revision_id': None} if default.get('name', '/') == '/': seq = self.env['ir.sequence'] default['name'] = seq.next_by_code('sale.order') or '/' diff --git a/sale_order_revision/tests/test_sale_order_revision.py b/sale_order_revision/tests/test_sale_order_revision.py index dd1b15807a0..4488670d0e5 100644 --- a/sale_order_revision/tests/test_sale_order_revision.py +++ b/sale_order_revision/tests/test_sale_order_revision.py @@ -85,3 +85,16 @@ def test_simple_copy(self): sale_order_3 = sale_order_2.copy() # Check the 'Order Reference' of the copied Sale Order self.assertEqual(sale_order_3.name, sale_order_3.unrevisioned_name) + + def test_copy_after_revision(self): + sale_order_4 = self._create_sale_order() + self.assertEqual(sale_order_4.name, sale_order_4.unrevisioned_name) + # create a revision + self._revision_sale_order(sale_order_4) + revision_1 = sale_order_4.current_revision_id + # Copy the Sale Order revisioned + sale_order_5 = revision_1.copy() + self.assertFalse(sale_order_5.current_revision_id) + sale_order_6 = sale_order_4.copy() + self.assertFalse(sale_order_6.current_revision_id) + self.assertEqual(sale_order_6.name, sale_order_6.unrevisioned_name) From 8e992bb6f9b5f91b271186a5b6c71274a7a86ee8 Mon Sep 17 00:00:00 2001 From: sergiocorato Date: Thu, 7 Mar 2024 18:25:42 +0100 Subject: [PATCH 3/6] [PORT] PR 1651 --- sale_discount_display_amount/hooks.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/sale_discount_display_amount/hooks.py b/sale_discount_display_amount/hooks.py index 3220bae9cc2..22cc3d3f98a 100644 --- a/sale_discount_display_amount/hooks.py +++ b/sale_discount_display_amount/hooks.py @@ -3,6 +3,7 @@ import logging from odoo.api import Environment from odoo import SUPERUSER_ID +from odoo.tools.sql import column_exists, create_column _logger = logging.getLogger(__name__) @@ -17,20 +18,10 @@ def pre_init_hook(cr): - _logger.info("Create discount columns in database") - cr.execute(""" - ALTER TABLE sale_order ADD COLUMN price_total_no_discount numeric; - """) - cr.execute(""" - ALTER TABLE sale_order ADD COLUMN discount_total numeric; - """) - cr.execute(""" - ALTER TABLE sale_order_line ADD COLUMN price_total_no_discount - numeric; - """) - cr.execute(""" - ALTER TABLE sale_order_line ADD COLUMN discount_total numeric; - """) + for table, column in COLUMNS: + if not column_exists(cr, table, column): + _logger.info("Create discount column %s in database", column) + create_column(cr, table, column, "numeric") def post_init_hook(cr, registry): From 0cd8e9281531dd42822c89cdf3cd36701ba28172 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 4 Jul 2023 14:06:01 +0200 Subject: [PATCH 4/6] [IMP] sale_discount_display_amount: Add untaxed no discount --- sale_discount_display_amount/views/sale_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_discount_display_amount/views/sale_view.xml b/sale_discount_display_amount/views/sale_view.xml index e0d8f421982..06d7dbf80c9 100644 --- a/sale_discount_display_amount/views/sale_view.xml +++ b/sale_discount_display_amount/views/sale_view.xml @@ -7,7 +7,7 @@ 99 - + From e8db89583e46b4b3299340a75be3447cb85f7337 Mon Sep 17 00:00:00 2001 From: sergiocorato Date: Fri, 14 Oct 2022 16:50:19 +0200 Subject: [PATCH 5/6] [12.0][FIX] sale_order_lot_selection missing return overriden function --- sale_order_lot_selection/models/sale.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sale_order_lot_selection/models/sale.py b/sale_order_lot_selection/models/sale.py index 8665bdeb96b..d47fba910f9 100644 --- a/sale_order_lot_selection/models/sale.py +++ b/sale_order_lot_selection/models/sale.py @@ -10,9 +10,9 @@ class SaleOrderLine(models.Model): @api.multi @api.onchange('product_id') def product_id_change(self): - result = super(SaleOrderLine, self).product_id_change() + res = super(SaleOrderLine, self).product_id_change() self.lot_id = False - return result + return res @api.onchange('product_id') def _onchange_product_id_set_lot_domain(self): From 6a188de189f0b5b21938fb6f8a1c6bc58885df1c Mon Sep 17 00:00:00 2001 From: sergiocorato Date: Fri, 8 Mar 2024 14:37:57 +0100 Subject: [PATCH 6/6] [IMP] backport not-committed pr on 14.0 --- sale_discount_display_amount/__manifest__.py | 2 +- sale_discount_display_amount/hooks.py | 2 ++ sale_discount_display_amount/i18n/it.po | 36 ++++++++++++------- .../i18n/sale_discount_display_amount.pot | 17 ++++++++- .../post-compute-subtotal-columns.py | 21 +++++++++++ .../12.0.1.3.0/pre-add-subtotal-columns.py | 17 +++++++++ .../models/sale_order.py | 11 +++++- .../models/sale_order_line.py | 7 +++- .../tests/test_discount_display_amount.py | 1 + .../views/sale_view.xml | 7 ++-- 10 files changed, 102 insertions(+), 19 deletions(-) create mode 100644 sale_discount_display_amount/migrations/12.0.1.3.0/post-compute-subtotal-columns.py create mode 100644 sale_discount_display_amount/migrations/12.0.1.3.0/pre-add-subtotal-columns.py diff --git a/sale_discount_display_amount/__manifest__.py b/sale_discount_display_amount/__manifest__.py index cc5ca76aa0e..3ac287c5031 100644 --- a/sale_discount_display_amount/__manifest__.py +++ b/sale_discount_display_amount/__manifest__.py @@ -6,7 +6,7 @@ 'summary': """ This addon intends to display the amount of the discount computed on sale_order_line and sale_order level""", - 'version': '12.0.1.2.0', + 'version': '12.0.1.3.0', 'license': 'AGPL-3', 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/sale-workflow', diff --git a/sale_discount_display_amount/hooks.py b/sale_discount_display_amount/hooks.py index 22cc3d3f98a..1a646dfb129 100644 --- a/sale_discount_display_amount/hooks.py +++ b/sale_discount_display_amount/hooks.py @@ -10,10 +10,12 @@ COLUMNS = ( ("sale_order", "price_total_no_discount"), ("sale_order", "discount_total"), + ("sale_order", "discount_subtotal"), ("sale_order", "price_subtotal_no_discount"), ("sale_order_line", "price_subtotal_no_discount"), ("sale_order_line", "price_total_no_discount"), ("sale_order_line", "discount_total"), + ("sale_order_line", "discount_subtotal"), ) diff --git a/sale_discount_display_amount/i18n/it.po b/sale_discount_display_amount/i18n/it.po index 94cd7fb2195..c8e434d43a1 100644 --- a/sale_discount_display_amount/i18n/it.po +++ b/sale_discount_display_amount/i18n/it.po @@ -1,20 +1,19 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * sale_discount_display_amount +# * sale_discount_display_amount # msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-09-03 13:37+0000\n" -"Last-Translator: Francesco Foresti \n" -"Language-Team: none\n" -"Language: it\n" +"POT-Creation-Date: 2024-03-11 08:38+0000\n" +"PO-Revision-Date: 2024-03-11 08:38+0000\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: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"Plural-Forms: \n" #. module: sale_discount_display_amount #: model_terms:ir.ui.view,arch_db:sale_discount_display_amount.report_saleorder_document_inherit @@ -26,11 +25,17 @@ msgstr "Subtotale Sconto" msgid "Subtotal Without Discount" msgstr "Subtotale senza sconto" +#. module: sale_discount_display_amount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__discount_subtotal +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__discount_subtotal +msgid "Discount Subtotal" +msgstr "Sconto concordato" + #. module: sale_discount_display_amount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__discount_total #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__discount_total -msgid "Discount Subtotal" -msgstr "Subtotale sconto" +msgid "Discount total" +msgstr "Sconto concordato" #. module: sale_discount_display_amount #: model:ir.model,name:sale_discount_display_amount.model_sale_order @@ -40,12 +45,19 @@ msgstr "Ordine di vendita" #. module: sale_discount_display_amount #: model:ir.model,name:sale_discount_display_amount.model_sale_order_line msgid "Sales Order Line" -msgstr "Riga ordine di vendita" +msgstr "Linea d'ordine di vendita" + +#. module: sale_discount_display_amount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__price_subtotal_no_discount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_subtotal_no_discount +msgid "Subtotal Without Discount" +msgstr "Imponibile parziale" #. module: sale_discount_display_amount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__price_subtotal_no_discount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__price_total_no_discount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_subtotal_no_discount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_total_no_discount -msgid "Subtotal Without Discount" -msgstr "Subtotale senza sconto" +msgid "Total Without Discount" +msgstr "Imponibile parziale" + diff --git a/sale_discount_display_amount/i18n/sale_discount_display_amount.pot b/sale_discount_display_amount/i18n/sale_discount_display_amount.pot index 98301ff582b..0aa74f24b6b 100644 --- a/sale_discount_display_amount/i18n/sale_discount_display_amount.pot +++ b/sale_discount_display_amount/i18n/sale_discount_display_amount.pot @@ -6,6 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-11 09:07+0000\n" +"PO-Revision-Date: 2024-03-11 09:07+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -23,10 +25,16 @@ msgstr "" msgid "Subtotal Without Discount" msgstr "" +#. module: sale_discount_display_amount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__discount_subtotal +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__discount_subtotal +msgid "Discount Subtotal" +msgstr "" + #. module: sale_discount_display_amount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__discount_total #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__discount_total -msgid "Discount Subtotal" +msgid "Discount total" msgstr "" #. module: sale_discount_display_amount @@ -44,6 +52,13 @@ msgstr "" #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__price_total_no_discount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_subtotal_no_discount #: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_total_no_discount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_subtotal_no_discount msgid "Subtotal Without Discount" msgstr "" +#. module: sale_discount_display_amount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order__price_total_no_discount +#: model:ir.model.fields,field_description:sale_discount_display_amount.field_sale_order_line__price_total_no_discount +msgid "Total Without Discount" +msgstr "" + diff --git a/sale_discount_display_amount/migrations/12.0.1.3.0/post-compute-subtotal-columns.py b/sale_discount_display_amount/migrations/12.0.1.3.0/post-compute-subtotal-columns.py new file mode 100644 index 00000000000..33c7439ecf5 --- /dev/null +++ b/sale_discount_display_amount/migrations/12.0.1.3.0/post-compute-subtotal-columns.py @@ -0,0 +1,21 @@ +import logging + +from odoo import SUPERUSER_ID +from odoo.api import Environment + +_logger = logging.getLogger(__name__) + + +def migrate(cr, version): + _logger.info("Compute discount columns") + env = Environment(cr, SUPERUSER_ID, {}) + + query = """ + select distinct order_id from sale_order_line where discount > 0.0; + """ + + cr.execute(query) + order_ids = cr.fetchall() + + orders = env["sale.order"].search([("id", "in", order_ids)]) + orders.mapped("order_line")._compute_discount() diff --git a/sale_discount_display_amount/migrations/12.0.1.3.0/pre-add-subtotal-columns.py b/sale_discount_display_amount/migrations/12.0.1.3.0/pre-add-subtotal-columns.py new file mode 100644 index 00000000000..8be68f33d72 --- /dev/null +++ b/sale_discount_display_amount/migrations/12.0.1.3.0/pre-add-subtotal-columns.py @@ -0,0 +1,17 @@ +import logging + +from odoo.tools.sql import column_exists, create_column + +_logger = logging.getLogger(__name__) + +COLUMNS = ( + ("sale_order", "discount_subtotal"), + ("sale_order_line", "discount_subtotal"), +) + + +def migrate(cr, version): + for table, column in COLUMNS: + if not column_exists(cr, table, column): + _logger.info("Create discount column %s in database", column) + create_column(cr, table, column, "numeric") diff --git a/sale_discount_display_amount/models/sale_order.py b/sale_discount_display_amount/models/sale_order.py index f4317800468..f4271ff6e70 100644 --- a/sale_discount_display_amount/models/sale_order.py +++ b/sale_discount_display_amount/models/sale_order.py @@ -9,6 +9,12 @@ class SaleOrder(models.Model): _inherit = 'sale.order' discount_total = fields.Monetary( + compute="_compute_discount_total", + string="Discount total", + currency_field="currency_id", + store=True, + ) + discount_subtotal = fields.Monetary( compute='_compute_discount_total', string='Discount Subtotal', currency_field='currency_id', @@ -21,7 +27,7 @@ class SaleOrder(models.Model): ) price_total_no_discount = fields.Monetary( compute='_compute_discount_total', - string='Subtotal Without Discount', + string='Total Without Discount', currency_field='currency_id', store=True) @@ -37,6 +43,8 @@ def _get_compute_discount_total_depends(self): def _compute_discount_total(self): for order in self: discount_total = sum(order.order_line.mapped('discount_total')) + discount_subtotal = sum( + order.order_line.mapped("discount_subtotal")) price_subtotal_no_discount = sum( order.order_line.mapped('price_subtotal_no_discount') ) @@ -46,6 +54,7 @@ def _compute_discount_total(self): order.update( { 'discount_total': discount_total, + "discount_subtotal": discount_subtotal, 'price_subtotal_no_discount': price_subtotal_no_discount, 'price_total_no_discount': price_total_no_discount, } diff --git a/sale_discount_display_amount/models/sale_order_line.py b/sale_discount_display_amount/models/sale_order_line.py index daa7f14c25c..d0361f90392 100644 --- a/sale_discount_display_amount/models/sale_order_line.py +++ b/sale_discount_display_amount/models/sale_order_line.py @@ -9,6 +9,9 @@ class SaleOrderLine(models.Model): _inherit = 'sale.order.line' discount_total = fields.Monetary( + compute="_compute_amount", string="Discount total", store=True + ) + discount_subtotal = fields.Monetary( compute='_compute_amount', string='Discount Subtotal', store=True) @@ -19,7 +22,7 @@ class SaleOrderLine(models.Model): ) price_total_no_discount = fields.Monetary( compute='_compute_amount', - string='Subtotal Without Discount', + string='Total Without Discount', store=True) def _compute_discount(self): @@ -39,9 +42,11 @@ def _compute_discount(self): price_subtotal_no_discount = taxes['total_excluded'] price_total_no_discount = taxes['total_included'] discount_total = price_total_no_discount - line.price_total + discount_subtotal = price_subtotal_no_discount - line.price_subtotal line.update({ 'discount_total': discount_total, + "discount_subtotal": discount_subtotal, 'price_subtotal_no_discount': price_subtotal_no_discount, 'price_total_no_discount': price_total_no_discount }) diff --git a/sale_discount_display_amount/tests/test_discount_display_amount.py b/sale_discount_display_amount/tests/test_discount_display_amount.py index 1f6a308c9ce..3d6410ac8d3 100644 --- a/sale_discount_display_amount/tests/test_discount_display_amount.py +++ b/sale_discount_display_amount/tests/test_discount_display_amount.py @@ -30,3 +30,4 @@ def test_sale_discount_value(self): self.assertAlmostEqual(so.price_subtotal_no_discount, 30.75) self.assertAlmostEqual(so.price_total_no_discount, 35.36) self.assertAlmostEqual(so.discount_total, 3.53) + self.assertAlmostEqual(so.discount_subtotal, 3.07) diff --git a/sale_discount_display_amount/views/sale_view.xml b/sale_discount_display_amount/views/sale_view.xml index 06d7dbf80c9..9b23d9af138 100644 --- a/sale_discount_display_amount/views/sale_view.xml +++ b/sale_discount_display_amount/views/sale_view.xml @@ -8,9 +8,10 @@ - - - + + + +