diff --git a/pms/data/pms_cancelled_reservation_email_template.xml b/pms/data/pms_cancelled_reservation_email_template.xml index e9b264eae..31ab04cc0 100644 --- a/pms/data/pms_cancelled_reservation_email_template.xml +++ b/pms/data/pms_cancelled_reservation_email_template.xml @@ -1,38 +1,70 @@ - + Cancelled Reservation - - Your reservation in ${object.pms_property_id.name} has been cancelled - ${object.pms_property_id.partner_id.email | safe} - ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} + + Your reservation in ${object.pms_property_id.name} has been cancelled + ${object.pms_property_id.partner_id.email | safe} + ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} -
- +
+
- +
@@ -42,22 +74,38 @@
% if object.pms_property_id.partner_id.street -

${object.pms_property_id.partner_id.street}

+

${object.pms_property_id.partner_id.street}

% endif % if object.pms_property_id.partner_id.street2 -

${object.pms_property_id.partner_id.street2}

+

${object.pms_property_id.partner_id.street2}

% endif -

${object.pms_property_id.partner_id.zip}

-

${object.pms_property_id.partner_id.city}

-

${object.pms_property_id.partner_id.country_id.name}

+

${object.pms_property_id.partner_id.zip}

+

${object.pms_property_id.partner_id.city}

+

${object.pms_property_id.partner_id.country_id.name}

-
+
- Hello ${object.partner_id.name or ''},
+ Hello ${object.partner_id.name or ''},
Your reservation at ${object.pms_property_id.name} has been successfully canceled.
- +
-
+
-
If you have questions please contact with us:
+
If you have questions please contact with us:
    -
  • ${object.pms_property_id.name}
  • +
  • ${object.pms_property_id.name}
  • % if object.pms_property_id.partner_id.email -
  • Mail: ${object.pms_property_id.partner_id.email}
  • +
  • Mail: ${object.pms_property_id.partner_id.email}
  • % endif % if object.pms_property_id.partner_id.phone -
  • Phone: ${object.pms_property_id.partner_id.phone}
  • +
  • Phone: ${object.pms_property_id.partner_id.phone}
  • % endif % if object.pms_property_id.partner_id.mobile -
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • +
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • % endif
@@ -71,7 +119,13 @@
% if object.pms_property_id.privacy_policy - +
@@ -80,9 +134,19 @@
${object.pms_property_id.privacy_policy}
% if object.company_id - +
- Sent by ${object.company_id.name} + Sent by ${object.company_id.name}
diff --git a/pms/data/pms_confirmed_reservation_email_template.xml b/pms/data/pms_confirmed_reservation_email_template.xml index fd29b76aa..aedc5d3fc 100644 --- a/pms/data/pms_confirmed_reservation_email_template.xml +++ b/pms/data/pms_confirmed_reservation_email_template.xml @@ -1,46 +1,83 @@ - + Confirmed Reservation - - ${object.company_id.name} has confirmed your reservation in ${object.pms_property_id.name} - ${object.pms_property_id.partner_id.email | safe} - ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} + + ${object.company_id.name} has confirmed your reservation in ${object.pms_property_id.name} + ${object.pms_property_id.partner_id.email | safe} + ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} -
- +
+ - +
- +
% if object.pms_property_id.partner_id.street -

${object.pms_property_id.partner_id.street}

+

${object.pms_property_id.partner_id.street}

% endif % if object.pms_property_id.partner_id.street2 -

${object.pms_property_id.partner_id.street2}

+

${object.pms_property_id.partner_id.street2}

% endif -

${object.pms_property_id.partner_id.zip}

-

${object.pms_property_id.partner_id.city}

-

${object.pms_property_id.partner_id.country_id.name}

+

${object.pms_property_id.partner_id.zip}

+

${object.pms_property_id.partner_id.city}

+

${object.pms_property_id.partner_id.country_id.name}

