228 lines
11 KiB
Python
228 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, _, api
|
|
from odoo.exceptions import UserError
|
|
import datetime
|
|
from datetime import datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
|
|
|
|
|
class hr_extend(models.Model):
|
|
_name = 'hr.re.contract'
|
|
_description = 'HR Re-Contract'
|
|
_rec_name = 'employee_id'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
|
|
state = fields.Selection(string='State', selection=[
|
|
('draft', 'Draft'),
|
|
('submitted', 'Submitted'),
|
|
('direct_manager', 'Direct Manager'),
|
|
('hr_manager', 'HR Manager'),
|
|
('done', 'Re-Contract'),
|
|
('refuse', 'Refuse'),
|
|
], default='draft', tracking=True)
|
|
|
|
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id)
|
|
employee_id = fields.Many2one('hr.employee', string='Employee', required=True)
|
|
date = fields.Date(default=fields.Date.context_today, string="Date Request")
|
|
effective_date = fields.Date()
|
|
job_id = fields.Many2one('hr.job', string='Job Position', compute='_get_employee_data', store=True)
|
|
department_id = fields.Many2one('hr.department', string='Department', compute='_get_employee_data', store=True)
|
|
|
|
hire_date = fields.Date(string='Hire Date', compute='_get_employee_data', store=True)
|
|
contract_id = fields.Many2one('hr.contract', compute='_get_employee_data', store=True, string='Current Contract',
|
|
help='Latest contract of the employee')
|
|
|
|
new_salary = fields.Float()
|
|
new_salary_scale = fields.Many2one('hr.salary.scale', string='New Salary Scale')
|
|
new_salary_group = fields.Many2one('hr.salary.group', string='New Salary Group')
|
|
new_salary_level = fields.Many2one('hr.salary.level', string='New Salary Level')
|
|
new_salary_degree = fields.Many2one('hr.salary.degree', string='New Salary Degree')
|
|
start_date = fields.Date(string='Current Contract Start Date', compute='_get_employee_data', store=True)
|
|
new_contract_start_date = fields.Date()
|
|
new_contract_end_date = fields.Date()
|
|
eoc_date = fields.Date(string='Current Contract End Date', compute='_get_employee_data', store=True)
|
|
increase_salary = fields.Selection([('no', 'NO'), ('yes', 'YES')], string='Increase Salary?', default='no')
|
|
last_renewal = fields.Boolean(readonly=True, string='Last Renewal?', default=True)
|
|
|
|
contract_type = fields.Selection([
|
|
('temporary', 'Temporary'),
|
|
('permanent', 'Permanent')
|
|
], string='Contract Type', default='temporary', tracking=True)
|
|
|
|
iqama_end_date = fields.Date(related="employee_id.iqama_number.expiry_date",string='Identity End Date', readonly=True)
|
|
|
|
# employee_type = fields.Selection(related='employee_id.contract_id.contract_description', store=True)
|
|
|
|
@api.depends('employee_id')
|
|
def _get_employee_data(self):
|
|
"""Compute employee data from employee record"""
|
|
for rec in self:
|
|
rec.hire_date = False
|
|
rec.contract_id = False
|
|
rec.start_date = False
|
|
rec.eoc_date = False
|
|
rec.job_id = False
|
|
rec.department_id = False
|
|
if rec.employee_id:
|
|
rec.hire_date = rec.employee_id.first_hiring_date
|
|
contract = rec.employee_id.contract_id
|
|
if contract:
|
|
rec.contract_id = contract.id
|
|
rec.start_date = contract.date_start
|
|
rec.eoc_date = contract.date_end
|
|
rec.job_id = rec.employee_id.job_id.id
|
|
rec.department_id = rec.employee_id.department_id.id
|
|
|
|
def action_refuse(self):
|
|
for item in self:
|
|
if item.state == 'done':
|
|
contracts = self.env['hr.contract'].search([('employee_id', '=', self.employee_id.id)],
|
|
order='id DESC')[:2]
|
|
item.contract_id.write({
|
|
'salary': item.contract_id.salary_degree.base_salary,
|
|
'salary_scale': item.contract_id.salary_scale.id,
|
|
'salary_level': item.contract_id.salary_level.id,
|
|
'salary_group': item.contract_id.salary_group.id,
|
|
'salary_degree': item.contract_id.salary_degree.id, })
|
|
self.state = "refuse"
|
|
|
|
def action_submit(self):
|
|
self._get_employee_data()
|
|
self.state = 'submitted'
|
|
|
|
def action_direct_manager(self):
|
|
# if self.employee_id.parent_id and self._uid != self.employee_id.parent_id.user_id.id:
|
|
# raise UserError(_('This is Not Your Role beacuse Your Direct Manager'))
|
|
self._get_employee_data()
|
|
self._check_contract()
|
|
self.state = "direct_manager"
|
|
|
|
def action_hr_manager(self):
|
|
self._get_employee_data()
|
|
self.state = "hr_manager"
|
|
|
|
def action_done(self):
|
|
self._check_contract()
|
|
today = datetime.now().date()
|
|
str_today = today.strftime('%Y-%m-%d')
|
|
# if str_today != self.effective_date:
|
|
# raise UserError(_('You can not re-contract employee because effective date is not today'))
|
|
last_record = self.env['hr.re.contract'].search(
|
|
[('id', '!=', self.id), ('employee_id', '=', self.employee_id.id),
|
|
('state', '=', 'done'), ('last_renewal', '=', True)], order='id desc', limit=1)
|
|
default = {
|
|
'job_id': self.job_id.id,
|
|
'employee_id': self.employee_id.id,
|
|
'department_id': self.department_id.id,
|
|
# 'date_start': self.new_contract_start_date,
|
|
'date_end': self.new_contract_end_date,
|
|
'name': 'Re-Contract' + self.employee_id.name,
|
|
'state': 'program_directory',
|
|
}
|
|
if self.increase_salary == 'yes':
|
|
|
|
default.update({'wage': self.new_salary_degree.base_salary,
|
|
'salary_scale': self.new_salary_scale.id,
|
|
'salary_level': self.new_salary_level.id,
|
|
# 'experience_year': self.experience_year,
|
|
'salary_group': self.new_salary_group.id,
|
|
'salary_degree': self.new_salary_degree.id,
|
|
})
|
|
|
|
else:
|
|
default.update({'wage': self.contract_id.salary_degree.base_salary,
|
|
'salary_scale': self.contract_id.salary_scale.id,
|
|
'salary_level': self.contract_id.salary_level.id,
|
|
'experience_year': self.contract_id.experience_year,
|
|
'salary_group': self.contract_id.salary_group.id,
|
|
'salary_degree': self.contract_id.salary_degree.id,
|
|
})
|
|
|
|
c_id = self.contract_id.copy(default=default)
|
|
|
|
for line in self.contract_id.employee_dependant:
|
|
line.contract_id = c_id.id
|
|
|
|
for line in self.contract_id.advantages:
|
|
line.contract_advantage_id = c_id.id
|
|
|
|
self.contract_id.write({'active': False})
|
|
if last_record:
|
|
last_record.last_renewal = False
|
|
if self.contract_type == 'permanent':
|
|
c_id.contract_description = 'permanent'
|
|
# Employee back to service
|
|
self.employee_id.state = 'open'
|
|
self.contract_id.state = 'program_directory'
|
|
|
|
self.state = "done"
|
|
|
|
def unlink(self):
|
|
for i in self:
|
|
if i.state != 'draft':
|
|
raise UserError(_('You can not delete record in state not in draft'))
|
|
return super(hr_extend, self).unlink()
|
|
|
|
@api.onchange('employee_id', 'new_contract_start_date', 'contract_type')
|
|
def onchange_new_contract_start_date(self):
|
|
for rec in self:
|
|
if rec.eoc_date:
|
|
rec.new_contract_start_date = False
|
|
rec.new_contract_end_date = False
|
|
date_start = datetime.strptime(str(rec.eoc_date), '%Y-%m-%d')
|
|
date_start += relativedelta(days=1)
|
|
rec.new_contract_start_date = date_start
|
|
# rec.new_contract_end_date = date_start + relativedelta(years=3)
|
|
if not rec.eoc_date and rec.employee_id:
|
|
raise UserError(_('You can not renewal contract is open Date'))
|
|
if rec.new_contract_start_date:
|
|
start_date = datetime.strptime(str(rec.new_contract_start_date), DEFAULT_SERVER_DATE_FORMAT).date()
|
|
end_date = start_date + relativedelta(years=1)
|
|
end_date -= relativedelta(days=1)
|
|
rec.new_contract_end_date = end_date
|
|
if rec.contract_type == 'permanent':
|
|
rec.new_contract_end_date = False
|
|
|
|
def _check_contract(self):
|
|
old_start_date = datetime.strptime(str(self.contract_id.date_start), DEFAULT_SERVER_DATE_FORMAT).date()
|
|
# old_end_date = datetime.strptime(self.contract_id.date_end, DEFAULT_SERVER_DATE_FORMAT).date()
|
|
new_start_date = datetime.strptime(str(self.new_contract_start_date), DEFAULT_SERVER_DATE_FORMAT).date()
|
|
|
|
if self.contract_id.date_end:
|
|
old_end_date = datetime.strptime(str(self.contract_id.date_end), DEFAULT_SERVER_DATE_FORMAT).date()
|
|
if new_start_date <= old_end_date:
|
|
raise UserError(_('New Contract must have start date after the end date of old contract'))
|
|
elif old_start_date <= new_start_date <= old_end_date:
|
|
raise UserError(_('New Contract must have start date after the end date of old contract'))
|
|
|
|
if self.new_contract_end_date:
|
|
new_end_date = datetime.strptime(str(self.new_contract_end_date), DEFAULT_SERVER_DATE_FORMAT).date()
|
|
|
|
if new_start_date >= new_end_date:
|
|
raise UserError(_('New Contract start date must be before the end date'))
|
|
|
|
return True
|
|
|
|
def action_set_to_draft(self):
|
|
if self.state == 'done':
|
|
last_record = self.env['hr.re.contract'].search(
|
|
[('id', '!=', self.id), ('employee_id', '=', self.employee_id.id),
|
|
('state', '=', 'done'), ('last_renewal', '=', False)], order='id desc', limit=1)
|
|
|
|
if self.last_renewal == False:
|
|
raise UserError(_('The record Cannot be Set To Draft Because It Is Not Last Renewal Record'))
|
|
for line in self.employee_id.contract_id.advantages:
|
|
line.contract_advantage_id = self.contract_id.id
|
|
for line in self.employee_id.contract_id.employee_dependant:
|
|
line.contract_id = self.contract_id.id
|
|
contracts = self.env['hr.contract'].search([('employee_id', '=', self.employee_id.id)], order='id DESC')[:2]
|
|
if self.contract_id:
|
|
self.contract_id.write({'active': True})
|
|
contracts.draft_state()
|
|
contracts.unlink()
|
|
if last_record:
|
|
last_record.last_renewal = True
|
|
self.state = "draft"
|