from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class HrLeave(models.Model): _inherit = 'hr.leave' project_id = fields.Many2one( 'project.project',related="holiday_status_id.project_id", string='Project' ) task_id = fields.Many2one( 'project.task',related="holiday_status_id.task_id", string='Task' ) timesheet_line_id = fields.Many2one( 'account.analytic.line', string='Timesheet Entry', readonly=True, copy=False ) # CREATE TIMESHEET ON APPROVAL def action_draft(self): res = super().action_draft() default_project = self.env.ref( 'leaves_timesheets_extended.project_internal_leave' ) default_task = self.env.ref( 'leaves_timesheets_extended.task_leave_management' ) for leave in self: # Prevent duplicate creation if leave.timesheet_line_id: continue project = ( leave.project_id or default_project ) task = ( leave.task_id or default_task ) # Hours Calculation if leave.request_unit_half: hours = 4 else: hours = leave.number_of_days * 8 analytic_line = self.env['account.analytic.line'].create({ 'name': f"Leave: {leave.holiday_status_id.name}", 'employee_id': leave.employee_id.id, 'user_id': leave.employee_id.user_id.id, 'project_id': project.id, 'task_id': task.id, 'unit_amount': hours, 'date': leave.request_date_from, 'company_id': leave.company_id.id, }) leave.timesheet_line_id = analytic_line.id return res def action_refuse(self): res = super().action_refuse() for leave in self: if leave.timesheet_line_id: leave.timesheet_line_id.unlink() leave.timesheet_line_id = False return res #ACTION CANCEL def action_cancel(self): res = super().action_cancel() for leave in self: if leave.timesheet_line_id: leave.timesheet_line_id.unlink() leave.timesheet_line_id = False return res def _check_validity(self): res = super(HrLeave, self)._check_validity() for leave in self: # Public holiday / weekoff validation if leave.number_of_days <= 0: raise ValidationError(_( "The selected day is either a Public Holiday or Week Off." )) return res class HRLeaveType(models.Model): _inherit='hr.leave.type' project_id = fields.Many2one( 'project.project', string='Project' ) task_id = fields.Many2one( 'project.task', string='Task' )