Buchungsmatrix nach dem Oesterreichischen Einheitskontenrahmen (KFS/BW 6; Nutzer-Referenz-Exemplar .additional_docs/KFSBW6_13072017_RF.pdf): Hook _configure_payroll_account_at (models/account_chart_private.py) ordnet Regelkonten, Journal SLR (Default = Gehaelterkonto 6200, BE-Muster) und das NET-Konto 3850 "Verbindlichkeiten aus Lohn und Gehalt" (Nutzer-Entscheidung 5.1; Anlage + reconcile, l10n_at-Standardchart hat es nicht) je Company zu — getriggert beim Chart-Load (_post_load_data) UND ueber die <function>-Datendatei data/hr_payroll_account_private.xml fuer Bestands-Companies (erster <value> einer function ist die Record-ID-Liste, convert.py-Semantik), idempotent. Konto-Suche exakt zuerst, Praefix-Fallback nur bis eine Stelle laenger — verhindert Matches auf Odoo-Scaffold-Konten chartloser Firmen (6000 darf nicht 600000 "Expenses" matchen). EKR-Debit-Split Arbeiter/Angestellte (Nutzer-Klaerung: 600-619 Loehne, 620-639 Gehaelter — "6000 Gehaelter/6200 Loehne" war gegen die eigene KFS/BW-6-Referenz vertauscht): l10n_at_personalgruppe am Vertrag (models/hr_version_private.py) + Override-Feld l10n_at_account_debit_arbeiter je Regel; Option A minimal (Nutzer-Entscheidung 5.2: Grundentgelt 6000, Sozialaufwand 6500, Abgaben 6600/6601/6602; Zuschlaege/UeStd/Praemien/SZ und BV (EKR 644 ohne Split) buchen fuer Arbeiter bis zur Referenzbuchhaltungs-Fixierung auf die Angestellten-Konten — fehlende Konten warnen, keine Erfindung). models/account_posting_private.py: Gesamtueberschreibung von _prepare_slip_lines nach Upstream-Muster (Odoo-Pin 19.0+e.20260910) mit einzeiliger Kontosubstitution — Odoo bietet dafuer keinen Override-Punkt; Verhalten testgepinnt. Matrix: KVGEO/URL_UE 6200/6000, Zuschlaege 6225, UeStd 6310, Praemien 6230, B13/B14 6240, DN-SV/LSt auf 3600/3540, NET 3850, SVDG-Block 6560/6500 auf 3600, BVG 6440 (Fallback 6400) auf Credit 3600 (Abfuhr via KV-Traeger, Nutzer 5.3), FLAFDB 6661/6601 auf 3541, KOMMST 6660/6600 auf 3550, DZ 6662/6602 auf 3542. NET-Umbenennung NETTO -> NET (Odoo-Konvention: action_register_payment, net_wage und Negativ-Netto-Erkennung filtern code == NET) inkl. 4 Bestands-Suiten. Odoo-19-Fund: das Anlegen einer Structure kopiert die Regeln des hr_payroll.default_structure (BASIC/GROSS/NET/...) via Feld-Default in rule_ids — die kopierte Default-NET-Regel kollidierte im result_rules-Dict (Netto fiel auf 0); Fix: <function> in salary_rules_private.xml archiviert die Kopie (active=False; KEIN Unlink — struct_id ist NOT NULL und historische Lohnkontolinien behalten ihre Regel-Referenz; One2many blendet Archivierte aus). Journal-Default-Konten duerfen nicht Receivable/Payable sein (Odoo-Constraint); Rundungscents bucht Odoo als Adjustment Entry aufs Journal-Default. depends: + l10n_at, hr_payroll_account_iso20022 (SEPA-Auszahlung, Plan 4.5; kein VRV/MVAG — gem360-Bruecke). Tests: test_account_private (4: RF-BUCH-1..4 — Kontenplan-Mock ohne Chart-Install, Move-Balance, Kontenzeilen je Matrix, Arbeiter-Split, Geringfuegiger, Fallback/Warnung) — gesamt 88/88 gruen auf Wegwerf-DB (frischer -i-Lauf). Rechenfaelle docs/rechenfaelle/buchhaltung.md. 19.0.6.0.0.
7.3 KiB
l10n_at_hr_payroll_private (General-AT)
General-AT-Payroll (KV-basierte Privatwirtschaft: KV-Gehaltskataloge, AZG/UrlG-Arbeitszeit, 13./14. Bezüge, Abfertigung Neu) für Odoo 19.
Implementierungsplan (freigegeben, M0):
personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md
· verbindliche Rechtslage:
personalverrechnung/RECHTSQUELLEN-Privat.md
GP1 umgesetzt (KV-Framework):
l10n.at.payroll.kv— KV-Stammdaten mit Trace-Link zur KV-Library (library_variant_id→personalverrechnung/quellen/kv/kv-catalog.json) und Quellen-URL der Arbeitgeberkammer;l10n.at.payroll.kv.wert— versionierte KV-Eckwerte (Musterhr.rule.parameter.value, KV-Scope): Regelkonsum überemployee.kv_id._wert('code', payslip.date_to);l10n.at.payroll.kv.gruppe/.stufe— Verwendungs-/Lohngruppen mit Erfahrungsstufen, Jahrestabellen jegueltig_ab(unique(Gruppe, Stufe, Stichtag));- Vertragsfelder auf
hr.version(durchgereicht aufhr.employee):kv_id,kv_gruppe_id,erfahrungsstufe,ueberzahlung; - Import-Wizard „KV-Katalog importieren": Tabellenpaste/CSV
(Gruppe;Stufe;Gehalt[;Bezeichnung]) mit Vorschau, Sprungwarnung
10 % (Warnzeilen werden nie automatisch übernommen) und Versionierung über
gueltig_ab— historische Werte bleiben unangetastet.
Seed D2 (Referenz-KVs R1): SI-2203 „Handwerk und Gewerbe" +
SI-2748 „Metallgewerbe", Gehaltstabellen ab 1. 1. 2026 kuratiert aus den
KV-Library-Volltexten (quellen/kv/oegb/texts/). Besonderheiten im Seed:
- SI-2203: VG I ist ab 1. 1. 2026 aufgelassen (Vorrückung nach § 17 Abs 6); Meistergruppen M I–M III als eigene Gruppen (M II ohne/mit Fachschule);
- SI-2748: eigene Vorrückungsverläufe als eigene Gruppen (IV-M = Meister in VG IV bis „nach 17 VWGJ", V-OM = Obermeister bis „nach 12 VWGJ"); Nacht-Sondervergütung 2,71 € (2026) bzw. 2,76 € (2027) als Jahresversionen.
Kern-Vorfinanzierung (D3): Lohnsteuer (AP3) und SV/DB-Regeln (AP4)
werden im Kern-Modul l10n_at_hr_payroll gebaut und von beiden
Produkten konsumiert; bei Bgld.-Auftragserteilung Anrechnung per
Change-Request.
GP2 Entgelt-Engine (umgesetzt 2026-09-11): Structure „AT
Privatwirtschaft (KV)", AZG-Fenster-WETs, Regelinventar
KVGEO/NACHT_SV/UE_/MEHR_/URL_UE/B13/B14/B14_RUECK/NETTO —
vollständig kv.wert-getrieben (Rechenfälle docs/rechenfaelle/).
GP3 Lohnsteuer (umgesetzt 2026-09-11): dünne Regeln
SVDN_KV/PV/AV/AK/WF + LST_LFD/LST_SZ auf dem AP3-Kern (§ 66
kumulativ mit Rollung, § 67 Sechstel/Fixsätze mit Günstig-
Aufrollung, § 68-Steuerfreiheiten; Rechenfälle docs/rechenfaelle/ lohnsteuer.md).
GP4 SV/DB (umgesetzt 2026-09-11): SVDN_SZ-Nachtrag (§ 67 Abs 12 —
Netto-Korrektur in §-67-Monaten), DG-Block SVDG_KV/PV/AV/UV/WF/IESG +
SVDG_SZ_* + §-53a-UV Geringfügiger (Kategorie ATP_DG, ohne
Nettoeffekt; ÖGK 2026: DG 20,98 % / Wien 21,23 %), Lohnnebenkosten
FLAFDB (§ 41 FLAG), KOMMST (§ 9 KommStG) und DZ (§§ 122/126 WKG,
company-flag-gated) mit Freibetragsstaffel 1.095/1.460 € — Logik/Werte
im Bundes-Kern (models/sozialversicherung.py, D3-Vorfinanzierung):
§-2a-ALV-DN-Staffel, Geringfügigkeit (§ 5 Abs 2 iVm § 810 Abs 3 ASVG),
beitragsfreie Bezüge § 49 Abs 3 mit Jahres-Kumulativen,
altersabhängige Satzausschaltungen (§ 1 Abs 2 lit e AlVG, § 51
Abs 6/7 ASVG, § 12 IESG), WF-Satzvektor Wien, Beitragsmonats-
Allokation (Anspruchsprinzip) und DAG-Bewertung (§ 1 DAG).
Rechenfälle docs/rechenfaelle/sozialversicherung.md.
GP5 Abfertigung Neu (umgesetzt 2026-09-11): BMSVG-Regel BVG
(§ 6 Abs 1: 1,53 % DG auf Entgelt und SZ; Kern-Parameter
at_sv_bv_dg) auf EIGENER, ungecappter BV-Grundlage (§ 6 Abs 5
iVm § 49 ASVG — kein HBG-/Jahresdeckel, ohne §-67-Abs-3/6-Zeilen gemäß
§ 49 Abs 3 Z 7 ASVG) — models/abfertigung_private.py:
- Beitragsfreier erster Monat taggenau (§ 6 Abs 1): Fenster [Eintritt, Eintritt + 1 Monat), Pflicht ab Monatsjubiläum (15. 06. → 15. 07.); 30-Tage-Aliquotierung (KB 4.500/30 × 17 = 2.550); Monatsende-Klippe (31. 01.) → frei bis Monatsultimo, Pflicht ab Folgemonatserstem; AV ≤ 1 Monat zur Gänze beitragsfrei; Wiederzulassung binnen 12 Monaten → Pflicht ab dem 1. Tag (OGH 9 ObA 30/16a; Vor-AV beliebiger Dauer — auch < 1 Monat);
- SZ ohne Fenster-Kürzung; frei nur bei Beitragsmonat im Fenster (taggenau); läuft auch für geringfügig Beschäftigte und Lehrlinge (§ 46, § 1 Abs 2 Z 1);
- Anwartschaft (§ 15: gutgebrachte Beiträge + Erträge aus dem
Kassen-Auszug, KEINE Monatsentgelt-Staffel) aus validierten
Läufen; Vertragsfelder Abfertigung-Neu/BV-Kasse
(
l10n.at.bv.kassemit Leitzahl für eSV/mBGM) + Erträge/Vor-Beitrags- monate am Mitarbeiter; Anwartschaftsreport (QWeb, am Mitarbeiter druckbar) + Endabrechnungs-Wizard (§§ 14-17: §-14-Abs-2- Verfügungsmatrix mit 36-Beitragsmonate-Kriterium, §-16-Fälligkeit, 6-Monats-Erklärungsfrist, 5 §-17-Optionen) — Auszahlung selbst läuft über die MV-Kasse, nicht über den Payslip.
Rechenfälle docs/rechenfaelle/abfertigung.md.
GP6 FI-Buchung UGB (umgesetzt 2026-09-12): Buchungsmatrix nach dem
Österreichischen Einheitskontenrahmen (KFS/BW 6): Hook
_configure_payroll_account_at (Chart-Load + <function>-Datendatei,
idempotent; Konto-Suche exakt mit Längen-gebundenem Präfix-Fallback —
kein Match auf Odoo-Scaffold-Konten) ordnet Regelkonten, Journal SLR
(Default = Gehälterkonto, BE-Muster) und das NET-Konto 3850
„Verbindlichkeiten aus Lohn und Gehalt" (Anlage + reconcile) zu.
EKR-Debit-Split Arbeiter/Angestellte: l10n_at_personalgruppe am
Vertrag + Override-Feld l10n_at_account_debit_arbeiter je Regel
(Option A minimal: Grundentgelt 6000, Sozialaufwand 6500, Abgaben
6600/6601/6602; Zuschläge/ÜStd/SZ/Prämien buchen bis zur
Referenzbuchhaltungs-Fixierung auf die Angestellten-Konten);
Gesamtüberschreibung von _prepare_slip_lines (Odoo bietet keinen
Override-Punkt; durch Tests gepinnt). Netto-Regel auf Odoo-Konvention
NET umbenannt + die automatisch kopierte Default-NET-Regel wird
archiviert (Code-Kollision im result_rules-Dict; archiviert statt
unlinkt — historische Linien behalten die Referenz).
Auszahlung über hr_payroll_account_iso20022; kein VRV/MVAG
(gem360-Brücke).
Rechenfälle docs/rechenfaelle/buchhaltung.md.
Offen (GP7+): Meldewesen/Belege (GP7), Jahreswechsel (GP8); All-in-UI-Bericht (GP8); B14 längster-Urlaubs-Teil-Verfeinerung; DZ-WKO-Verifikation (8.11) vor Wien-Mandanten; §-7-BMSVG-Fiktivfälle (Präsenzdienst/Kranken-/Wochengeld) als dokumentierte Option (Rechenfälle-Datei); Arbeiter-Sub-Konten (Option A-Rest) mit der Referenzbuchhaltung fixieren (GP0-Rest).
Tests: test_kv_katalog + test_entgelt_private (GP2) +
test_lst_private (GP3) + test_sv_private (GP4) +
test_bv_private (GP5) + test_account_private (GP6) —
.venv/bin/python -m odoo -d <testdb> -i l10n_at_hr_payroll,l10n_at_hr_payroll_private --test-tags /l10n_at_hr_payroll,/l10n_at_hr_payroll_private --test-enable --stop-after-init --addons-path=odoo_19.0+e.20260910/odoo-19.0+e.20260910/odoo/addons,addons
(Lokal grün am 2026-09-12 auf Wegwerf-DB, frischer -i-Lauf:
88/88 Tests — NET-Rundungscents bucht Odoo als „Adjustment Entry"
auf das Journal-Default.)