[IMP]pms_housekeeping: constrains and tests for housekeeping tasks

This commit is contained in:
braisab
2024-02-22 11:56:22 +01:00
committed by Darío Lodeiros
parent 30f0748cb8
commit f403daf78f
8 changed files with 305 additions and 52 deletions

View File

@@ -44,14 +44,14 @@ class PmsHouseKeepingTask(models.Model):
readonly=False, readonly=False,
) )
cleaning_comments = fields.Text(string="Cleaning Comments") cleaning_comments = fields.Text(string="Cleaning Comments")
employee_ids = fields.Many2many( housekeeper_ids = fields.Many2many(
comodel_name="hr.employee", comodel_name="hr.employee",
relation="pms_housekeeping_task_hr_employee_rel", relation="pms_housekeeping_task_hr_employee_rel",
column1="task_id", column1="task_id",
column2="employee_id", column2="employee_id",
string="Employees", string="Housekeepers",
domain="[('job_id.name', '=', 'Housekeeper')]", domain="[('job_id.name', '=', 'Housekeeper')]",
compute="_compute_employee_ids", compute="_compute_housekeeper_ids",
store=True, store=True,
readonly=False, readonly=False,
) )
@@ -96,6 +96,11 @@ class PmsHouseKeepingTask(models.Model):
string="Is Done Allowed", string="Is Done Allowed",
compute="_compute_done_allowed", compute="_compute_done_allowed",
) )
allowed_housekeeper_ids = fields.Many2many(
comodel_name="hr.employee",
string="Allowed Housekeepers",
compute="_compute_allowed_housekeeper_ids",
)
@api.constrains("task_date") @api.constrains("task_date")
def _check_task_date(self): def _check_task_date(self):
@@ -111,6 +116,16 @@ class PmsHouseKeepingTask(models.Model):
if rec.parent_id.parent_id: if rec.parent_id.parent_id:
raise ValidationError(_("Parent task cannot have a parent task")) raise ValidationError(_("Parent task cannot have a parent task"))
@api.constrains("housekeeper_ids")
def _check_housekeeper_ids(self):
for rec in self:
if rec.housekeeper_ids:
for housekeeper in rec.housekeeper_ids:
if housekeeper not in rec.allowed_housekeeper_ids:
raise ValidationError(
_("The housekeeper should belong to the room's property.")
)
def action_cancel(self): def action_cancel(self):
for rec in self: for rec in self:
rec.state = "cancel" rec.state = "cancel"
@@ -207,20 +222,20 @@ class PmsHouseKeepingTask(models.Model):
rec.done_allowed = False rec.done_allowed = False
@api.depends("room_id", "task_type_id") @api.depends("room_id", "task_type_id")
def _compute_employee_ids(self): def _compute_housekeeper_ids(self):
for rec in self: for rec in self:
employee_ids = False housekeeper_ids = False
if rec.room_id or rec.task_type_id: if rec.room_id or rec.task_type_id:
employee_ids = self.env["hr.employee"].search( housekeeper_ids = self.env["hr.employee"].search(
[("pre_assigned_room_ids", "in", [rec.room_id.id])] [("pre_assigned_room_ids", "in", [rec.room_id.id])]
) )
if not employee_ids: if not housekeeper_ids:
employee_ids = ( housekeeper_ids = (
self.env["pms.housekeeping.task.type"] self.env["pms.housekeeping.task.type"]
.search([("id", "=", rec.task_type_id.id)]) .search([("id", "=", rec.task_type_id.id)])
.housekeeper_ids .housekeeper_ids
) )
rec.employee_ids = employee_ids rec.housekeeper_ids = housekeeper_ids
@api.depends("task_type_id") @api.depends("task_type_id")
def _compute_priority(self): def _compute_priority(self):
@@ -230,6 +245,19 @@ class PmsHouseKeepingTask(models.Model):
else: else:
rec.priority = False rec.priority = False
@api.depends('room_id')
def _compute_allowed_housekeeper_ids(self):
for rec in self:
domain = [('job_id.name', '=', 'Housekeeper')]
if rec.room_id:
domain = [
('job_id.name', '=', 'Housekeeper'),
'|',
('property_ids', 'in', rec.room_id.pms_property_id.ids),
('property_ids', '=', False),
]
rec.allowed_housekeeper_ids = self.env['hr.employee'].search(domain).ids
@api.model @api.model
def create(self, vals): def create(self, vals):
task_type_id = vals.get("task_type_id") task_type_id = vals.get("task_type_id")

View File

