mirror of
https://bitbucket.org/presik/trytonpsk-staff_payroll_co.git
synced 2023-12-14 06:42:56 +01:00
212 lines
8.1 KiB
Python
212 lines
8.1 KiB
Python
|
#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
|