fix in get line for move

This commit is contained in:
Wilson Gomez 2023-05-10 11:45:38 -05:00
parent 634b72de45
commit 9b7921a774
1 changed files with 47 additions and 40 deletions

View File

@ -255,8 +255,9 @@ class Payroll(Workflow, ModelSQL, ModelView):
@ModelView.button @ModelView.button
@Workflow.transition('posted') @Workflow.transition('posted')
def post(cls, records): def post(cls, records):
wage_dict = cls.create_cache_wage_types()
for payroll in records: for payroll in records:
payroll.create_move() payroll.create_move(wage_dict)
@fields.depends('start', 'end') @fields.depends('start', 'end')
def on_change_start(self): def on_change_start(self):
@ -311,14 +312,14 @@ class Payroll(Workflow, ModelSQL, ModelView):
return salary_full return salary_full
def create_move(self): def create_move(self, wage_dict):
pool = Pool() pool = Pool()
Move = pool.get('account.move') Move = pool.get('account.move')
Period = pool.get('account.period') Period = pool.get('account.period')
if self.move: if self.move:
return return
period_id = Period.find(self.company.id, date=self.date_effective) period_id = Period.find(self.company.id, date=self.date_effective)
move_lines = self.get_moves_lines() move_lines = self.get_moves_lines(wage_dict)
move, = Move.create([{ move, = Move.create([{
'journal': self.journal.id, 'journal': self.journal.id,
'origin': str(self), 'origin': str(self),
@ -331,7 +332,7 @@ class Payroll(Workflow, ModelSQL, ModelView):
self.write([self], {'move': move.id}) self.write([self], {'move': move.id})
Move.post([self.move]) Move.post([self.move])
def get_moves_lines(self): def get_moves_lines(self, wage_dict):
lines_moves = {} lines_moves = {}
mandatory_wages = dict([(m.wage_type.id, m.party) mandatory_wages = dict([(m.wage_type.id, m.party)
for m in self.employee.mandatory_wages]) for m in self.employee.mandatory_wages])
@ -342,23 +343,25 @@ class Payroll(Workflow, ModelSQL, ModelView):
entity_in_line = configuration.expense_contribution_entity entity_in_line = configuration.expense_contribution_entity
debit_acc2 = None debit_acc2 = None
attr_getter = attrgetter( attr_getter = attrgetter(
'amount', 'party', 'amount_60_40', 'wage_type', 'amount', 'party', 'amount_60_40', 'wage_type.id'
'wage_type.definition', 'wage_type.account_60_40',
'wage_type.debit_account', 'wage_type.credit_account',
'wage_type.expense_formula'
) )
for line in self.lines: for line in self.lines:
amount, party, amount_60_40, wage_type, definition, account_60_40, debit_acc, credit_acc, expense_for = attr_getter(line) amount, party, amount_60_40, wage_type = attr_getter(line)
wage_type_= wage_dict[wage_type]
definition = wage_type_['definition']
account_60_40 = wage_type_['account_60_40.']
debit_acc = wage_type_['debit_account.']
credit_acc = wage_type_['credit_account.']
expense_for = wage_type_['expense_formula']
if amount <= 0 or not wage_type: if amount <= 0 or not wage_type:
continue continue
try: try:
party_id = party.id party_id = party.id
except: except:
party_id = None party_id = None
wage_type_id = wage_type.id
if not party_id: if not party_id:
if mandatory_wages.get(wage_type_id): if mandatory_wages.get(wage_type):
party_id = mandatory_wages[wage_type_id].id party_id = mandatory_wages[wage_type].id
else: else:
party_id = employee_id party_id = employee_id
@ -366,7 +369,7 @@ class Payroll(Workflow, ModelSQL, ModelView):
# if not line.wage_type: # if not line.wage_type:
# continue # continue
if expense_for: if expense_for:
expense = line.get_expense_amount() expense = line.get_expense_amount(wage_type_)
if definition == 'payment': if definition == 'payment':
amount_debit = amount + expense amount_debit = amount + expense
@ -383,37 +386,37 @@ class Payroll(Workflow, ModelSQL, ModelView):
amount_credit = amount + expense amount_credit = amount + expense
# debit_acc = line.wage_type.debit_account # debit_acc = line.wage_type.debit_account
try: if True:
if debit_acc and amount_debit > _ZERO: if debit_acc and amount_debit > _ZERO:
if definition == 'discount': if definition == 'discount':
amount_debit = amount_debit * (-1) amount_debit = amount_debit * (-1)
if debit_acc.id not in lines_moves.keys(): if debit_acc['id'] not in lines_moves.keys():
if entity_in_line: if entity_in_line:
p = party_id p = party_id
else: else:
p = employee_id p = employee_id
lines_moves[debit_acc.id] = { lines_moves[debit_acc['id']] = {
employee_id: line.get_move_line( employee_id: line.get_move_line(
debit_acc, p, debit_acc, p,
('debit', amount_debit) ('debit', amount_debit)
)} )}
else: else:
line.update_move_line( line.update_move_line(
lines_moves[debit_acc.id][employee_id], lines_moves[debit_acc['id']][employee_id],
{'debit': amount_debit, 'credit': _ZERO} {'debit': amount_debit, 'credit': _ZERO}
) )
if debit_acc2: if debit_acc2:
if debit_acc2.id not in lines_moves.keys(): if debit_acc2['id'] not in lines_moves.keys():
lines_moves[debit_acc2.id] = { lines_moves[debit_acc2['id']] = {
employee_id: line.get_move_line( employee_id: line.get_move_line(
debit_acc2, party_id, debit_acc2, party_id,
('debit', amount_debit2) ('debit', amount_debit2)
)} )}
else: else:
line.update_move_line( line.update_move_line(
lines_moves[debit_acc2.id][employee_id], lines_moves[debit_acc2['id']][employee_id],
{'debit': amount_debit, 'credit': _ZERO} {'debit': amount_debit, 'credit': _ZERO}
) )
@ -421,16 +424,16 @@ class Payroll(Workflow, ModelSQL, ModelView):
if amount_credit > _ZERO: if amount_credit > _ZERO:
line_credit_ready = False line_credit_ready = False
if credit_acc: if credit_acc:
if credit_acc.id not in lines_moves.keys(): if credit_acc['id'] not in lines_moves.keys():
lines_moves[credit_acc.id] = { lines_moves[credit_acc['id']] = {
party_id: line.get_move_line( party_id: line.get_move_line(
credit_acc, party_id, ('credit', credit_acc, party_id, ('credit',
amount_credit) amount_credit)
)} )}
line_credit_ready = True line_credit_ready = True
else: else:
if party_id not in lines_moves[credit_acc.id].keys(): if party_id not in lines_moves[credit_acc['id']].keys():
lines_moves[credit_acc.id].update({ lines_moves[credit_acc['id']].update({
party_id: line.get_move_line( party_id: line.get_move_line(
credit_acc, party_id, ( credit_acc, party_id, (
'credit', amount_credit) 'credit', amount_credit)
@ -438,23 +441,24 @@ class Payroll(Workflow, ModelSQL, ModelView):
}) })
line_credit_ready = True line_credit_ready = True
if definition != 'payment': if definition != 'payment':
deduction_acc = wage_type.deduction_account deduction_acc = wage_type_['deduction_account.']
if deduction_acc: if deduction_acc:
if deduction_acc.id not in lines_moves.keys(): if deduction_acc['id'] not in lines_moves.keys():
lines_moves[deduction_acc.id] = { lines_moves[deduction_acc['id']] = {
employee_id: line.get_move_line( employee_id: line.get_move_line(
deduction_acc, employee_id, ( deduction_acc, employee_id, (
'credit', -amount), 'credit', -amount),
)} )}
line_credit_ready = True line_credit_ready = True
else: else:
lines_moves[deduction_acc.id][employee_id]['credit'] -= amount lines_moves[deduction_acc['id']][employee_id]['credit'] -= amount
if credit_acc and not line_credit_ready: if credit_acc and not line_credit_ready:
lines_moves[credit_acc.id][party_id]['credit'] += amount_credit lines_moves[credit_acc['id']][party_id]['credit'] += amount_credit
except Exception as e: # except Exception as e:
raise WageTypeValidationError(
gettext('staff_payroll.bad_configuration_of_wage_type', wage=wage_type.name)) # raise WageTypeValidationError(
# gettext('staff_payroll.bad_configuration_of_wage_type', wage=wage_type_['name']))
result = [] result = []
for r in lines_moves.values(): for r in lines_moves.values():
_line = list(r.values()) _line = list(r.values())
@ -521,7 +525,9 @@ class Payroll(Workflow, ModelSQL, ModelView):
'expense_formula', 'uom', 'default_quantity', 'type_concept', 'expense_formula', 'uom', 'default_quantity', 'type_concept',
'salary_constitute', 'receipt', 'concepts_salary', 'salary_constitute', 'receipt', 'concepts_salary',
'contract_finish', 'limit_days', 'month_application', 'contract_finish', 'limit_days', 'month_application',
'minimal_amount', 'adjust_days_worked', 'round_amounts' 'minimal_amount', 'adjust_days_worked', 'round_amounts',
'debit_account.name', 'credit_account.name',
'deduction_account.name', 'account_60_40.name'
] ]
wages = Wage.search_read([], fields_names=fields_names) wages = Wage.search_read([], fields_names=fields_names)
return {w['id']: w for w in wages} return {w['id']: w for w in wages}
@ -591,7 +597,8 @@ class Payroll(Workflow, ModelSQL, ModelView):
if discount: if discount:
quantity -= discount quantity -= discount
else: else:
quantity = extras.get(wage_name, 0) extra_key = wage_name.split(' ')[0]
quantity = extras.get(extra_key, 0)
return quantity return quantity
@ -799,10 +806,10 @@ class PayrollLine(ModelSQL, ModelView):
credit = amount[1] credit = amount[1]
res = { res = {
'description': account.name, 'description': account['name'],
'debit': debit, 'debit': debit,
'credit': credit, 'credit': credit,
'account': account.id, 'account': account['id'],
'party': party_id, 'party': party_id,
} }
return res return res
@ -815,12 +822,12 @@ class PayrollLine(ModelSQL, ModelView):
move_line['credit'] += values['credit'] move_line['credit'] += values['credit']
return move_line return move_line
def get_expense_amount(self): def get_expense_amount(self, wage_type):
expense = 0 expense = 0
wage_type = self.wage_type wage_type_ = self.wage_type
if wage_type.expense_formula: if wage_type['expense_formula']:
salary_args = self.payroll.get_salary_full(wage_type) salary_args = self.payroll.get_salary_full(wage_type)
expense = wage_type.compute_expense(salary_args, wage_type.expense_formula) expense = wage_type_.compute_expense(wage_type['expense_formula'], salary_args)
return expense return expense