30270f9877
Katalogmodell nach Implementierungsplan AP1 (freigegeben 2026-09-09): - ``gemeinde.payroll.entlohnungsgruppe`` (Code, Schema, §, Bundesland, Vorrückungszeitraum je Gruppe; § 66 Abs 2 GemBG: 4 Jahre, abweichend 2 Jahre für Betreuungspersonen-/Sondergruppen) und ``gemeinde.payroll.entlohnungsstufe`` (Stufe, Monatsentgelt, Stichtag, unique je Gruppe/Stufe/Stichtag) mit Stichtags-Lookup-Helfern. - Seed 2026: 35 Entlohnungsgruppen, 433 Werte (Schemata I/gv, II/gh, Ia/bv, IIa/bh, kb, av sowie §-Gruppen 150c/151/151c), Werte aus der konsolidierten GemBG-Fassung 09.09.2026 (Wert 1.7.2026 gemäß Artikel 4 RV 0715/XXIII. GP; 2025er-Stichtagsannahme für nicht 2026 angepasste Tabellen als AP0-Verifikationspunkt dokumentiert). Generator mit Herkunftsnachweis: personalverrechnung/tools/extract_gembg_katalog.py. - GemBG-Felder auf der Payroll-Version (hr.version) plus Employee-Spiegel nach dem Engine-Muster (related/inherited): Entlohnungsgruppe, Stufe, Besoldungsdienstalter, Vorrückungstermin — berechnet nach § 66 Abs 2 (erster Tag des Monats nach Vollendung weiterer n Jahre BDA), manuell überschreibbar für Überleitungsfälle (§§ 157a ff). - Vorrückungs-Wizard (§ 66 Abs 2): fällige Versionen zum Stichtag, Stufenerhöhung mit Höchststufen-Schutz und Ergebnis-Notification — bewusst kein stilles Mutieren im Lohnlauf (Dokumentationspflicht). - Views/Menüs (Personalverrechnung Bgld. unter Payroll), Security auf hr_payroll-Gruppen, Employee-Form-Anbindung in payroll_group. - Tests (Rechenfälle AP1): Seed-Werte inkl. Quellenanomalie kb1a/6, Stichtags-Lookup, Jahresversionierung, Vorrückungstermin (BDA 15.03.2020 -> 1.4.2028), Wizard-Anwendung mit Höchststufen-Skip. Statische Validierung grün (py_compile, XML, Manifest, CSV-Integrität); Runtime-Testlauf auf dem Dev-Host (gem360_dev) ausständig, wie im Implementierungsplan M2 vorgesehen.
70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
# 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'},
|
|
},
|
|
} |