124 lines
5.2 KiB
Python
124 lines
5.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, api, _
|
|
from odoo.exceptions import UserError, ValidationError
|
|
|
|
|
|
class HrJobRequest(models.Model):
|
|
_name = 'hr.job.request'
|
|
_description = 'HR Job Request'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
|
|
@api.model
|
|
def default_get(self, field_list):
|
|
result = super(HrJobRequest, self).default_get(field_list)
|
|
employee = self.env['hr.employee'].search([('user_id', '=', self.env.user.id)], limit=1)
|
|
if employee:
|
|
result['department_id'] = employee.department_id.id if employee.department_id else False
|
|
result['employee_id'] = employee.id
|
|
return result
|
|
|
|
name = fields.Char(string="Name of Request", required=True, copy=False)
|
|
date = fields.Date(string="Request Date", required=True, copy=False)
|
|
requested_start_date = fields.Date(string="Requested Start Date", required=True, copy=False)
|
|
employee_id = fields.Many2one('hr.employee', 'Applicant', required=True, copy=False)
|
|
department_id = fields.Many2one('hr.department', string="Requesting Department", required=True, copy=False)
|
|
job_id = fields.Many2one('hr.job', string="Job Title", required=True, copy=False)
|
|
job_related_department_id = fields.Many2one('hr.department', string="Job Department", required=True, copy=False)
|
|
job_type = fields.Selection(
|
|
selection=[('permanent', 'Permanent'), ('temporary', 'Temporary')],
|
|
string="Job Type",
|
|
required=True,
|
|
copy=False,
|
|
default='permanent'
|
|
)
|
|
job_number = fields.Char(string="Job Number", required=True, copy=False)
|
|
needed_employee = fields.Integer(string="Needed Employee", required=True, copy=False)
|
|
working_location = fields.Many2one('work.location', string="Work Location", required=True, copy=False)
|
|
request_reason = fields.Text(string="Request Reason", required=True, copy=False)
|
|
state = fields.Selection(
|
|
selection=[
|
|
('draft', 'Draft'),
|
|
('recruitment_officer', 'Waiting for Recruitment Officer'),
|
|
('hr_manager', 'Waiting for HR Manager'),
|
|
('general_manager', 'Waiting for General Manager'),
|
|
('confirm', 'Confirm'),
|
|
('refused', 'Refused')
|
|
],
|
|
default='draft',
|
|
tracking=True
|
|
)
|
|
quarter = fields.Selection(
|
|
string="Quarter",
|
|
selection=[
|
|
('all_quarter', 'All Quarter'),
|
|
('first_quarter', 'First Quarter'),
|
|
('second_quarter', 'Second Quarter'),
|
|
('third_quarter', 'Third Quarter'),
|
|
('fourth_quarter', 'Fourth Quarter')
|
|
],
|
|
default='all_quarter'
|
|
)
|
|
number_of_employees = fields.Integer(
|
|
related="job_id.no_of_employee",
|
|
string="Current Employees",
|
|
store=True
|
|
)
|
|
expected_employee = fields.Integer(string="Expected jobs", compute="_compute_jobs", store=True)
|
|
number_of_job_empty = fields.Integer(string="Empty jobs", compute="_compute_jobs", store=True)
|
|
number_of_job_empty_total = fields.Integer(string="Total Empty jobs", compute="_compute_jobs", store=True)
|
|
job_requirements = fields.Html('Job Requirements')
|
|
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company)
|
|
|
|
def unlink(self):
|
|
for rec in self:
|
|
if rec.state != 'draft':
|
|
raise UserError(_('You cannot delete a record that is not in draft state'))
|
|
return super(HrJobRequest, self).unlink()
|
|
|
|
@api.depends('needed_employee', 'job_id', 'state')
|
|
def _compute_jobs(self):
|
|
for rec in self:
|
|
if rec.job_id:
|
|
if rec.job_id.no_of_employee == rec.job_id.expected_employees:
|
|
rec.number_of_job_empty_total = rec.needed_employee
|
|
else:
|
|
rec.number_of_job_empty_total = rec.needed_employee + rec.job_id.no_of_recruitment
|
|
rec.number_of_job_empty = rec.job_id.no_of_recruitment
|
|
rec.expected_employee = rec.number_of_job_empty_total + rec.number_of_employees
|
|
else:
|
|
rec.number_of_job_empty_total = 0
|
|
rec.number_of_job_empty = 0
|
|
rec.expected_employee = 0
|
|
|
|
def action_send(self):
|
|
for rec in self:
|
|
rec.state = 'recruitment_officer'
|
|
|
|
def action_hr_manager(self):
|
|
for rec in self:
|
|
rec.state = 'hr_manager'
|
|
|
|
def action_general_manager(self):
|
|
for rec in self:
|
|
rec.state = 'general_manager'
|
|
rec.job_id.sudo().write({'no_of_recruitment': rec.number_of_job_empty_total})
|
|
|
|
def action_confirm(self):
|
|
for rec in self:
|
|
rec.state = 'confirm'
|
|
|
|
def action_refused(self):
|
|
for rec in self:
|
|
if rec.state == 'general_manager':
|
|
empty = rec.job_id.expected_employees - rec.job_id.no_of_employee
|
|
record = rec.job_id.no_of_recruitment - rec.needed_employee
|
|
if empty < rec.needed_employee or record < 0:
|
|
raise ValidationError(_("You cannot cancel used jobs"))
|
|
rec.job_id.sudo().write({'no_of_recruitment': record})
|
|
rec.state = 'refused'
|
|
|
|
def action_set_draft(self):
|
|
for rec in self:
|
|
rec.state = 'draft'
|