From bbbef67008e207c374b7020fd0ee6afa10d4cd00 Mon Sep 17 00:00:00 2001 From: Sergio Bustamante Date: Mon, 21 Jul 2025 10:40:37 +0200 Subject: [PATCH 1/2] [IMP] pos_default_partner: Set default partner on pos generated moves --- pos_default_partner/README.rst | 1 + pos_default_partner/models/__init__.py | 3 ++ pos_default_partner/models/account_move.py | 14 +++++++ pos_default_partner/models/pos_payment.py | 20 +++++++++ pos_default_partner/models/pos_session.py | 20 +++++++++ pos_default_partner/readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 1 + .../tests/test_pos_default_partner.py | 41 +++++++++++++++++-- 8 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 pos_default_partner/models/account_move.py create mode 100644 pos_default_partner/models/pos_payment.py create mode 100644 pos_default_partner/models/pos_session.py diff --git a/pos_default_partner/README.rst b/pos_default_partner/README.rst index 2716946371..3243829b1a 100644 --- a/pos_default_partner/README.rst +++ b/pos_default_partner/README.rst @@ -74,6 +74,7 @@ Contributors * FactorLibre: * Alvaro Rollan + * Sergio Bustamante * `Coop IT Easy SC `_: * hugues de keyzer diff --git a/pos_default_partner/models/__init__.py b/pos_default_partner/models/__init__.py index 9743e882e2..62fb500a10 100644 --- a/pos_default_partner/models/__init__.py +++ b/pos_default_partner/models/__init__.py @@ -1,3 +1,6 @@ from . import pos_order from . import pos_config from . import res_config_settings +from . import account_move +from . import pos_payment +from . import pos_session diff --git a/pos_default_partner/models/account_move.py b/pos_default_partner/models/account_move.py new file mode 100644 index 0000000000..8fbec01449 --- /dev/null +++ b/pos_default_partner/models/account_move.py @@ -0,0 +1,14 @@ +from odoo import api, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + @api.model_create_multi + def create(self, vals_list): + if self.env.context.get("pos_default_partner_id", False): + default_partner_id = self.env.context["pos_default_partner_id"].id + for vals in vals_list: + if not vals.get("partner_id", False): + vals["partner_id"] = default_partner_id + return super().create(vals_list) diff --git a/pos_default_partner/models/pos_payment.py b/pos_default_partner/models/pos_payment.py new file mode 100644 index 0000000000..6fef9a37c6 --- /dev/null +++ b/pos_default_partner/models/pos_payment.py @@ -0,0 +1,20 @@ +from odoo import models + + +class PosPayment(models.Model): + _inherit = "pos.payment" + + def _generate_payment_move(self, is_reverse, change_payment=None): + order = self.pos_order_id + pos_session = order.session_id + default_partner_id = pos_session.config_id.default_partner_id + return super( + PosPayment, self.with_context(pos_default_partner_id=default_partner_id) + )._generate_payment_move(is_reverse, change_payment=change_payment) + + def _prepare_debit_line_payment(self, payment_move, is_reverse): + vals = super()._prepare_debit_line_payment(payment_move, is_reverse) + if self.env.context.get("pos_default_partner_id", False): + default_partner_id = self.env.context["pos_default_partner_id"].id + vals["partner_id"] = default_partner_id + return vals diff --git a/pos_default_partner/models/pos_session.py b/pos_default_partner/models/pos_session.py new file mode 100644 index 0000000000..31d7349ec0 --- /dev/null +++ b/pos_default_partner/models/pos_session.py @@ -0,0 +1,20 @@ +from odoo import models + + +class PosSession(models.Model): + _inherit = "pos.session" + + def _create_account_move( + self, + balancing_account=False, + amount_to_balance=0, + bank_payment_method_diffs=None, + ): + return super( + PosSession, + self.with_context(pos_default_partner_id=self.config_id.default_partner_id), + )._create_account_move( + balancing_account=balancing_account, + amount_to_balance=amount_to_balance, + bank_payment_method_diffs=bank_payment_method_diffs, + ) diff --git a/pos_default_partner/readme/CONTRIBUTORS.rst b/pos_default_partner/readme/CONTRIBUTORS.rst index e57f794eb3..794b2421c5 100644 --- a/pos_default_partner/readme/CONTRIBUTORS.rst +++ b/pos_default_partner/readme/CONTRIBUTORS.rst @@ -5,6 +5,7 @@ * FactorLibre: * Alvaro Rollan + * Sergio Bustamante * `Coop IT Easy SC `_: * hugues de keyzer diff --git a/pos_default_partner/static/description/index.html b/pos_default_partner/static/description/index.html index 4644ea397f..ca226ea36c 100644 --- a/pos_default_partner/static/description/index.html +++ b/pos_default_partner/static/description/index.html @@ -421,6 +421,7 @@