@@ -47,14 +47,6 @@ class PmsHouseKeepingTaskType(models.Model):
string="Properties", string="Properties",
) )
allowed_housekeeper_ids = fields.Many2many(
comodel_name="hr.employee",
relation="pms_housekeeping_task_type_allowed_hr_employee_rel",
column1="task_type_id",
column2="employee_id",
string="Allowed Employees",
compute="_compute_allowed_housekeeper_ids",
)
@api.constrains("is_overnight", "days_after_clean_overnight") @api.constrains("is_overnight", "days_after_clean_overnight")
def _check_days_after_clean_overnight(self): def _check_days_after_clean_overnight(self):
@@ -80,15 +72,12 @@ class PmsHouseKeepingTaskType(models.Model):
_("Parent task type cannot have a parent task type") _("Parent task type cannot have a parent task type")
) )
@api.depends("pms_property_ids") @api.constrains("housekeeper_ids")
def _compute_allowed_housekeeper_ids(self): def _check_housekeeper_ids(self):
for record in self: for record in self:
domain = [] if record.housekeeper_ids:
if record.pms_property_ids: for employee in record.housekeeper_ids:
domain = [ if employee.job_id.name != 'Housekeeper':
"|", raise ValidationError(
("property_ids", "in", record.pms_property_ids.ids), _("The job position should be Housekeeper.")
("property_ids", "in", False), )
]
domain.append(("job_id.name", "=", "Housekeeper"))
record.allowed_housekeeper_ids = self.env["hr.employee"].search(domain).ids

View File

@@ -1,2 +1,3 @@
from . import test_pms_housekeeping_task from . import test_pms_housekeeping_task
from . import test_pms_hr_employee from . import test_pms_hr_employee
from . import test_pms_housekeeping_task_type

View File

@@ -359,7 +359,7 @@ class TestPmsHousekeepingTask(TestPms):
self.assertFalse(housekeeping_task, "Housekeeping task shouldn't be created") self.assertFalse(housekeeping_task, "Housekeeping task shouldn't be created")
@freeze_time("2000-01-04") @freeze_time("2000-01-04")
def test_create_task_type_childs(self): def test_create_task_childs(self):
# ARRANGE # ARRANGE
# create task type # create task type
parent_task_type = self.env["pms.housekeeping.task.type"].create( parent_task_type = self.env["pms.housekeeping.task.type"].create(
@@ -400,7 +400,7 @@ class TestPmsHousekeepingTask(TestPms):
# Verify that the housekeeping task is not created # Verify that the housekeeping task is not created
self.assertTrue(housekeeping_task, "Child housekeeping task should be created") self.assertTrue(housekeeping_task, "Child housekeeping task should be created")
def test_no_create_task_type_childs(self): def test_no_create_task_childs(self):
# ARRANGE # ARRANGE
# create task type # create task type
self.env["pms.housekeeping.task.type"].create( self.env["pms.housekeeping.task.type"].create(
@@ -437,30 +437,190 @@ class TestPmsHousekeepingTask(TestPms):
housekeeping_task.child_ids, "Child housekeeping task shouldn´t be created" housekeeping_task.child_ids, "Child housekeeping task shouldn´t be created"
) )
def test_days_after_clean_overnight_constraint(self): def test_no_create_grandchild_task(self):
# ARRANGE, ACT & ASSERT # ARRANGE
# create task type and verify that the constraint is raised # create task type
task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Parent",
"is_checkout": True,
}
)
parent_task = self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": task_type.id,
"task_date": datetime.today(),
}
)
child_task = self.env["pms.housekeeping.task"].create(
{
"name": "Child Task",
"room_id": self.room1.id,
"task_type_id": task_type.id,
"parent_id": parent_task.id,
"task_date": datetime.today(),
}
)
# ACT & ASSERT
with self.assertRaises( with self.assertRaises(
ValidationError, msg="Days After Clean Overnight should be greater than 0" ValidationError, msg="Grandchild task shouldn´t exist."
): ):
self.env["pms.housekeeping.task.type"].create( self.env["pms.housekeeping.task"].create(
{ {
"name": "Task Type 1", "name": "Grandchild Task",
"is_overnight": True, "room_id": self.room1.id,
"days_after_clean_overnight": 0, "task_type_id": task_type.id,
"parent_id": child_task.id,
"task_date": datetime.today(),
} }
) )
def test_days_after_clean_empty_constraint(self): def test_create_task_with_no_housekeeper(self):
# ARRANGE, ACT & ASSERT
# create task type and verify that the constraint is raised # ARRANGE
self.job_id = self.env["hr.job"].create(
{
"name": "Test Job",
}
)
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.job_id.id,
}
)
# create task type
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
# ACT & ASSERT
with self.assertRaises( with self.assertRaises(
ValidationError, msg="Days After Clean Overnight should be greater than 0" ValidationError, msg="Employee should have a housekeeper job"
): ):
self.env["pms.housekeeping.task.type"].create( self.env["pms.housekeeping.task"].create(
{ {
"name": "Task Type 1", "name": "Task",
"is_empty": True, "room_id": self.room1.id,
"days_after_clean_empty": 0, "task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
} }
) )
def test_create_task_with_housekeeper(self):
# ARRANGE
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
}
)
# create task type
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
# ACT
self.task = self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
#ASSERT
self.assertTrue(self.task, "Housekeeping task should be created")
def test_task_housekeeper_room_inconsistency(self):
# ARRANGE
self.pms_property2 = self.env["pms.property"].create(
{
"name": "Property 2",
"company_id": self.company1.id,
"default_pricelist_id": self.pricelist1.id,
}
)
self.room2 = self.env["pms.room"].create(
{
"name": "Room 202",
"pms_property_id": self.pms_property2.id,
"room_type_id": self.room_type1.id,
}
)
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
"property_ids": [(6, 0, [self.pms_property1.id])],
}
)
# create task type
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
# ACT & ASSERT
with self.assertRaises(
ValidationError, msg="The room and housekeeper should belong to the same property."
):
self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room2.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
def test_task_housekeeper_room_consistency(self):
# ARRANGE
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
"property_ids": [(6, 0, [self.pms_property1.id])],
}
)
# create task type
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
# ACT
task = self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
# ASSERT
self.assertTrue(task, "Housekeeping task should be created")

