odex30_standard/hr_contract_custom/models/hr_contract.py

756 lines
38 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
import datetime
from datetime import datetime as dt
from datetime import timedelta
from dateutil import relativedelta
from hijridate import convert
# from googletrans import Translator
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# translator = Translator()
# Contract
class Contract(models.Model):
_inherit = 'hr.contract'
name = fields.Char(related="employee_id.emp_no", readonly=True, string='Employee Number')
state = fields.Selection(selection_add=[
('employeed_aproval', 'Employeed Approval'),
('hr_head_approval', 'HR Head Approval'),
('program_directory', 'Executive Approval'),
('end_contract', 'End Contract')
])
active = fields.Boolean(default=True)
employee_name = fields.Char(related="employee_id.name", readonly=True)
employee_type = fields.Selection(selection=[('saudi', 'Saudi'), ('foreign', 'Foreign'),
('displaced', 'Displaced Tribes'),
('external', 'Outsource1'), ('external2', 'Outsource2')],
default='saudi',
tracking=True)
contract_status = fields.Selection(selection=[('single', 'single contract'),
('marriage', 'marriage contract')], default='single',
tracking=True)
contract_duration = fields.Selection(selection=[('3_months', '3 Months'),
('6_months', '6 Months'),
('9_months', '9 Months'),
('12_months', '12 Months'),
('24_months', '24 Months'), ('36_months', '36 Months'),
('none', 'None')], default='12_months')
experience_year = fields.Integer()
has_end_service_benefit = fields.Boolean(string='Has end service benefits')
# fields on salary information page
suspended = fields.Boolean(string='Suspended')
social_insurance = fields.Boolean(string='Social Insurance')
salary = fields.Float(string='Base Salary', tracking=True)
# fields of information page
wage = fields.Float()
advatages = fields.Text()
trial_date_start = fields.Date(tracking=True)
trial_date_end = fields.Date(tracking=True)
date_start = fields.Date(tracking=True)
date_end = fields.Date(tracking=True)
note = fields.Text()
# fields of dependent page
employee_code = fields.Char()
allow_mbl = fields.Boolean(string='Allow Mobile Allowance')
sign_bonous = fields.Boolean(string='Sign on Bounus')
loan_allow = fields.Boolean(string='Allow Loan Allowance')
air_allow = fields.Boolean(string='Air Allowance')
adults = fields.Integer(string='Adult(s)')
# children = fields.Integer()
infants = fields.Integer()
package = fields.Float()
gosi = fields.Boolean(string='GOSI')
# vehicle_attendance = fields.Integer(string='Vehicle Attendance')
# system_attendance = fields.Integer(string='System Attendance')
# line_manager_attendance = fields.Integer(string='Line Manager Attendance')
# expense_claim = fields.Float(string='Expense Claim')
# hr_visa_ticket = fields.Float(string='HR Visa/Ticket')
# other_allowances = fields.Float(string='Other Allowances')
# advance_salary = fields.Float(string='Advance AGT Salary')
hr_expense = fields.Float(string='Hr Expense')
cash_sales = fields.Float(string='Cash Sales')
traffic_fine = fields.Float(string='Traffic Fine')
bk_balance = fields.Float(string='Bank Balance')
other_deductions = fields.Float(string='Other Deductions')
fn = fields.Char(string="First Name")
mn = fields.Char("Middle Name")
ln = fields.Char(string="Last Name")
dn = fields.Char(string="Display Name")
e_date = fields.Date(string="Effective Date")
status = fields.Selection(selection=[('bachelor', 'Bachelor'), ('family', 'family')], string='Status')
hra = fields.Char("HRA")
t_allow = fields.Float(string="Transport Allowance")
f_allow = fields.Float(string="Food Allowance")
f_ot = fields.Float(string="Fixed OT")
departure = fields.Char(string="Departure Air Port")
destination = fields.Char(string="Destination Air Port")
medical = fields.Selection(selection=[('yes', 'Yes'), ('no', 'No')], string='Medical')
c_accommodation = fields.Selection(selection=[(
'yes', 'Yes'),
('no', 'No')], string='Company Accommodation')
c_vehicle = fields.Selection(selection=[(
'yes', 'Yes'),
('no', 'No')], string='Company Vehicle')
c_vacation = fields.Selection(selection=[(
'12', '12 Months'),
('18', '18 Months'),
('24', '24 Months')], string='Contractual Vacation')
nod = fields.Selection(selection=[(
'12', '12 Months'),
('18', '18 Months'),
('24', '24 Months')], string='Number of days')
probation = fields.Selection(selection=[(
'3', '3 Months'),
('6', '6 Months')], string='Probation')
dependent = fields.Selection(selection=[(
'1', '1+1 '),
('2', '1+2 '),
('3', '1+3 '),
('all', 'All ')], string='Dependent')
incentive = fields.Selection(selection=[(
'yes', 'Yes'),
('no', 'No')], string='Incentive')
monthly_salary = fields.Float(string='Monthly Salary', compute='_compute_monthly_salary')
saudi_emp_type = fields.Selection([('saudi-contract', 'Saudi Contracting'),
('saudi-non', 'Saudi Non-Contracting')], string='Saudi Employee Type',
default='saudi-contract')
contract_type = fields.Selection([('local', 'Local'), ('international', 'International')], string='Contract Type')
contract_description = fields.Selection([('locum', 'Temporary'), ('permanent', 'Permanent')],
string='Contract Description', default='permanent')
house_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='House Allowance Type', default='none')
house_allowance = fields.Float('House Allowance')
salary_insurnce = fields.Float(string='Salary Insurnce')
overtime_eligible = fields.Selection([('yes', 'Yes'), ('no', 'No')], string='Overtime Eligibility', default='no')
overtime_eligible_float = fields.Float('Overtime Eligibility Amount')
exit_and_return = fields.Selection([('yes', 'Yes'), ('no', 'No')], string='Exit and Return', default='no')
exit_and_return_amount = fields.Float('Exit and Return Amount', default=200)
air_ticket_eligible = fields.Selection([('yes', 'Yes'), ('no', 'No')],
string='Air Ticket Eligible', default='no')
annual_leave = fields.Selection([('yes', 'Yes'), ('no', 'No')], string='Annual Leave', default="no")
annual_leave_days = fields.Float(string='Annual Leave In Days')
transport_allowance_type = fields.Selection(
[('none', 'None'), ('perc', 'Percentage'), ('num', 'Number'), ('company', 'By Company')],
string='Transportation Allowance Type', default='none')
transport_allowance = fields.Float('Transportation Allowance')
transport_allowance_temp = fields.Float(string='Transportation Allowance', compute='_get_amount')
field_allowance_type = fields.Selection(
[('none', 'None'), ('perc', 'Percentage'), ('num', 'Number'), ('company', 'By Company')],
string='Field Allowance Type', default='none')
field_allowance = fields.Float('Field Allowance')
field_allowance_temp = fields.Float(string='Field Allowance', compute='_get_amount')
special_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Special Allowance Type', default='none')
special_allowance = fields.Float('Special Allowance')
special_allowance_temp = fields.Float('Special Allowance', compute='_get_amount')
other_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Other Allowances Type', default='none')
other_allowance = fields.Float('Other Allowances')
other_allowance_temp = fields.Float('Other Allowances', compute='_get_amount')
travel_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Travel Allowance Type', default='none')
travel_allowance = fields.Float('Travel Allowance')
travel_allowance_temp = fields.Float('Travel Allowance', compute='_get_amount')
education_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Education Allowance Type', default='none')
education_allowance = fields.Float('Education Allowance')
education_allowance_temp = fields.Float('Education Allowance', compute='_get_amount')
food_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Food Allowance Type', default='none')
food_allowance2 = fields.Float('Food Allowance')
food_allowance2_temp = fields.Float('Food Allowance', compute='_get_amount')
security_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Security Allowance Type', default='none')
security_allowance = fields.Float('Security Allowance')
security_allowance_temp = fields.Float('Security Allowance', compute='_get_amount')
communication_allowance_type = fields.Selection(
[('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Communication Allowance Type', default='none')
communication_allowance = fields.Float('Communication Allowance')
communication_allowance_temp = fields.Float('Communication Allowance', compute='_get_amount')
retire_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Retire Allowance Type', default='none')
retire_allowance = fields.Float('Retirement Allowance')
infect_allowance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Infection Allowance Type', default='none')
infect_allowance = fields.Float('Infection Allowance')
supervision_allowance_type = fields.Selection(
[('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Supervision Allowance Type', default='none')
supervision_allowance = fields.Float('Supervision Allowance')
insurance_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Insurance Type', default='none')
insurance = fields.Float('Insurance')
other_deduction_type = fields.Selection([('none', 'None'), ('perc', 'Percentage'), ('num', 'Number')],
string='Other Deductions Type', default='none')
other_deduction = fields.Float('Other Deductions')
gosi_deduction = fields.Float(compute="_calculate_gosi", string='Gosi (Employee Percentage)')
gosi_employer_deduction = fields.Float(compute="_calculate_gosi", string='Gosi (Employer Percentage)')
total_gosi = fields.Float(compute="_calculate_gosi", string='Total')
is_gosi_deducted = fields.Selection([('yes', 'Yes'), ('no', 'No')], default='yes')
blood_type = fields.Selection(
[('O-', 'O'), ('O+', 'O+'), ('A-', 'A'), ('A+', 'A+'), ('B-', 'B'), ('B+', 'B+'), ('AB-', 'AB'),
('AB+', 'AB+')], 'Blood Type')
religion = fields.Selection([('muslim', 'Muslim'), ('christian', 'Christian'), ('other', 'Other')],
string='Religion')
gender = fields.Selection([('male', 'Male'), ('female', 'Female')],
string='Gender')
birth_place = fields.Char('Birth Place')
point_of_hire = fields.Char('Point of hire')
city = fields.Char('City Hired From')
country = fields.Char('Country Hired From')
contact_address = fields.Char('Contact address', size=512)
date_of_birth = fields.Date('Date Of Birth')
marital = fields.Selection(
[('single', 'Single'), ('married', 'Married'), ('widower', 'Widower'), ('divorced', 'Divorced')],
string='Marital Status', default='single')
mobile_no = fields.Char('Mobile No')
p_o_box_no = fields.Char('P. O. Box')
zip_code = fields.Char('Zip Code')
saudi_id_iqama = fields.Char('Saudi ID / Identity No.')
saudi_id_iqama_date = fields.Date('Saudi ID / Identity Issue Date')
saudi_id_iqama_expiry = fields.Date('Saudi ID / Identity Expiry Date')
passport_number = fields.Char('Passport number')
passport_issue_date = fields.Date('Passport Issue Date')
passport_expiry_date = fields.Date('Passport Expiry Date')
passport_issue_place = fields.Char('Passport Issue Place')
saudi_com_number = fields.Char('Saudi Commission Number')
saudi_com_date = fields.Date('Saudi Commission Issue Date')
saudi_com_expiry_date = fields.Date('Saudi Commission Expiry Date')
bls_date = fields.Date('BLS Date')
acls_date = fields.Date('ACLS Date')
insurance_date = fields.Date('Insurance Date')
specialty = fields.Char('Specialty')
category = fields.Char('Category')
effective_from = fields.Date('Effective From')
to_contact = fields.Text('To contact in case of Emergency')
emp_type = fields.Selection([('saudi', 'Holiday1'),
('other', 'Holiday2'),
('displaced', 'Holiday3'),
('external', 'Holiday4'),
('external2', 'Other')], string='Annual Leave Entitlement', tracking=True)
appraisal = fields.Boolean('Appraisal')
re_contract = fields.Boolean('re contract')
contract_draft = fields.Boolean('Contract Draft')
breakdown_allowance = fields.Float(compute="_cal_allowance", string='Breakdown Allowance')
car_allowance = fields.Float('Car Allowance')
ticket_allowance = fields.Float('Ticket Allowance')
medical_ins_allowance = fields.Float('Medical Insurance Allowance')
medical_ins_issue_date = fields.Date('Medical Insurance Issue Date')
medical_ins_exp_date = fields.Date('Medical Insurance Expiry Date')
join_date = fields.Date('Join Date')
driving_lic_issue_date = fields.Date('Driving License Issue Date')
driving_lic_exp_date = fields.Date('Driving License Expiry Date')
driving_lic_issue_place = fields.Char('Driving License Issue Place')
# Work permit fields
visa_no = fields.Char('Visa Number')
visa_expire = fields.Date('Visa Expiry Date')
permit_no = fields.Char('Work Permit Number')
dependants_ticket_amount = fields.Float(string='Dependants Ticket Amount', compute='_get_dependants_ticket_amount')
air_ticket_amount = fields.Float(string='Air Ticket Amount')
air_ticket_number = fields.Integer(string='Air Ticket No.')
total_air_ticket_amount = fields.Float(string='Total Air Ticket Amount', compute='_get_total_ticket_amount')
trial_duration = fields.Float(string='Trail Duration', compute='_compute_contract_duration')
contract_duration_cal = fields.Float(string='Contract Duration', compute='_compute_contract_duration')
# Relational fields
job_id = fields.Many2one(related="employee_id.job_id", readonly=True, tracking=True)
working_hours = fields.Many2one(related='employee_id.resource_calendar_id')
analytic_account_id = fields.Many2one(comodel_name='account.analytic.account')
journal_id = fields.Many2one(comodel_name='account.journal')
vac_des = fields.Many2one(comodel_name='hr.vacation.dest', string='Vacation Destination')
employee_dependent_ids = fields.One2many(comodel_name='hr.employee.dependent', inverse_name='contract_id')
employee_dependant = fields.One2many('hr.employee.dependent', 'contract_id', 'Employee Dependants')
children_allowance = fields.One2many('hr.children.allowance', 'contract_id', 'Children Allowance')
nationality = fields.Many2one('res.country', related='employee_id.country_id', readonly=True)
type_id = fields.Many2one(related='employee_id.employee_type_id', string="Contractor Type", tracking=True)
contractor_type = fields.Many2one(related='employee_id.employee_type_id', string="Contractor Type", required=False, tracking=True, store=True)
employee_id = fields.Many2one('hr.employee')
department_id = fields.Many2one('hr.department', 'Department Name', related='employee_id.department_id',
readonly=True)
hiring_date = fields.Date(related='employee_id.first_hiring_date', string="Hiring Date", readonly=True)
all_exper_year = fields.Integer(compute='_compute_all_experience', store=True)
all_exper_month = fields.Integer(compute='_compute_all_experience', store=True)
all_exper_day = fields.Integer(compute='_compute_all_experience', store=True)
previous_contract_id = fields.Many2one('hr.contract', store=True, string='Previous Contract',
help='The Previous Contract Of The Employee')
######################### consultant #####################new /:19/10
consultants = fields.Boolean(default=False)
consultant_salary = fields.Float(string='Consultant Salary')
consultant_hour = fields.Float(string='Consultant Hour')
max_consultant_hour = fields.Float(string='Max Consultant Hour')
salary_status = fields.Selection([('in', 'IN'), ('out', 'OUT')],
string='Salary Status')
recruited_talent = fields.Selection([('billable', 'Billable'), ('un_billable', 'Un Billable')],
string='Recruited Talent')
class_contract = fields.Selection([('employees', 'Employees'), ('collect_money', 'Collect Money'),
('endowments', 'Endowments'),('researchers', 'Researchers')],
string='Classification Contracts', tracking=True)
period_ticket = fields.Integer()
dependant_count = fields.Integer(compute='_get_employee_dependant_count', store=True)
has_transportation = fields.Boolean(string='Has Transportation?', default=True)
has_housing = fields.Boolean(string='Has Housing?', default=True)
check_nationality = fields.Boolean(related='employee_id.check_nationality', store=True, string="Saudi?")
last_salary_gosi = fields.Float(string='Last Salary Gosi', help='The Last Salary Gosi After The Age 50 Years.')
def _get_employee_dependant_count(self):
for rec in self:
rec.dependant_count = len(
self.env['hr.employee.dependent'].search([('contract_id', '=', rec.id)]))
@api.depends('employee_id')
def _compute_all_experience(self):
for item in self:
if item.employee_id:
item.all_exper_year = item.employee_id.experience_year + item.employee_id.service_year
item.all_exper_month = item.employee_id.experience_month + item.employee_id.service_month
item.all_exper_day = item.employee_id.experience_day + item.employee_id.service_day
if item.all_exper_month > 11:
item.all_exper_year = item.all_exper_year + 1
item.all_exper_month = item.all_exper_month - 12
if item.all_exper_day > 30:
item.all_exper_month = item.all_exper_month + 1
item.all_exper_day = item.all_exper_day - 30
@api.onchange('contractor_type')
def onchange_contractor_type(self):
if self.contractor_type:
self.type_id = self.contractor_type
self.consultants = self.contractor_type.consultants
self.employee_id.employee_type_id = self.contractor_type
@api.onchange('date_start', 'hiring_date')
def get_trial_date_field(self):
for rec in self:
# rec.trial_date_start = False
# rec.trial_date_end = False
if rec.hiring_date and rec.date_start:
date_start = datetime.datetime.strptime(str(rec.hiring_date), '%Y-%m-%d')
rec.trial_date_start = rec.hiring_date
rec.trial_date_end = date_start + relativedelta.relativedelta(months=3)
elif rec.date_start and not rec.hiring_date:
date_start = datetime.datetime.strptime(str(rec.date_start), '%Y-%m-%d')
rec.trial_date_start = rec.date_start
rec.trial_date_end = date_start + relativedelta.relativedelta(months=3)
@api.onchange('employee_id')
def _emp_type_employee(self):
for item in self:
previous_contract = self.search([('employee_id', '=', item.employee_id.id),
('active', '=', True), ], limit=1)
if previous_contract:
raise UserError(_('Sorry, Can Not Create More than One contract for an Employeet %s') %
item.employee_id.name)
if item.employee_id:
#if item.employee_id.check_nationality:
# item.emp_type = 'saudi'
#else:
# item.emp_type = 'other'
if item.employee_id.marital == 'single':
item.contract_status = 'single'
else:
item.contract_status = 'marriage'
item.job_id = item.employee_id.job_id
item.department_id = item.employee_id.department_id
item.employee_code = item.employee_id.employee_code
item.fn = item.employee_id.fn
item.mn = item.employee_id.mn
item.ln = item.employee_id.ln
item.dn = item.employee_id.name
'''@api.onchange('emp_type')
def chick_saudi_percentage(self):
for item in self:
Saudization_percen = item.env.user.company_id.saudi_percentage
if Saudization_percen > 0:
saudi = len(item.search([('active', '=', True), ('emp_type', 'in', ('saudi', 'displaced')),
('state', '=', 'program_directory')]).ids)
all_emp = len(item.search([('active', '=', True), ('state', '!=', 'end_contract')]).ids) + 1
saudi_percen = (saudi / all_emp) * 100
if saudi_percen > Saudization_percen and item.emp_type in ('saudi', 'displaced'):
raise UserError(
_('The Saudization percentage should not exceed Percentage %s') % Saudization_percen)
none_saudi = len(item.search(
[('active', '=', True), ('emp_type', '=', 'other'), ('state', '=', 'program_directory')]).ids)
none_Saudization_percen = (100 - Saudization_percen)
none_percen = (none_saudi / all_emp) * 100
if none_percen > none_Saudization_percen and item.emp_type == 'other':
raise UserError(
_('The None Saudization percentage should not exceed Percentage %s') % none_Saudization_percen)'''
def change_current_date_hijri(self, date):
date = datetime.datetime.strptime(str(date), '%Y-%m-%d')
year = date.year
day = date.day
month = date.month
hijri_date = convert.Gregorian(year, month, day).to_hijri()
return hijri_date
def translate_to_eng(self, text):
if text:
eng_text = text
ln = translator.detect(text)
if ln.lang != 'en':
eng_text = translator.translate(text, dest='en')
return eng_text
else:
return ' '
###############>>send email end contract and trial peroid<<<##########
@api.model
def contract_mail_reminder(self):
now = dt.now() + timedelta(days=1)
date_now = now.date()
match = self.search([('state', '!=', 'end_contract'),
('contract_duration', 'not in',( '3_months','6_months'))])
# trial_days_send_email=5
cont_end_reminder = self.env.user.company_id.contract_end_reminder
cont_trial_reminder = self.env.user.company_id.contract_trial_reminder
for i in match:
if i.date_end:
exp_date = fields.Date.from_string(i.date_end) - timedelta(days=cont_end_reminder)
if date_now >= exp_date:
self.env.ref('hr_contract_custom.email_template_contract_period_expiration_reminder', False).send_mail(i.id)
if i.trial_date_end:
exp_date = fields.Date.from_string(i.trial_date_end)
exp_date1 = fields.Date.from_string(i.trial_date_end) - timedelta(days=cont_trial_reminder)
# if date_now >= exp_date :
if exp_date >= date_now and date_now >= exp_date1:
self.env.ref('hr_contract_custom.email_template_contract_trial_period_expiration_reminder', False).send_mail(i.id)
##########################################################################
@api.onchange('contract_duration', 'date_start')
def get_contract_end_date(self):
if self.date_start and self.contract_description == 'locum':
date_start = datetime.datetime.strptime(str(self.date_start), '%Y-%m-%d')
if self.contract_duration == '3_months':
self.date_end = date_start + relativedelta.relativedelta(months=3) - timedelta(days=1)
elif self.contract_duration == '6_months':
self.date_end = date_start + relativedelta.relativedelta(months=6) - timedelta(days=1)
elif self.contract_duration == '9_months':
self.date_end = date_start + relativedelta.relativedelta(months=9) - timedelta(days=1)
elif self.contract_duration == '12_months':
self.date_end = date_start + relativedelta.relativedelta(months=12) - timedelta(days=1)
elif self.contract_duration == '24_months':
self.date_end = date_start + relativedelta.relativedelta(months=24) - timedelta(days=1)
elif self.contract_duration == '36_months':
self.date_end = date_start + relativedelta.relativedelta(months=36) - timedelta(days=1)
else:
self.date_end = False
# get salary amount form salary degree
@api.onchange('salary_degree')
def onchange_salary_degree(self):
if self.salary_degree:
self.salary = self.salary_degree.base_salary
# Get Salary Insurnce from Salary amount
@api.onchange('salary')
def onchange_base_salary_insurance(self):
if self.salary:
self.salary_insurnce = self.salary
# update to control on date constrains
@api.onchange('trial_date_start', 'trial_date_end', 'date_start', 'date_end')
def onchange_dates(self):
if self.trial_date_start:
if self.trial_date_end:
if self.date_start:
if self.date_end:
start_date_1 = dt.strptime(str(self.date_start), "%Y-%m-%d")
end_date_1 = dt.strptime(str(self.date_end), "%Y-%m-%d")
trial_start_date_1 = dt.strptime(str(self.trial_date_start), "%Y-%m-%d")
trial_end_date_1 = dt.strptime(str(self.trial_date_end), "%Y-%m-%d")
if trial_end_date_1 < trial_start_date_1:
raise UserError(_('trial End Date must be greater than Trial Start date'))
if end_date_1 < start_date_1:
raise UserError(_('End date must be greater than Start date'))
@api.onchange('contract_description')
def _contract_duration_change_state(self):
if self.contract_description == 'permanent':
self.contract_duration = 'none'
self.date_end = ''
@api.depends('wage', 'house_allowance', 'transport_allowance', 'communication_allowance')
def _compute_monthly_salary(self):
for rec in self:
rec.monthly_salary = rec.wage + rec.house_allowance_temp + rec.transport_allowance_temp + \
rec.communication_allowance_temp + rec.field_allowance_temp + \
rec.special_allowance_temp + rec.other_allowance_temp
@api.depends()
def _cal_allowance(self):
allowance = 0.0
if self.employee_id.country_id.code == 'SA':
allowance = self.salary * 1 / 100
self.breakdown_allowance = allowance
@api.depends()
def _calculate_gosi(self):
saudi_gosi = self.env.user.company_id.saudi_gosi
company_gosi = self.env.user.company_id.company_gosi
none_saudi_gosi = self.env.user.company_id.none_saudi_gosi
max_saudi_gosi = self.env.user.company_id.max_amount_saudi_gosi
max_company_gosi = self.env.user.company_id.max_amount_company_gosi
Sanad_saudi_gosi = self.env.user.company_id.Sanad_saudi_gosi
Sanad_company_gosi = self.env.user.company_id.Sanad_company_gosi
for record in self:
#if (record.emp_type == 'saudi' or record.emp_type == 'displaced') and record.is_gosi_deducted == "yes":
record.employee_id._compute_employee_age()
sanad_age = record.salary_scale.retirement_age
emp_age = record.employee_id.employee_age
if record.check_nationality==True and record.is_gosi_deducted == "yes":
if emp_age >= sanad_age and sanad_age > 0 :
employee_gosi = (record.salary_insurnce + record.house_allowance_temp) * (saudi_gosi - Sanad_saudi_gosi) / 100
employer_gosi = (record.salary_insurnce + record.house_allowance_temp) * (company_gosi - Sanad_company_gosi)/ 100
else:
employee_gosi = (record.salary_insurnce + record.house_allowance_temp) * saudi_gosi / 100
employer_gosi = (record.salary_insurnce + record.house_allowance_temp) * company_gosi / 100
if employee_gosi <= max_saudi_gosi:
record.gosi_deduction = employee_gosi
else:
record.gosi_deduction = max_saudi_gosi
if employer_gosi <= max_company_gosi:
record.gosi_employer_deduction = employer_gosi
else:
record.gosi_employer_deduction = max_company_gosi
record.total_gosi = record.gosi_deduction + record.gosi_employer_deduction
#elif (record.emp_type == 'saudi' or record.emp_type == 'displaced') and record.is_gosi_deducted == "no":
elif record.check_nationality==True and record.is_gosi_deducted == "no":
if emp_age >= sanad_age and sanad_age > 0 :
employee_gosi = (record.salary_insurnce + record.house_allowance_temp) * (saudi_gosi - Sanad_saudi_gosi) / 100
employer_gosi = (record.salary_insurnce + record.house_allowance_temp) * (company_gosi - Sanad_company_gosi) / 100
else:
employee_gosi = (record.salary_insurnce + record.house_allowance_temp) * saudi_gosi / 100
employer_gosi = (record.salary_insurnce + record.house_allowance_temp) * company_gosi / 100
if employee_gosi <= max_saudi_gosi:
employee_gosi = employee_gosi
else:
employee_gosi = max_saudi_gosi
if employer_gosi <= max_company_gosi:
employer_gosi = employer_gosi
else:
employer_gosi = max_company_gosi
record.gosi_deduction = 0.0
record.gosi_employer_deduction = employee_gosi + employer_gosi
record.total_gosi = employee_gosi + employer_gosi
else:
# pass
employer_gosi = (record.salary_insurnce + record.house_allowance_temp) * none_saudi_gosi / 100
record.gosi_deduction = 0.0
record.gosi_employer_deduction = employer_gosi
record.total_gosi = employer_gosi
#if (record.emp_type == 'saudi' or record.emp_type == 'displaced') and record.saudi_emp_type == 'saudi-non':
if record.check_nationality==True and record.saudi_emp_type == 'saudi-non':
record.gosi_deduction = 0.0
record.gosi_employer_deduction = 0.0
record.total_gosi = 0.0
@api.depends('date_start', 'date_end', 'trial_date_start', 'trial_date_end')
def _compute_contract_duration(self):
for item in self:
item.contract_duration_cal = 0
item.trial_duration = 0
if item.date_start and item.date_end:
date_start = datetime.datetime.strptime(str(item.date_start), '%Y-%m-%d').date()
date_end = datetime.datetime.strptime(str(item.date_end), '%Y-%m-%d').date()
item.contract_duration_cal = relativedelta.relativedelta(date_end, date_start).years
if item.trial_date_start and item.trial_date_end:
date_start = datetime.datetime.strptime(str(item.trial_date_start), '%Y-%m-%d').date()
date_end = datetime.datetime.strptime(str(item.trial_date_end), '%Y-%m-%d').date()
item.trial_duration = relativedelta.relativedelta(date_end, date_start).months
if item.trial_duration > 6:
raise UserError(_('The period of trail duration must be not more than 6 months'))
'''@api.onchange('date_start')
def _compute_trial_period(self):
if self.date_start and self.date_end:
date_start = datetime.datetime.strptime(str(self.date_start), '%Y-%m-%d').date()
self.trial_date_start = self.date_start
self.trial_date_end = date_start + relativedelta.relativedelta(months=3) - timedelta(days=1)'''
@api.depends('air_ticket_amount')
def _get_total_ticket_amount(self):
self.total_air_ticket_amount = self.air_ticket_amount * self.air_ticket_number
@api.onchange('employee_id')
def _onchange_employee_id(self):
if self.employee_id:
self.job_id = self.employee_id.job_id
self.department_id = self.employee_id.department_id
self.employee_code = self.employee_id.employee_code
self.fn = self.employee_id.fn
self.mn = self.employee_id.mn
self.ln = self.employee_id.ln
self.dn = self.employee_id.name
@api.model_create_multi
def create(self, vals_list):
contracts = super(Contract, self).create(vals_list)
for contract in contracts:
contract.employee_id.contract_id = contract.id
return contracts
def draft_state(self):
self.state = "draft"
def employeed_aproval(self):
#self.chick_saudi_percentage()
self.state = "employeed_aproval"
def hr_head_approval(self):
#self.chick_saudi_percentage()
self.state = "hr_head_approval"
def end_contract_state(self):
if self.date_end == False:
raise UserError(_('The contract End Date Must Be Entered'))
else:
self.state = "end_contract"
def program_directory(self):
#self.chick_saudi_percentage()
self.employee_id.contract_id = self.id
hiring_date = self.employee_id.first_hiring_date
effective = self.env['employee.effective.form'].search([('contract_id', '=', self.id)])
if not effective and not hiring_date:
self.env['employee.effective.form'].create({
'employee_id': self.employee_id.id,
'contract_id': self.id,
'department_id': self.department_id.id,
'contract_start': self.date_start,
'effective_form_date': self.date_start,
'state': 'draft'})
self.state = "program_directory"
def unlink(self):
for i in self:
if i.state != 'draft':
raise UserError(_('You can not delete record in state not in draft'))
# if i.hiring_date:
# raise UserError(_('You can not delete record has Hiring date'))
return super(Contract, self).unlink()
@api.onchange('working_hours')
def _onchange_working_hours(self):
if self.employee_id.contract_id.id == self._origin.id:
self.env['resource.resource'].browse([self.employee_id.resource_id.id]).write(
{'calendar_id': self.working_hours.id})
# Smart Button to access effective form
def action_view_effective_frm(self):
effective_id = self.env['employee.effective.form'].search([('employee_id', '=', self.employee_id.id)])
return {
'name': _('Employee Effective Form'),
'domain': [('id', '=', effective_id.id)],
'view_mode': 'list,form',
'res_model': 'employee.effective.form',
'view_id': False,
'type': 'ir.actions.act_window',
}
class VacationDest(models.Model):
_name = 'hr.vacation.dest'
_rec_name = 'name'
name = fields.Char(required=True)
class EmployeeChildAllowance(models.Model):
_name = 'hr.children.allowance'
name = fields.Char('Children Name')
age = fields.Integer('Age')
fees = fields.Float('Educational Fees')
remarks = fields.Text('Remarks')
# Relational fields
contract_id = fields.Many2one('hr.contract', 'Contract')
class ContractType(models.Model):
_name = "hr.contract.type"
_description = "Contract Type"
_order = "sequence, id"
name = fields.Char(string="Contract Type", required=True)
sequence = fields.Integer(help="Gives the sequence when displaying a list of Contract.", default=10)
salary_type = fields.Selection([
("amount", "Amount"),
("scale", "Scale")
], string="Salary Type")
code = fields.Char(string='Code')
consultants = fields.Boolean(default=False, string='Consultants')
country_id = fields.Many2one('res.country', string='Country')
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company)