mirror of
http://100.103.83.12:3003/fegger/odoo-at-payroll.git
synced 2026-09-17 16:56:42 +00:00
[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.
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# 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'},
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user