756 lines
38 KiB
Python
756 lines
38 KiB
Python
# -*- 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)
|
||
|