100 lines
3.7 KiB
Python
100 lines
3.7 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, ModelSQL, ModelView
|
|
from trytond.pool import PoolMeta, Pool
|
|
from trytond.transaction import Transaction
|
|
from trytond.wizard import Wizard, StateTransition
|
|
from trytond.i18n import gettext
|
|
from .exceptions import (MissingPartyWageType)
|
|
|
|
|
|
class Employee(metaclass=PoolMeta):
|
|
__name__ = 'company.employee'
|
|
category = fields.Many2One('staff.employee_category', 'Category')
|
|
mandatory_wages = fields.One2Many('staff.payroll.mandatory_wage',
|
|
'employee', 'Mandatory Wage')
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(Employee, cls).__setup__()
|
|
|
|
def get_fix_amount_wage_type(self, wage_id):
|
|
fix_amount = sum([w.fix_amount or 0 for w in self.mandatory_wages if w.wage_type.id == wage_id])
|
|
return fix_amount
|
|
|
|
def get_last_date_futhermore(self):
|
|
if self.contract and self.contract.futhermores:
|
|
values = [f.end_date for f in self.contract.futhermores if f.end_date and f.state != 'draft']
|
|
last_date_futhermore = max(values) if values else None
|
|
if last_date_futhermore:
|
|
return last_date_futhermore
|
|
else:
|
|
return self.contract.end_date or None
|
|
|
|
@classmethod
|
|
def create_mandatory_wages(cls, employees_ids):
|
|
MandatoryWage = Pool().get('staff.payroll.mandatory_wage')
|
|
employees = cls.browse(employees_ids)
|
|
values = []
|
|
for employee in employees:
|
|
if employee.category and employee.category.wages_default:
|
|
current_wages_ids = [m.wage_type.id
|
|
for m in employee.mandatory_wages]
|
|
for wage in employee.category.wages_default:
|
|
if wage.id in current_wages_ids:
|
|
continue
|
|
val = {
|
|
'employee': employee.id,
|
|
'wage_type': wage.id,
|
|
}
|
|
values.append(val)
|
|
if values:
|
|
MandatoryWage.create(values)
|
|
|
|
|
|
class MandatoryWage(ModelSQL, ModelView):
|
|
"Mandatory Wage"
|
|
__name__ = 'staff.payroll.mandatory_wage'
|
|
employee = fields.Many2One('company.employee', 'Employee')
|
|
wage_type = fields.Many2One('staff.wage_type', 'Wage Type',
|
|
required=True, domain=[('active', '=', True)])
|
|
party = fields.Many2One('party.party', 'Party',
|
|
domain=[('active', '=', True)],)
|
|
fix_amount = fields.Numeric('Fix Amount')
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(MandatoryWage, cls).__setup__()
|
|
cls._order.insert(0, ('id', 'ASC'))
|
|
|
|
@classmethod
|
|
def validate(cls, mandatoryWages):
|
|
for wage in mandatoryWages:
|
|
wage.check_partys()
|
|
|
|
def check_partys(self):
|
|
pool = Pool()
|
|
Wage = pool.get('staff.wage_type')
|
|
if self.wage_type:
|
|
wages = Wage.search([
|
|
('id', '=', self.wage_type.id),
|
|
])
|
|
if wages:
|
|
for wage in wages:
|
|
if wage.party_required and not self.party:
|
|
raise MissingPartyWageType(
|
|
gettext('staff_payroll.msg_party_required', wage=wage.name))
|
|
|
|
|
|
class CreateMandatoryWages(Wizard):
|
|
'Create Mandatory Wages'
|
|
__name__ = 'staff.payroll.create_mandatory_wages'
|
|
start_state = 'create_wages'
|
|
create_wages = StateTransition()
|
|
|
|
def transition_create_wages(self):
|
|
Employee = Pool().get('company.employee')
|
|
employees_ids = Transaction().context['active_ids']
|
|
Employee.create_mandatory_wages(employees_ids)
|
|
return 'end'
|