)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from odoo import fields, models
+from odoo import api, fields, models
class HrEmployee(models.Model):
@@ -12,3 +12,10 @@ class HrEmployee(models.Model):
string="Pre Assigned Rooms",
help="Rooms pre assigned to this employee",
)
+
+ job_name = fields.Char(string="Job Name", compute="_compute_job_name")
+
+ @api.depends("job_id")
+ def _compute_job_name(self):
+ for record in self:
+ record.job_name = record.job_id.name
diff --git a/pms_housekeeping/models/pms_housekeeping_cancellation_type.py b/pms_housekeeping/models/pms_housekeeping_cancellation_type.py
index 3111706ab..361d472eb 100644
--- a/pms_housekeeping/models/pms_housekeeping_cancellation_type.py
+++ b/pms_housekeeping/models/pms_housekeeping_cancellation_type.py
@@ -1,8 +1,8 @@
-from odoo import fields, models, api
+from odoo import fields, models
class PmsHousekeepingCancellationType(models.Model):
- _name = 'pms.housekeeping.cancellation.type'
+ _name = "pms.housekeeping.cancellation.type"
name = fields.Char(string="Name", required=True)
description = fields.Text(string="Description")
diff --git a/pms_housekeeping/models/pms_housekeeping_task.py b/pms_housekeeping/models/pms_housekeeping_task.py
index 7a6e2de33..7d435cb4b 100644
--- a/pms_housekeeping/models/pms_housekeeping_task.py
+++ b/pms_housekeeping/models/pms_housekeeping_task.py
@@ -1,4 +1,4 @@
-from odoo import fields, models, api
+from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
@@ -18,7 +18,10 @@ class PmsHouseKeepingTask(models.Model):
required=True,
ondelete="restrict",
)
- task_date = fields.Date(string="Date", required=True,)
+ task_date = fields.Date(
+ string="Date",
+ required=True,
+ )
state = fields.Selection(
selection=[
("pending", "Pending"),
@@ -29,9 +32,15 @@ class PmsHouseKeepingTask(models.Model):
],
string="State",
required=True,
- default="to_do",
+ default="pending",
+ )
+ priority = fields.Integer(
+ string="Priority",
+ default=0,
+ computed="_compute_priority",
+ store=True,
+ readonly=False,
)
- priority = fields.Integer(string="Priority", default=0)
cleaning_comments = fields.Text(string="Cleaning Comments")
employee_ids = fields.Many2many(
comodel_name="hr.employee",
@@ -40,6 +49,9 @@ class PmsHouseKeepingTask(models.Model):
column2="employee_id",
string="Employees",
domain="[('job_id.name', '=', 'Housekeeper')]",
+ compute="_compute_employee_ids",
+ store=True,
+ readonly=False,
)
parent_id = fields.Many2one(
string="Parent Task",
@@ -51,27 +63,45 @@ class PmsHouseKeepingTask(models.Model):
string="Parent State",
compute="_compute_parent_state",
)
+ child_ids = fields.One2many(
+ string="Child Tasks",
+ help="Indicates that this task has child tasks",
+ comodel_name="pms.housekeeping.task",
+ inverse_name="parent_id",
+ )
cancellation_type_id = fields.Many2one(
comodel_name="pms.housekeeping.cancellation.type",
string="Cancellation Type",
ondelete="restrict",
)
- is_today = fields.Boolean(
- string="Is Today",
- compute="_compute_is_today",
- store=True,
- readonly=False,
+ pending_allowed = fields.Boolean(
+ string="Is pending allowed",
+ compute="_compute_pending_allowed",
)
- is_future = fields.Boolean(
- string="Is Future",
- compute="_compute_is_future",
+ to_do_allowed = fields.Boolean(
+ string="Is To Do Allowed",
+ compute="_compute_to_do_allowed",
+ )
+ cancel_allowed = fields.Boolean(
+ string="Is Cancel Allowed",
+ compute="_compute_cancel_allowed",
+ )
+ in_progress_allowed = fields.Boolean(
+ string="Is In Progress Allowed",
+ compute="_compute_in_progress_allowed",
+ )
+ done_allowed = fields.Boolean(
+ string="Is Done Allowed",
+ compute="_compute_done_allowed",
)
@api.constrains("task_date")
def _check_task_date(self):
for rec in self:
if rec.task_date < fields.Date.today():
- raise ValidationError("Task Date must be greater than or equal to today")
+ raise ValidationError(
+ _("Task Date must be greater than or equal to today")
+ )
def action_cancel(self):
for rec in self:
@@ -80,35 +110,128 @@ class PmsHouseKeepingTask(models.Model):
def action_to_do(self):
for rec in self:
rec.state = "to_do"
+ rec.cancellation_type_id = False
def action_done(self):
for rec in self:
rec.state = "done"
+ rec.cancellation_type_id = False
def action_in_progress(self):
for rec in self:
rec.state = "in_progress"
+ rec.cancellation_type_id = False
def action_pending(self):
for rec in self:
rec.state = "pending"
+ rec.cancellation_type_id = False
+
+ @api.onchange("state")
+ def _onchange_state(self):
+ for rec in self:
+ if rec.state == "cancel":
+ rec.child_ids.state = "cancel"
+ elif rec.state != "done":
+ rec.child_ids.state = "pending"
@api.depends("parent_id.state")
def _compute_parent_state(self):
for rec in self:
rec.parent_state = rec.parent_id.state if rec.parent_id else False
- @api.depends("task_date")
- def _compute_is_today(self):
+ @api.depends("task_date", "state")
+ def _compute_pending_allowed(self):
for rec in self:
- if rec.task_date:
- rec.is_today = rec.task_date == fields.Date.today()
+ if (
+ rec.task_date
+ and rec.state == "cancel"
+ and (
+ rec.task_date > fields.Date.today()
+ or (
+ (rec.parent_state and rec.parent_state != "done")
+ or not rec.parent_state
+ )
+ )
+ ):
+ rec.pending_allowed = True
else:
- rec.is_today = False
- @api.depends("task_date")
- def _compute_is_future(self):
+ rec.pending_allowed = False
+
+ @api.depends("task_date", "state")
+ def _compute_to_do_allowed(self):
for rec in self:
- if rec.task_date:
- rec.is_future = rec.task_date > fields.Date.today()
+ if (
+ rec.task_date
+ and rec.task_date == fields.Date.today()
+ and rec.state in ("cancel", "pending", "done", "in_progress")
+ and (
+ (rec.parent_state and rec.parent_state == "done")
+ or not rec.parent_state
+ )
+ ):
+ rec.to_do_allowed = True
else:
- rec.is_future = False
+ rec.to_do_allowed = False
+
+ @api.depends("state")
+ def _compute_cancel_allowed(self):
+ for rec in self:
+ if rec.state in ("to_do", "pending"):
+ rec.cancel_allowed = True
+ else:
+ rec.cancel_allowed = False
+
+ @api.depends("state")
+ def _compute_in_progress_allowed(self):
+ for rec in self:
+ if rec.state == "to_do":
+ rec.in_progress_allowed = True
+ else:
+ rec.in_progress_allowed = False
+
+ @api.depends("state")
+ def _compute_done_allowed(self):
+ for rec in self:
+ if rec.state == "in_progress":
+ rec.done_allowed = True
+ else:
+ rec.done_allowed = False
+
+ @api.depends("room_id", "task_type_id")
+ def _compute_employee_ids(self):
+ for rec in self:
+ employee_ids = False
+ if rec.room_id or rec.task_type_id:
+ employee_ids = self.env["hr.employee"].search(
+ [("pre_assigned_room_ids", "in", [rec.room_id.id])]
+ )
+ if not employee_ids:
+ employee_ids = (
+ self.env["pms.housekeeping.task.type"]
+ .search([("id", "=", rec.task_type_id.id)])
+ .housekeeper_ids
+ )
+ rec.employee_ids = employee_ids
+
+ @api.depends("task_type_id")
+ def _compute_priority(self):
+ for rec in self:
+ if rec.task_type_id:
+ rec.priority = rec.task_type_id.priority
+ else:
+ rec.priority = False
+
+ @api.model
+ def create(self, vals):
+ task_type_id = vals.get("task_type_id")
+ pms_housekeeping_task_type = self.env["pms.housekeeping.task.type"].browse(
+ task_type_id
+ )
+ room_id = vals.get("room_id")
+ pms_room = self.env["pms.room"].browse(room_id)
+ pms_room.housekeeping_state = (
+ "to_inspect" if pms_housekeeping_task_type.is_inspection else "dirty"
+ )
+
+ return super(PmsHouseKeepingTask, self).create(vals)
diff --git a/pms_housekeeping/models/pms_housekeeping_task_type.py b/pms_housekeeping/models/pms_housekeeping_task_type.py
index 0bb25f22d..ff7986847 100644
--- a/pms_housekeeping/models/pms_housekeeping_task_type.py
+++ b/pms_housekeeping/models/pms_housekeeping_task_type.py
@@ -12,9 +12,13 @@ class PmsHouseKeepingTaskType(models.Model):
is_checkin = fields.Boolean(string="Checkin")
is_checkout = fields.Boolean(string="Checkout")
priority = fields.Integer(string="Priority", default=0)
- days_after_clean_overnight = fields.Integer(string="Days After Clean Overnight",)
- days_after_clean_empty = fields.Integer(string="Days After Clean Empty", )
- housekeepers = fields.Many2many(
+ days_after_clean_overnight = fields.Integer(
+ string="Days After Clean Overnight",
+ )
+ days_after_clean_empty = fields.Integer(
+ string="Days After Clean Empty",
+ )
+ housekeeper_ids = fields.Many2many(
comodel_name="hr.employee",
relation="pms_housekeeping_task_type_hr_employee_rel",
column1="task_type_id",
diff --git a/pms_housekeeping/models/pms_room.py b/pms_housekeeping/models/pms_room.py
index ea0fc069e..bc46bbfed 100644
--- a/pms_housekeeping/models/pms_room.py
+++ b/pms_housekeeping/models/pms_room.py
@@ -1,4 +1,4 @@
-from odoo import fields, models, api
+from odoo import fields, models
class PmsRoom(models.Model):
@@ -14,4 +14,3 @@ class PmsRoom(models.Model):
required=True,
default="dirty",
)
-
diff --git a/pms_housekeeping/static/description/index.html b/pms_housekeeping/static/description/index.html
index 49c265c4b..807ad9226 100644
--- a/pms_housekeeping/static/description/index.html
+++ b/pms_housekeeping/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:de773807356222adab5ee772d075d86a64a8a09828b1e137748c9562380fe750
+!! source digest: sha256:4807e347dd2088e7cfafc8201f1105b6162c3f0793e9b87f570b6ba38c1756e7
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

This module adds housekeeping feature to property management system (PMS).
diff --git a/pms_housekeeping/views/hr_employee_views.xml b/pms_housekeeping/views/hr_employee_views.xml
index 93c1553e3..d3159d825 100644
--- a/pms_housekeeping/views/hr_employee_views.xml
+++ b/pms_housekeeping/views/hr_employee_views.xml
@@ -5,7 +5,12 @@
-
+
+