View File

@@ -0,0 +1,63 @@
from .common import TestPms
from odoo.exceptions import ValidationError
class TestPmsHousekeepingTask(TestPms):
def setUp(self):
super().setUp()
def test_days_after_clean_overnight_constraint(self):
# ARRANGE, ACT & ASSERT
# create task type and verify that the constraint is raised
with self.assertRaises(
ValidationError, msg="Days After Clean Overnight should be greater than 0"
):
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_overnight": True,
"days_after_clean_overnight": 0,
}
)
def test_days_after_clean_empty_constraint(self):
# ARRANGE, ACT & ASSERT
# create task type and verify that the constraint is raised
with self.assertRaises(
ValidationError, msg="Days After Clean Overnight should be greater than 0"
):
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_empty": True,
"days_after_clean_empty": 0,
}
)
def test_no_create_grandchild_task_type(self):
# ARRANGE
# create task type
parent_task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Parent",
"is_checkout": True,
}
)
child_task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Child",
"is_checkout": True,
"parent_id": parent_task_type.id,
}
)
# ACT & ASSERT
with self.assertRaises(
ValidationError, msg="Grandchild task type shouldn´t exist."
):
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Grandchild",
"is_checkout": True,
"parent_id": child_task_type.id,
}
)

View File

@@ -77,11 +77,16 @@ class TestPmsHrEmployee(TestPms):
def test_not_pre_assigned_room_no_housekeeper_employee(self): def test_not_pre_assigned_room_no_housekeeper_employee(self):
# ARRANGE # ARRANGE
self.job_id = self.env["hr.job"].create(
{
"name": "Test Job",
}
)
self.hr_employee = self.env["hr.employee"].create( self.hr_employee = self.env["hr.employee"].create(
{ {
"name": "Test Employee", "name": "Test Employee",
"company_id": self.company1.id, "company_id": self.company1.id,
"job_id": self.env.ref("hr.job_trainee").id, "job_id": self.job_id.id,
} }
) )

View File

@@ -57,10 +57,12 @@
<field <field
name="housekeeper_ids" name="housekeeper_ids"
widget="many2many_tags" widget="many2many_tags"
domain="[('id', 'in', allowed_housekeeper_ids)]" domain="[('job_id.name', '=', 'Housekeeper')]"
/>
<field
name="pms_property_ids"
widget="many2many_tags"
/> />
<field name="pms_property_ids" widget="many2many_tags" />
<field name="allowed_housekeeper_ids" invisible="1" />
<field name="parent_id" /> <field name="parent_id" />
<field name="description" /> <field name="description" />
</group> </group>

View File

@@ -11,7 +11,7 @@
<field name="state" /> <field name="state" />
<field name="priority" /> <field name="priority" />
<field name="cleaning_comments" /> <field name="cleaning_comments" />
<field name="employee_ids" /> <field name="housekeeper_ids" />
<field name="parent_id" /> <field name="parent_id" />
</tree> </tree>
</field> </field>
@@ -73,7 +73,12 @@
<group class="col-6"> <group class="col-6">
<field name="task_date" /> <field name="task_date" />
<field name="priority" /> <field name="priority" />
<field name="employee_ids" widget="many2many_tags" /> <field
name="housekeeper_ids"
widget="many2many_tags"
domain="[('id', 'in', allowed_housekeeper_ids)]"
/>
<field name="allowed_housekeeper_ids" invisible="1"/>
</group> </group>
<group class="col-12"> <group class="col-12">
<field name="parent_id" /> <field name="parent_id" />