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.
Laufender Beitrag (§ 6 BMSVG): Regel BVG (Kategorie ATP_DG, ohne Nettoeffekt) auf EIGENER, ungecappter BV-Grundlage — §-49-bereinigt, ohne HBG-/Jahresdeckel (§ 6 Abs 5 iVm § 49 ASVG) und ohne §-67-Abs-3/6-Zeilen (§ 49 Abs 3 Z 7 ASVG); bewusst kein Rückgriff auf die SV-SZ-Basis des Kerns (Nutzer-Entscheidung eigene BV-Grundlage; deren Z-7-Ausschluss fehlt — GP4-Beobachtung bleibt offen dokumentiert).
Beitragsfreier erster Monat taggenau: Fenster [Eintritt, Eintritt + 1 Monat), Beitragspflicht ab Monatsjubiläum (15. 06. → 15. 07.; KB-Beispiel lb-vor-03: 4.500/30 × 17 = 2.550 — die ab-Folgetag-Lesart war ein Off-by-one und wurde verworfen); 30-Tage-Aliquotierung über die Lohnsteuertage (Teilmonate ohne Doppelabzug); Monatsende-Klippe (Eintritt 31. 01.): Fenster bis Monatsultimo, Pflicht ab Folgemonatserstem (ABGB-Fristrechnung); AV ≤ 1 Monat zur Gänze beitragsfrei.
Wiederzulassung binnen 12 Monaten → Beitragspflicht ab dem 1. Tag; Vor-AV beliebiger Dauer (auch < 1 Monat, Nutzer-Klarstellung) und schlägt auch die Kurz-AV-Freiheit des laufenden AV (OGH 9 ObA 30/16a; Suche über frühere hr.version mit contract_date_end im 12-Monats-Fenster). Sonderzahlungen werden nicht um das Fenster gekürzt, bleiben frei nur bei Beitragsmonat (voller Datumstag, taggenau) im Fenster. Geringfügig Beschäftigte und Lehrlinge sind erfasst — BVG läuft auch im §-53a-Fall.
Anwartschaft (§ 15: gutgebrachte Beiträge + Erträge, keine Monatsentgelt-Staffel) on-the-fly aus validierten Läufen; Anwartschaftsreport (QWeb auf hr.employee) und Endabrechnungs-Wizard (§§ 14-17: §-14-Abs-2-Verfügungsmatrix, < 36 Beitragsmonate sperrt immer, §-16-Fälligkeit am Ende des zweitfolgenden Monats, 6-Monats-Erklärungsfrist, 5 Verfügungsoptionen) — die Auszahlung erfolgt durch die MV-Kasse, nicht über den Payslip.
Stammdaten: Vertrags-Flag l10n_at_abfertigung_neu (§ 46) + Modell l10n.at.bv.kasse (Leitzahl für eSV/mBGM; Seed der 7 Kassen-Namen noupdate, lb-gsv-11 — Leitzahlen aus Mandats-Unterlagen) + Mitarbeiter-Felder l10n_at_bv_ertraege/l10n_at_bv_monate_extern (Kassen-Auszug).
Bewusst nicht: §-7-BMSVG-Fiktivfälle (dokumentierte Option), Geringfügigen-Jahreszahlung + 2,5 % (GP7), BV-Provider (Option).
Tests: test_bv_private (10 Fälle, RF-BV1-10); gesamt 84/84 grün (frischer -i-Lauf auf Wegwerf-DB). Rechenfälle docs/rechenfaelle/abfertigung.md. 19.0.5.0.0.
Anbindung der privatwirtschaftlichen Structure an den GP4-Kern nach
dem bewährten GP3-Muster (dünne 1-Zeilen-Regeln; Logik und Werte
verbleiben im Kern — hr.salary.rule.struct_id ist required, geteilte
Kern-Regeln sind mechanisch unmöglich).
SVDN_SZ-Nachtrag (§ 67 Abs 12): Die SV-DN auf sonstigen Bezügen war in
GP3 nur als Bemessungsbestandteil der §-67-Lohnsteuer wirksam, fehlte
aber als eigene Abzugszeile — das Netto in §-67-Monaten war um den
SV-DN(SZ) zu hoch (RF-L1: 290,79 € nach §-2a-Korrektur). Die Erwartungen
in test_01/test_20 wurden entsprechend korrigiert.
DG-Block (Kategorie ATP_DG, ohne Nettoeffekt): SVDG_KV/PV/AV/UV/WF/IESG
laufend, SVDG_SZ_* auf Sonderzahlungen, SVDG_UV_GFG (§-53a-Pauschale
geringfügig Beschäftigter) sowie die Lohnnebenkosten FLAFDB (§ 41
FLAG), KOMMST (§ 9 KommStG) und DZ (§§ 122/126 WKG, nur bei Company-
Flag l10n_at_wk_mitglied; Satz je Betriebsstätten-Bundesland).
Gemeinsame LNK-Basis in payslip_private.py (_at_lnk_basis): monatlich
gezahlte Arbeitslöhne nach Zufluss, ohne §-67-Abs-3/6-Bezüge (Kern-Flag
l10n_at_s67_abs), lit-f-Befreiung nur für FLAF und DZ (KommSt ohne),
Freibetragsstaffel 1.095/1.460 €.
Rechenfälle docs/rechenfaelle/sozialversicherung.md (RF-SV-1 bis -7)
und §-2a-Korrekturvermerk in lohnsteuer.md. Tests: test_sv_private
(8 Fälle); gesamt 74/74 grün auf odoo_dev.
Documentation-only updates from the General-AT track (2026-09-10/11)
that had been left uncommitted; no code changes.
- RECHTSQUELLEN-Privat: new section 13 (cross-check of all 571 KB
legal_bases citation strings, ~130 statutes, against the binding RQ
inventory; outside-scope delimitation) and procurement-list
extensions in section 11 (AVRAG, ASVG contribution/notification
block, EStG, KommStG/BAO, AUEG, UrlG, BMSVG, IESG, LohnkontenVO,
Mutterschutz-/Karenz block as scope decision)
- IMPLEMENTIERUNGSPLAN-Privat: new section 2.1 (knowledge-base binding
regime, KB as curated secondary source with ID and Stand), GP2-GP8
fine mechanics backed by KB entries, new open points 8.11 DZ
surcharge decision, 8.12 KB conflict families for RIS clarification
and 8.13 scope candidates; source reference updated to the
odoo_19.0+e.20260910 tree
- CHANGELOG: 2026-09-10 entries for the primary-source procurement
(19 RIS statutes via RIS title search incl. short-title traps, LStR
2002 findok XML, DM-ORG 42.7.0 with L16/L17 checklists, SV values
2026), the KB legal-basis cross-check and the plan knowledge-base
integration; the 'Krankengeldumlage par. 62 ASVG' false premise is
resolved and corrected in RQ and plan
- README and module README: dev-host runtime documentation (PostgreSQL
18.6, Python 3.14 venv with editable install of the merged tree,
odoo_dev database, test invocation via .venv/bin/python -m odoo;
GP1 test_kv_katalog green, 8 tests 0 errors)
- .gitignore: odoo_19.0+e.20260910/ and .venv/ replace the removed
odoo/ and odoo_enterprise/ checkouts; ignore local tooling
(.zed-hours/, /tools/ anchored to the repo root so
personalverrechnung/tools stays fully tracked)
GP1 of the approved General-AT implementation plan: the KV
framework for the Austrian private economy on the Odoo 19
hr_payroll engine.
- l10n.at.payroll.kv: collective agreement master data with chamber,
union, validity date and a trace link to the KV library
(personalverrechnung/quellen/kv/)
- l10n.at.payroll.kv.wert: versioned KV parameters following the
hr.rule.parameter.value pattern (Python literal, unique per
KV/code/date); consumed via employee.kv_id._wert(code, date)
- l10n.at.payroll.kv.gruppe / .stufe: Verwendungsgruppen with
Erfahrungsstufen year tables, unique(gruppe, stufe, gueltig_ab),
Stichtag lookup
- hr.version / hr.employee contract fields: kv_id, kv_gruppe_id,
erfahrungsstufe, ueberzahlung
- import wizard for KV intake and yearly updates: table paste
(Gruppe;Stufe;Gehalt[;Bezeichnung]), preview, >10% jump warning
(warn lines never applied automatically), new gueltig_ab versions,
historical values untouched
- seed D2 (SI-2203 Handwerk und Gewerbe, SI-2748 Metallgewerbe):
wage tables from 1. 1. 2026 curated from the KV library texts -
18 groups, 131 stage values, 27 parameters, including the special
progression groups IV-M / V-OM (SI-2748) and the discontinued
VG I (SI-2203)
- tests: test_kv_katalog (seed lookups, Stichtag behaviour,
versioning, parameters, wizard, contract fields)
Statically validated (py_compile, XML well-formedness, CSV
consistency, wizard logic simulation); runtime acceptance pending
PostgreSQL on the dev host.
Approved implementation plan for l10n_at_hr_payroll_private (M0,
decisions D1-D4) and the GP0 legal-source inventory
RECHTSQUELLEN-Privat.md, verified against primary sources (RIS,
jusline):
- FLAF-DB § 41 FLAG: 3.7% for 2026, 2.7% from 2028 (GesNr 10008220);
KommStG 1993: 3% (GesNr 10004841)
- 13th/14th salary taxation runs via § 67 EStG (Jahressechstel fixed
rates, control sixth § 77 Abs 4a); § 68 covers allowances/surcharges
only - plan citation corrected, also fixes the legal basis of the
Bgld open point P9
- Urlaubsentgelt is § 6 UrlG (§ 9 repealed since 2001) - corrected
- EOSB: no Monatsentgelt staffel; § 15 BMSVG pays out the Anwartschaft
with § 14 Abs 2 Verfügungsausschluss matrix - GP5 design confirmed
- 2026 overtime measure: first 15 hours, max 170 €/month
(§ 124b Z 476 lit c BGBl I 43/2026)
Plan section 8 items 3-6 and UrlG (8) marked verified; private module
skeleton README, MEMORY, CHANGELOG and payroll skill updated (§ 67
citation fix, RECHTSQUELLEN-Privat.md as required source).