Contributors

  • Foram Shah <foram.shah@initos.com>
  • FactorLibre:
    • Alvaro Rollan
    • +
    • Sergio Bustamante
  • Coop IT Easy SC:
      diff --git a/pos_default_partner/tests/test_pos_default_partner.py b/pos_default_partner/tests/test_pos_default_partner.py index eaad85ca25..c7115f9572 100644 --- a/pos_default_partner/tests/test_pos_default_partner.py +++ b/pos_default_partner/tests/test_pos_default_partner.py @@ -16,17 +16,18 @@ def setUpClass(cls, chart_template_ref=None): # ==== Partners ==== cls.partner_01 = cls.env["res.partner"].create({"name": "Test partner 1"}) cls.partner_02 = cls.env["res.partner"].create({"name": "Test partner 2"}) + cls.partner_03 = cls.env["res.partner"].create({"name": "Test partner 3"}) # ==== Products ==== cls.product0 = cls.create_product("Product test 0", cls.categ_basic, 5.0, 0.0) cls.product1 = cls.create_product("Product test 1", cls.categ_basic, 10.0, 5) - def _create_order(self, partner_id=False): - # ==== open a session ==== - self.open_new_session() + def _create_order(self, partner_id=False, is_invoiced=False): # ==== create order ==== orders = [ self.create_ui_order_data( - [(self.product0, 3), (self.product1, 20)], partner_id + [(self.product0, 3), (self.product1, 20)], + customer=partner_id, + is_invoiced=is_invoiced, ) ] result = self.env["pos.order"].create_from_ui(orders) @@ -34,23 +35,55 @@ def _create_order(self, partner_id=False): return order def test_no_default_partner(self): + self.open_new_session() order = self._create_order() self.assertTrue(order) self.assertFalse(order.partner_id) def test_no_default_partner_assigned_partner(self): + self.open_new_session() order = self._create_order(self.partner_01) self.assertTrue(order) self.assertEqual(order.partner_id, self.partner_01) def test_default_partner(self): + self.open_new_session() self.config.default_partner_id = self.partner_02 order = self._create_order() self.assertTrue(order) self.assertEqual(order.partner_id, self.partner_02) def test_default_partner_assigned_partner(self): + self.open_new_session() self.config.default_partner_id = self.partner_02 order = self._create_order(self.partner_01) self.assertTrue(order) self.assertEqual(order.partner_id, self.partner_01) + + def test_pos_move_default_partner(self): + self.open_new_session() + self.config.default_partner_id = self.partner_02 + session = self.config.current_session_id + order = self._create_order() + self.assertTrue(order) + self.assertEqual(order.partner_id, self.partner_02) + session.action_pos_session_closing_control() + related_moves = session._get_related_account_moves() + moves_partner = related_moves.line_ids.mapped("partner_id") + self.assertEqual(moves_partner, self.partner_02) + + def test_pos_move_default_partner_invoiced_order(self): + self.open_new_session() + self.config.default_partner_id = self.partner_02 + session = self.config.current_session_id + order = self._create_order() + self.assertTrue(order) + self.assertEqual(order.partner_id, self.partner_02) + order2 = self._create_order(partner_id=self.partner_03, is_invoiced=True) + self.assertTrue(order2) + self.assertEqual(order2.partner_id, self.partner_03) + session.action_pos_session_closing_control() + related_moves = session._get_related_account_moves() + moves_partner = related_moves.line_ids.mapped("partner_id") + self.assertIn(self.partner_02, moves_partner) + self.assertIn(self.partner_03, moves_partner) From d061de808af690ccc7fec956b471dc28f21ab6a4 Mon Sep 17 00:00:00 2001 From: Sergio Bustamante Date: Fri, 22 Aug 2025 07:40:03 +0200 Subject: [PATCH 2/2] [FIX] pos_default_partner: Post-install test + fallback to load CoA --- .../tests/test_pos_default_partner.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pos_default_partner/tests/test_pos_default_partner.py b/pos_default_partner/tests/test_pos_default_partner.py index c7115f9572..de572d43c8 100644 --- a/pos_default_partner/tests/test_pos_default_partner.py +++ b/pos_default_partner/tests/test_pos_default_partner.py @@ -9,8 +9,17 @@ @odoo.tests.tagged("post_install", "-at_install") class TestPosDefaultPartner(TestPoSCommon): @classmethod - def setUpClass(cls, chart_template_ref=None): - super().setUpClass(chart_template_ref=chart_template_ref) + def setUpClass(cls): + super().setUpClass() + if not cls.env.company.chart_template_id: + # Load a CoA if there's none in current company + coa = cls.env.ref("l10n_generic_coa.configurable_chart_template", False) + if not coa: + # Load the first available CoA + coa = cls.env["account.chart.template"].search( + [("visible", "=", True)], limit=1 + ) + coa.try_loading(company=cls.env.company, install_demo=False) cls.config = cls.basic_config cls.PosOrder = cls.env["pos.order"] # ==== Partners ====