odex30_standard/hr_job_request/models/job_request.py

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'