154 lines
5.4 KiB
Python
154 lines
5.4 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 decimal import Decimal
|
|
from datetime import date
|
|
|
|
from trytond.model import ModelView, fields
|
|
from trytond.wizard import Wizard, StateView, Button, StateTransition
|
|
from trytond.transaction import Transaction
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.exceptions import UserError
|
|
from trytond.i18n import gettext
|
|
from trytond.modules.staff_payroll.exceptions import MissingPartyWageType
|
|
|
|
|
|
_ZERO = Decimal('0.0')
|
|
|
|
class Move(metaclass=PoolMeta):
|
|
__name__ = 'account.move'
|
|
|
|
@classmethod
|
|
def _get_origin(cls):
|
|
return super(Move, cls)._get_origin() + ['staff.liquidation']
|
|
|
|
class SeverancePayClearingStart(ModelView):
|
|
'Severance Pay Clearing Start'
|
|
# Consolidacion de Cesantias
|
|
__name__ = 'staff_payroll.severance_pay_clearing.start'
|
|
company = fields.Many2One('company.company', 'Company', required=True)
|
|
journal = fields.Many2One('account.journal', 'Journal', required=True)
|
|
fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year',
|
|
required=True)
|
|
severance_pay = fields.Many2One('account.account',
|
|
'Severance Pay', domain=[
|
|
('type', '!=', None),
|
|
], required=True)
|
|
counterpart_account = fields.Many2One('account.account',
|
|
'Counterpart Account', domain=[
|
|
('type', '!=', None),
|
|
], required=True)
|
|
description = fields.Char('Description', required=True)
|
|
|
|
@staticmethod
|
|
def default_company():
|
|
return Transaction().context.get('company')
|
|
|
|
|
|
class SeverancePayClearing(Wizard):
|
|
'Severance Pay Clearing'
|
|
__name__ = 'staff_payroll.severance_pay_clearing'
|
|
start = StateView('staff_payroll.severance_pay_clearing.start',
|
|
'staff_payroll_co.severance_pay_clearing_start_view_form', [
|
|
Button('Cancel', 'end', 'tryton-cancel'),
|
|
Button('Ok', 'create_', 'tryton-print', default=True),
|
|
])
|
|
create_ = StateTransition()
|
|
done = StateView('staff_payroll.severance_pay_clearing.done',
|
|
'staff_payroll_co.severance_pay_clearing_done_view_form', [
|
|
Button('Done', 'end', 'tryton-ok', default=True),
|
|
])
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(SeverancePayClearing, cls).__setup__()
|
|
|
|
def default_done(self, fields):
|
|
return {'result': self.result}
|
|
|
|
def transition_create_(self):
|
|
pool = Pool()
|
|
MandatoryWage = pool.get('staff.payroll.mandatory_wage')
|
|
Move = pool.get('account.move')
|
|
MoveLine = pool.get('account.move.line')
|
|
Period = pool.get('account.period')
|
|
move_lines = MoveLine.search([
|
|
('move.period.fiscalyear', '=', self.start.fiscalyear),
|
|
('account', '=', self.start.severance_pay.id),
|
|
('party', '!=', None),
|
|
('reconciliation', '=', None),
|
|
('credit', '>', 0)
|
|
])
|
|
|
|
mandatory_wages = MandatoryWage.search([
|
|
('employee', '!=', None),
|
|
('party', '!=', None),
|
|
('wage_type.type_concept', '=', 'retirement'),
|
|
])
|
|
parties_related = {}
|
|
for mw in mandatory_wages:
|
|
if not mw or not mw.party or not mw.employee.party:
|
|
raise MissingPartyWageType(
|
|
gettext('staff_payroll_co.msg_missing_party',
|
|
wage=mw.wage_type.name,
|
|
employee=mw.employee.party.name))
|
|
parties_related[mw.employee.party.id] = mw.party.id
|
|
|
|
counterparts = {}
|
|
lines_to_create = []
|
|
to_reconcile = {}
|
|
|
|
date_ = date.today()
|
|
|
|
move, = Move.create([{
|
|
'period': Period.find(self.start.company.id, date=date_),
|
|
'date': date_,
|
|
'journal': self.start.journal.id,
|
|
'state': 'draft',
|
|
'description': self.start.description,
|
|
}])
|
|
|
|
grouped_parties_lines = {}
|
|
for line in move_lines:
|
|
party_id = line.party.id
|
|
if grouped_parties_lines.get(party_id):
|
|
grouped_parties_lines[party_id]['debit'] += line.credit
|
|
to_reconcile[party_id].append(line)
|
|
else:
|
|
to_reconcile[party_id] = [line]
|
|
grouped_parties_lines[party_id] = {
|
|
'account': line.account.id,
|
|
'party': party_id,
|
|
'debit': line.credit,
|
|
'credit': 0,
|
|
'description': line.description,
|
|
'move': move.id,
|
|
}
|
|
|
|
for party_id, line in grouped_parties_lines.items():
|
|
line, = MoveLine.create([line])
|
|
to_reconcile[party_id].append(line)
|
|
_party_id = parties_related.get(party_id)
|
|
if not _party_id:
|
|
continue
|
|
MoveLine.create([{
|
|
'account': self.start.counterpart_account.id,
|
|
'party': _party_id,
|
|
'debit': 0,
|
|
'credit': line.debit,
|
|
'move': move.id,
|
|
}])
|
|
|
|
for lr in to_reconcile.values():
|
|
MoveLine.reconcile(lr)
|
|
|
|
self.result = UserError(
|
|
gettext('staff_payroll_co.msg_move_created',
|
|
s=move.number))
|
|
return 'done'
|
|
|
|
|
|
class SeverancePayClearingDone(ModelView):
|
|
'Severance Pay Clearing Done'
|
|
__name__ = 'staff_payroll.severance_pay_clearing.done'
|
|
result = fields.Text('Result', readonly=True)
|