From e4d4c113e644c384ed278472ef5a5ebd9cfe6038 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 18 Aug 2022 20:48:36 +0200 Subject: [PATCH] [FIX] account_payment_purchase: Don't propagate empty payment mode Steps to reproduce the problem: - Have a partner without payment mode. - Create a PO with such partner. - No payment mode is filled. - Now fill the payment mode in the partner. - Create the invoice for the PO. Current behavior: The invoice has empty payment mode. Expected behavior: The invoice has the partner payment mode. Someone may think that having no payment mode in the PO may prevail over the partner's payment mode, or even their flows may consist in empyting the payment mode in the PO for not binding it with anything yet, but that strategy has more holes than the one implemented here, as the flow presented proves. You can then use another one like having an extra payment mode "Undetermined" or similar for doing such classification as a more resilient strategy. It includes a regression test that fails before the change and now is correct. TT38608 --- account_payment_purchase/models/__init__.py | 4 ++-- .../models/account_move.py | 19 ++++++------------- .../tests/test_account_payment_purchase.py | 13 ++++++++++++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/account_payment_purchase/models/__init__.py b/account_payment_purchase/models/__init__.py index 1d9a05322..f2f331b5e 100644 --- a/account_payment_purchase/models/__init__.py +++ b/account_payment_purchase/models/__init__.py @@ -1,3 +1,3 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from . import account_move, purchase_order +from . import account_move +from . import purchase_order diff --git a/account_payment_purchase/models/account_move.py b/account_payment_purchase/models/account_move.py index 52d1ba67d..feaa64878 100644 --- a/account_payment_purchase/models/account_move.py +++ b/account_payment_purchase/models/account_move.py @@ -1,5 +1,6 @@ # Copyright 2016 Akretion (). -# Copyright 2017 Tecnativa - Vicent Cubells. +# Copyright 2017 Tecnativa - Vicent Cubells +# Copyright 2022 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import _, api, models @@ -10,16 +11,8 @@ class AccountMove(models.Model): @api.onchange("purchase_vendor_bill_id", "purchase_id") def _onchange_purchase_auto_complete(self): - - new_mode = ( - self.purchase_vendor_bill_id.purchase_order_id.payment_mode_id.id - or self.purchase_id.payment_mode_id.id - ) - new_bank = ( - self.purchase_vendor_bill_id.purchase_order_id.supplier_partner_bank_id.id - or self.purchase_id.supplier_partner_bank_id.id - ) - + new_mode = self.purchase_id.payment_mode_id.id or False + new_bank = self.purchase_id.supplier_partner_bank_id.id or False res = super()._onchange_purchase_auto_complete() or {} if self.payment_mode_id and new_mode and self.payment_mode_id.id != new_mode: res["warning"] = { @@ -27,7 +20,7 @@ class AccountMove(models.Model): "message": _("Selected purchase order have different payment mode."), } return res - elif self.payment_mode_id.id != new_mode: + if new_mode: self.payment_mode_id = new_mode if self.partner_bank_id and new_bank and self.partner_bank_id.id != new_bank: res["warning"] = { @@ -35,6 +28,6 @@ class AccountMove(models.Model): "message": _("Selected purchase order have different supplier bank."), } return res - elif self.partner_bank_id.id != new_bank: + if new_bank: self.partner_bank_id = new_bank return res diff --git a/account_payment_purchase/tests/test_account_payment_purchase.py b/account_payment_purchase/tests/test_account_payment_purchase.py index e772c54cd..f767f898e 100644 --- a/account_payment_purchase/tests/test_account_payment_purchase.py +++ b/account_payment_purchase/tests/test_account_payment_purchase.py @@ -3,7 +3,7 @@ # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html from odoo import Command, fields -from odoo.tests import TransactionCase, tagged +from odoo.tests import Form, TransactionCase, tagged @tagged("-at_install", "post_install") @@ -112,6 +112,17 @@ class TestAccountPaymentPurchase(TransactionCase): result and result.get("warning", {}).get("title", False), "Warning" ) + def test_from_purchase_order_empty_mode_invoicing(self): + self.purchase.payment_mode_id = False + self.purchase.button_confirm() + invoice_form = Form( + self.env["account.move"].with_context(default_move_type="in_invoice") + ) + invoice_form.purchase_vendor_bill_id = self.env["purchase.bill.union"].browse( + -self.purchase.id + ) + self.assertEqual(invoice_form.payment_mode_id, self.payment_mode) + def test_from_purchase_order_invoicing_bank(self): # Test partner_bank product = self.env["product.product"].create({"name": "Test product"})