From ea14c48cca81beb03bcc68c817773dfd62206ff0 Mon Sep 17 00:00:00 2001 From: fegger Date: Sat, 12 Sep 2026 17:31:21 +0200 Subject: [PATCH] [IMP] odoo-at-payroll: GP7-Bau, DM-ORG-42.7.0-Verifikationen und Nutzer-Entscheidungen 5.1-5.4 dokumentiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGELOG-GP7-Eintrag; Plan-Abschnitt-10-Update (ELDA-Fixsatz-Konventionen, KZ-210-§-25-Gesamtbrutto-Fund, mBGM-Abschläge je Basis, Nutzer-Entscheidungen: Arbeitsstätte in GP7, Mitteilungsfile-Import GP8, FB+ nicht im Lohnsteuerkern/ANV + Kind-Modell für FABO+-Wartung); MEMORY-Handoff (94/94, Wegwerf-DB, GP8 als nächster Bauabschnitt, offene Reste: odoo_dev-Update, geringfügig-mBGM-Parametrisierung, CRLF/ELDA-Kanal-Verifikation, Referenzbuchhaltungs-Endfixierung, Schwerarbeit nach ASchV-Datenmodell-Bau). --- .agents/MEMORY.md | 74 +++++++++++++++++-- docs/CHANGELOG.md | 57 ++++++++++++++ .../IMPLEMENTIERUNGSPLAN-Privat.md | 28 +++++++ 3 files changed, 152 insertions(+), 7 deletions(-) diff --git a/.agents/MEMORY.md b/.agents/MEMORY.md index 9310f12..4ab981a 100644 --- a/.agents/MEMORY.md +++ b/.agents/MEMORY.md @@ -2,8 +2,45 @@ ## Current focus -**GP6 FI-Buchung UGB umgesetzt und grün (88/88 Tests) — nächster -Bauabschnitt GP7 Meldewesen/Belege (Kern-Bau AP5/AP6)** (2026-09-12): +**GP7 Meldewesen/Belege umgesetzt und grün (94/94 Tests) — nächster +Bauabschnitt GP8 Jahreswechsel/UI/Fristen** (2026-09-12): Kern +19.0.4.0.0 — ELDA-Fixsatz-Framework (`models/elda.py`: Fixlängen, +a/n blank/n null, Cent kaufmännisch, Prozente ×1000, ISO-8859-15, +Dateiheader, Vorlauf SART 00/Schluss SART 99, SANR ab 1 lückenlos, +SANZ inkl. Rahmen; **CRLF-Satztrenner = Praxis-Annahme, DM-ORG +normiert keines — Parallellauf verifizieren**); L16 (`models/ +lohnzettel_l16.py`: I1 1.100 + L1 **3.500**, Lohnzettelversion 28, +BEST LF/VSTR 94, ~210 Felder, Kinderblock 15×123 ab Pos. 1501; +**KZ 210 = § 25 GESAMTBrutto** — KZ-245-Formel = laufende Steuer- +bemessung, per Konstruktion GP3-konsistent, Ableitung aus Kern-Flags +ohne paralleles KZ-Feld) + Arbeitsstättenmeldung § 34 Abs 6 (SART 45, +BEST AD/VSTR ST, je AN am 31. 12., GKZ manuell am Dienstort-Partner); +Kind-Modell `l10n.at.payroll.kind` (FB+-Wartung; Nutzer: **FB+ rechnet +NICHT im Lohnsteuerkern** — Steuer < 0 → ANV); Stammdaten +(BKNR/Lohnsteuernummer Company, GKZ Partner, VSNR-Formatprüfung +hr.version.ssnid — Prüfziffer Rest, eSV-AGRD-Mapping +hr.departure.reason); Belege: Lohnzettel AT + Monatsdienstliste + +Monatsjournal (QWeb auf hr.payslip.run; account.report in keinem +HR-Modul). Privat 19.0.7.0.0 — mBGM/JASV (`models/mbgm.py`: PS/G1/ +T1/BS/V1, T01/T02-Gesamtsatz aus `at_mbgm_tarif` **normativ laufend +39,05 %/SZ 37,55 %**; Abschläge **je Basis AB und SZ**: A03/A02/A01 +§-2a-DN-AV, A09 UV-60, A10 AV+IE, A15 PV; BV-Basis GP5 + V01; +RSUM=Basis×Satz mit GP4-Konsistenzcheck ±0,10 €; Storno R1 REFU, +Fehlanzeige Null-Paket; geringfügig/fallweise OHNE Parametrisierung → +Abbruch, keine Tariferfindung) + Versichertenmeldung (`models/ +versichertenmeldung.py`: M3/M4 deklarative Event-Erkennung über +Registry `l10n.at.payroll.vr.event` — idempotent, KEIN write-diff; +BBER 01–04, GERF Gehalt-vs-GFG, BVAB/BVJN aus GP5, VWAZ h×100, AGRD; +fallweise BEST MA/SART 32 MVP je Anmeldetag; NSchAB-Company-Flag ++3,80 B001). Tests 94/94 (test_elda_l16 4 + test_meldewesen_private +2), Wegwerf-DB frisch; Rechenfälle `docs/rechenfaelle/meldewesen.md`. +Out: Schwerarbeit (DM-ORG E.22-Struktur vorhanden, keine ASchV- +Basis), § 109a, L17, Mitteilungsfile-Import (5.2→GP8), FB+-LSt +(ANV), geringfügig-mBGM bis Param. Offen: odoo_dev-Update (GP4- +Stand!), Referenzbuchhaltungs-Endfixierung, Parallellauf-Verifikation +CRLF/Kanäle. + +**GP6 FI-Buchung UGB umgesetzt und grün (88/88 Tests)** (2026-09-12): privat 19.0.6.0.0 — Buchungsmatrix nach **KFS/BW 6** (Nutzer- Referenz-Exemplar `.additional_docs/KFSBW6_13072017_RF.pdf`, extrah. `/tmp/kfsbw6/` ad hoc): Hook `_configure_payroll_account_at` @@ -192,6 +229,24 @@ B17-Inhalt/B18; Kleinverifikationen s. KB-KONFLIKTE „Nächste Schritte“). ## Completed +- **GP7 Meldewesen/Belege umgesetzt (94/94 grün)** (2026-09-12): + Kern 19.0.4.0.0: `models/elda.py` (Fixsatz-Framework), + `lohnzettel_l16.py` (L16 I1/L1 + Arbeitsstätte SART 45; + `l10n.at.payroll.l16` + `.line`), `kind.py` (`l10n.at.payroll.kind`), + `meldewesen.py` (BKNR/Lohnsteuernummer/GKZ/VSNR-Prüfung/AGRD), + `monatsreports.py` + `report/belege_reports.xml` (3 Belege), + `views/meldewesen_views.xml`. Privat 19.0.7.0.0: `mbgm.py` + (`l10n.at.payroll.mbgm[.line]`), `versichertenmeldung.py` + (`l10n.at.payroll.vr` + `.event`-Registry), + `data/rule_parameters_mbgm_private.xml` (at_mbgm_tarif B001/B002 + 39,05/37,55 ab 2026), `views/meldewesen_views.xml`, NSchAB-Flag. + DM-ORG-42.7.0-Satzstrukturen PDF-verifiziert extrahiert (mBGM + E.32, L16 E.13/E.14 mit vollständiger L1-Tabelle inkl. Kinderblock- + Offsets, VR E.29 mit Pflichtmatrix/AGRD/BBER, Arbeitsstätte E.20, + fallweise E.18; TXT-Fehler vs. PDF dokumentiert — PDF gewinnt). + Rechenfälle `docs/rechenfaelle/meldewesen.md`; README/CHANGELOG/ + PLAN-10/MEMORY nachgezogen. + - **GP6 FI-Buchung UGB umgesetzt (88/88 grün)** (2026-09-12): `l10n_at_hr_payroll_private` 19.0.6.0.0 — Buchungsmatrix KFS/BW 6: `models/account_chart_private.py` (Matrix-Dict + Hook @@ -1207,12 +1262,17 @@ B17-Inhalt/B18; Kleinverifikationen s. KB-KONFLIKTE „Nächste Schritte“). GP5 Abfertigung Neu; **GP6 FI-Buchung UGB umgesetzt 2026-09-12** — `test_kv_katalog` 8 + `test_entgelt_private` 21 + `test_lst_private` 6 + `test_sv_private` 8 + `test_bv_private` 10 + `test_account_private` - 4 grün auf Wegwerf-DB (**88/88**, frischer `-i`-Lauf — `odoo_dev` - noch auf GP4-Stand, Update nachholen); Rechenfall-Fixtures unter - `docs/rechenfaelle/` inkl. buchhaltung.md (KFS/BW-6-Matrix); - GP7 Meldewesen/Belege als Nächstes) + 4 + `test_meldewesen_private` 2 grün auf Wegwerf-DB (**94/94** + gesamt mit Kern; `odoo_dev` noch auf GP4-Stand, Update nachholen); + Rechenfall-Fixtures unter `docs/rechenfaelle/` inkl. buchhaltung.md + + meldewesen.md; + GP7 umgesetzt: mBGM/Versichertenmeldung/fallweise auf dem Kern-Framework; + GP8 Jahreswechsel/UI/Fristen als Nächstes) - `addons/l10n_at_hr_payroll/` — Bundes-Kern (SV/TASY + GP3 Lohnsteuer - `models/lohnsteuer.py` + **GP4 SV/DB `models/sozialversicherung.py`** + + GP4 SV/DB + **GP7 ELDA/L16/Arbeitsstätte/Belege** 19.0.4.0.0 — + `models/elda.py`, `lohnzettel_l16.py`, `kind.py`, `meldewesen.py`, + `monatsreports.py`, `report/belege_reports.xml`; + `test_elda_l16` 4) (DG/Geringfügigkeit/§ 49/Altersstichtage/§ 2a-Staffel/WF-Vektor/ Beitragsmonat/DAG), `rule_parameters_lst_2026.xml` + `rule_parameters_sv_2026.xml`; **74/74 grün**) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dae786f..a010d82 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,62 @@ # CHANGELOG — odoo-at-payroll +## 2026-09-12 — General-AT GP7: Meldewesen/Belege umgesetzt (M7; Kern-Bau AP5/AP6) + +- `addons/l10n_at_hr_payroll` (19.0.4.0.0): **ELDA-Fixsatz-Framework** + `models/elda.py` (DM-ORG 42.7.0: Fixlängen ohne Trennzeichen, a/n + linksbündig-blank / n rechtsbündig-0, Cent ohne Interpunktion, + Prozente ×1000, ISO-8859-15, Dateiheader optional, Vorlauf SART 00/ + Schluss SART 99 mit SANR-Kette ab 1 und SANZ inkl. Rahmen; + **CRLF als Satztrenner = Praxis-Annahme** — DM-ORG normiert keines). + **Lohnzettel Finanz L16 + Arbeitsstättenmeldung § 34 Abs 6 ASVG** + `models/lohnzettel_l16.py`: I1 (1.100) + L1 (**3.500**, + Lohnzettelversion 28, BEST LF/VSTR 94) inkl. Kinderblock 15×123 + ab Pos. 1501 — PDF-verifizierte Positions-Ketten; **KZ 210 = + Bruttobezüge gem. § 25 gesamt** (KZ 245 = 210−215−220−230−243 = + laufende Steuerbemessung, konsistent mit der GP3-§-66-Kette per + Konstruktion; Ableitung aus l10n_at_bemessung/steuerbefreiung_68/ + s67_abs, KEIN paralleles KZ-Feld). Arbeitsstätte: SART 45 (300, + BEST AD/VSTR ST) je AN am 31. 12. aus dem Dienstort-Partner + (GKZ manuell, Warnung wenn fehlt). + **Kind-Datenmodell** `models/kind.py` (Nutzer-Entscheidung: FB+ + rechnet NICHT im Lohnsteuerkern — Steuer < 0 → Arbeitnehmer- + veranlagung; Modell dient der FABO+-Wartung: Monate voll/halb, + Alterstaffel, L16-Kinderblock). **Stammdaten** `models/meldewesen.py`: + BKNR + Lohnsteuernummer (Company), GKZ (res.partner), VSNR-Format- + prüfung LLLPTTMMJJ auf hr.version.ssnid (Prüfziffer = Rest, SVS- + Quelle), eSV-AGRD-Mapping auf hr.departure.reason. **Belege** + (AP6): Lohnzettel AT (ir.actions.report auf hr.payslip) + + Monatsdienstliste + Monatsjournal (QWeb auf hr.payslip.run, + AbstractModel `models/monatsreports.py`; kein HR-Modul nutzt + account.report). +- `addons/l10n_at_hr_payroll_private` (19.0.7.0.0): **mBGM/JASV** + (BEST MB, Version 02; `models/mbgm.py`): Paket PS/mBGM G1/Tarif- + block T1/Verrechnungsbasis BS/Position V1 aus GP4-Beitragsmonats- + Daten; T01/T02-GESAMT-Prozentsatz je BSGR aus `at_mbgm_tarif` + (normativ laufend **39,05 %**, SZ **37,55 %** = DN KV 3,87 + PV + 10,25 + AV 2,95 + DG 20,48); **Abschläge je Verrechnungsbasis** + (A03/A02/A01 §-2a-AMPFG DN-AV auf AB UND SZ, A09 UV-60, A10 + AV+IE-Entfall, A15 PV-Halbierung; Konkurrenz a4: A10 sperrt + Staffelabschlag); BV-Basis (ungedeckelt, GP5) + V01; RSUM = + Basis×Satz mit Konsistenz-Check gegen GP4-Payslip-Summen (±0,10 €); + Storno R1 (REFU/VSUM wie Original), Fehlanzeige als Null-Paket; + Geringfügige/fallweise ohne Parametrisierung → listenweiser + Abbruch (keine Tarif-Erfindung). **Versichertenmeldung** + `models/versichertenmeldung.py` (BEST VR, Version 03): M3 vor + Arbeitsantritt / M4 (7 Tage) mit deklarativer Event-Erkennung über + die Meldungs-Registry (idempotente Läufe, kein write-diff), BBER + 01–04, GERF (Gehalt vs. GFG), FRDV, BVAB/BVJN aus GP5, VWAZ + Stunden×100, AGRD aus dem Abgangsgrund-Mapping; **fallweise + Anmeldung** (BEST MA, SART 32, Version 07; MVP je Anmeldetag). + NSchAB-Branche als Company-Flag (B001-T01 + 3,80). +- **Bewusst nicht in GP7:** Schwerarbeitsmeldung (DM-ORG E.22- + Struktur vorhanden, aber keine ASchV-Datenbasis), § 109a (separate + Honorar-Datenbasis), L17 (keine AG-Pflicht), Mitteilungsfile-Import + (Nutzer-Entscheidung 5.2 → GP8), FB+-Lohnsteuermechanik (ANV). +- Tests: `test_elda_l16` (4) + `test_meldewesen_private` (2) — + **94/94 grün** (frischer `-i`-Lauf, Wegwerf-DB). Rechenfälle + `docs/rechenfaelle/meldewesen.md`. + ## 2026-09-12 — General-AT GP6: FI-Buchung UGB nach KFS/BW 6 umgesetzt (M6) - `addons/l10n_at_hr_payroll_private` (19.0.6.0.0): **GP6 FI-Buchung diff --git a/personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md b/personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md index 0687820..7854818 100644 --- a/personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md +++ b/personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md @@ -783,6 +783,34 @@ Budget: die Kandidaten 8.13, der DZ (8.11) und die Regel-Optionen (NSchAB, DAG) laufen über die GP0-/Pilotmandant-Entscheidung bzw. Change-Requests. +**Update 2026-09-12 (GP7 umgesetzt):** Meldewesen/Belege komplett +umgesetzt und grün (94/94) — Nutzer-Entscheidungen 5.1-5.4 (2026- +09-12): Arbeitsstättenmeldung § 34 Abs 6 in GP7 (SART 45, BEST AD/ +VSTR ST — im selben Jahreslauf wie die L16); Mitteilungsfile-Import += GP8-Rest; **FB+ rechnet NICHT im Lohnsteuerkern** (Steuer < 0 → +Arbeitnehmerveranlagung — das Kind-Modell dient der FABO+-Wartung +und dem L16-Kinderblock); alles in einem GP7. Kern 19.0.4.0.0: +ELDA-Fixsatz-Framework (`models/elda.py`), L16 (I1 1.100 + L1 +3.500, Lohnzettelversion 28, BEST LF/VSTR 94; **KZ 210 = § 25- +Gesamtbrutto** — KZ-245-Formel damit die laufende Steuerbemessung, +per Konstruktion GP3-konsistent; Ableitung aus l10n_at_bemessung/ +steuerbefreiung_68/s67_abs, kein paralleles KZ-Feld), Arbeitsstätte, +Kind-Modell, Stammdaten (BKNR/Lohnsteuernummer/GKZ/VSNR-Pruefung/ +AGRD-Mapping), 3 Belege (Lohnzettel AT/Monatsdienstliste/Monats- +journal, QWeb auf hr.payslip bzw. hr.payslip.run — account.report +in keinem HR-Modul). Privat 19.0.7.0.0: mBGM/JASV (PS/G1/T1/BS/V1, +T01/T02-Gesamtsatz aus `at_mbgm_tarif` — normativ 39,05 % laufend/ +37,55 % SZ; **Abschläge je Basis AB UND SZ** A03/A02/A01 §-2a-DN-AV, +A09/A10/A15; BV-Basis + V01 aus GP5; RSUM=Basis×Satz mit GP4- +Konsistenzcheck; Storno R1/REFU; Fehlanzeige Null-Paket), Ver- +sichertenmeldung M3/M4 (deklarative Event-Erkennung über die +Meldungs-Registry — kein write-diff; BBER/GERF/FRDV/BVAB/BVJN/VWAZ/ +AGRD), fallweise Anmeldung BEST MA/SART 32; NSchAB-Company-Flag. +Bewusst nicht: Schwerarbeitsmeldung (DM-ORG E.22-Struktur vorhanden, +keine ASchV-Datenbasis), § 109a (Honorar-Basis), L17 (keine AG- +Pflicht), geringfügig-mBGM bis Parametrisierung (keine Tarif- +erfindung). Rechenfälle `docs/rechenfaelle/meldewesen.md`. + **Update 2026-09-12 (GP6 umgesetzt):** FI-Buchung UGB nach dem Österreichischen Einheitskontenrahmen (KFS/BW 6 — Nutzer-Referenz- Exemplar `.additional_docs/KFSBW6_13072017_RF.pdf`) umgesetzt und