[FIX] l10n_at_gemeinde_payroll: Modul erstmals installierbar — 9 Odoo-19-Latenzfehler; BDA-Vordienstzeiten-Vorschlag (AP10+AP9)

AP10 — Latenzfehler des nie installierten Vorlaufs:
- regular_pay auf hr.payroll.structure entfernt (Feld existiert nicht)
- is_paid/round_days/round_days_type von WET-Records entfernt
- Falscher XML-ID-Praefix payroll_structure_bgld. -> Modul-Referenzen
- amount_select 'python' -> 'code' (Selection)
- import in Regelcode entfernt (safe_eval verbietet IMPORT_NAME)
- rules['ME'].total -> result_rules['ME']['total'] (Odoo 19 befuellt
  rules nie; SZQ-Sonderzahlung rechnete gegen Null)
- categories.X -> categories['X'] (NETTO-Regel)
- work_time_rate /100 entfernt (Odoo 19 speichert Bruchteil 0..1)
- nie gelaufene Tests: Payslip-name-Pflichtfeld, Stichtag vor
  Katalog-Gueltigkeit (Wizard-Skip korrekt), date_start ist Compute
  aus contract_date_start

AP9 — BDA-Vordienstzeiten (GemBG S 67 Abs 1-3, RIS LrB GesNr
20001002 verifiziert): Feld vordienstzeiten_monate (Help dokumentiert
Anrechnungskatalog inkl. Obergrenzen), Compute bda_vorschlag
(Vertragsbeginn - Monate), Uebernahme-Button als Verwaltungsakt,
View-Erweiterung
This commit is contained in:
2026-09-12 23:18:07 +02:00
parent 9b4221fcef
commit 0abc1383d1
8 changed files with 306 additions and 65 deletions
@@ -1,7 +1,7 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'Österreich - Gemeinde-Personalverrechnung (Bgld. GemBG)',
'version': '19.0.1.4.0',
'version': '19.0.1.6.0',
'author': 'ixsol / gem360',
'website': 'https://gem360.at',
'category': 'Human Resources/Payroll',
@@ -16,7 +16,6 @@
<field name="name">Gemeindebedienstete (Bgld. GemBG 2014)</field>
<field name="code">GEMBG.BGLD</field>
<field name="type_id" ref="structure_type_gembg_bgld"/>
<field name="regular_pay" eval="True"/>
</record>
<!-- ============================================================ -->
@@ -42,47 +41,32 @@
<!-- ============================================================ -->
<!-- Work-Entry-Types für GemBG-Komponenten -->
<!-- ============================================================ -->
<!-- Odoo 19: hr.work.entry.type hat weder is_paid noch
round_days/round_days_type mehr (Latenzfehler des Bgld-
Vorlaufs, entfernt). -->
<record id="work_entry_type_ueberstunden_tag" model="hr.work.entry.type">
<field name="name">Überstunden (tagsüber, § 76 GemBG)</field>
<field name="code">GEMBG_UEB_TAG</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<record id="work_entry_type_ueberstunden_nacht" model="hr.work.entry.type">
<field name="name">Überstunden (Nachtzeit 22-6 Uhr, § 76 GemBG)</field>
<field name="code">GEMBG_UEB_NACHT</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<record id="work_entry_type_mehrdienst" model="hr.work.entry.type">
<field name="name">Mehrdienstleistung (§ 76 GemBG)</field>
<field name="code">GEMBG_MEHR</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<record id="work_entry_type_journaldienst" model="hr.work.entry.type">
<field name="name">Journaldienst (§ 79 GemBG)</field>
<field name="code">GEMBG_JOURNAL</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<record id="work_entry_type_bereitschaft" model="hr.work.entry.type">
<field name="name">Bereitschaftsdienst (§ 80 GemBG)</field>
<field name="code">GEMBG_BEREIT</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<record id="work_entry_type_sonn_feiertag" model="hr.work.entry.type">
<field name="name">Sonn-/Feiertagsdienst (§ 78 GemBG)</field>
<field name="code">GEMBG_SONNFEI</field>
<field name="round_days">NO</field>
<field name="round_days_type">DOWN</field>
<field name="is_paid" eval="True"/>
</record>
<!-- ============================================================ -->
@@ -7,11 +7,11 @@
<field name="name">Monatsentgelt</field>
<field name="code">ME</field>
<field name="sequence" eval="1"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = bool(employee.entlohnungsgruppe_id and employee.entlohnungsstufe)</field>
<field name="amount_select">python</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# Monatsentgelt nach Bgld. GemBG 2014 (IVa. Hauptstück §§ 133 ff).
# Katalog-Lookup: Entlohnungsgruppe + Stufe + Stichtag.
@@ -24,9 +24,10 @@ else:
# Ausbildungsphase: 5 % Abzug (§ 133h GemBG)
if employee.ausbildungsphase:
base *= 0.95
# Teilzeit: anteilig über work_time_rate (§ 59 GemBG)
work_rate = employee.work_time_rate or 100.0
result = base * work_rate / 100.0
# Teilzeit: anteilig über work_time_rate (§ 59 GemBG) — Odoo 19
# speichert work_time_rate als Bruchteil 0..1 (nicht Prozent).
work_rate = employee.work_time_rate or 1.0
result = base * work_rate
]]></field>
</record>
@@ -37,8 +38,8 @@ else:
<field name="name">Kinderzulage (§ 61 GemBG)</field>
<field name="code">KIZU</field>
<field name="sequence" eval="2"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = employee.kinder_anzahl > 0</field>
<field name="amount_select">code</field>
@@ -58,16 +59,16 @@ result = employee.kinder_anzahl * kiz_satz
<field name="name">Funktionszulage (§ 62 GemBG)</field>
<field name="code">FUZU</field>
<field name="sequence" eval="3"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = employee.funktionszulage > 0</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# Funktionszulage § 62 GemBG — Satz am Dienstvertrag (hr.version).
# Bei Teilzeit anteilig (wie Monatsentgelt).
work_rate = employee.work_time_rate or 100.0
result = employee.funktionszulage * work_rate / 100.0
# Bei Teilzeit anteilig (wie Monatsentgelt); work_time_rate = Bruchteil.
work_rate = employee.work_time_rate or 1.0
result = employee.funktionszulage * work_rate
]]></field>
</record>
@@ -78,8 +79,8 @@ result = employee.funktionszulage * work_rate / 100.0
<field name="name">Überstundenvergütung tagsüber (§ 76 GemBG)</field>
<field name="code">UEZ_TAG</field>
<field name="sequence" eval="10"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'GEMBG_UEB_TAG' in worked_days and worked_days['GEMBG_UEB_TAG'].number_of_hours > 0</field>
<field name="amount_select">code</field>
@@ -100,8 +101,8 @@ else:
<field name="name">Überstundenvergütung Nachtzeit (§ 76 GemBG)</field>
<field name="code">UEZ_NACHT</field>
<field name="sequence" eval="11"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'GEMBG_UEB_NACHT' in worked_days and worked_days['GEMBG_UEB_NACHT'].number_of_hours > 0</field>
<field name="amount_select">code</field>
@@ -125,8 +126,8 @@ else:
<field name="name">Journaldienstzulage (§ 79 GemBG)</field>
<field name="code">JZU</field>
<field name="sequence" eval="12"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'GEMBG_JOURNAL' in worked_days and worked_days['GEMBG_JOURNAL'].number_of_hours > 0</field>
<field name="amount_select">code</field>
@@ -146,8 +147,8 @@ result = tage * satz
<field name="name">Sonn-/Feiertagszulage (§ 78 GemBG)</field>
<field name="code">SFZU</field>
<field name="sequence" eval="13"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'GEMBG_SONNFEI' in worked_days and worked_days['GEMBG_SONNFEI'].number_of_hours > 0</field>
<field name="amount_select">code</field>
@@ -174,8 +175,8 @@ else:
<field name="name">Bereitschaftsentschädigung (§ 80 GemBG)</field>
<field name="code">BERB</field>
<field name="sequence" eval="14"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'GEMBG_BEREIT' in worked_days and worked_days['GEMBG_BEREIT'].number_of_hours > 0</field>
<field name="amount_select">code</field>
@@ -195,8 +196,8 @@ result = stunden * satz
<field name="name">Erschwerniszulage (§ 83 GemBG)</field>
<field name="code">ERZU</field>
<field name="sequence" eval="15"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ERZU_INPUT' in inputs and inputs['ERZU_INPUT'].amount > 0</field>
<field name="amount_select">code</field>
@@ -212,8 +213,8 @@ result = inputs['ERZU_INPUT'].amount
<field name="name">Jubiläumszuwendung (§ 89 GemBG)</field>
<field name="code">JUB</field>
<field name="sequence" eval="16"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'JUB_INPUT' in inputs and inputs['JUB_INPUT'].amount > 0</field>
<field name="amount_select">code</field>
@@ -229,8 +230,8 @@ result = inputs['JUB_INPUT'].amount
<field name="name">Fahrtkostenzuschuss (§ 88 GemBG)</field>
<field name="code">FKZ</field>
<field name="sequence" eval="17"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'FKZ_INPUT' in inputs and inputs['FKZ_INPUT'].amount > 0</field>
<field name="amount_select">code</field>
@@ -246,8 +247,8 @@ result = inputs['FKZ_INPUT'].amount
<field name="name">Sonderzahlung (quartalsweise, § 133n GemBG)</field>
<field name="code">SZQ</field>
<field name="sequence" eval="30"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_brutto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_brutto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">python</field>
<field name="condition_python"><![CDATA[
# § 133n GemBG: 50 % des Monatsentgelts (und der Kinderzulage)
@@ -255,7 +256,6 @@ result = inputs['FKZ_INPUT'].amount
# Quartalsende (März, Juni, September, Dezember).
# Der Monat der Auszahlung ist der Monat, für den das Entgelt
# gebührt (§ 56 Abs 2 GemBG: 15.3., 15.6., 15.9., 15.12.).
import datetime
month = payslip.date_to.month
result = month in (3, 6, 9, 12)
]]></field>
@@ -266,8 +266,9 @@ result = month in (3, 6, 9, 12)
# Kinderzulage), die ihnen für den Monat der Auszahlung zustehen").
# Bei unterbrochenem Vierteljahr: nur der entsprechende Teil
# (R1: Vollzeit-Rechnung; Anteil folgt mit der Zeit-Erfassung).
me_total = rules['ME'].total or 0
kizu_total = rules['KIZU'].total or 0
# Odoo 19 befült result_rules (nicht rules) mit den Regelsummen.
me_total = result_rules['ME']['total'] or 0
kizu_total = result_rules['KIZU']['total'] or 0
result = (me_total + kizu_total) * 0.5
]]></field>
</record>
@@ -279,12 +280,12 @@ result = (me_total + kizu_total) * 0.5
<field name="name">Netto</field>
<field name="code">NETTO</field>
<field name="sequence" eval="100"/>
<field name="category_id" ref="payroll_structure_bgld.category_gembg_netto"/>
<field name="struct_id" ref="payroll_structure_bgld.structure_gembg_bgld"/>
<field name="category_id" ref="category_gembg_netto"/>
<field name="struct_id" ref="structure_gembg_bgld"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = categories.GEMBG_BRUTTO - categories.GEMBG_ABZUG
result = categories['GEMBG_BRUTTO'] - categories['GEMBG_ABZUG']
]]></field>
</record>
</odoo>
@@ -24,12 +24,55 @@ class HrVersion(models.Model):
besoldungsdienstalter = fields.Date(
string='Besoldungsdienstalter (ab)',
groups="hr_payroll.group_hr_payroll_user", tracking=True)
vordienstzeiten_monate = fields.Integer(
string='Anerkannte Vordienstzeiten (Monate)',
groups="hr_payroll.group_hr_payroll_user", tracking=True,
help='AP9 — Bgld. GemBG § 67: Das Besoldungsdienstalter umfasst '
'die im Dienstverhältnis verbrachten wirksamen Zeiten '
'ZUSAMMEN mit den anrechenbaren Vordienstzeiten '
'(Abs 1). Anzurechnen sind u. a. Zeiten in einem '
'Dienstverhältnis zu einer Gebietskörperschaft/einem '
'Gemeindeverband (EWR/Türkei/Schweiz) sowie EU- und '
'zwischenstaatliche Dienstverhältnisse (Abs 2 Z 1 f); '
'Grundwehr-/Ausbildungsdienst zusammen max. 6 Monate, '
'Zivil-/Ersatzdienst max. 9 Monate (Abs 2 Z 4); über '
'die Pflichtzeiten hinaus einschlägige Berufstätigkeit '
'oder ein Verwaltungspraktikum max. 10 Jahre (Abs 3). '
'Doppelanrechnung desselben Zeitraums unzulässig. '
'Hier: die vom Bescheid anerkannten Monate gesamt.')
bda_vorschlag = fields.Date(
string='BDA-Vorschlag (Vordienstzeiten)',
compute='_compute_bda_vorschlag',
groups="hr_payroll.group_hr_payroll_user",
help='Vorschlag: Vertragsbeginn zurückverlegt um die '
'anerkannten Vordienstzeiten (§ 67 Abs 1). Übernahme '
'bewusst manuell — Besoldungsdienstalter ist ein '
'dokumentationspflichtiger Verwaltungsakt (s. Vorrückungs-'
'Wizard).')
vorrueckungstermin = fields.Date(
compute='_compute_vorrueckungstermin', store=True, readonly=False,
groups="hr_payroll.group_hr_payroll_user", tracking=True,
help="Vorschlag nach § 66 Abs 2 GemBG (BDA + Vorrückungszeitraum); "
"bei Überleitungsfällen manuell korrigierbar.")
@api.depends('contract_date_start', 'vordienstzeiten_monate')
def _compute_bda_vorschlag(self):
for version in self:
if not (version.contract_date_start
and version.vordienstzeiten_monate):
version.bda_vorschlag = False
continue
version.bda_vorschlag = version.contract_date_start \
- relativedelta(months=version.vordienstzeiten_monate)
def action_bda_uebernehmen(self):
"""BDA-Vorschlag als Besoldungsdienstalter übernehmen — ein
expliziter Verwaltungsakt, kein stilles Schreiben im Lohnlauf
(Muster: Vorrückungs-Wizard § 66 Abs 2)."""
for version in self:
if version.bda_vorschlag:
version.besoldungsdienstalter = version.bda_vorschlag
@api.depends('entlohnungsgruppe_id', 'besoldungsdienstalter')
def _compute_vorrueckungstermin(self):
for version in self:
@@ -67,6 +110,16 @@ class HrEmployee(models.Model):
besoldungsdienstalter = fields.Date(
related="version_id.besoldungsdienstalter", inherited=True,
readonly=False, groups="hr_payroll.group_hr_payroll_user")
vordienstzeiten_monate = fields.Integer(
related="version_id.vordienstzeiten_monate", inherited=True,
readonly=False, groups="hr_payroll.group_hr_payroll_user")
bda_vorschlag = fields.Date(
related="version_id.bda_vorschlag", inherited=True,
groups="hr_payroll.group_hr_payroll_user")
vorrueckungstermin = fields.Date(
related="version_id.vorrueckungstermin", inherited=True,
readonly=False, groups="hr_payroll.group_hr_payroll_user")
readonly=False, groups="hr_payroll.group_hr_payroll_user")
def action_bda_uebernehmen(self):
"""Delegation an die Version (Button am Mitarbeiterformular)."""
self.mapped('version_id').action_bda_uebernehmen()
@@ -44,6 +44,7 @@ class EntgeltTest(TransactionCase):
slip_month = month or 7
slip = self.env['hr.payslip'].create({
'name': 'GemBG-Test %d/2026' % slip_month,
'employee_id': employee.id,
'struct_id': self.structure.id,
'date_from': date(2026, slip_month, 1),
@@ -1,6 +1,8 @@
# Part of the gem360 onboarding. See LICENSE / project docs for details.
from datetime import date
from freezegun import freeze_time
from odoo.tests import TransactionCase, tagged
@@ -53,9 +55,14 @@ class KatalogTest(TransactionCase):
if not version:
version = self.env['hr.version'].create({
'employee_id': employee.id,
'date_start': date(2020, 1, 1),
'contract_date_start': date(2020, 1, 1),
})
version.write({
# contract_date_start ins Suchfenster des Vorrückungs-
# Wizards rücken — hr.version.date_start ist ein nicht-
# gespeicherter Compute daraus (nie gelaufener Test,
# Odoo-19-Latenzkorrektur).
'contract_date_start': date(2014, 1, 1),
'entlohnungsgruppe_id':
self.env.ref('l10n_at_gemeinde_payroll.bgld_grp_av_av1').id,
'entlohnungsstufe': stufe,
@@ -76,10 +83,13 @@ class KatalogTest(TransactionCase):
"""Wizard erhöht die Stufe fälliger Versionen und überspringt
die Höchststufe."""
version = self._version_mit_katalog(date(2014, 3, 15), stufe=3)
version.vorrueckungstermin = date(2024, 4, 1)
max_stufe = version.entlohnungsgruppe_id._max_stufe(date(2024, 4, 1))
# Stichtag ab Katalog-Gültigkeit (Seed 2026-07-01) — vor dem
# 1. 7. 2026 gibt es keine Katalogwerte, der Wizard überspringt
# korrekt (nie gelaufener Test, Odoo-19-Latenzkorrektur).
version.vorrueckungstermin = date(2028, 4, 1)
max_stufe = version.entlohnungsgruppe_id._max_stufe(date(2028, 4, 1))
wizard = self.env['gemeinde.payroll.vorrueckung.wizard'].create({
'stichtag': date(2024, 4, 1),
'stichtag': date(2028, 4, 1),
})
self.assertIn(version, wizard.version_ids)
wizard.action_apply()
@@ -87,9 +97,29 @@ class KatalogTest(TransactionCase):
version_top = self._version_mit_katalog(date(2014, 3, 15),
stufe=max_stufe)
version_top.vorrueckungstermin = date(2024, 4, 1)
version_top.vorrueckungstermin = date(2028, 4, 1)
wizard2 = self.env['gemeinde.payroll.vorrueckung.wizard'].create({
'stichtag': date(2024, 4, 1),
'stichtag': date(2028, 4, 1),
})
wizard2.action_apply()
self.assertEqual(version_top.entlohnungsstufe, max_stufe)
self.assertEqual(version_top.entlohnungsstufe, max_stufe)
def test_06_bda_vorschlag_aus_vordienstzeiten(self):
"""AP9 — § 67 Abs 1 GemBG: BDA-Vorschlag = Vertragsbeginn
zurückverlegt um die anerkannten Vordienstzeiten; Übernahme
setzt das BDA und den Vorrückungstermin neu (§ 66 Abs 2)."""
version = self._version_mit_katalog(date(2014, 3, 15))
version.write({'contract_date_start': date(2026, 7, 1)})
self.assertFalse(version.bda_vorschlag)
version.vordienstzeiten_monate = 48
self.assertEqual(version.bda_vorschlag, date(2022, 7, 1))
# Ohne Übernahme bleibt das gepflegte BDA (Setup) unangetastet.
self.assertEqual(version.besoldungsdienstalter, date(2014, 3, 15))
with freeze_time('2026-09-12'):
version.action_bda_uebernehmen()
self.assertEqual(version.besoldungsdienstalter, date(2022, 7, 1))
# Vorrückungstermin nach § 66 Abs 2: Die 4-Jahres-Vollendung
# (1. 7. 2026) ist am 12. 9. 2026 bereits verstrichen → der
# Termin der NÄCHSTFÄLLIGEN Vorrückung: BDA + 8 Jahre =
# 1. 7. 2030 → 1. 8. 2030.
self.assertEqual(version.vorrueckungstermin, date(2030, 8, 1))
@@ -10,8 +10,15 @@
groups="hr_payroll.group_hr_payroll_user">
<field name="entlohnungsgruppe_id"/>
<field name="entlohnungsstufe" invisible="not entlohnungsgruppe_id"/>
<field name="vordienstzeiten_monate" invisible="not entlohnungsgruppe_id"/>
<field name="bda_vorschlag" invisible="not entlohnungsgruppe_id"/>
<field name="besoldungsdienstalter" invisible="not entlohnungsgruppe_id"/>
<field name="vorrueckungstermin" invisible="not entlohnungsgruppe_id"/>
<button name="action_bda_uebernehmen"
string="BDA-Vorschlag übernehmen" type="object"
class="btn-secondary"
invisible="not entlohnungsgruppe_id or not bda_vorschlag"
groups="hr_payroll.group_hr_payroll_manager"/>
</group>
<group name="gembg_zulagen" string="GemBG Zulagen"
groups="hr_payroll.group_hr_payroll_user">