from odoo import fields, models, _ from odoo.exceptions import UserError class LateComingRequest(models.Model): _name = 'late.coming.request' _description = 'Late Coming Request' _inherit = ['mail.thread', 'mail.activity.mixin'] _rec_name = 'employee_id' employee_id = fields.Many2one( 'hr.employee', string="Employee", required=True ) manager_id = fields.Many2one( 'hr.employee', related='employee_id.parent_id', store=True, string="Manager" ) department_id = fields.Many2one( 'hr.department', related='employee_id.department_id', store=True, string="Department" ) attendance_date = fields.Date( string="Attendance Date" ) check_in = fields.Datetime( string="Check In" ) worked_hours = fields.Float( string="Worked Hours" ) expected_check_in = fields.Float( string="Expected Check In" ) late_minutes = fields.Float( string="Late Minutes" ) department_grace_period = fields.Integer( string="Department Grace Period" ) required_checkout_time = fields.Float( string="Required Checkout Time" ) compensation_pending = fields.Boolean( string="Compensation Pending" ) compensation_minutes = fields.Float( string="Compensation Minutes" ) reason = fields.Text( string="Reason" ) manager_comment = fields.Text( string="Manager Comment" ) status_message = fields.Char( string="Status" ) state = fields.Selection([ ('draft', 'Draft'), ('submitted', 'Submitted'), ('approved', 'Approved'), ('rejected', 'Rejected') ], string="Status", default='draft' ) 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 work email not configured.") ) rec.state = 'submitted' template = self.env.ref( 'grace_period.email_template_late_coming_request' ) template.send_mail( rec.id, force_send=True ) rec.message_post( body=_("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' 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.") ) if not rec.employee_id.work_email: raise UserError( _("Employee work email not configured.") ) rec.state = 'rejected' template = self.env.ref( 'grace_period.email_template_late_coming_rejected' ) template.send_mail( rec.id, force_send=True ) rec.message_post( body=_("Request Rejected.") ) def action_reset_to_draft(self): self.state = 'draft'