[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
+165
View File
@@ -2,6 +2,153 @@
## Current focus
**AP 4 EFZG/Teilentgelt umgesetzt — 144/144 Tests grün**
(2026-09-12):
- **Rechtsverifikation:** lb-krs-08-⚠Marke erledigt — EFZG von RIS
beschafft (Bundesnormen **GesNr 10008308**,
.firecrawl/ris/EFZG_*GeltendeFassung.html) und **§ 2 Abs 1/3/5
verifiziert**; § 8 Abs 1/2/2a AngG lokal verifiziert —
**Gleichlauf bestätigt** (6/8/10/12 Wochen bei 0/1/15/25
vollendeten DJ + je 4 Wochen halb). „56 Tage" = AU-Topf 8 Wochen
(lb-asc-15), KEINE eigene Regel. **KUG § 62 ASVG = Falsch-
Prämisse** (RECHTSQUELLEN-Privat 2026-09-10: § 62 regelt
Beitragsabrechnung; deutsches U1-Vorbild) — kein Baustein.
- **EFZ-Maschine** `models/efzg.py`: `_at_efz_status()`
Kalendertage-Kontingente je Arbeitsjahr (Eintrittsdatum-Rhythmus),
Krank- und AU-Topf getrennt (AU nur voll), Stufe je Tag
(Stufensprung verlängert), Phasen je Arbeitstag aus den
ATP_KRANK/ATP_AU-Work Entries (neue Urlaubsart Arbeitsunfall);
Episode-Beginn für fiktive BV; Info-Feld am Payslip.
- **Regeln** TEIL_ENTGELT_HALB (50 %/AT) + KRANKENTGELT_PHASE
(100 %/AT) als negative Brutto-Zeilen (seq 45/46, Tagesatz =
unreduzierte laufende Basis ÷ Arbeitstage —
`_at_efz_tagesatz(result_rules)` rechnet die eigenen Reduktionen
heraus); SV/LSt/LNK folgen über die reduzierte laufende Basis
(lb-krs-07).
- **Fiktive BV § 7 Abs 3 BMSVG** in `_at_bv_basis_laufen`-Hook:
50 % Vormonatsentgelt (Episode-Beginn-Monat davor, SZ ausgenommen)
× Halb-/ÖGK-Kalendertage/30 — Halbphase zählt mit (Krankengeld
ruht zur Hälfte, Quellbeispiel lb-krs-07); fließt in BVG-Zeile
und mBGM-BV-Basis.
- Parameter `at_efz_stufen` (data/rule_parameters_efzg_private.xml);
Rechenfälle docs/rechenfaelle/efzg.md; 6 Tests (Übergang,
Kontingent, Stufe 8 Wo, AU-Topf, fiktive BV, Wirkungslos ohne
Stand). November-B13-SZ-Bezug in BV-Grundlage inklusive (§ 6
BMSVG) — Tests komponentenweise.
- Version: Privat **19.0.9.2.0**. 144/144 (64+106+18) frischer
-i-Lauf, py/XML-Sweep.
- **Offen:** AP 7 (Wochengeld/Mutterschutz), AP 8 (AEB SART 70/75)
— EFZ-WETs sind verdrahtet; dokumentierte Reste: Kalenderjahr-
Umstellung § 8 Abs 9 AngG, ÜStd-/Provisionsdurchschnitte, SZ-
Kürzung „kann"-Regel.
**AP 9 Vordienstzeiten/Einstufung umgesetzt — 138/138 Tests grün**
(2026-09-12):
- **Rechtsbeschaffung:** Bgld. GemBG 2014 via RIS **LrB GesNr
20001002** (geltende Fassung, Quelle
`.firecrawl/ris/bgld/GemBG_2014_GeltendeFassung.html`) — **§ 67
verifiziert**: BDA = Dienstzeit + anrechenbare Vordienstzeiten
(Abs 1); Pflicht-Anrechnung EWR-ÖD/EU-Dienste (Abs 2 Z 1 f),
Grundwehr/Ausbildung max 6 M, Zivil/Ersatz max 9 M (Z 4),
einschlägige Berufstätigkeit/Verwaltungspraktikum **max 10 Jahre**
(Abs 3). Rahmen-KV § 17 (SI-2203 Volltext) verifiziert: Abs 4
Anzahl angerechneter VWGJ durch Firmenleitung + Dienstzettel,
Abs 5 Vorrückung am **Ersten des Erreichungsmonats**.
- **Privat (AP9b):** Stufen-Neu-Feld `vwgj_ab` (aus Labels "nach N
VWGJ", 0=ab Beginn, **-1=nicht gepflegt** — ORM liest Integer-
NULL als 0, deshalb -1-Konvention + Domain `> -1`); CSV-Seed um
vwgj_ab ergänzt (131 Zeilen); Gruppen-Methoden
`_get_stufe_fuer_vwgj`/`_get_naechste_vwgj` (kollektivvertrag.py);
Vertragsfeld `l10n_at_vordienstzeit_monate` + Compute
`l10n_at_vwgj_monate`/`l10n_at_vwgj_stufe_vorschlag`/
`l10n_at_naechste_vorrueckung` (§ 17 Abs 5) + Button
`action_einstufung_uebernehmen` (bewusst manueller
Verwaltungsakt); KV-Einstufungs-Gruppe im View erweitert.
Tests: test_einstufung_private 4 (freeze_time für Determinismus).
- **GemBG (AP9a):** `vordienstzeiten_monate` (Help dokumentiert den
kompletten §-67-Katalog) + Compute `bda_vorschlag` (= Beginn
Monate) + Button `action_bda_uebernehmen`; View am
Besoldungs-Block. Test test_06 (BDA-Übernahme triggert
§-66-Abs-2-Vorrückungstermin).
- Versionen: Privat **19.0.9.1.0**, GemBG **19.0.1.6.0**.
Validierung: 138/138 frischer -i-Lauf, py/XML-Sweep, DB entfernt.
- **Offen:** AP 4 (EFZG/Teilentgelt + fiktive BV), AP 7
(Wochengeld/Mutterschutz), AP 8 (AEB SART 70/75).
**AP 5 + AP 2ad + AP 3 + AP 10 umgesetzt — 133/133 Tests grün**
(2026-09-12, Folgeturn nach AP0/AP1, Reihenfolge lt. Plan):
- **AP5 Abwesenheiten:** hr_holidays + hr_work_entry_holidays als
Pflicht-Dependence des Privatmoduls; AT-WETs ATP_URLAUB/ATP_KRANK/
ATP_KARENZ (is_leave) + country-gebundene AT-Urlaubsarten mit
WET-Verknüpfung (data/absence_private.xml, Odoo-Lokalisations-
muster); Karenz-Wochen erkennbar via Work Entries.
- **AP2ad Reports:** Monatsjournal mit eigenem **Dienstgeberanteile-
Block** (ATP_DG-Kategorie, vorher still ausfiltert), neuer Report
**Dienstgeber-Gesamtkosten** (je AN Brutto + LNK aufgeschlüsselt/kumuliert
+ Laufsummen, Spalten FLAF/KommSt/DZ/BV/Wr. DAG), **Jahreslohnkonto
je DN** + **Betriebsjahreslohnkonto** (Wizard + Monatsmatrix,
models/monatsreports.py + report/jahresreports.xml), **Buchungsbeleg**
am Lohnlauf (private, models/buchungsbeleg.py).
**Latenz-Bug:** models/monatsreports.py war NIE in models/__init__.py
importiert — sämtliche GP7-Reportmodelle waren toter Code!
- **AP3 U-Bahn-Steuer:** Wr. DAG via RIS **verifiziert** (LrW GesNr
20000133, Fassung 12.09.2026, Quelle .firecrawl/ris/wien/WDGAG_*.html;
2 €/Woche § 5, Befreiungen § 3, 15./31.3. § 6, Rückerstattung § 7
218,02/2.180,19 €) — Implementierung: Company-Flag l10n_at_wien_dag
(Kern), Regel WIEN_DAG (models/wien_dag.py — Wochenlogik Montag-im-
Monat + Befreiungen Lehrling/55+/≤10WStd/Karenz-Woche), Fristenarten
wien_dag/wien_dag_jahres (cron-geflaggt), FI 6663 (3560 Referenz-
rest), DG-Kosten-Spalte. **Wochenlektüre „Montag beginnt im Monat" =
Praxis-Annahme, Parallellauf verifizieren.**
- **AP10 GemBG-Fixpaket:** Modul erstmals **installierbar** — 9
Latenzfehler behoben: regular_pay, is_paid+round_days* auf WETs,
falscher XML-ID-Präfix (payroll_structure_bgld.), amount_select
'python'→'code', safe_eval-Import, rules→result_rules (Odoo 19
befült rules NIE), categories['X'], work_time_rate-÷100 (Bruchteil
0..1), nie gelaufene Tests (Payslip-name, Stichtag vor Katalog-
gültigkeit, date_start ist Compute aus contract_date_start).
- Versionen: Kern **19.0.6.0.0**, Privat **19.0.9.0.0**, GemBG
**19.0.1.5.0**. Validierung: 133/133 (17 GemBG + 64 Kern + 92
Privat), frischer -i-Lauf aller 3 Module, py/XML-Sweep, DB entfernt.
- **Offen:** AP 9 (Vordienstzeiten — jetzt entblockt), AP 4 (EFZG/
Teilentgelt), AP 7 (Wochengeld/Mutterschutz), AP 8 (AEB SART 70/75).
**AP0 TASY-Katalog (Variante b) + AP1 AGRD umgesetzt und grün (109/109
Tests)** (2026-09-12, Nutzer-Freigabe des AP-Plans mit
Scope-Entscheidungen): — Kernmodul: neue Katalogmodelle
`models/tasy_katalog.py` (10 Modelle: tasy.bsgr/ergaenzung/
dienstgebergruppe/tarifgruppe/tarifset/tarif/tarifset.zuord/
zuabschlag/zuabschlag.steuerung [+ m2m]), Import-Wizard
`l10n.at.payroll.tasy.katalog.wizard` in `models/tasy.py`
(sektionsscharf — root.iter() fasste auch Referenz-Elemente!),
Sicherheit, Views/Menus `views/tasy_katalog_views.xml`;
Auflösungs-API `_l10n_at_find(bsgr, ergs, dgg, stichtag)`
`_l10n_at_saetze(basis, stichtag)`. Privatmodul: mBGM liest Katalog
vor `at_mbgm_tarif` (quellen-Fallback), Company-Feld
`l10n_at_dienstgebergruppe` (Default NBALG), Vertrags-m2m
`l10n_at_ergaenzung_ids`, **ERGB wird real belegt** (15 Stellen im T1),
NSchAB-Flag nur noch Parameter-Fallback. **BSGR-Korrektur:**
Lehrlinge arbeiter→**B045**, angestellte→**B044** (TASY: B044 =
„Angestelltenlehrlinge"), geringf./fallweise→**B010/B030** je
Personalgruppe; **NSchAB-Feldumbenennung** Schlechtwetter→Nachtschwer-
arbeit (3,80 % = NB-Zweig DG ab 2020, verifiziert; SW-Zweig = 0,7/0,7).
**AP1**`l10n_at_agrd` Char→Selection mit vollständiger D.22-Liste
(33 Codes, lokal verifiziert), Seed `data/hr_departure_reason_seed.xml`
(noupdate; hr-Defaults fired→01/resigned→02/retired→16 vorverbunden +
7 AT-Ursachen), View-Erbe auf Abgangsursachen-Form/Liste.
Nutzer-Entscheidungen: hr_holidays als **Pflicht-Dependence**;
Wochengeld **volle Berechnung**; TASY-Import **alle Träger**; AGRD
Migration OK; Buchungsbeleg **Lohnlauf-Ebene**; GemBG-Fix-Paket **ja**.
Validierung: 109/109 grün auf Wegwerf-DB (frischer -i-Lauf;
test_tasy_katalog 5 inkl. Realexport — Fund: altersgrenzeMinJahr
ist **Dezimal** (60.5) → Float-Felder), py/XML-Sweep ok, DB entfernt.
**Nächste APs:** AP 5 (holidays/WETs), AP 2a-d (Reports), AP 3
(U-Bahn nach RIS-Klärung), AP 4/7/8 (EFZG/Wochengeld/AEB), AP 10/9
(GemBG-Fix → Vordienstzeiten).
**GP9 UI/Security/Doku umgesetzt — GP1GP9 komplett, AP9
abgeschlossen, Projekt M8 final** (2026-09-12): Kern 19.0.5.1.0 —
Company-Stammdaten-UI (BKNR/LStNr/Bundesland/WKO/WF-Wien — Reiter
@@ -1078,6 +1225,24 @@ B17-Inhalt/B18; Kleinverifikationen s. KB-KONFLIKTE „Nächste Schritte“).
`IMPLEMENTIERUNGSPLAN-Bgld.md` Abschnitt 8.
- Odoo-Upgrades künftig in beiden Repos (gem360 + dieses) gegen denselben
Odoo-Pin validieren.
- **Audit ÖGK-Tarifgruppensystem (2026-09-12, Nutzer-Audit-Frage):** Um-
fang nur „Normalbetriebe Allgemeiner Teil": mBGM-BSGR B001/B002 mit
normativ korrekten T01 39,05 %/T02 37,55 % (gegen TASY-LSWH-Export
2026-07-01 verifiziert: KV 3,87/3,78, PV 10,25/12,55, AK 0,5 DN gilt
für B001 **und** B002, Kern-Splitting stimmt); ERGB (E01 NSch, E02 SW,
E03 Schulpflicht …) nie belegt — NSchAB läuft stattdessen über Company-
Flag +3,80 % auf B001; nur 6 Abschläge (A01A03/A09/A10/A15) von ~30
ÖGK-Handbuch-Abschlägen; keine Dienstgebergruppen-Konzept. **Zwei
BSGR-Befunde vor Parametrisierung fixen:** (1) `_l10n_at_bsgr` mappt
Lehrling+`arbeiter` auf **B044** — TASY: B044=Angestelltenlehrlinge,
B045=Arbeiterlehrlinge → **invertiert** (BBER-Mapping in versicher-
tenmeldung.py ist korrekt, D.39: 03=Arbeiterlehrling); (2) gering-
fügig/fallweise immer **B030** (Gfg. Ang.), B010 (Gfg. Arb.) wird nie
emittiert. Beide heute folgenlos (Lauf bricht ohne B044/B045/B010/
B030-Parameter listenweise ab), falsch sobald parametrisiert. TASY-
Import mappt nur 3 BBB + 8 Tarifzweige (erweiterbares Mapping-Modell,
kein BSGR/ERGB/Tarifgruppen-Import). Kein Code-Fix ohne Nutzer-
Freigabe (Audit-only).
## Decisions & conventions