From 4e79c8b8b131415bf600c44888b84b843e99ad55 Mon Sep 17 00:00:00 2001 From: Florian Egger Date: Wed, 9 Sep 2026 11:39:41 +0200 Subject: [PATCH] [ADD] personalverrechnung: Implementierungsplan Bgld. Personalverrechnung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plan zur Freigabe (AGENTS.md Phase 3): Anforderungsbild, am Odoo-19-Source verifizierte Erweiterungspunkte (hr.rule.parameter-Konsum via payslip._rule_parameter, localdict-Kontext, Regel-Konten, Posting-Hook _prepare_line_values für budget_position_id, Refund-Mechanik, Work-Entry-Types), Modul-Layout, Katalogmodell (Entlohnungsgruppen/-stufen mit Jahresversionierung aus Bezügeanpassungs-Tabellen), Regelinventar (Monatsentgelt, Kinderzulage ungekürzt, Zulagen, Über-/Mehrdienstleistung, quartalsweise SZ, Lohnsteuer § 33/§ 68, SV/DG, öffentlicher FLAF-DB, IESG), VRV-Buchung über vrv_ansatz_id auf hr.salary.rule, eigene Abfertigungsrückstellungs-Engine, dateibasiertes Meldewesen (L16/ELDA), Jahreswechsel-Wizard, Rechenfall-Testplan mit VRV-L2-Verprobungsankern, Risiken (Buchungsmatrix AP0, FLAF-DB-Satz, SZ-Lohnsteuer-Zuordnung, ELDA/FinOnl-Specs, Prorate-Konvention) und Meilensteine M0–M6 im AP-Rahmen der Angebotskalkulation. --- .../IMPLEMENTIERUNGSPLAN-Bgld.md | 228 ++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md diff --git a/personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md b/personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md new file mode 100644 index 0000000..5d01f48 --- /dev/null +++ b/personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md @@ -0,0 +1,228 @@ +# Implementierungsplan — Gemeinde-Personalverrechnung Bgld. +## Modul `l10n_at_gemeinde_payroll` (Odoo 19) + +**Status:** Plan zur Freigabe (AGENTS.md-Workflow, Phase 3 — Implementierung +startet erst nach ausdrücklicher Freigabe). Basis: Rechtsquellen +(`RECHTSQUELLEN-Bgld.md`), Angebotskalkulation (APs, Prämissen P1–P10), +payroll-Skill. Alle Odoo-APIs wurden am vorliegenden Odoo-19-Source +verifiziert (Nachweise in Abschnitt 2). + +- **Stand:** 2026-09-09 · Branch `dev-payroll` · lokal +- **Scope R1:** GemBG-Gemeindebedienstete (inkl. Kinderbetreuungspersonal); + Optionen (Organe, Altpensionen, Lehrlinge, Folgebundesländer) und + Ausschlüsse gem. Kalkulation Abschnitt 5/6. + +## 1. Anforderung (Verständnis) + +Vollständige Monatsverrechnung für Bedienstete burgenländischer Gemeinden +nach dem **Bgld. GemBG 2014**-Eigenregime: Entlohnung aus +Entlohnungsgruppen/-stufen (Jahreswerte aus Bgld. Bezügeanpassungs- +Sammelgesetzen), quartalsweise Sonderzahlung, Zulagen, Über-/Mehrdienst- +leistung; Lohnsteuer (§ 33/§ 68 EStG) und SV/Dienstgeberbeiträge (ASVG, +öffentlicher FLAF-DB, IESG); Belege (Lohnzettel, Monatsdienstliste, +Monatsjournal); Meldedateien (L16/FinOnl, eSV/ELDA-XML, Beitragsgrundlagen- +nachweis) — dateibasiert, Übertragung beim Kunden (P7); FI-Buchung auf den +VRV-Kontenplan mit Ansatz-/MVAG-Attribution und EHH/FHH-korrektem Verhalten +plus Abfertigungsrückstellung; Jahreswechsel-Prozess. + +## 2. Verifizierte Odoo-Basen (Erweiterungspunkte) + +| Mechanismus | Nachweis (odoo/addons/…) | Verwendung im Plan | +|---|---|---| +| `hr.rule.parameter` + Werte je `date_from` (Python-Datenstruktur, safe_eval) | `hr_payroll/models/hr_rule_parameter.py` | Alle jährlichen/variablen Werte: LSt-Tarif & Absetzbeträge, SV-Sätze, Grenzen, FLAF-DB-Satz, IESG, Überstundenfreibetrag | +| Konsum in Regeln: `payslip._rule_parameter('code')` | `hr_payslip.py` L951; Praxis l10n_be (`data/cp200/*_data.xml`) | Regeln lesen keine Literale | +| Regel-Kontext `localdict`: `categories`, `rules`, `payslip`, `worked_days`, `inputs`, `employee`, `result_rules`, `version` | `hr_payslip.py` L1051–1072 | Entgelt-/Abzugsregeln; GemBG-Komponenten als Work-Entry-Types/Inputs | +| Strukturen: `hr.payroll.structure` (mit `journal_id`), `hr.payroll.structure.type`; Zuordnung über Mitarbeiter-Version | `hr_payroll_structure.py`, `hr_version.py` | EINE Struktur „GemBG Bgld. Gemeindebedienstete“; Gruppen/Stufen über Vertragsfelder, nicht über Struktur-Vielfalt | +| Work-Entry-Types (`hr.work.entry.type`: Rounding, `unpaid_structure_ids`) | `hr_work_entry_type.py` | Dienstzeit-Komponenten: Über-/Mehrdienstleistung, Journaldienst, Bereitschaft, Karenz/Herabsetzung | +| Buchung: `hr.salary.rule.account_debit/account_credit` (company_dependent, restrict), Netto-Ausschluss-Flag, Tags | `hr_payroll_account/models/hr_salary_rule.py`, `hr_payslip.py` | Regel→VRV-Konto-Mapping direkt am Regelobjekt; Buchungs-ohne-Netto-Regeln für DG-Sicht | +| Posting-Batch je Journal+Monat: `_action_create_account_move` → `_prepare_slip_lines`/`_prepare_line_values`/`_prepare_adjust_line` | `hr_payroll_account/models/hr_payslip.py` L54–222 | **Hook:** Überschreiben von `_prepare_line_values`, um je Regel `budget_position_id` (Ansatz aus `l10n_at_vrv2015`) + korrekte HH-Attribution zu setzen | +| Retro/Korrekturen: `is_refund_payslip`, `_action_refund_payslips` | `hr_payslip.py` L130–735 | Korrekturläufe ohne Eigenbau | +| Batches `hr.payslip.run`; SEPA-Auszahlung `hr_payroll_account_iso20022` | Engine | Monatsläufe, Zahlungsdatei (FHH via Zahlungslauf) | + +## 3. Modul-Layout (Dateien/Komponenten) + +``` +l10n_at_gemeinde_payroll/ + models/ + entlohnung.py # Katalog: gemeinde.payroll.entlohnungsgruppe / -stufe + hr_employee_contract.py# GemBG-Felder auf Employee/Contract-Version + hr_salary_rule.py # vrv_ansatz_id (+ VRV-Default-Konto je Regel) + hr_payslip.py # Posting-Hook (Ansatz/HH), SZ-Quartil-Helfer + lohnsteuer.py # § 33-Tarif als pure Python-Utility (unit-testbar) + vorrueckung.py # BDA-/Vorrückungstermin-Berechnung + abfertigung.py # §-130-Rückstellungs-Engine (Anwartschaft, Zuführung) + l16_export.py # FinOnl-L16-Export (Datei + Prüfprotokoll) + elda_export.py # eSV/ELDA-XML (JASV, An-/Ab-/Änderung, Fehlanzeige, BGN) + data/ + structure_bgld.xml # Structure-Type + Structure (Journal-Verweis) + salary_rules_bgld.xml # Kategorien + Regelinventar (Abschnitt 4.2) + rule_parameters_2026.xml # LSt/SV/Grenzen/FLAF-DB/IESG/ÜStd-Freibetrag 2026 + katalog_bgld_2026.xml # Entlohnungsgruppen/-stufen 2026 (aus RV 0715; Seed) + work_entry_types.xml, input_types.xml + wizard/ + bezuegeanpassung_import.py # Jahreswechsel: Tabellen-Import + Validierung + vorrueckung_run.py # Vorrückungen je Stichtag anwenden (explizit) + report/ # Lohnzettel (AT-Layout), Monatsdienstliste, Monatsjournal + security/ir.model.access.csv + tests/ (Abschnitt 6) +``` + +## 4. Vorgeschlagene Umsetzung + +### 4.1 Katalogmodell (AP1) + +- `gemeinde.payroll.entlohnungsgruppe`: `code` (z. B. `gv1`, `gb3`), Name, + `bundesland` (Auswahl; Bgld. befüllt, weitere Länder als Daten), + Verwendungsbeschreibung. +- `gemeinde.payroll.entlohnungsstufe`: `gruppe_id`, `stufe` (int), + `monatsentgelt`, `gueltig_ab` (Datum); unique(Gruppe, Stufe, gueltig_ab) + → jährliche Versionen aus der Bezügeanpassung; Seed 2026 aus + RV 0715 (`.firecrawl/bezuege2026-rv0715.md`), Folgejahre über den + Import-Wizard (Tabellenpaste + Plausibilitätsprüfung ±x %). +- Mitarbeiter/Vertragsversion (erben in `hr.employee`/`hr.version`-Kontext): + `entlohnungsgruppe_id`, `entlohnungsstufe` (bezogen auf Stichtag), + `besoldungsdienstalter` (Datum; Anrechnungszeiten als Zusatzfelder), + `vorrueckungstermin` (compute), Teilzeit-Ausmaß via Resource-Kalender. +- **Vorrückungen** werden nicht still im Lohnlauf mutiert: eigener + Wizard/Cron je Stichtag mit Protokoll (Vorrückung ist besoldungs- + rechtlich ein Verwaltungsakt mit Dokumentationspflicht). + +### 4.2 Regelinventar (AP2–AP4) + +Kategorien: `GEMBG_BRUTTO`, `GEMBG_ABZUG`, `GEMBG_NETTO`, `GEMBG_DG` +(Arbeitgeberanteile, buchungs-/journalwirksam), `VRV_BUCHUNG` +(nicht netto-wirksam). + +| Regel (Code) | Quelle/Mechanik | +|---|---| +| `ME` Monatsentgelt | Katalog-Lookup Gruppe+Stufe(Stichtag); Prorate Ein-/Austritt (Konvention AP1: Kalender- vs. Arbeitstage) und Teilzeit-Ausmaß | +| `KIZU` Kinderzulage | Kinder-Anzahl × Satz (Rule-Parameter); **bei Teilzeit ungekürzt** (§ 59) | +| `FUZU/ERZU/JZU/SFZU/BERB` Funktions-/Erschwernis-/Journaldienst-/Sonn-Feiertags-/Bereitschafts-Bezüge | Inputs/Work-Entry-Types mit Sätzen aus Rule-Parametern | +| `UEZ` Über-/Mehrdienstleistung | Inputs + § 68-Pauschalbesteuerung (steuerfreier Anteil; 2026: max. 170 €/15 ÜStd — Mechanik nach LStR, siehe 8.) | +| `JUB` Jubiläumszuwendung | Stichtagslogik (Dienstzeit) aus § 89/§ 157d | +| `SZQ` Sonderzahlung | **Quartalsweise**: im Auszahlungsmonat (Ende Q) 50 % des Monatsentgelts (inkl. KIZU); anteilig bei unterbrochenem Vierteljahr (§ 60 Abs 3: „nur der entsprechende Teil“) | +| `LSTL` Lohnsteuer laufend | `lohnsteuer.py`-Utility: § 33-Tarif auf Jahres-Progressionsbasis (LStBMG-Systematik), Absetzbeträge (Rule-Parameter 2026) | +| `LSTSZ` Lohnsteuer SZ | Begünstigte Bezüge (§ 68 Abs 5/6): Grenzwerte aus Rule-Parametern; Zuordnung quartalsweiser SZ — offene Detailfrage (Abschnitt 8) | +| `SVDN` SV Dienstnehmer | KV+PV+AV mit je-Zweig-HBG (6.930 €/13.860 € SZ), Geringfügigkeits-Check (551,10 €), AV-Staffel § 2a AMPFG | +| `SVDG` SV Dienstgeber | DG-Anteile (KV/UV/PV/AV) | +| `FLAFDB` | Öffentlicher FLAF-DB (§ 49a ASVG; Satz als Parameter — P5, AP0-Wert) | +| `IESG` | Insolvenz-Zuschlag 0,10 % (DG) | +| `NETTO` | Kategoriensummen | +| Abfertigungs-Rückstellung | **Nicht** als Slip-Regel: eigene Engine (4.4) | + +### 4.3 VRV-Buchung (AP7) + +- Regel→Konto: `account_debit/account_credit` auf den Regeln (Anlage-3b- + Konten Klassen 4/5/6; exakte Codes aus der **Buchungsmatrix AP0** mit der + Gemeindebuchhaltung; Ansätze 2211/2212/… aus dem verifizierten + Bereichsbudget-Export ableitbar). +- Regel→Ansatz: neues Feld `vrv_ansatz_id` (`vrv2015.va.position`, + company_dependent) auf `hr.salary.rule`; der Posting-Hook setzt + `budget_position_id` je Move-Line (Vererbung von `_prepare_line_values`) + → damit laufen die Bezüge automatisch durch die bestehende Detailnachweis-/ + Anlage-1a/2a-Engine des `l10n_at_vrv2015`. +- EHH/FHH: Lohnlauf bucht EHH (Ergebnishaushalt); die Auszahlung läuft über + den Zahlungsverkehr (SEPA/Iso20022) → FHH über die normale Zahlungs- + Verrechnung des VRV-Moduls (kein Sonderweg). +- DG-Beiträge (SV-DG, FLAF-DB, IESG) als buchungswirksame Regeln ohne + Nettoeffekt (Netto-Ausschluss-Flag der Engine). + +### 4.4 Abfertigungsrückstellung (AP7) + +`gemeinde.payroll.abfertigung`-Engine: Anwartschaft je Dienstverhältnis +(§ 130-GemBG-Matrix), monatliche Zuführungsberechnung, Buchungs-Wizard +(Aufwandkonto Ansatz 2211 ↔ Rückstellungskonto 37x) mit Verprobungs- +Anker zur VRV-Engine. Keine Pseudo-Slip-Regel. + +### 4.5 Meldewesen (AP5, dateibasiert — P7) + +- `l16_export`: Wizard → L16-Datei (FinOnl-Format; **Spec in AP0 + beschaffen**) + Prüfprotokoll; Jahresbelegmeldung bis Ende Februar. +- `elda_export`: eSV-XML-Dateien (JASV-Monatsmeldung, An-/Ab-/Änderung, + Fehlanzeige, Beitragsgrundlagennachweis; **eSV-XML-Spec in AP0**) + + Validierungsprotokoll. +- Struktur der Dateien als Schema-Test gegen Spec-Beispiele (Abschnitt 6). + +### 4.6 Jahreswechsel (AP8) + +- Bezügeanpassungs-Import-Wizard (Tabellen des neuen Sammelgesetzes → + neue `entlohnungsstufe`-Versionen; Plausibilitätsprüfung, Freigabe, + Änderungsprotokoll). +- `rule_parameters_.xml` je Jahr (LSt/SV/Grenzen) als normale + Modul-Daten; Fristenkalender (L16 Ende Februar, JASV 15. Folgemonat — + AP0 verifizieren). + +## 5. Daten-/Modell-/Report-Implikationen + +- Multi-Company je Gemeinde unverändert über Engine/Security; Katalog- + Daten global (kein `company_id`), Regeln company-dependent-Konten. +- Reports: Lohnzettel = Payslip-Report im AT-Layout (qweb), Monatsdienst- + liste (je Mitarbeiter/Periode), Monatsjournal (je Ansatz/Konto, DG-Summen) + — alles qweb auf `hr.payslip`/Aggregaten, keine eigene Reporting-Engine. +- Rechenfall-Dokumentation je Regel (im `docs/` des Moduls) als Review-Grundlage. + +## 6. Tests (hinzuzufügen) + +`tests/` mit Rechenfall-Suiten (Lohntarif- und SV-Werte aus den verifizierten +2026er Quellen; Katalogwerte aus RV 0715): + +1. `test_katalog`: Import 2026, Versionierung, Lookup Stichtag, Vorrückungstermin +2. `test_entgelt`: Vollzeit/Stufe; Teilzeit 50 % (KIZU ungekürzt); Eintritt + am 15. (Prorate); Überstunden; Journaldienst/Bereitschaft; Jubiläum +3. `test_sz_quartalsweise`: Q-Ende voll; unterbrochenes Vierteljahr anteilig +4. `test_lohnsteuer`: Tarifgrenzen 2026 (0 %-Zone, Mittelzone, > 104.859), + § 68-ÜStd-Pauschale, SZ-Behandlung (per LStR-Konvention AP0) +5. `test_sv`: HBG je Zweig inkl. SZ-HBG; Geringfügigkeit 551,10 + § 53a; + AV-Staffel; FLAF-DB (Parameter); IESG 0,10 % +6. `test_posting_vrv`: Regel→Konto/Ansatz; Summe je Ansatz = Summe Regel; + **L2-Anker: Kontenklasse-5-Ist des Lohnlaufs = Anlage-1a-Engine-Wert** + (Muster wie im VRV-Modul); Rückstellungszuführung +7. `test_meldewesen`: Schema-/Beispielvalidierung L16 + ELDA (sobald Specs); + Prüfprotokolle +8. Refund-Lauf (Korrektur) ohne Doppelbuchung + +## 7. VRV-/Buchhaltungs-Überlegungen + +- EHH zuerst, FHH über Zahlungsverkehr (keine künstlichen FHH-Buchungen im + Lohnlauf); § 12/Barvorlagen irrelevant für Personal. +- Ansatz-Attribution über `budget_position_id` je Move-Line (bestehende + Felder/Engine des VRV-Moduls; keine Parallelstruktur). +- Rückstellungen (Abfertigung § 130) buchungsseitig mit Verprobungsankern; + Altpensionen/Versorgung sind **Option O2**, nicht R1. + +## 8. Risiken / offene Fragen (vor Implementierungsbeginne in AP0 klären) + +1. **Buchungsmatrix**: exakte Anlage-3b-Konten je Bezugsart mit der + Gemeindebuchhaltung (AP0-Workshop) — Voraussetzung für 4.3. +2. **FLAF-DB öffentlich (P5)**: exakter aktueller Satz § 49a Abs 8/9 ASVG + (RIS-Verifikation; Firecrawl-Limit ausnehmen). +3. **SZ ↔ Lohnsteuer (P9)**: quartalsweise SZ in der § 68 Abs 5/6-Systematik + (LStR 2002; ggf. BMF-Auskunft) — betrifft Regel `LSTSZ`. +4. **ELDA-/FinOnl-Specs**: Beschaffung + Testdaten (AP0) — bis dahin werden + die Exporte als „strukturvalidiert gegen Spec-Beispiel“ abgenommen. +5. **Prorate-Konvention** Ein-/Austritt (Kalender-/Arbeitstage) aus + GemBG § 64 und Praxis der Gemeinde (AP0/Bestandsaufnahme). +6. **SV-Träger** ÖGK Bgld. (P6) aus Unterwart-Läufen bestätigen. +7. Bestands-Sonderfälle (Lehrlinge/Organe/Altpensionen) — Optionen O1–O3. + +## 9. Meilensteine (AP-Mapping, post-Auftragserteilung) + +| M | Inhalt | APs | Dauer | +|---|---|---|---| +| M0 | Freigabe dieses Plans | — | heute | +| M1 | Bestandsaufnahme Pilotmandant, Buchungsmatrix, P5/Träger/Specs, Konventionen | AP0 | ~2 Wo | +| M2 | Katalogmodell + 2026er Daten + Vertragsfelder + Erstläufe intern | AP1 | ~3 Wo | +| M3 | Entgelt-Engine (Zulagen/ÜStd/SZ), Lohnsteuer, SV/DB | AP2–AP4 | ~6 Wo | +| M4 | Meldedateien + Belege | AP5–AP6 | ~4 Wo | +| M5 | VRV-Buchung + Rückstellung + Jahreswechsel-Importer | AP7–AP8 | ~3 Wo | +| M6 | Rechenfall-Suiten komplett, UI/Security/Doku/Schulung, **2–3 Monate Parallellauf**, Abnahme | AP9–AP10, PM | ~2,5 Mo | + +Gesamtkalkulation unverändert ≈ 260 PT (Kalkulationsdokument); +M1-M5 sequenziell, M6 teilweise parallel zu M3–M5. + +## 10. Freigabe-Antrag + +Mit Freigabe dieses Plans startet die Umsetzung mit **M1 (AP0)** und +anschließend M2 (AP1: Katalogmodell + Seed-Daten + Vertragsfelder). +Änderungen am Scope (Prämissen-Verletzungen, Optionen) laufen über +Change-Requests. \ No newline at end of file