diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 6e2bb6c5a..afdaec51b 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -697,14 +697,29 @@ class PmsFolio(models.Model): if not folio.user_id: folio.user_id = (folio.partner_id.user_id.id or self.env.uid,) - @api.depends("partner_id") + @api.depends( + "partner_id", + "reservation_ids", + "reservation_ids.partner_id", + "reservation_ids.checkin_partner_ids", + "reservation_ids.checkin_partner_ids.partner_id", + ) def _compute_partner_invoice_ids(self): - for folio in self.filtered("partner_id"): - folio.partner_invoice_ids = False - addr = folio.partner_id.address_get(["invoice"]) - if not addr["invoice"] in folio.partner_invoice_ids.ids: - folio.partner_invoice_ids = [(4, addr["invoice"])] - # Avoid CacheMissing + for folio in self: + if folio.partner_id: + addr = folio.partner_id.address_get(["invoice"]) + if not addr["invoice"] in folio.partner_invoice_ids.ids: + folio.partner_invoice_ids = [(4, addr["invoice"])] + for reservation in folio.reservation_ids: + if reservation.partner_id: + addr = reservation.partner_id.address_get(["invoice"]) + if not addr["invoice"] in folio.partner_invoice_ids.ids: + folio.partner_invoice_ids = [(4, addr["invoice"])] + for checkin in reservation.checkin_partner_ids: + if checkin.partner_id: + addr = checkin.partner_id.address_get(["invoice"]) + if not addr["invoice"] in folio.partner_invoice_ids.ids: + folio.partner_invoice_ids = [(4, addr["invoice"])] self.filtered(lambda f: not f.partner_invoice_ids).partner_invoice_ids = False @api.depends("partner_id") @@ -1428,6 +1443,11 @@ class PmsFolio(models.Model): % (self.company_id.name, self.company_id.id) ) + if not partner_invoice_id: + partner_invoice_id = ( + self.partner_invoice_ids[0].id if self.partner_invoice_ids else False + ) + invoice_vals = { "ref": self.client_order_ref or "", "move_type": "out_invoice", @@ -1437,9 +1457,7 @@ class PmsFolio(models.Model): # 'medium_id': self.medium_id.id, # 'source_id': self.source_id.id, "invoice_user_id": self.user_id and self.user_id.id, - "partner_id": partner_invoice_id - if partner_invoice_id - else self.partner_invoice_ids[0], + "partner_id": partner_invoice_id, "partner_bank_id": self.company_id.partner_id.bank_ids[:1].id, "journal_id": journal.id, # company comes from the journal "invoice_origin": self.name, diff --git a/pms/tests/test_pms_folio.py b/pms/tests/test_pms_folio.py index 910e62095..5a266e9cc 100644 --- a/pms/tests/test_pms_folio.py +++ b/pms/tests/test_pms_folio.py @@ -867,3 +867,90 @@ class TestPmsFolio(TestPms): msg="A partner can be added to the folio", ): several_partners_wizard.add_partner() + + def test_add_partner_invoice_contact(self): + """ + Check that when adding a customer at check-in, reservation or folio, + it is added as a possible billing address + --------------- + Three res.partner are created with name, email and mobile. A folio is created. + We add the partners to the folio, reservation, and checkin, and check that the + three partners are on partner_invoice in folio. + """ + # ARRANGE + partner1 = self.env["res.partner"].create( + { + "name": "SerafĂn Rivas", + "email": "serafin@example.com", + "mobile": "60595595", + } + ) + partner2 = self.env["res.partner"].create( + { + "name": "Simon", + "mobile": "654667733", + "email": "simon@example.com", + } + ) + partner3 = self.env["res.partner"].create( + { + "name": "Sofia", + "mobile": "688667733", + "email": "sofia@example.com", + } + ) + + # FIRST ACTION + folio1 = self.env["pms.folio"].create( + { + "pms_property_id": self.pms_property1.id, + "partner_name": partner1.name, + "email": partner1.email, + } + ) + reservation1 = self.env["pms.reservation"].create( + { + "checkin": datetime.datetime.now(), + "checkout": datetime.datetime.now() + datetime.timedelta(days=1), + "adults": 2, + "room_type_id": self.room_type_double.id, + "folio_id": folio1.id, + } + ) + + # FIRST ASSERT + self.assertEqual( + len(folio1.partner_invoice_ids), + 0, + "A partner was added as a billing contact for no reason", + ) + + # SECOND ACTION + folio1.partner_id = partner1.id + + # SECOND ASSERT + self.assertEqual( + folio1.partner_invoice_ids.ids, + [partner1.id], + "A folio partner was not added as a billing contact", + ) + + # SECOND ACTION + reservation1.partner_id = partner2.id + + # SECOND ASSERT + self.assertIn( + partner2.id, + folio1.partner_invoice_ids.ids, + "A reservation partner was not added as a billing contact", + ) + + # THIRD ACTION + reservation1.checkin_partner_ids[0].partner_id = partner3.id + + # THIRD ASSERT + self.assertIn( + partner3.id, + folio1.partner_invoice_ids.ids, + "A checkin partner was not added as a billing contact", + ) diff --git a/pms/views/folio_portal_templates.xml b/pms/views/folio_portal_templates.xml index cd3029d05..ae08bf585 100644 --- a/pms/views/folio_portal_templates.xml +++ b/pms/views/folio_portal_templates.xml @@ -178,7 +178,9 @@ class="row pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}" >
-
+