-
+
- Hello ${object.partner_id.name or ''},
+ Hello ${object.partner_id.name or ''},
We are happy to confirm your reservation in ${object.pms_property_id.name}
- See you soon,
+ See you soon,
-
+
${object.company_id.name}
@@ -51,39 +88,77 @@
-
-
Reservation Details
- +
+
Reservation Details
+
- - - - -
-
+
-
From ${object.checkin} At ${object.arrival_hour}
-
To ${object.checkout} At ${object.departure_hour}
-
TZ ${object.pms_property_id.tz}
+
+
From ${object.checkin} At ${object.arrival_hour}
+
To ${object.checkout} At ${object.departure_hour}
+
TZ ${object.pms_property_id.tz}
-
-
+
+
+
-
-
Room: ${object.room_type_id.name}
+
+
+
Room: ${object.room_type_id.name}
-
-
+
+
+
-
-
Price: ${object.price_room_services_set} ${object.pms_property_id.country_id.currency_id.symbol}
+
+
+
Price: ${object.price_room_services_set} ${object.pms_property_id.country_id.currency_id.symbol}
@@ -91,28 +166,46 @@
% if object.pms_property_id.mail_information -
-
Additional Information
+
+
Additional Information
${object.pms_property_id.mail_information|safe} % endif
-
+
- Questions about the reservation? + Questions about the reservation?
Please contact with us:
    -
  • ${object.pms_property_id.name}
  • +
  • ${object.pms_property_id.name}
  • % if object.pms_property_id.partner_id.email -
  • Mail: ${object.pms_property_id.partner_id.email}
  • +
  • Mail: ${object.pms_property_id.partner_id.email}
  • % endif % if object.pms_property_id.partner_id.phone -
  • Phone: ${object.pms_property_id.partner_id.phone}
  • +
  • Phone: ${object.pms_property_id.partner_id.phone}
  • % endif % if object.pms_property_id.partner_id.mobile -
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • +
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • % endif
@@ -126,7 +219,13 @@
% if object.pms_property_id.privacy_policy - +
@@ -135,9 +234,19 @@
${object.pms_property_id.privacy_policy|safe}
% if object.company_id - +
- Sent by ${object.company_id.name} + Sent by ${object.company_id.name}
diff --git a/pms/data/pms_modified_reservation_email_template.xml b/pms/data/pms_modified_reservation_email_template.xml index a334916df..9ca3a0942 100644 --- a/pms/data/pms_modified_reservation_email_template.xml +++ b/pms/data/pms_modified_reservation_email_template.xml @@ -1,47 +1,84 @@ - + Modified Reservation - - Your reservation in ${object.pms_property_id.name} has been modified - ${object.pms_property_id.partner_id.email | safe} - ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} + + Your reservation in ${object.pms_property_id.name} has been modified + ${object.pms_property_id.partner_id.email | safe} + ${(object.email and '"%s" <%s>' % (object.name, object.email) or object.partner_id.email_formatted or '') | safe} -
- +
+ - +
- +
% if object.pms_property_id.partner_id.street -

${object.pms_property_id.partner_id.street}

+

${object.pms_property_id.partner_id.street}

% endif % if object.pms_property_id.partner_id.street2 -

${object.pms_property_id.partner_id.street2}

+

${object.pms_property_id.partner_id.street2}

% endif -

${object.pms_property_id.partner_id.zip}

-

${object.pms_property_id.partner_id.city}

-

${object.pms_property_id.partner_id.country_id.name}

+

${object.pms_property_id.partner_id.zip}

+

${object.pms_property_id.partner_id.city}

+

${object.pms_property_id.partner_id.country_id.name}

-
+
- Hello ${object.partner_id.name or ''},
+ Hello ${object.partner_id.name or ''},
Your reservation in ${object.pms_property_id.name} has been modified
- See you soon,
+ See you soon,
-
+
${object.company_id.name}
@@ -52,39 +89,77 @@
-
-
Reservation Details
- +
+
Reservation Details
+
- - - - -
-
+
-
From ${object.checkin} At ${object.arrival_hour}
-
To ${object.checkout} At ${object.departure_hour}
-
TZ ${object.pms_property_id.tz}
+
+
From ${object.checkin} At ${object.arrival_hour}
+
To ${object.checkout} At ${object.departure_hour}
+
TZ ${object.pms_property_id.tz}
-
-
+
+
+
-
-
Room: ${object.room_type_id.name}
+
+
+
Room: ${object.room_type_id.name}
-
-
+
+
+
-
-
Price: ${object.price_total} ${object.pms_property_id.country_id.currency_id.symbol}
+
+
+
Price: ${object.price_total} ${object.pms_property_id.country_id.currency_id.symbol}
@@ -92,28 +167,47 @@
% if object.pms_property_id.mail_information -
-
Additional Information
-

${object.pms_property_id.mail_information|safe}

+
+
Additional Information
+

${object.pms_property_id.mail_information|safe}

% endif
-
+
- Questions about the reservation? + Questions about the reservation?
Please contact with us:
    -
  • ${object.pms_property_id.name}
  • +
  • ${object.pms_property_id.name}
  • % if object.pms_property_id.partner_id.email -
  • Mail: ${object.pms_property_id.partner_id.email}
  • +
  • Mail: ${object.pms_property_id.partner_id.email}
  • % endif % if object.pms_property_id.partner_id.phone -
  • Phone: ${object.pms_property_id.partner_id.phone}
  • +
  • Phone: ${object.pms_property_id.partner_id.phone}
  • % endif % if object.pms_property_id.partner_id.mobile -
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • +
  • Mobile: ${object.pms_property_id.partner_id.mobile}
  • % endif
