diff --git a/pms/__manifest__.py b/pms/__manifest__.py index aa4a71ad0..214881276 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -4,7 +4,7 @@ { "name": "PMS (Property Management System)", "summary": "A property management system", - "version": "14.0.2.23.0", + "version": "14.0.2.22.1", "development_status": "Alpha", "category": "Generic Modules/Property Management System", "website": "https://github.com/OCA/pms", diff --git a/pms/migrations/14.0.2.22.1/post-migrate.py b/pms/migrations/14.0.2.22.1/post-migrate.py new file mode 100644 index 000000000..73a658c1e --- /dev/null +++ b/pms/migrations/14.0.2.22.1/post-migrate.py @@ -0,0 +1,2 @@ +def migrate(cr, version): + cr.execute("UPDATE pms_reservation SET to_send_mail = NOT is_mail_send") diff --git a/pms/models/mail_compose_message.py b/pms/models/mail_compose_message.py index 0e74c8757..3f2070e04 100644 --- a/pms/models/mail_compose_message.py +++ b/pms/models/mail_compose_message.py @@ -21,19 +21,6 @@ class MailComposeMessage(models.TransientModel): return res def send_mail(self, auto_commit=False): - # if ( - # self._context.get("default_model") == "pms.folio" - # and self._context.get("default_res_id") - # and self._context.get("mark_so_as_sent") - # ): - # # TODO: WorkFlow Mails - # folio = self.env["pms.folio"].browse([self._context["default_res_id"]]) - # if folio: - # cmds = [ - # (1, lid, {"to_send": False}) for lid in folio.reservation_ids.ids - # ] - # if any(cmds): - # folio.reservation_ids = cmds res = super(MailComposeMessage, self).send_mail(auto_commit=auto_commit) if self._context.get("record_id"): folio = self.env["pms.folio"].search( @@ -41,5 +28,5 @@ class MailComposeMessage(models.TransientModel): ) reservations = folio.reservation_ids for reservation in reservations: - reservation.is_mail_send = True + reservation.to_send_mail = False return res diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 98e5e3006..651fc0f43 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -9,6 +9,8 @@ from odoo import _, api, fields, models from odoo.exceptions import AccessError, UserError, ValidationError from odoo.tools import float_is_zero +from odoo.addons.base.models.ir_mail_server import MailDeliveryException + _logger = logging.getLogger(__name__) @@ -1286,125 +1288,124 @@ class PmsFolio(models.Model): @api.model def send_confirmation_mail(self): - folios = self.env["pms.folio"].search([]) - if folios and all( - is_confirmed_auto_mail - for is_confirmed_auto_mail in folios.pms_property_id.mapped( - "is_confirmed_auto_mail" - ) - ): - for folio in folios: - create_date = folio.create_date.date() - if ( - folio.state in "confirm" - and create_date == fields.Date.today() - and all( - not mail_send - for mail_send in folio.reservation_ids.mapped("is_mail_send") + folios = self.env["pms.folio"].search( + [ + ("pms_property_id.is_confirmed_auto_mail", "=", True), + ("reservation_ids.to_send_mail", "=", True), + ("reservation_ids.is_modified_reservation", "=", False), + ("reservation_ids.state", "!=", "cancel"), + ] + ) + for folio in folios: + if folio.email and folio.create_date.date() == fields.Date.today(): + template = folio.pms_property_id.property_confirmed_template + subject = template._render_field( + "subject", + [6, 0, folio.id], + compute_lang=True, + )[folio.id] + body = template._render_field( + "body_html", + [6, 0, folio.id], + compute_lang=True, + )[folio.id] + mail = ( + folio.env["mail.mail"] + .sudo() + .create( + { + "subject": subject, + "body_html": body, + "email_from": folio.pms_property_id.partner_id.email, + "email_to": folio.email, + } ) - and all( - not is_modified_reservation - for is_modified_reservation in folio.reservation_ids.mapped( - "is_modified_reservation" - ) + ) + try: + mail.send() + except MailDeliveryException: + self.env["ir.logging"].create( + { + "name": "Failed to send confirmation email to " + + folio.email, + "type": "server", + "path": "pms/pms/models/pms_folio.py", + "line": "1339", + "func": "send_confirmation_email", + "message": "Confirmation Mail Delivery Failed", + } ) - ): - template = folio.pms_property_id.property_confirmed_template - subject = template._render_field( - "subject", - [6, 0, folio.id], - compute_lang=True, - post_process=True, - )[folio.id] - body = template._render_field( - "body_html", - [6, 0, folio.id], - compute_lang=True, - post_process=True, - )[folio.id] - invitation_mail = ( - folio.env["mail.mail"] - .sudo() - .create( - { - "subject": subject, - "body_html": body, - "email_from": folio.pms_property_id.partner_id.email, - "email_to": folio.email, - } - ) - ) - invitation_mail.send() - for reservation in folio.reservation_ids: - reservation.is_mail_send = True + for reservation in folio.reservation_ids: + reservation.to_send_mail = False @api.model def send_modification_mail(self): - folios = self.env["pms.folio"].search([]) - if folios and all( - is_modified_auto_mail - for is_modified_auto_mail in folios.pms_property_id.mapped( - "is_modified_auto_mail" - ) - ): - for folio in folios: - if ( - folio.state in ("confirm", "onboard") - and any( - not mail_send - for mail_send in folio.reservation_ids.mapped("is_mail_send") + folios = self.env["pms.folio"].search( + [ + ("pms_property_id.is_modified_auto_mail", "=", True), + ("reservation_ids.to_send_mail", "=", True), + ("reservation_ids.is_modified_reservation", "=", True), + ("reservation_ids.state", "!=", "cancel"), + ] + ) + for folio in folios: + if folio.email: + template = folio.pms_property_id.property_modified_template + subject = template._render_field( + "subject", + [6, 0, folio.id], + compute_lang=True, + post_process=True, + )[folio.id] + body = template._render_field( + "body_html", + [6, 0, folio.id], + compute_lang=True, + post_process=True, + )[folio.id] + mail = ( + folio.env["mail.mail"] + .sudo() + .create( + { + "subject": subject, + "body_html": body, + "email_from": folio.pms_property_id.partner_id.email, + "email_to": folio.email, + } ) - and any( - is_modified_reservation - for is_modified_reservation in folio.reservation_ids.mapped( - "is_modified_reservation" - ) + ) + try: + mail.send() + except MailDeliveryException: + self.env["ir.logging"].create( + { + "name": "Failed to send modification email to " + + folio.email, + "type": "server", + "path": "pms/pms/models/pms_folio.py", + "line": "1391", + "func": "send_modification_email", + "message": "Modification Mail Delivery Failed", + } ) - ): - template = folio.pms_property_id.property_modified_template - subject = template._render_field( - "subject", - [6, 0, folio.id], - compute_lang=True, - post_process=True, - )[folio.id] - body = template._render_field( - "body_html", - [6, 0, folio.id], - compute_lang=True, - post_process=True, - )[folio.id] - invitation_mail = ( - folio.env["mail.mail"] - .sudo() - .create( - { - "subject": subject, - "body_html": body, - "email_from": folio.pms_property_id.partner_id.email, - "email_to": folio.email, - } - ) - ) - invitation_mail.send() - for reservation in folio.reservation_ids: - reservation.is_mail_send = True + for reservation in folio.reservation_ids: + reservation.to_send_mail = False @api.model def send_cancelation_mail(self): - folios = self.env["pms.folio"].search([]) - if folios and all( - is_canceled_auto_mail - for is_canceled_auto_mail in folios.pms_property_id.mapped( - "is_canceled_auto_mail" - ) - ): - for folio in folios: - reservations = folio.reservation_ids.filtered( - lambda r: r.state in "cancel" - ) - for reservation in reservations: - if not reservation.is_mail_send: + folios = self.env["pms.folio"].search( + [("pms_property_id.is_canceled_auto_mail", "=", True)] + ) + for folio in folios: + reservations = folio.reservation_ids.filtered(lambda r: r.state in "cancel") + for reservation in reservations: + if reservation.email: + if ( + not reservation.to_send_mail + and reservation.email + and reservation.state not in "out" + ): template = ( reservation.pms_property_id.property_canceled_template ) @@ -1420,7 +1421,7 @@ class PmsFolio(models.Model): compute_lang=True, post_process=True, )[reservation.id] - invitation_mail = ( + mail = ( folio.env["mail.mail"] .sudo() .create( @@ -1428,13 +1429,25 @@ class PmsFolio(models.Model): "subject": subject, "body_html": body, "email_from": folio.pms_property_id.partner_id.email, - "email_to": folio.email, + "email_to": reservation.email, } ) ) - invitation_mail.send() - for reservation in folio.reservation_ids: - reservation.is_mail_send = True + try: + mail.send() + except MailDeliveryException: + self.env["ir.logging"].create( + { + "name": "Failed to send cancellation email to " + + reservation.email, + "type": "server", + "path": "pms/pms/models/pms_folio.py", + "line": "1450", + "func": "send_cancelation_email", + "message": "Cancellation Mail Delivery Failed", + } + ) + reservation.to_send_mail = False def action_view_invoice(self): invoices = self.mapped("move_ids") diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 388e9a529..e6bb3a349 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -643,7 +643,12 @@ class PmsReservation(models.Model): comodel_name="res.partner", inverse_name="reservation_possible_customer_id", ) - is_mail_send = fields.Boolean(string="Mail Sent", default=False) + to_send_mail = fields.Boolean( + string="Mail Sent", + compute="_compute_to_send_mail", + readonly=False, + store=True, + ) is_modified_reservation = fields.Boolean( string="Is A Modified Reservation", @@ -1470,9 +1475,9 @@ class PmsReservation(models.Model): for record in self: if record.state in "draft": record.is_modified_reservation = False - elif record.state in ("confirm", "onboard") and record.is_mail_send: + elif record.state in ("confirm", "onboard") and not record.to_send_mail: record.is_modified_reservation = True - record.is_mail_send = False + record.to_send_mail = True else: record.is_modified_reservation = False @@ -1484,6 +1489,14 @@ class PmsReservation(models.Model): else: record.lang = self.env["res.lang"].get_installed() + @api.depends("reservation_type") + def _compute_to_send_mail(self): + for record in self: + if record.reservation_type == "out": + record.to_send_mail = False + else: + record.to_send_mail = True + def _search_allowed_checkin(self, operator, value): if operator not in ("=",): raise UserError( @@ -1730,20 +1743,20 @@ class PmsReservation(models.Model): template = False pms_property = self.pms_property_id if ( - not self.is_mail_send + self.to_send_mail and not self.is_modified_reservation and self.state not in "cancel" ): if pms_property.property_confirmed_template: template = pms_property.property_confirmed_template elif ( - not self.is_mail_send + self.to_send_mail and self.is_modified_reservation and self.state not in "cancel" ): if pms_property.property_modified_template: template = pms_property.property_modified_template - elif not self.is_mail_send and self.state in "cancel": + elif self.to_send_mail and self.state in "cancel": if pms_property.property_canceled_template: template = pms_property.property_canceled_template compose_form = self.env.ref( @@ -1931,7 +1944,7 @@ class PmsReservation(models.Model): else: record.state = "cancel" record.folio_id._compute_amount() - record.is_mail_send = False + record.to_send_mail = True def action_assign(self): for record in self: diff --git a/pms/tests/test_pms_reservation.py b/pms/tests/test_pms_reservation.py index 939df2aae..7cee7e2cf 100644 --- a/pms/tests/test_pms_reservation.py +++ b/pms/tests/test_pms_reservation.py @@ -3462,7 +3462,7 @@ class TestPmsReservations(TestPms): ---------------------- A reservation is created. The checkin and checkout fields of the reservation are modified. The state of the boolean - is_mail_send is changed to True so that the compute of + to_send_mail is changed to False so that the compute of the is_modified_reservation field is activated correctly and it is verified that the state of this field is True. """ @@ -3482,7 +3482,7 @@ class TestPmsReservations(TestPms): # ACT writed_checkin = fields.date.today() + datetime.timedelta(days=4) writed_checkout = fields.date.today() + datetime.timedelta(days=6) - reservation.is_mail_send = True + reservation.to_send_mail = False reservation.update( { "checkin": writed_checkin, diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index 53216b050..3aa79c172 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -47,22 +47,22 @@ name="action_open_mail_composer" string="Send Confirmation Email " type="object" - attrs="{'invisible':['|','|',('is_mail_send', '=', True),('is_modified_reservation', '=', True),('state', 'in', 'cancel')]}" + attrs="{'invisible':['|','|',('to_send_mail', '=', False),('is_modified_reservation', '=', True),('state', 'in', 'cancel')]}" />