diff --git a/account_payment_partner/models/account_move.py b/account_payment_partner/models/account_move.py index 4069f77b1..824e599e8 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 @@ -32,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): @@ -81,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/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..a80489ae1 100644 --- a/account_payment_partner/tests/test_account_payment_partner.py +++ b/account_payment_partner/tests/test_account_payment_partner.py @@ -292,6 +292,24 @@ 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) + # 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_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 + + + + + + + + + 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" > +