@@ -127,7 +221,13 @@
% if object.pms_property_id.privacy_policy - +
@@ -136,9 +236,19 @@
${object.pms_property_id.privacy_policy|safe}
% if object.company_id - +
- Sent by ${object.company_id.name} + Sent by ${object.company_id.name}
diff --git a/pms/models/__init__.py b/pms/models/__init__.py index 518a2ba19..8b246ec75 100644 --- a/pms/models/__init__.py +++ b/pms/models/__init__.py @@ -31,7 +31,7 @@ from . import product_pricelist_item from . import res_partner from . import pms_sale_channel -# from . import mail_compose_message +from . import mail_compose_message from . import pms_room_type_class from . import pms_room_closure_reason from . import pms_service_line diff --git a/pms/models/mail_compose_message.py b/pms/models/mail_compose_message.py index 62bbaad3b..e76de0ec6 100644 --- a/pms/models/mail_compose_message.py +++ b/pms/models/mail_compose_message.py @@ -1,24 +1,43 @@ # Copyright 2017 Alexandre Díaz # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models +from odoo import api, models class MailComposeMessage(models.TransientModel): _inherit = "mail.compose.message" + @api.model + def default_get(self, fields): + res = super(MailComposeMessage, self).default_get(fields) + template = self.env["mail.template"].browse(self._context.get("template_id")) + res.update( + { + "composition_mode": "comment", + "attachment_ids": False, + "template_id": template.id, + } + ) + 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 - return super(MailComposeMessage, self).send_mail(auto_commit=auto_commit) + # 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"): + reservation = self.env["pms.reservation"].search( + [("id", "=", self._context.get("record_id"))] + ) + reservation.is_mail_send = True + return res diff --git a/pms/models/pms_property.py b/pms/models/pms_property.py index 2bd052bc6..a524ed083 100644 --- a/pms/models/pms_property.py +++ b/pms/models/pms_property.py @@ -116,14 +116,10 @@ class PmsProperty(models.Model): ) mail_information = fields.Html( - string="Mail Information", - help="Additional information of the mail" + string="Mail Information", help="Additional information of the mail" ) - privacy_policy = fields.Html( - string="Privacy Policy", - help="Mail privacy policy " - ) + privacy_policy = fields.Html(string="Privacy Policy", help="Mail privacy policy ") property_confirmed_template = fields.Many2one( string="Confirmation Template", diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index c2b3c2b63..3e0715b33 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -644,6 +644,19 @@ class PmsReservation(models.Model): add_possible_customer = fields.Boolean(string="Add possible Customer") + is_mail_send = fields.Boolean(string="Mail Sent", default=False) + + is_modified_reservation = fields.Boolean( + string="Is A Modified Reservation", + compute="_compute_is_modified_reservation", + readonly=False, + store=True, + ) + + lang = fields.Many2one( + string="Language", comodel_name="res.lang", compute="_compute_lang" + ) + def _compute_date_order(self): for record in self: record.date_order = datetime.datetime.today() @@ -1428,6 +1441,25 @@ class PmsReservation(models.Model): for record in self: self.env["pms.folio"]._apply_is_possible_existing_customer_id(record) + @api.depends("checkin", "checkout") + def _compute_is_modified_reservation(self): + 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: + record.is_modified_reservation = True + record.is_mail_send = False + else: + record.is_modified_reservation = False + + @api.depends("partner_id") + def _compute_lang(self): + for record in self: + if record.partner_id: + record.lang = record.partner_id.lang + else: + record.lang = self.env["res.lang"].get_installed() + def _search_allowed_checkin(self, operator, value): if operator not in ("=",): raise UserError( @@ -1666,6 +1698,54 @@ class PmsReservation(models.Model): }, } + def action_open_mail_composer(self): + self.ensure_one() + template = False + if ( + not self.is_mail_send + and not self.is_modified_reservation + and self.state not in "cancel" + ): + template = self.env.ref( + "pms.confirmed_reservation_email", raise_if_not_found=False + ) + elif ( + not self.is_mail_send + and self.is_modified_reservation + and self.state not in "cancel" + ): + template = self.env.ref( + "pms.modified_reservation_email", raise_if_not_found=False + ) + elif not self.is_mail_send and self.state in "cancel": + template = self.env.ref( + "pms.cancelled_reservation_email", raise_if_not_found=False + ) + compose_form = self.env.ref( + "mail.email_compose_message_wizard_form", raise_if_not_found=False + ) + ctx = dict( + model="pms.reservation", + default_res_model="pms.reservation", + default_res_id=self.id, + template_id=template and template.id or False, + composition_mode="comment", + partner_ids=[self.partner_id.id], + force_email=True, + record_id=self.id, + ) + return { + "name": _("Send Confirmed Reservation Mail "), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "mail.compose.message", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, + } + @api.model def name_search(self, name="", args=None, operator="ilike", limit=100): if args is None: @@ -1811,6 +1891,7 @@ class PmsReservation(models.Model): else: record.state = "cancel" record.folio_id._compute_amount() + record.is_mail_send = False def action_assign(self): for record in self: diff --git a/pms/views/pms_automated_mails_views.xml b/pms/views/pms_automated_mails_views.xml index 1dd6f30ff..4f49aa5d9 100644 --- a/pms/views/pms_automated_mails_views.xml +++ b/pms/views/pms_automated_mails_views.xml @@ -51,6 +51,9 @@ + + + diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index d9c3169ef..7c7e0bed1 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -43,7 +43,27 @@ states="onboard,departure_delayed" type="object" /> +