diff --git a/pms/models/account_journal.py b/pms/models/account_journal.py index 82b51e21a..827a13946 100644 --- a/pms/models/account_journal.py +++ b/pms/models/account_journal.py @@ -32,6 +32,24 @@ class AccountJournal(models.Model): readonly=False, store=True, ) + allowed_room_ids = fields.Many2many( + string="Rooms Filter allowed", + comodel_name="pms.room", + relation="account_journal_allow_room_rel", + column1="account_journal_id", + column2="room_id", + help="Room to filter the room in the reservation", + compute="_compute_allowed_room_ids", + ) + room_filter_ids = fields.Many2many( + string="Apply Rooms", + comodel_name="pms.room", + relation="account_journal_room_rel", + column1="account_journal_id", + column2="room_id", + help="Room to filter the room types in the reservation", + domain="[('id', 'in', allowed_room_ids)]", + ) @api.depends("pms_property_ids", "pms_property_ids.journal_simplified_invoice_id") def _compute_is_simplified_invoice(self): @@ -42,6 +60,18 @@ class AccountJournal(models.Model): ): journal.is_simplified_invoice = True + @api.depends("pms_property_ids") + def _compute_allowed_room_ids(self): + for journal in self: + if not journal.pms_property_ids: + journal.allowed_room_ids = self.env["pms.room"].search([]).ids + else: + journal.allowed_room_ids = ( + self.env["pms.room"] + .search([("pms_property_id", "in", journal.pms_property_ids.ids)]) + .ids + ) + @api.constrains("is_simplified_invoice") def _check_pms_properties_simplified_invoice(self): for journal in self: diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 9f8f1753e..8e970bc7e 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -2082,7 +2082,10 @@ class PmsFolio(models.Model): (making sure to call super() to establish a clean extension chain). """ self.ensure_one() - journal = self.pms_property_id._get_folio_default_journal(partner_invoice_id) + journal = self.pms_property_id._get_folio_default_journal( + partner_invoice_id=partner_invoice_id, + room_ids=self.reservation_ids.mapped("reservation_line_ids.room_id.id"), + ) if not journal: journal = ( self.env["account.move"] diff --git a/pms/models/pms_property.py b/pms/models/pms_property.py index 63ff0ee50..937729f05 100644 --- a/pms/models/pms_property.py +++ b/pms/models/pms_property.py @@ -569,11 +569,13 @@ class PmsProperty(models.Model): dt = dt.replace(tzinfo=None) return dt - def _get_payment_methods(self, automatic_included=False): + def _get_payment_methods(self, automatic_included=False, room_ids=False): # We use automatic_included to True to see absolutely # all the journals with associated payments, if it is # false, we will only see those journals that can be used # to pay manually + # room_ids [list] is used to filter the payment methods + # by rooms (usefull in apartments, villas, etc) self.ensure_one() payment_methods = self.env["account.journal"].search( [ @@ -589,6 +591,11 @@ class PmsProperty(models.Model): ("company_id", "=", False), ] ) + if room_ids: + payment_methods = payment_methods.filtered( + lambda p: not p.room_filter_ids + or any([room_id in p.room_filter_ids.ids for room_id in room_ids]) + ) if not automatic_included: payment_methods = payment_methods.filtered(lambda p: p.allowed_pms_payments) return payment_methods @@ -891,9 +898,10 @@ class PmsProperty(models.Model): pms_property.journal_simplified_invoice_id.is_simplified_invoice = True @api.model - def _get_folio_default_journal(self, partner_invoice_id): + def _get_folio_default_journal(self, partner_invoice_id, room_ids=False): self.ensure_one() partner = self.env["res.partner"].browse(partner_invoice_id) + # For simplified invoices if ( not partner or partner.id == self.env.ref("pms.various_pms_partner").id @@ -902,8 +910,56 @@ class PmsProperty(models.Model): and self._context.get("autoinvoice") ) ): - return self.journal_simplified_invoice_id - return self.journal_normal_invoice_id + if self.journal_simplified_invoice_id: + return self.journal_simplified_invoice_id + else: + journals = self.env["account.journal"].search( + [ + ("type", "=", "sale"), + ("is_simplified_invoice", "=", True), + ("company_id", "=", self.company_id.id), + "|", + ("pms_property_ids", "in", self.id), + ("pms_property_ids", "=", False), + ] + ) + if journals: + if room_ids: + journals = journals.filtered( + lambda j: not j.room_filter_ids + or any( + [ + room_id in j.room_filter_ids.ids + for room_id in room_ids + ] + ) + ) + return journals[0] + return False + # For normal invoices + if self.journal_normal_invoice_id: + return self.journal_normal_invoice_id + else: + journals = self.env["account.journal"].search( + [ + ("type", "=", "sale"), + ("is_simplified_invoice", "=", False), + ("company_id", "=", self.company_id.id), + "|", + ("pms_property_ids", "in", self.id), + ("pms_property_ids", "=", False), + ] + ) + if journals: + if room_ids: + journals = journals.filtered( + lambda j: not j.room_filter_ids + or any( + [room_id in j.room_filter_ids.ids for room_id in room_ids] + ) + ) + return journals[0] + return False def _get_adr(self, start_date, end_date, domain=False): """ diff --git a/pms/views/account_journal_views.xml b/pms/views/account_journal_views.xml index 5bc5fa053..2d54e7a22 100644 --- a/pms/views/account_journal_views.xml +++ b/pms/views/account_journal_views.xml @@ -6,6 +6,12 @@ + +