From c11afd5f969a7b5c677c24f466819ae76bf69c08 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 7 Oct 2022 13:01:12 +0200 Subject: [PATCH 1/2] [IMP] account_payment_partner: Make payment mode editable on journal item This field was editable in previous version before invoice > move refactoring, and it's logic to allow to change payment mode once the invoice has been posted without the need of resetting it to draft. Thus, the field has been changed to computed writable field, taking care of the consequences at model level (compute) and view level (add the field in views + proper attrs). This commits adds tracking=True to the payment mode field as well to be aware when and who the payment mode is changed in the invoice, no matter if directly changed in draft, or through the change on the journal item. TT39850 --- .../models/account_move.py | 1 + .../models/account_move_line.py | 20 ++++++++++++-- .../tests/test_account_payment_partner.py | 4 +++ .../views/account_move_line.xml | 27 ++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/account_payment_partner/models/account_move.py b/account_payment_partner/models/account_move.py index 4069f77b1..2603129d8 100644 --- a/account_payment_partner/models/account_move.py +++ b/account_payment_partner/models/account_move.py @@ -22,6 +22,7 @@ class AccountMove(models.Model): store=True, ondelete="restrict", readonly=False, + tracking=True, ) bank_account_required = fields.Boolean( related="payment_mode_id.payment_method_id.bank_account_required", readonly=True diff --git a/account_payment_partner/models/account_move_line.py b/account_payment_partner/models/account_move_line.py index 0664d80f5..3307afee4 100644 --- a/account_payment_partner/models/account_move_line.py +++ b/account_payment_partner/models/account_move_line.py @@ -13,9 +13,10 @@ class AccountMoveLine(models.Model): store=True, ondelete="restrict", index=True, + readonly=False, ) - @api.depends("move_id.payment_mode_id") + @api.depends("move_id", "move_id.payment_mode_id") def _compute_payment_mode(self): for line in self: if line.move_id.is_invoice() and line.account_internal_type in ( @@ -24,4 +25,19 @@ class AccountMoveLine(models.Model): ): line.payment_mode_id = line.move_id.payment_mode_id else: - line.payment_mode_id = False + line.payment_mode_id = line.payment_mode_id # HACK not needed for v14+ + + def write(self, vals): + """Propagate up to the move the payment mode if applies.""" + if "payment_mode_id" in vals: + for record in self: + move = ( + self.env["account.move"].browse(vals.get("move_id", 0)) + or record.move_id + ) + if ( + move.payment_mode_id.id != vals["payment_mode_id"] + and move.is_invoice() + ): + move.payment_mode_id = vals["payment_mode_id"] + return super().write(vals) diff --git a/account_payment_partner/tests/test_account_payment_partner.py b/account_payment_partner/tests/test_account_payment_partner.py index afc7904d0..3b79068b8 100644 --- a/account_payment_partner/tests/test_account_payment_partner.py +++ b/account_payment_partner/tests/test_account_payment_partner.py @@ -292,6 +292,10 @@ class TestAccountPaymentPartner(SavepointCase): lambda l: l.account_id.user_type_id == self.acct_type_payable ) self.assertEquals(invoice.payment_mode_id, aml[0].payment_mode_id) + # Test payment mode change on aml + mode = self.supplier_payment_mode.copy() + aml.payment_mode_id = mode + self.assertEquals(invoice.payment_mode_id, mode) def test_invoice_create_out_invoice(self): invoice = self._create_invoice( diff --git a/account_payment_partner/views/account_move_line.xml b/account_payment_partner/views/account_move_line.xml index a56d67039..4c00e72ef 100644 --- a/account_payment_partner/views/account_move_line.xml +++ b/account_payment_partner/views/account_move_line.xml @@ -14,9 +14,34 @@ position="after" > - + + + + + account.move.line.tree - Add payment mode + account.move.line + + + + + + + + + From d879a42c74d1c0a5df69942c5089c564b523d14c Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 18 Jan 2023 10:02:31 +0100 Subject: [PATCH 2/2] [IMP] account_payment_partner: Make payment mode editable on entry Complement of 998f8df6aa254266c015fab144ba290e1a386cf0 Extend the editability to the journal entry (account.move), taking as criteria if there's no reconciliation made, which is the definitory one. It includes test for this new partner, both the mode propagation and the editability check. TT39850 --- account_payment_partner/models/account_move.py | 15 +++++++++++++++ .../tests/test_account_payment_partner.py | 14 ++++++++++++++ .../views/account_move_view.xml | 3 ++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/account_payment_partner/models/account_move.py b/account_payment_partner/models/account_move.py index 2603129d8..824e599e8 100644 --- a/account_payment_partner/models/account_move.py +++ b/account_payment_partner/models/account_move.py @@ -33,6 +33,10 @@ class AccountMove(models.Model): ondelete="restrict", readonly=False, ) + has_reconciled_items = fields.Boolean( + help="Technical field for supporting the editability of the payment mode", + compute="_compute_has_reconciled_items", + ) @api.depends("type") def _compute_payment_mode_filter_type_domain(self): @@ -82,6 +86,17 @@ class AccountMove(models.Model): partner.supplier_payment_mode_id.refund_payment_mode_id ) + @api.depends("line_ids.matched_credit_ids", "line_ids.matched_debit_ids") + def _compute_has_reconciled_items(self): + for record in self: + lines_to_consider = record.line_ids.filtered( + lambda x: x.account_id.internal_type in ("receivable", "payable") + ) + record.has_reconciled_items = bool( + lines_to_consider.matched_credit_ids + + lines_to_consider.matched_debit_ids + ) + @api.onchange("partner_id") def _onchange_partner_id(self): """Force compute because the onchange chain doesn't call diff --git a/account_payment_partner/tests/test_account_payment_partner.py b/account_payment_partner/tests/test_account_payment_partner.py index 3b79068b8..a80489ae1 100644 --- a/account_payment_partner/tests/test_account_payment_partner.py +++ b/account_payment_partner/tests/test_account_payment_partner.py @@ -296,6 +296,20 @@ class TestAccountPaymentPartner(SavepointCase): mode = self.supplier_payment_mode.copy() aml.payment_mode_id = mode self.assertEquals(invoice.payment_mode_id, mode) + # Test payment mode editability on account move + self.assertFalse(invoice.has_reconciled_items) + invoice.payment_mode_id = self.supplier_payment_mode + self.assertEquals(aml.payment_mode_id, self.supplier_payment_mode) + payment_form = Form( + self.env["account.payment"].with_context( + active_ids=invoice.ids, + active_model="account.move", + active_id=invoice.id, + ) + ) + payment = payment_form.save() + payment.post() + self.assertTrue(invoice.has_reconciled_items) def test_invoice_create_out_invoice(self): invoice = self._create_invoice( diff --git a/account_payment_partner/views/account_move_view.xml b/account_payment_partner/views/account_move_view.xml index 7dd11363b..e83955787 100644 --- a/account_payment_partner/views/account_move_view.xml +++ b/account_payment_partner/views/account_move_view.xml @@ -27,11 +27,12 @@ expr="//div[field[@name='invoice_payment_term_id']]" position="after" > +