From 66f72145d5bc15f66b84b09a9caf3a7f7e9d7ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Sat, 9 Jul 2022 16:02:06 +0200 Subject: [PATCH 1/7] account_invoice_update_wizard: fix UI add translation Add section support and keep order based on the line sequence Add Fr translation --- .../i18n/account_invoice_update_wizard.pot | 243 +++++++++++++++++ account_invoice_update_wizard/i18n/fr.po | 250 ++++++++++++++++++ .../wizard/account_move_update.py | 3 + .../wizard/account_move_update_view.xml | 2 +- 4 files changed, 497 insertions(+), 1 deletion(-) create mode 100644 account_invoice_update_wizard/i18n/account_invoice_update_wizard.pot create mode 100644 account_invoice_update_wizard/i18n/fr.po diff --git a/account_invoice_update_wizard/i18n/account_invoice_update_wizard.pot b/account_invoice_update_wizard/i18n/account_invoice_update_wizard.pot new file mode 100644 index 0000000..10df6c0 --- /dev/null +++ b/account_invoice_update_wizard/i18n/account_invoice_update_wizard.pot @@ -0,0 +1,243 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_invoice_update_wizard +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__price_subtotal +msgid "Amount" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_account_id +msgid "Analytic Account" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_tag_ids +msgid "Analytic Tags" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_bank_id +msgid "Bank Account" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Bill Reference" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Cancel" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__company_id +msgid "Company" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_uid +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_uid +msgid "Created by" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_date +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_date +msgid "Created on" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__currency_id +msgid "Currency" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Customer Reference" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__name +msgid "Description" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__display_name +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_name +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__display_name +msgid "Display Name" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_type +msgid "Display Type" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__id +msgid "ID" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_id +msgid "Invoice" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__invoice_line_id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__line_ids +msgid "Invoice Lines" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.actions.act_window,name:account_invoice_update_wizard.account_invoice_update_action +msgid "Invoice Update Wizard" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move____last_update +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update____last_update +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_uid +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_date +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "Non-legal fields of invoice updated via the Invoice Update wizard." +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_note +msgid "Note" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_id +msgid "Partner" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_payment_term_id +msgid "Payment Term" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__quantity +msgid "Quantity" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__ref +msgid "Reference" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__user_id +msgid "Salesperson" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_section +msgid "Section" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__sequence +msgid "Sequence" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_origin +msgid "Source Document" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,help:account_invoice_update_wizard.field_account_move_line_update__display_type +msgid "Technical field for UX purpose." +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "" +"The original payment term '%s' doesn't have the same terms (number of terms " +"and/or amount) as the new payment term '%s'. You can only switch to a " +"payment term that has the same number of terms with the same amount." +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "" +"This wizard doesn't support the update of payment terms on an invoice which " +"is partially or fully paid." +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__move_type +msgid "Type" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Update" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.view_move_form_inherit +msgid "Update Invoice" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Update Invoice Wizard" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move_line_update +msgid "Update non-legal fields of invoice lines" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__parent_id +msgid "Wizard" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move_update +msgid "Wizard to update non-legal fields of invoice" +msgstr "" diff --git a/account_invoice_update_wizard/i18n/fr.po b/account_invoice_update_wizard/i18n/fr.po new file mode 100644 index 0000000..ae5de72 --- /dev/null +++ b/account_invoice_update_wizard/i18n/fr.po @@ -0,0 +1,250 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_invoice_update_wizard +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__price_subtotal +msgid "Amount" +msgstr "Montant" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_account_id +msgid "Analytic Account" +msgstr "Compte Analytique" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_tag_ids +msgid "Analytic Tags" +msgstr "Tag Analytique" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_bank_id +msgid "Bank Account" +msgstr "Compte Bancaire" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +#, fuzzy +msgid "Bill Reference" +msgstr "Reference Client" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Cancel" +msgstr "Annuler" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__company_id +msgid "Company" +msgstr "Société" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_uid +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_date +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__currency_id +msgid "Currency" +msgstr "Devise" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +#, fuzzy +msgid "Customer Reference" +msgstr "Reference Client" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__name +msgid "Description" +msgstr "Description" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__display_name +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_name +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__display_name +msgid "Display Name" +msgstr "Nom" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_type +msgid "Display Type" +msgstr "Type Affichage" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__id +msgid "ID" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_id +msgid "Invoice" +msgstr "Facture" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__invoice_line_id +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__line_ids +msgid "Invoice Lines" +msgstr "Ligne de factures" + +#. module: account_invoice_update_wizard +#: model:ir.actions.act_window,name:account_invoice_update_wizard.account_invoice_update_action +msgid "Invoice Update Wizard" +msgstr "Assistance de mise à jour de la facture" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move +msgid "Journal Entry" +msgstr "Entrée comptable" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move____last_update +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update____last_update +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_uid +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_date +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "Non-legal fields of invoice updated via the Invoice Update wizard." +msgstr "Champs non légaux mis à jour via l'assistant" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_note +msgid "Note" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_id +msgid "Partner" +msgstr "Client" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_payment_term_id +msgid "Payment Term" +msgstr "Condition de paiement" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__quantity +msgid "Quantity" +msgstr "Quantité" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__ref +#, fuzzy +msgid "Reference" +msgstr "Reference Client" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__user_id +msgid "Salesperson" +msgstr "Vendeur" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_section +msgid "Section" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__sequence +msgid "Sequence" +msgstr "Sequence" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_origin +msgid "Source Document" +msgstr "Origine du document" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,help:account_invoice_update_wizard.field_account_move_line_update__display_type +msgid "Technical field for UX purpose." +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "" +"The original payment term '%s' doesn't have the same terms (number of terms " +"and/or amount) as the new payment term '%s'. You can only switch to a " +"payment term that has the same number of terms with the same amount." +msgstr "" + +#. module: account_invoice_update_wizard +#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0 +#, python-format +msgid "" +"This wizard doesn't support the update of payment terms on an invoice which " +"is partially or fully paid." +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__move_type +msgid "Type" +msgstr "" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Update" +msgstr "Mettre à jour" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.view_move_form_inherit +msgid "Update Invoice" +msgstr "Mettre à jour" + +#. module: account_invoice_update_wizard +#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form +msgid "Update Invoice Wizard" +msgstr "Assistant de mise à jour" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move_line_update +msgid "Update non-legal fields of invoice lines" +msgstr "Mettre à jour les champs non légaux des lignes de facture" + +#. module: account_invoice_update_wizard +#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__parent_id +msgid "Wizard" +msgstr "" + +#. module: account_invoice_update_wizard +#: model:ir.model,name:account_invoice_update_wizard.model_account_move_update +msgid "Wizard to update non-legal fields of invoice" +msgstr "Assistant pour mettre à jours les champs non légaux" + +#~ msgid "Account" +#~ msgstr "Compte" diff --git a/account_invoice_update_wizard/wizard/account_move_update.py b/account_invoice_update_wizard/wizard/account_move_update.py index c454f07..98c0ba3 100644 --- a/account_invoice_update_wizard/wizard/account_move_update.py +++ b/account_invoice_update_wizard/wizard/account_move_update.py @@ -48,6 +48,7 @@ class AccountMoveUpdate(models.TransientModel): aa_tags = [(6, 0, aa_tags.ids)] if aa_tags else False res['line_ids'].append([0, 0, { 'invoice_line_id': line.id, + 'sequence': line.sequence, 'name': line.name, 'quantity': line.quantity, 'price_subtotal': line.price_subtotal, @@ -231,7 +232,9 @@ class AccountMoveUpdate(models.TransientModel): class AccountMoveLineUpdate(models.TransientModel): _name = 'account.move.line.update' _description = 'Update non-legal fields of invoice lines' + _order = "sequence, name" + sequence = fields.Integer() parent_id = fields.Many2one( 'account.move.update', string='Wizard', ondelete='cascade') invoice_line_id = fields.Many2one( diff --git a/account_invoice_update_wizard/wizard/account_move_update_view.xml b/account_invoice_update_wizard/wizard/account_move_update_view.xml index c817089..6dc388a 100644 --- a/account_invoice_update_wizard/wizard/account_move_update_view.xml +++ b/account_invoice_update_wizard/wizard/account_move_update_view.xml @@ -23,7 +23,7 @@ - + From 6ff99bd91f7b2b1deb98b13f58914eeec8af398d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Sat, 9 Jul 2022 22:55:03 +0200 Subject: [PATCH 2/7] account_invoice_update_wizard: inactive update of broken payment term We should add test and fix it --- .../wizard/account_move_update_view.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/account_invoice_update_wizard/wizard/account_move_update_view.xml b/account_invoice_update_wizard/wizard/account_move_update_view.xml index 6dc388a..d253370 100644 --- a/account_invoice_update_wizard/wizard/account_move_update_view.xml +++ b/account_invoice_update_wizard/wizard/account_move_update_view.xml @@ -18,7 +18,8 @@ - + + From 89f9a2afa37a4be8891baa6813cfca8af7a49fe4 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Mon, 12 Feb 2024 11:51:15 +0100 Subject: [PATCH 3/7] [IMP] account_invoice_update_wizard : rename button for accounting entries + hide invoice specific fields in case of accountring entries --- account_invoice_update_wizard/views/account_move.xml | 3 ++- .../wizard/account_move_update_view.xml | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/account_invoice_update_wizard/views/account_move.xml b/account_invoice_update_wizard/views/account_move.xml index b142b8b..4e6ae5b 100644 --- a/account_invoice_update_wizard/views/account_move.xml +++ b/account_invoice_update_wizard/views/account_move.xml @@ -11,7 +11,8 @@ diff --git a/account_invoice_update_wizard/wizard/account_move_update_view.xml b/account_invoice_update_wizard/wizard/account_move_update_view.xml index d253370..2149860 100644 --- a/account_invoice_update_wizard/wizard/account_move_update_view.xml +++ b/account_invoice_update_wizard/wizard/account_move_update_view.xml @@ -17,11 +17,12 @@ - + + - - + + @@ -30,8 +31,8 @@ - - + + From 9fc47065ff7a38bd3210fb6deac305baceab57da Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Mon, 11 Mar 2024 12:29:35 +0100 Subject: [PATCH 4/7] [IMP] Add bill date (for supplier invoice) and rename bill ref to supplier bill ref to be consistent with name in invoice --- account_invoice_update_wizard/wizard/account_move_update.py | 3 ++- .../wizard/account_move_update_view.xml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/account_invoice_update_wizard/wizard/account_move_update.py b/account_invoice_update_wizard/wizard/account_move_update.py index 98c0ba3..ea59e8f 100644 --- a/account_invoice_update_wizard/wizard/account_move_update.py +++ b/account_invoice_update_wizard/wizard/account_move_update.py @@ -21,6 +21,7 @@ class AccountMoveUpdate(models.TransientModel): invoice_payment_term_id = fields.Many2one( 'account.payment.term', string='Payment Term') ref = fields.Char(string='Reference') # field label is customized in the view + invoice_date = fields.Date() invoice_origin = fields.Char(string='Source Document') partner_bank_id = fields.Many2one( 'res.partner.bank', string='Bank Account') @@ -30,7 +31,7 @@ class AccountMoveUpdate(models.TransientModel): @api.model def _simple_fields2update(self): '''List boolean, date, datetime, char, text fields''' - return ['ref', 'invoice_origin'] + return ['ref', 'invoice_origin', 'invoice_date'] @api.model def _m2o_fields2update(self): diff --git a/account_invoice_update_wizard/wizard/account_move_update_view.xml b/account_invoice_update_wizard/wizard/account_move_update_view.xml index 2149860..f772cdd 100644 --- a/account_invoice_update_wizard/wizard/account_move_update_view.xml +++ b/account_invoice_update_wizard/wizard/account_move_update_view.xml @@ -15,7 +15,8 @@ - + + From 6d855f4397e531d34b0f7e121c0beb8ce4daa461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Fri, 27 Sep 2024 17:11:39 +0200 Subject: [PATCH 5/7] account_invoice_update_wizard: purge existing pdf in attachment after update --- account_invoice_update_wizard/wizard/account_move_update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/account_invoice_update_wizard/wizard/account_move_update.py b/account_invoice_update_wizard/wizard/account_move_update.py index ea59e8f..40cbdfe 100644 --- a/account_invoice_update_wizard/wizard/account_move_update.py +++ b/account_invoice_update_wizard/wizard/account_move_update.py @@ -227,6 +227,9 @@ class AccountMoveUpdate(models.TransientModel): inv.message_post(body=_( 'Non-legal fields of invoice updated via the Invoice Update ' 'wizard.')) + # Purge existing PDF + report = self.env.ref("account.account_invoices") + report.retrieve_attachment(inv).unlink() return True From 03c3f8c15dcc192abd73d138e8e01060b8b34f68 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Thu, 10 Oct 2024 09:12:48 +0200 Subject: [PATCH 6/7] [FIX] account_invoice_update_wizard : avoid stacktrace when no pdf is found --- account_invoice_update_wizard/wizard/account_move_update.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/account_invoice_update_wizard/wizard/account_move_update.py b/account_invoice_update_wizard/wizard/account_move_update.py index 40cbdfe..873829f 100644 --- a/account_invoice_update_wizard/wizard/account_move_update.py +++ b/account_invoice_update_wizard/wizard/account_move_update.py @@ -229,7 +229,10 @@ class AccountMoveUpdate(models.TransientModel): 'wizard.')) # Purge existing PDF report = self.env.ref("account.account_invoices") - report.retrieve_attachment(inv).unlink() + attachment = report.retrieve_attachment(inv) + # attachment may be None + if attachment: + attachment.unlink() return True From a76cb62beae8cc321e827d2fcd9c72408a1a1e36 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Wed, 19 Mar 2025 17:22:26 +0100 Subject: [PATCH 7/7] [MIG] account_invoice_update_wizard to 18 --- account_invoice_update_wizard/__manifest__.py | 4 +- .../tests/test_account_move_update_wizard.py | 110 ++++-------------- .../views/account_move.xml | 4 +- .../wizard/account_move_update.py | 100 +++++----------- .../wizard/account_move_update_view.xml | 37 +++--- 5 files changed, 79 insertions(+), 176 deletions(-) diff --git a/account_invoice_update_wizard/__manifest__.py b/account_invoice_update_wizard/__manifest__.py index dd60e4e..ab3906a 100644 --- a/account_invoice_update_wizard/__manifest__.py +++ b/account_invoice_update_wizard/__manifest__.py @@ -4,7 +4,7 @@ { 'name': 'Account Invoice Update Wizard', - 'version': '14.0.1.0.0', + 'version': '18.0.1.0.0', 'category': 'Accounting & Finance', 'license': 'AGPL-3', 'summary': 'Wizard to update non-legal fields of an open/paid invoice', @@ -18,5 +18,5 @@ 'wizard/account_move_update_view.xml', 'views/account_move.xml', ], - 'installable': False, + 'installable': True, } diff --git a/account_invoice_update_wizard/tests/test_account_move_update_wizard.py b/account_invoice_update_wizard/tests/test_account_move_update_wizard.py index ec6171e..bc08d5d 100644 --- a/account_invoice_update_wizard/tests/test_account_move_update_wizard.py +++ b/account_invoice_update_wizard/tests/test_account_move_update_wizard.py @@ -1,10 +1,10 @@ # Copyright 2018-2022 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.tests.common import SavepointCase +from odoo.tests.common import TransactionCase -class TestAccountInvoiceUpdateWizard(SavepointCase): +class TestAccountInvoiceUpdateWizard(TransactionCase): @classmethod def setUpClass(cls): @@ -13,6 +13,17 @@ class TestAccountInvoiceUpdateWizard(SavepointCase): cls.product16 = cls.env.ref('product.product_product_16') uom_unit = cls.env.ref('uom.product_uom_categ_unit') + cls.plan = cls.env['account.analytic.plan'].create({'name': 'Test Plan'}) + cls.analytic_account_1 = cls.env['account.analytic.account'].create({ + 'name': 'analytic 1 test plan', + 'plan_id': cls.plan.id, + 'company_id': False, + }) + cls.analytic_account_2 = cls.env['account.analytic.account'].create({ + 'name': 'analytic 2 test plan', + 'plan_id': cls.plan.id, + 'company_id': False, + }) cls.move1 = cls.env['account.move'].create({ 'name': 'Test invoice', 'partner_id': cls.customer12.id, @@ -30,13 +41,6 @@ class TestAccountInvoiceUpdateWizard(SavepointCase): ], }) - cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp') - cls.aa2 = cls.env.ref('analytic.analytic_nebula') - cls.atag1 = cls.env.ref('analytic.tag_contract') - cls.atag2 = cls.env['account.analytic.tag'].create({ - 'name': 'の', - }) - def create_wizard(self, move): res = move.prepare_update_wizard() self.wiz = self.env['account.move.update'].browse(res['res_id']) @@ -54,13 +58,14 @@ class TestAccountInvoiceUpdateWizard(SavepointCase): wiz_line = self.wiz.line_ids.filtered( lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_account_id = self.aa1 + wiz_line.analytic_distribution = {self.analytic_account_1.id: 50, self.analytic_account_2.id: 50} self.wiz.run() related_ml = self.move1.invoice_line_ids.filtered( lambda rec: rec.product_id == self.product16) - self.assertEqual(related_ml.analytic_account_id, self.aa1) - self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1) + self.assertEqual(related_ml.analytic_distribution, {str(self.analytic_account_1.id): 50.0, str(self.analytic_account_2.id): 50.0}) + self.assertEqual(len(related_ml.analytic_line_ids), 2) + self.assertEqual(related_ml.analytic_line_ids[0].amount, 21.0) def test_change_analytic_account_line1(self): """ Change analytic account on a move line @@ -70,86 +75,21 @@ class TestAccountInvoiceUpdateWizard(SavepointCase): - update the move line - update the existing analytic line.""" move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16) - move_line1.analytic_account_id = self.aa2 + move_line1.analytic_distribution = {self.analytic_account_1.id: 100} self.move1._post() self.create_wizard(self.move1) wiz_line = self.wiz.line_ids.filtered( lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_account_id = self.aa1 + wiz_line.analytic_distribution = {self.analytic_account_1.id: 50, self.analytic_account_2.id: 50} self.wiz.run() related_ml = self.move1.invoice_line_ids.filtered( lambda rec: rec.product_id == self.product16) - self.assertEqual(related_ml.analytic_account_id, self.aa1) - self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1) - - def test_add_analytic_tags_line1(self): - """ Add analytic tags on a move line - after the move has been approved. - - This will update move line. - """ - self.move1._post() - self.create_wizard(self.move1) - - wiz_line = self.wiz.line_ids.filtered( - lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_tag_ids = self.atag2 - self.wiz.run() - - related_ml = self.move1.invoice_line_ids.filtered( - lambda rec: rec.product_id == self.product16) - self.assertEqual(related_ml.analytic_tag_ids, self.atag2) - self.assertFalse(related_ml.analytic_line_ids) - - def test_change_analytic_tags_line1(self): - """ Change analytic tags on a move line - after the move has been approved. - - It will update move line and analytic line - """ - move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16) - move_line1.analytic_account_id = self.aa2 - move_line1.analytic_tag_ids = self.atag1 - - self.move1._post() - self.create_wizard(self.move1) - - wiz_line = self.wiz.line_ids.filtered( - lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_tag_ids = self.atag2 - self.wiz.run() - - related_ml = self.move1.invoice_line_ids.filtered( - lambda rec: rec.product_id == self.product16) - self.assertEqual(related_ml.analytic_tag_ids, self.atag2) - self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2) - - def test_add_analytic_info_line1(self): - """ Add analytic account and tags on a move line - after the move has been approved. - - This will: - - update move line - - create an analytic line - """ - self.move1._post() - self.create_wizard(self.move1) - - wiz_line = self.wiz.line_ids.filtered( - lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_account_id = self.aa1 - wiz_line.analytic_tag_ids = self.atag2 - self.wiz.run() - - related_ml = self.move1.invoice_line_ids.filtered( - lambda rec: rec.product_id == self.product16) - self.assertEqual(related_ml.analytic_account_id, self.aa1) - self.assertEqual(related_ml.analytic_tag_ids, self.atag2) - self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1) - self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2) + self.assertEqual(related_ml.analytic_distribution, {str(self.analytic_account_1.id): 50.0, str(self.analytic_account_2.id): 50.0}) + self.assertEqual(len(related_ml.analytic_line_ids), 2) + self.assertEqual(related_ml.analytic_line_ids[0].amount, 21.0) def test_empty_analytic_account_line1(self): """ Remove analytic account @@ -158,16 +98,16 @@ class TestAccountInvoiceUpdateWizard(SavepointCase): This will raise an error as it is not implemented. """ move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16) - move_line1.analytic_account_id = self.aa2 + move_line1.analytic_distribution = {self.analytic_account_1.id: 100} self.move1._post() self.create_wizard(self.move1) wiz_line = self.wiz.line_ids.filtered( lambda rec: rec.invoice_line_id.product_id.id == self.product16.id) - wiz_line.analytic_account_id = False + wiz_line.analytic_distribution = False self.wiz.run() related_ml = self.move1.invoice_line_ids.filtered( lambda rec: rec.product_id == self.product16) - self.assertFalse(related_ml.analytic_account_id) + self.assertFalse(related_ml.analytic_distribution) self.assertFalse(related_ml.analytic_line_ids) diff --git a/account_invoice_update_wizard/views/account_move.xml b/account_invoice_update_wizard/views/account_move.xml index 4e6ae5b..9429cc0 100644 --- a/account_invoice_update_wizard/views/account_move.xml +++ b/account_invoice_update_wizard/views/account_move.xml @@ -11,8 +11,8 @@ diff --git a/account_invoice_update_wizard/wizard/account_move_update.py b/account_invoice_update_wizard/wizard/account_move_update.py index 873829f..e9a14a2 100644 --- a/account_invoice_update_wizard/wizard/account_move_update.py +++ b/account_invoice_update_wizard/wizard/account_move_update.py @@ -2,7 +2,7 @@ # Copyright 2018-2022 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields, api, _ +from odoo import Command, models, fields, api from odoo.exceptions import UserError import odoo.addons.decimal_precision as dp @@ -17,7 +17,7 @@ class AccountMoveUpdate(models.TransientModel): move_type = fields.Selection(related='invoice_id.move_type') company_id = fields.Many2one(related='invoice_id.company_id') partner_id = fields.Many2one(related='invoice_id.partner_id') - user_id = fields.Many2one('res.users', string='Salesperson') + invoice_user_id = fields.Many2one('res.users', string='Salesperson') invoice_payment_term_id = fields.Many2one( 'account.payment.term', string='Payment Term') ref = fields.Char(string='Reference') # field label is customized in the view @@ -35,7 +35,7 @@ class AccountMoveUpdate(models.TransientModel): @api.model def _m2o_fields2update(self): - return ['invoice_payment_term_id', 'user_id', 'partner_bank_id'] + return ['invoice_payment_term_id', 'invoice_user_id', 'partner_bank_id'] @api.model def _prepare_default_get(self, invoice): @@ -45,18 +45,14 @@ class AccountMoveUpdate(models.TransientModel): for m2ofield in self._m2o_fields2update(): res[m2ofield] = invoice[m2ofield].id or False for line in invoice.invoice_line_ids: - aa_tags = line.analytic_tag_ids - aa_tags = [(6, 0, aa_tags.ids)] if aa_tags else False res['line_ids'].append([0, 0, { 'invoice_line_id': line.id, 'sequence': line.sequence, 'name': line.name, 'quantity': line.quantity, 'price_subtotal': line.price_subtotal, - 'analytic_account_id': line.analytic_account_id.id, + 'analytic_distribution': line.analytic_distribution, 'currency_id': line.currency_id.id, - 'analytic_tag_ids': aa_tags, - 'display_type': line.display_type, }]) return res @@ -89,15 +85,15 @@ class AccountMoveUpdate(models.TransientModel): @api.model def _line_simple_fields2update(self): - return ["name"] + return ["name", "analytic_distribution"] @api.model def _line_m2o_fields2update(self): - return ["analytic_account_id"] + return [] @api.model def _line_m2m_fields2update(self): - return ["analytic_tag_ids"] + return [] @api.model def _prepare_invoice_line(self, line): @@ -110,30 +106,9 @@ class AccountMoveUpdate(models.TransientModel): vals[field] = line[field].id for field in self._line_m2m_fields2update(): if line[field] != line.invoice_line_id[field]: - vals[field] = [(6, 0, line[field].ids)] + vals[field] = [Command.set(line[field].ids)] return vals - def _prepare_move_line_and_analytic_line(self, inv_line): - mlvals = {} - alvals = {} - inv_line_upd = self.line_ids.filtered( - lambda rec: rec.invoice_line_id == inv_line) - - ini_aa = inv_line.analytic_account_id - new_aa = inv_line_upd.analytic_account_id - - if ini_aa != new_aa: - mlvals['analytic_account_id'] = new_aa.id - alvals['account_id'] = new_aa.id - - ini_aa_tags = inv_line.analytic_tag_ids - new_aa_tags = inv_line_upd.analytic_tag_ids - - if ini_aa_tags != new_aa_tags: - mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)] - alvals['tag_ids'] = [(6, None, new_aa_tags.ids)] - return mlvals, alvals - def _update_payment_term_move(self): self.ensure_one() inv = self.invoice_id @@ -146,7 +121,7 @@ class AccountMoveUpdate(models.TransientModel): # the reconcile marks to put the new maturity date on the right # lines if inv.payment_id: - raise UserError(_( + raise UserError(self.env._( "This wizard doesn't support the update of payment " "terms on an invoice which is partially or fully " "paid.")) @@ -170,7 +145,7 @@ class AccountMoveUpdate(models.TransientModel): mlines[amount] = [line] for iamount, lines in mlines.items(): if len(lines) != len(new_pterm.get(iamount, [])): - raise UserError(_( + raise UserError(self.env._( "The original payment term '%s' doesn't have the " "same terms (number of terms and/or amount) as the " "new payment term '%s'. You can only switch to a " @@ -190,41 +165,16 @@ class AccountMoveUpdate(models.TransientModel): if ivals: updated = True inv.write(ivals) - if inv: - for ml in inv.line_ids.filtered( - # we are only interested in invoice lines, not tax lines - lambda rec: bool(rec.product_id) - ): - if ml.credit == 0.0: - continue - analytic_account = ml.analytic_account_id - mlvals, alvals = self._prepare_move_line_and_analytic_line(ml) - if mlvals: - updated = True - ml.write(mlvals) - aalines = ml.analytic_line_ids - if aalines and alvals: - updated = True - if ('account_id' in alvals and - alvals['account_id'] is False): - former_aa = analytic_account - to_remove_aalines = aalines.filtered( - lambda rec: rec.account_id == former_aa) - # remove existing analytic line - to_remove_aalines.unlink() - else: - aalines.write(alvals) - elif 'account_id' in alvals: - # Create analytic lines if analytic account - # is added later - ml.create_analytic_lines() for line in self.line_ids: ilvals = self._prepare_invoice_line(line) if ilvals: updated = True + # note that updating analytic_distribution will delete/re-create + # the analytic line with inverse method, we do not need additional + # logic about that. line.invoice_line_id.write(ilvals) if updated: - inv.message_post(body=_( + inv.message_post(body=self.env._( 'Non-legal fields of invoice updated via the Invoice Update ' 'wizard.')) # Purge existing PDF @@ -247,15 +197,23 @@ class AccountMoveLineUpdate(models.TransientModel): invoice_line_id = fields.Many2one( 'account.move.line', string='Invoice Line', readonly=True) name = fields.Text(string='Description', required=True) - display_type = fields.Selection([ - ('line_section', "Section"), - ('line_note', "Note")], default=False, help="Technical field for UX purpose.") + display_type = fields.Selection( + related="invoice_line_id.display_type", + help="Technical field for UX purpose.") quantity = fields.Float( string='Quantity', digits='Product Unit of Measure', readonly=True) price_subtotal = fields.Monetary( string='Amount', readonly=True) - analytic_account_id = fields.Many2one( - 'account.analytic.account', string='Analytic Account') - analytic_tag_ids = fields.Many2many( - 'account.analytic.tag', string='Analytic Tags') currency_id = fields.Many2one('res.currency', readonly=True) + analytic_distribution = fields.Json( + string="Analytic", +# compute="_compute_writeoff_analytic_distribution", +# readonly=False, +# store=True, +# precompute=True, + ) + analytic_precision = fields.Integer( + default=lambda self: self.env["decimal.precision"].precision_get( + "Percentage Analytic" + ), + ) diff --git a/account_invoice_update_wizard/wizard/account_move_update_view.xml b/account_invoice_update_wizard/wizard/account_move_update_view.xml index f772cdd..df51010 100644 --- a/account_invoice_update_wizard/wizard/account_move_update_view.xml +++ b/account_invoice_update_wizard/wizard/account_move_update_view.xml @@ -15,28 +15,33 @@ - - - - - + + + + + - - + + - - - - + + + + - - - - - + + + +