odoo18/addons_extensions/roster_management/models/shift_swap.py

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"
)
)