134 lines
7.2 KiB
Python
134 lines
7.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
import logging
|
|
from random import randint
|
|
|
|
from odoo import fields
|
|
from odoo.fields import Datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def _generate_payslips(env):
|
|
# Do this only when demo data is activated
|
|
if env.ref('base.demo_company_be', raise_if_not_found=False):
|
|
if not env['hr.payslip'].sudo().search_count([('employee_id.name', '=', 'Marian Weaver')]):
|
|
_logger.info('Generating payslips')
|
|
joseph = env.ref('test_l10n_be_hr_payroll_account.hr_employee_joseph_noluck', raise_if_not_found=False)
|
|
if not joseph:
|
|
return
|
|
employees = env['hr.employee'].search([
|
|
('company_id', '=', env.ref('base.demo_company_be').id),
|
|
('id', '!=', joseph.id),
|
|
])
|
|
# Everyone was on training 1 week
|
|
leaves = env['hr.leave']
|
|
training_type = env.ref('test_l10n_be_hr_payroll_account.l10n_be_leave_type_training')
|
|
for employee in employees:
|
|
training_leave = env['hr.leave'].new({
|
|
'name': 'Whole Company Training',
|
|
'employee_id': employee.id,
|
|
'holiday_status_id': training_type.id,
|
|
'request_date_from': fields.Date.today() + relativedelta(day=1, month=1, years=-1),
|
|
'request_date_to': fields.Date.today() + relativedelta(day=7, month=1, years=-1),
|
|
'request_hour_from': 7,
|
|
'request_hour_to': 18,
|
|
'number_of_days': 5,
|
|
})
|
|
training_leave._compute_date_from_to()
|
|
leaves |= env['hr.leave'].create(training_leave._convert_to_write(training_leave._cache))
|
|
env['hr.leave'].search([]).write({'payslip_state': 'done'}) # done or normal : to check!!!
|
|
|
|
cids = env.ref('base.demo_company_be').ids
|
|
payslip_runs = env['hr.payslip.run']
|
|
payslis_values = []
|
|
for i in range(2, 20):
|
|
date_start = Datetime.today() - relativedelta(months=i, day=1)
|
|
date_end = Datetime.today() - relativedelta(months=i, day=31)
|
|
payslis_values.append({
|
|
'name': date_start.strftime('%B %Y'),
|
|
'date_start': date_start,
|
|
'date_end': date_end,
|
|
'company_id': env.ref('base.demo_company_be').id,
|
|
'structure_id': env.ref('l10n_be_hr_payroll.hr_payroll_structure_cp200_employee_salary').id,
|
|
})
|
|
payslip_runs = env['hr.payslip.run'].create(payslis_values)
|
|
for payslip_run in payslip_runs:
|
|
payslip_run.generate_payslips(employee_ids=[employee.id for employee in employees])
|
|
_logger.info('Validating payslips')
|
|
# after many insertions in work_entries, table statistics may be broken.
|
|
# In this case, query plan may be randomly suboptimal leading to slow search
|
|
# Analyzing the table is fast, and will transform a potential ~30 seconds
|
|
# sql time for _mark_conflicting_work_entries into ~2 seconds
|
|
env.cr.execute('ANALYZE hr_work_entry')
|
|
payslip_runs.with_context(allowed_company_ids=cids).action_validate()
|
|
|
|
# Generate skills logs
|
|
employee_skills_vals = []
|
|
data_vals = []
|
|
today = fields.Date.today()
|
|
all_skills = env['hr.skill'].search([])
|
|
regular_skills = all_skills.filtered(lambda skill: not skill.skill_type_id.is_certification)
|
|
all_belgium_employees = env['hr.employee'].search([('company_id', '=', env.ref('base.demo_company_be').id)])
|
|
# To unlink expired one and expire no expired one
|
|
env['hr.employee.skill'].search([('employee_id.company_id', '=', env.ref('base.demo_company_be').id)]).unlink()
|
|
# To unlink new expired one
|
|
env['hr.employee.skill'].search([('employee_id.company_id', '=', env.ref('base.demo_company_be').id)]).unlink()
|
|
for employee in all_belgium_employees:
|
|
for skill in regular_skills:
|
|
if randint(0, 100) > 90:
|
|
array = skill.skill_type_id.skill_level_ids.sorted('level_progress')
|
|
max_level_index = len(array) - 1
|
|
level_index = 0
|
|
skills_vals = []
|
|
for index in range(6):
|
|
if randint(1, 5) == 1 and level_index < max_level_index:
|
|
level_index = level_index + 1
|
|
if skills_vals:
|
|
skills_vals[-1]['valid_to'] = today + relativedelta(months=(index - 6 - 1) * 6, day=1)
|
|
skills_vals.append({
|
|
'employee_id': employee.id,
|
|
'skill_id': skill.id,
|
|
'skill_type_id': skill.skill_type_id.id,
|
|
'skill_level_id': array[level_index].id,
|
|
'valid_from': today + relativedelta(months=(index - 6 - 1) * 6, day=2),
|
|
'valid_to': False
|
|
})
|
|
employee_skills_vals = employee_skills_vals + skills_vals
|
|
for skill in all_skills - regular_skills:
|
|
if randint(1, 4) == 1:
|
|
number_of_certification = randint(1, 3)
|
|
has_no_valid_to = randint(1, 4) == 1
|
|
array = skill.skill_type_id.skill_level_ids.sorted('level_progress')
|
|
max_level_index = len(array) - 1
|
|
level_index = 0
|
|
for index in range(number_of_certification):
|
|
employee_skills_vals.append({
|
|
'employee_id': employee.id,
|
|
'skill_id': skill.id,
|
|
'skill_type_id': skill.skill_type_id.id,
|
|
'skill_level_id': array[level_index].id,
|
|
'valid_from': today + relativedelta(months=(index - number_of_certification - 1) * 6 + 2),
|
|
'valid_to': False if number_of_certification - 1 == index and has_no_valid_to else today + relativedelta(months=(index - number_of_certification) * 6 + 2, days=-1)
|
|
})
|
|
if randint(1, 4) == 1:
|
|
level_index = min(max_level_index, level_index + 1)
|
|
employee_skills = env['hr.employee.skill'].create(employee_skills_vals)
|
|
prefix = 'test_l10n_be_hr_payroll_account'
|
|
for skill in employee_skills:
|
|
employee_id = skill.employee_id.id
|
|
skill_id = skill.skill_id.id
|
|
level_id = skill.skill_level_id.id
|
|
valid_from = skill.valid_from
|
|
valid_to = skill.valid_to
|
|
data_vals.append({
|
|
'name': f'{prefix}.skill_employee_{employee_id}_skill_{skill_id}_level_{level_id}_{valid_from}_{valid_to}',
|
|
'module': prefix,
|
|
'res_id': skill.id,
|
|
'model': 'hr.employee.skill',
|
|
'noupdate': True,
|
|
})
|
|
|
|
env['ir.model.data'].create(data_vals)
|