trytonpsk-staff_payroll_co/employee.py

212 lines
8.1 KiB
Python
Raw Normal View History

2020-04-16 00:38:42 +02:00
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.model import fields
from trytond.pool import PoolMeta
__all__ = ['Employee']
class Employee:
__metaclass__ = PoolMeta
__name__ = 'company.employee'
party_health = fields.Function(fields.Many2One('party.party', 'Party Health'),
'get_party_concept')
party_retirement = fields.Function(fields.Many2One('party.party', 'Party Retirement'),
'get_party_concept')
party_risk = fields.Function(fields.Many2One('party.party', 'Party Risk'),
'get_party_concept')
party_box_family = fields.Function(fields.Many2One('party.party', 'Party Box Family'),
'get_party_concept')
party_bank = fields.Function(fields.Many2One('party.party', 'Party Bank'),
'get_party_bank')
@classmethod
def __setup__(cls):
super(Employee, cls).__setup__()
@classmethod
def import_data(cls, fields_names, data):
pool = Pool()
Contract = pool.get('staff.contract')
Position = pool.get('staff.position')
Party = pool.get('party.party')
Department = pool.get('company.department')
Category = pool.get('staff.employee_category')
WageType = pool.get('staff.wage_type')
AnalyticAccount = pool.get('analytic_account.account')
MandatoryWage = pool.get('staff.payroll.mandatory_wage')
cont = 0
def compute_date(date_str):
format_str = '%d/%m/%Y' # The format
datetime_obj = datetime.strptime(date_str, format_str)
return datetime_obj.date()
def _create_party(class_, id_number):
parties = class_.create([{
'name': 'pendiente',
'id_number': id_number,
}])
return parties
for row in data[1:]:
parties = Party.search([('id_number', '=', row[0])])
if not parties:
names_ = row[1].split(' ')
fn, sn, ffn, sfn = '', '', '', ''
if len(names_) > 3:
fn = names_[0]
sn = names_[1]
ffn = names_[2]
sfn = names_[3]
elif len(names_) == 3:
fn = names_[0]
ffn = names_[1]
sfn = names_[2]
elif len(names_) == 2:
fn = names_[0]
ffn = names_[1]
create_party = {
'name': row[1],
'first_name': fn,
'second_name': sn,
'first_family_name': ffn,
'second_family_name': sfn,
'id_number': row[0],
'type_document': '13',
'addresses': [('create', [{
'street': row[3],
}])],
'contact_mechanisms': [
('create', [
{'type': 'mobile', 'value': row[2]},
])
]
}
party, = Party.create([create_party])
else:
party = parties[0]
departments = Department.search([('name', 'ilike', row[7])])
categories = Category.search([('name', 'ilike', row[5])])
employees = cls.search([('party', '=', party.id)])
if employees:
employee = employees[0]
else:
employee, = cls.create([{
'party': party.id,
'contracting_state': 'active',
'department': departments[0].id if departments else None,
'category': categories[0].id if categories else None,
}])
values_mand_wage = []
if employee.category and employee.category.wages_default:
current_wages_ids = [m.wage_type.id
for m in employee.mandatory_wages]
accounts = AnalyticAccount.search([
('name', 'ilike', row[8]),
])
mandatory_wages = {
'1': 'ARL CLASE I OPERATIVO',
'2': 'ARL CLASE II OPERATIVO',
'3': 'ARL CLASE III OPERATIVO',
'4': 'ARL CLASE IV OPERATIVO',
'5': 'ARL CLASE V OPERATIVO',
}
key_mw = str(row[19])
if key_mw:
wages = WageType.search([
('name', 'ilike', mandatory_wages[key_mw])
])
if wages:
wage_id = wages[0].id
parties = Party.search([('id_number', '=', row[18])])
if not parties and row[18]:
parties = _create_party(Party, row[18])
values_mand_wage.append({
'employee': employee.id,
'defect_amount': 0,
'party': parties[0].id,
'wage_type': wage_id,
'analytic_account': accounts[0].id if accounts else None,
})
for wage in employee.category.wages_default:
parties = []
party_id = None
if wage.type_concept == 'health':
parties = Party.search([('id_number', '=', row[15])])
if not parties and row[15]:
parties = _create_party(Party, row[15])
elif wage.type_concept == 'retirement':
parties = Party.search([('id_number', '=', row[16])])
if not parties and row[16]:
parties = _create_party(Party, row[16])
elif wage.type_concept == 'box_family':
parties = Party.search([('id_number', '=', row[17])])
if not parties and row[17]:
parties = _create_party(Party, row[17])
if parties:
party_id = parties[0].id
if wage.name == 'BONIFICACIONES OPERATIVO':
defect_amount = row[14]
else:
defect_amount = None
values_mand_wage.append({
'employee': employee.id,
'defect_amount': defect_amount,
'party': party_id,
'wage_type': wage.id,
'analytic_account': accounts[0].id if accounts else None,
})
MandatoryWage.create(values_mand_wage)
positions = Position.search([('name', 'ilike', row[4])])
if not positions:
positions = Position.create([{
'name': row[4],
}])
contracts = Contract.search([('employee', '=', employee.id)])
if not contracts:
start_date_contract = row[9] or '01/01/1000'
end_date_contract = row[10] or '01/01/1000'
contract, = Contract.create([{
'employee': employee.id,
'position': positions[0].id,
'salary': int(row[12]),
'transport_bonus': int(row[13]),
'kind': 'job',
'contract_date': compute_date(start_date_contract),
'start_date': compute_date(start_date_contract),
'end_date': compute_date(end_date_contract),
'state': 'draft',
}])
Contract.active([contract])
cont += 1
return cont
def get_party_concept(self, name=None):
res = None
name = name[6:]
for mw in self.mandatory_wages:
if mw.party and mw.wage_type.type_concept == name:
res = mw.party.id
break
return res
def get_party_bank(self, name=None):
return None