from odoo import fields, models, _ from odoo.exceptions import UserError class OvertimeRequest(models.Model): _name = 'overtime.request' _description = 'Overtime Request' _inherit = ['mail.thread', 'mail.activity.mixin'] _rec_name = 'employee_id' employee_id = fields.Many2one( 'hr.employee', required=True, tracking=True ) department_id = fields.Many2one( 'hr.department', related='employee_id.department_id', store=True ) manager_id = fields.Many2one( 'hr.employee', related='employee_id.parent_id', store=True ) attendance_date = fields.Date( tracking=True ) check_in = fields.Datetime() check_out = fields.Datetime() worked_hours = fields.Float() hours_per_day = fields.Float() allowed_ot_limit = fields.Float() overtime_hours = fields.Float( tracking=True ) reason = fields.Text( tracking=True ) state = fields.Selection([ ('draft', 'Draft'), ('submitted', 'Submitted'), ('approved', 'Approved'), ('rejected', 'Rejected') ], default='draft', tracking=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( 'grace_period.email_template_ot_request' ) template.send_mail( rec.id, force_send=True ) rec.message_post( body=_( "OT Request Submitted" ) ) 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.") ) rec.state = 'approved' rec.message_post( body=_("Overtime Request Approved.") ) 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( 'grace_period.email_template_ot_rejected' ) template.send_mail( rec.id, force_send=True ) rec.message_post( body=_("Overtime Request Rejected.") ) def action_reset_to_draft(self): self.state = 'draft' self.message_post( body=_( "Reset to Draft" ) )