# Part of the gem360 onboarding. See LICENSE / project docs for details. from odoo import _, api, fields, models class GemeindePayrollVorrueckungWizard(models.TransientModel): """Wendet fällige GemBG-Vorrückungen (§ 66 Abs 2) explizit an. Vorrückungen werden bewusst nicht still im Lohnlauf mutiert: Der Vorrückungstermin ist ein dokumentationspflichtiger Verwaltungsakt. Der Wizard listet die fälligen Versionen zum Stichtag, erhöht die Entlohnungsstufe und setzt den nächsten Vorrückungstermin (BDA- Logik, siehe hr_version_bgld). """ _name = 'gemeinde.payroll.vorrueckung.wizard' _description = 'GemBG Vorrückungen anwenden (§ 66 Abs 2)' stichtag = fields.Date( required=True, default=fields.Date.today, help="Vorrückungstermine bis zu diesem Tag werden berücksichtigt.") version_ids = fields.Many2many( 'hr.version', string='Fällige Dienstverhältnisse', compute='_compute_version_ids', readonly=False) anzahl = fields.Integer(compute='_compute_anzahl') @api.depends('stichtag') def _compute_version_ids(self): for wizard in self: wizard.version_ids = wizard._get_faellige_versionen() @api.depends('version_ids') def _compute_anzahl(self): for wizard in self: wizard.anzahl = len(wizard.version_ids) def _get_faellige_versionen(self): self.ensure_one() if not self.stichtag: return self.env['hr.version'] return self.env['hr.version'].search([ ('entlohnungsgruppe_id', '!=', False), ('vorrueckungstermin', '<=', self.stichtag), ('date_start', '<=', self.stichtag), '|', ('date_end', '=', False), ('date_end', '>=', self.stichtag), ]) def action_apply(self): self.ensure_one() applied = self.env['hr.version'] skipped = 0 for version in self.version_ids: max_stufe = version.entlohnungsgruppe_id._max_stufe(self.stichtag) if version.entlohnungsstufe >= max_stufe: skipped += 1 continue version.entlohnungsstufe += 1 applied |= version return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'type': 'success' if applied else 'warning', 'message': _( "%(applied)s Vorrückung(en) angewendet, " "%(skipped)s an der Höchststufe übersprungen.", applied=len(applied), skipped=skipped, ), 'next': {'type': 'ir.actions.act_window_close'}, }, }