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