Files
odoo-at-payroll/addons/l10n_at_gemeinde_payroll/wizard/vorrueckung_run.py
T
fegger 30270f9877 [IMP] l10n_at_gemeinde_payroll: implement AP1 pay scale model (GemBG Bgld.)
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.
2026-09-09 11:55:15 +02:00

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'},
},
}