153 lines
3.8 KiB
Python
153 lines
3.8 KiB
Python
from odoo import fields, models, api, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class ShiftSwapRequest(models.Model):
|
|
_name = 'shift.swap.request'
|
|
_inherit = [
|
|
'mail.thread',
|
|
'mail.activity.mixin'
|
|
]
|
|
|
|
employee_id = fields.Many2one('hr.employee')
|
|
shift_id = fields.Many2one(
|
|
'resource.calendar',
|
|
related='employee_id.resource_calendar_id',
|
|
string='Assigned Shift',
|
|
store=True,
|
|
readonly=True,
|
|
)
|
|
swap_employee_id = fields.Many2one(
|
|
'hr.employee'
|
|
)
|
|
roster_date = fields.Date()
|
|
reason = fields.Text()
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('submitted', 'Submitted'),
|
|
('approved', 'Approved'),
|
|
('rejected', 'Rejected')
|
|
], default='draft')
|
|
manager_id = fields.Many2one(
|
|
'hr.employee',
|
|
related='employee_id.parent_id',
|
|
store=True
|
|
)
|
|
|
|
def action_submit(self):
|
|
for rec in self:
|
|
|
|
if not rec.reason:
|
|
raise UserError(
|
|
_("Please enter reason.")
|
|
)
|
|
|
|
if not rec.manager_id:
|
|
raise UserError(
|
|
_("Manager not configured.")
|
|
)
|
|
|
|
if not rec.manager_id.work_email:
|
|
raise UserError(
|
|
_("Manager email not configured.")
|
|
)
|
|
|
|
rec.state = 'submitted'
|
|
|
|
template = self.env.ref(
|
|
'roster_management.email_template_shift_swap_request'
|
|
)
|
|
|
|
template.send_mail(
|
|
rec.id,
|
|
force_send=True
|
|
)
|
|
|
|
rec.message_post(
|
|
body=_(
|
|
"Shift swapping Request Submitted"
|
|
)
|
|
)
|
|
|
|
def action_reject(self):
|
|
for rec in self:
|
|
|
|
if (
|
|
rec.manager_id.user_id != self.env.user
|
|
and not self.env.user.has_group(
|
|
'hr.group_hr_manager'
|
|
)
|
|
):
|
|
raise UserError(
|
|
_("Only Manager or HR can reject.")
|
|
)
|
|
|
|
rec.state = 'rejected'
|
|
|
|
template = self.env.ref(
|
|
'roster_management.email_template_shiftswap_rejected'
|
|
)
|
|
|
|
template.send_mail(
|
|
rec.id,
|
|
force_send=True
|
|
)
|
|
|
|
rec.message_post(
|
|
body=_("ShiftSwap Request Rejected.")
|
|
)
|
|
|
|
def action_approve(self):
|
|
|
|
for rec in self:
|
|
|
|
if (
|
|
rec.manager_id.user_id != self.env.user
|
|
and not self.env.user.has_group(
|
|
'hr.group_hr_manager'
|
|
)
|
|
):
|
|
raise UserError(
|
|
_("Only Manager or HR can approve.")
|
|
)
|
|
|
|
roster1 = self.env[
|
|
'team.roster.line'
|
|
].search([
|
|
('employee_id', '=', rec.employee_id.id),
|
|
('roster_date', '=', rec.roster_date)
|
|
], limit=1)
|
|
|
|
roster2 = self.env[
|
|
'team.roster.line'
|
|
].search([
|
|
('employee_id', '=', rec.swap_employee_id.id),
|
|
('roster_date', '=', rec.roster_date)
|
|
], limit=1)
|
|
|
|
if not roster1 or not roster2:
|
|
raise UserError(
|
|
_("Roster records not found for the selected date.")
|
|
)
|
|
|
|
shift = roster1.shift_id
|
|
|
|
roster1.shift_id = roster2.shift_id
|
|
|
|
roster2.shift_id = shift
|
|
|
|
rec.state = 'approved'
|
|
|
|
rec.message_post(
|
|
body=_("Shift Swap Request Approved.")
|
|
)
|
|
def action_reset_to_draft(self):
|
|
|
|
self.state = 'draft'
|
|
|
|
self.message_post(
|
|
body=_(
|
|
"Reset to Draft"
|
|
)
|
|
)
|