diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py
index 94aaee21c..a4b78572b 100644
--- a/pms/models/pms_folio.py
+++ b/pms/models/pms_folio.py
@@ -814,6 +814,7 @@ class PmsFolio(models.Model):
"reservation_ids.reservation_line_ids.cancel_discount",
"reservation_ids.reservation_line_ids.default_invoice_to",
"reservation_ids.tax_ids",
+ "reservation_ids.state",
)
def _compute_sale_line_ids(self):
for folio in self.filtered(lambda f: isinstance(f.id, int)):
@@ -1658,7 +1659,7 @@ class PmsFolio(models.Model):
)
if self.env.context.get("confirm_all_reservations"):
- self.reservation_ids.confirm()
+ self.reservation_ids.action_confirm()
return True
@@ -1809,10 +1810,10 @@ class PmsFolio(models.Model):
}
def _message_post_after_hook(self, message, msg_vals):
- res = super(PmsFolio, self)._message_post_after_hook(message, msg_vals)
+ res = super(PmsFolio, self).sudo()._message_post_after_hook(message, msg_vals)
for folio in self:
for follower in folio.message_follower_ids:
- follower.unlink()
+ follower.sudo().unlink()
return res
def action_view_invoice(self):
@@ -1954,6 +1955,17 @@ class PmsFolio(models.Model):
month_day,
)
if invoice_date:
+ if (
+ self.company_id.period_lock_date
+ and invoice_date < self.company_id.period_lock_date
+ and not self.user_has_groups("account.group_account_manager")
+ ):
+ raise UserError(
+ _(
+ "The period to create this invoice is locked. "
+ "Please contact your administrator to unlock it."
+ )
+ )
if invoice_date < datetime.date.today() and not self._context.get(
"autoinvoice"
):
@@ -2017,7 +2029,7 @@ class PmsFolio(models.Model):
lambda m: m.amount_total < 0
).action_switch_invoice_into_refund_credit_note()
for move in moves:
- move.message_post_with_view(
+ move.sudo().message_post_with_view(
"mail.message_origin_link",
values={
"self": move,
@@ -2168,7 +2180,7 @@ class PmsFolio(models.Model):
"origin_reference": folio.external_reference,
}
pay = self.env["account.payment"].create(vals)
- pay.message_post_with_view(
+ pay.sudo().message_post_with_view(
"mail.message_origin_link",
values={
"self": pay,
@@ -2211,7 +2223,7 @@ class PmsFolio(models.Model):
or folio.pms_property_id.email_formatted,
)
for reservation in folio.reservation_ids:
- reservation.message_post(
+ reservation.sudo().message_post(
body=_(
"""Payment: %s by %s""",
amount,
@@ -2260,7 +2272,7 @@ class PmsFolio(models.Model):
"state": "draft",
}
pay = self.env["account.payment"].create(vals)
- pay.message_post_with_view(
+ pay.sudo().message_post_with_view(
"mail.message_origin_link",
values={
"self": pay,
@@ -2298,7 +2310,7 @@ class PmsFolio(models.Model):
or folio.pms_property_id.email_formatted,
)
for reservation in folio.reservation_ids:
- reservation.message_post(
+ reservation.sudo().message_post(
body=_(
"""Refund: %s by %s""",
amount,
diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py
index a5b453457..c05b180d3 100644
--- a/pms/models/pms_reservation.py
+++ b/pms/models/pms_reservation.py
@@ -1883,6 +1883,10 @@ class PmsReservation(models.Model):
raise ValidationError(
_("The reservation must be canceled by action: action_cancel")
)
+ if record.state == "confirm" and not self.env.context.get("action_confirm"):
+ raise ValidationError(
+ _("The reservation must be confirmed by action: action_confirm")
+ )
@api.constrains("arrival_hour")
def _check_arrival_hour(self):
@@ -2131,7 +2135,7 @@ class PmsReservation(models.Model):
record = super(PmsReservation, self).create(vals)
record._check_capacity()
if record.preconfirm and record.state == "draft":
- record.confirm()
+ record.action_confirm()
record._check_services(vals)
@@ -2295,14 +2299,14 @@ class PmsReservation(models.Model):
reservations._compute_priority()
return True
- def confirm(self):
+ def action_confirm(self):
for record in self:
vals = {}
if record.checkin_partner_ids.filtered(lambda c: c.state == "onboard"):
vals.update({"state": "onboard"})
else:
vals.update({"state": "confirm"})
- record.write(vals)
+ record.with_context(action_confirm=True).write(vals)
record.reservation_line_ids.update({"cancel_discount": 0})
# Unlink penalty service if exist
record.service_ids.filtered(lambda s: s.is_cancel_penalty).unlink()
@@ -2319,9 +2323,10 @@ class PmsReservation(models.Model):
record.with_context(action_cancel=True).state = "cancel"
record._check_cancel_penalty()
record.cancel_datetime = fields.Datetime.now()
- if all(
+ # If all reservations in the folio are cancelled, cancel the folio
+ if not (
record.folio_id.reservation_ids.filtered(
- lambda r: r.state == "cancel"
+ lambda r: r.state != "cancel"
)
):
record.folio_id.action_cancel()
@@ -2447,7 +2452,7 @@ class PmsReservation(models.Model):
record.checkin_partner_ids.filtered(
lambda check: check.state == "onboard"
).action_undo_onboard()
- record.state = "confirm"
+ record.action_confirm()
return True
def action_checkin_partner_view(self):
diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py
index e7e9385ae..97e091c7a 100644
--- a/pms/models/pms_reservation_line.py
+++ b/pms/models/pms_reservation_line.py
@@ -415,7 +415,7 @@ class PmsReservationLine(models.Model):
line.occupies_availability = True
# TODO: Refact method and allowed cancelled single days
- @api.depends("reservation_id.cancelled_reason")
+ @api.depends("reservation_id.cancelled_reason", "reservation_id.state")
def _compute_cancel_discount(self):
for line in self:
if line.state == "cancel":
diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml
index 34cd058ac..fd5e8f561 100644
--- a/pms/views/pms_reservation_views.xml
+++ b/pms/views/pms_reservation_views.xml
@@ -18,7 +18,7 @@