odoo18/addons_extensions/requisitions/models/hr_requisition.py

143 lines
6.6 KiB
Python

from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, UserError
class RecruitmentRequisition(models.Model):
_name = 'recruitment.requisition'
_description = 'Recruitment Requisition'
_inherit = ['mail.thread', 'mail.activity.mixin']
jd_file = fields.Binary(string="JD")
jd_file_name = fields.Char(string="JD")
name = fields.Char(string="Requisition Name", required=True, default="New", tracking=True)
requested_by = fields.Many2one('res.users', string="Requested By", default=lambda self: self.env.user, tracking=True)
client_id = fields.Many2one('res.partner', string="Client", default=lambda self: self.env.user.company_id.partner_id, tracking=True)
recruitment_type = fields.Selection([('internal','In-House'),('external','Client-Side')], default='internal')
requested_on = fields.Date(string='Requested On', tracking=True)
hr_manager_id = fields.Many2one('res.users', string="HR Manager", compute='_compute_hr_manager')
finance_manager_id = fields.Many2one('res.users',string="Finance Manager", compute="_compute_finance_manager")
is_hr = fields.Boolean(compute="_compute_check_access")
is_finance_manager = fields.Boolean(compute="_compute_check_access")
@api.onchange('client_id')
def onchange_client_id(self):
for rec in self:
if rec.client_id != rec.requested_by.company_id.partner_id and rec.client_id != rec.requested_by.partner_id:
rec.recruitment_type = 'external'
else:
rec.recruitment_type = 'internal'
@api.depends('hr_manager_id','finance_manager_id')
def _compute_check_access(self):
for rec in self:
rec.is_hr = False
rec.is_finance_manager = False
if (rec.hr_manager_id and rec.hr_manager_id == self.env.user) or self.env.user.id == 2:
rec.is_hr = True
if (rec.finance_manager_id and rec.finance_manager_id == self.env.user) or self.env.user.id == 2:
rec.is_finance_manager = True
hr_job = fields.Many2one('hr.job', tracking=True)
number_of_positions = fields.Integer(string="Number of Positions", required=True, tracking=True)
job_description = fields.Html(string="Job Summary")
job_id = fields.Many2one('hr.job',"Job Position", tracking=True)
state = fields.Selection([
('draft', 'Draft'),
('hr', 'HR Manager'),
('finance', 'Finance'),
('final', 'Final Approval'),
('jd_created', 'JD Created'),
('rejected', 'Rejected'),
('cancel', 'Cancelled')
], default='draft', tracking=True)
notes = fields.Text(string="Notes", tracking=True)
primary_skill_ids = fields.Many2many('hr.skill', "recruitment_requisition_primary_hr_skill_rel",
'hr_job_id', 'hr_skill_id', "Primary Skills", required=True, tracking=True)
secondary_skill_ids = fields.Many2many('hr.skill', "recruitment_requisition_secondary_hr_skill_rel",
'hr_job_id', 'hr_skill_id', "Secondary Skills", tracking=True)
assign_to = fields.Many2one('res.users', domain=lambda self: [
('groups_id', 'in', self.env.ref('hr_recruitment.group_hr_recruitment_user').id)], tracking=True)
finance_notes = fields.Text(string="Finance Comments", tracking=True)
budget = fields.Char(string="Budget",tracking=True)
requested_deadline = fields.Date(string="Required Before",tracking=True)
target_deadline = fields.Date(string="Target Deadline",tracking=True)
target_startdate = fields.Date(string="Start Date",tracking=True)
contract_type_id = fields.Many2one('hr.contract.type',string="Employment Type")
def action_finance_reject(self):
for rec in self:
if not rec.finance_notes:
raise UserError(_("Please enter rejection comments before rejecting."))
rec.state = 'hr'
template = self.env.ref(
'requisitions.mail_template_recruitment_requisition_finance_reject',
raise_if_not_found=False
)
if template:
template.send_mail(rec.id, force_send=True)
@api.depends('requested_by')
def _compute_hr_manager(self):
hr_id = self.env['ir.config_parameter'].sudo().get_param('requisitions.requisition_hr_id')
self.hr_manager_id = self.env['res.users'].sudo().browse(int(hr_id)) if hr_id else False
@api.depends('requested_by')
def _compute_finance_manager(self):
finance_id = self.env['ir.config_parameter'].sudo().get_param('requisitions.requisition_finance_manager_id')
self.finance_manager_id = self.env['res.users'].sudo().browse(int(finance_id)) if finance_id else False
def action_submit_hr(self):
self.name = self.env['ir.sequence'].next_by_code('hr.requisitions')
self.requested_on = fields.Date.today()
self.state = 'hr'
if self.requested_deadline:
self.target_deadline = self.requested_deadline
template = self.env.ref('requisitions.mail_template_recruitment_requisition_notification') # Replace `module_name` with your module name
if template:
template.send_mail(self.id, force_send=True)
def action_send_finance(self):
self.state = 'finance'
template = self.env.ref('requisitions.mail_template_recruitment_requisition_finance', raise_if_not_found=False)
if template:
template.send_mail(self.id, force_send=True)
def action_send_hr(self):
self.state = 'final'
template = self.env.ref('requisitions.mail_template_recruitment_requisition_final', raise_if_not_found=False)
if template:
template.send_mail(self.id, force_send=True)
def action_final_approve(self):
for rec in self:
if not rec.assign_to:
raise ValidationError(_("Please assign a recruitment user."))
rec.state = 'jd_created'
template = self.env.ref(
'requisitions.mail_template_recruitment_requisition_jd',
raise_if_not_found=False
)
if template:
template.send_mail(rec.id, force_send=True)
def action_cancel(self):
return {
'type': 'ir.actions.act_window',
'res_model': 'recruitment.requisition.cancel.wizard',
'name': _('Cancellation Reason'),
'view_mode': 'form',
'target': 'new',
'context': {'active_id': self.id},
}
class HRJob(models.Model):
_inherit = 'hr.job'
requested_by = fields.Many2one('res.partner', string="Requested By", default=lambda self: self.env.user.partner_id)