oca-ocb-hr/odoo-bringout-oca-ocb-hr/hr/wizard/hr_bank_account_wizard.py
Ernad Husremovic e1d89e11e3 19.0 vanilla
2026-03-09 09:31:00 +01:00

63 lines
2.6 KiB
Python

from odoo import api, models, fields, Command
from odoo.exceptions import ValidationError
from odoo.tools.float_utils import float_is_zero, float_round
class BankAccountAllocationWizard(models.TransientModel):
_name = 'hr.bank.account.allocation.wizard'
_description = 'Bank Account Allocation Wizard'
employee_id = fields.Many2one('hr.employee', required=True)
allocation_ids = fields.One2many('hr.bank.account.allocation.wizard.line', 'wizard_id', string="Allocations", readonly=False)
def _prepare_allocations_from_employee(self):
self.ensure_one()
wizard_lines = []
distribution = self.employee_id.salary_distribution or {}
for ba in self.employee_id.bank_account_ids:
if str(ba.id) not in distribution:
raise ValidationError(self.env._("Bank account %s not found within the salary distribution of the employee", ba))
dist_entry = distribution.get(str(ba.id))
amount = dist_entry.get('amount')
is_percentage = dist_entry.get('amount_is_percentage')
sequence = dist_entry.get('sequence')
wizard_lines.append(Command.create({
'bank_account_id': ba.id,
'amount': amount,
'amount_type': 'percentage' if is_percentage else 'fixed',
'trusted': ba.allow_out_payment,
'sequence': sequence,
}))
self.write({'allocation_ids': wizard_lines})
@api.model_create_multi
def create(self, vals_list):
records = super().create(vals_list)
for wizard in records:
wizard._prepare_allocations_from_employee()
return records
def action_save(self):
self.ensure_one()
distribution = {}
total = 0.0
check_for_total = False
for index, line in enumerate(self.allocation_ids):
line_amount = float_round(line.amount, precision_digits=2, rounding_method="DOWN")
distribution[str(line.bank_account_id.id)] = {
'amount': line_amount,
'sequence': line.sequence,
'amount_is_percentage': line.amount_type == 'percentage'
}
if line.amount_type == 'percentage':
total += line_amount
check_for_total = True
line.bank_account_id.sudo().write({
'allow_out_payment': line.trusted
})
if check_for_total and not float_is_zero(total - 100.0, precision_digits=4):
raise ValidationError(self.env._("Total percentage allocation must equal 100%."))
self.employee_id.salary_distribution = distribution