Skip to content

Commit

Permalink
[FIX] sale_order_type: Avoid unwanted triggering of compute functions
Browse files Browse the repository at this point in the history
Having account.move._compute_journal_id overriden with an added
dependency to sale_type_id is messing with computation triggers,
because compute functions depending on journal_id will get recomputed,
potentially overwriting existing value, as is the case with
bank account on account.payment.

Use instead the hook to search for default journal, in order to return
the journal defined on sale order type to its compute function.
  • Loading branch information
grindtildeath committed Sep 24, 2024
1 parent 090b773 commit 272d6cb
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 6 deletions.
16 changes: 10 additions & 6 deletions sale_order_type/models/account_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ def _compute_sale_type_id(self):
)
if sale_type:
record.sale_type_id = sale_type
# Add manually field to compute, as using api.depends on its compute function would
# trigger unwanted recomputation of partner_bank_id on vendor bills
self.env.add_to_compute(
self.env["account.move"]._fields["journal_id"], record
)

@api.depends("sale_type_id")
def _compute_invoice_payment_term_id(self):
Expand All @@ -56,9 +61,8 @@ def _compute_invoice_payment_term_id(self):
move.invoice_payment_term_id = move.sale_type_id.payment_term_id
return res

@api.depends("sale_type_id")
def _compute_journal_id(self):
res = super()._compute_journal_id()
for move in self.filtered("sale_type_id.journal_id"):
move.journal_id = move.sale_type_id.journal_id
return res
def _search_default_journal(self):
sale_type_journal = self.sale_type_id.journal_id
if sale_type_journal:
return sale_type_journal
return super()._search_default_journal()
37 changes: 37 additions & 0 deletions sale_order_type/tests/test_sale_order_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,3 +263,40 @@ def test_sequence_default(self):
def test_res_partner_copy_data(self):
new_partner = self.partner.copy()
self.assertEqual(self.partner.sale_type, new_partner.sale_type)

def test_avoid_bank_recomputation(self):
first_bank_account = (
self.env["res.partner.bank"]
.search([], limit=1)
.copy({"partner_id": self.partner.id})
)
second_bank_account = first_bank_account.copy(
{
"acc_number": first_bank_account.acc_number.replace("1", "2"),
"sequence": first_bank_account.sequence + 10,
}
)
inv_form = Form(
self.env["account.move"].with_context(default_move_type="in_invoice")
)
inv_form.partner_id = self.partner
inv_form.invoice_date = fields.Date.today()
with inv_form.invoice_line_ids.new() as inv_line:
inv_line.product_id = self.product
inv_line.quantity = 1.0
inv_line.price_unit = 10.0
vendor_bill = inv_form.save()
self.assertEqual(vendor_bill.partner_bank_id, first_bank_account)
vendor_bill.partner_bank_id = second_bank_account
vendor_bill.action_post()
register_payment_action = vendor_bill.action_register_payment()
register_payment_wiz_form = Form(
self.env[register_payment_action["res_model"]].with_context(
**register_payment_action["context"]
)
)
self.assertEqual(register_payment_wiz_form.partner_bank_id, second_bank_account)
register_payment_wiz = register_payment_wiz_form.save()
payment_action = register_payment_wiz.action_create_payments()
payment = self.env[payment_action["res_model"]].browse(payment_action["res_id"])
self.assertEqual(payment.partner_bank_id, second_bank_account)

0 comments on commit 272d6cb

Please sign in to comment.