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.
5.4 KiB
Rechenfälle FI-Buchung UGB (GP6) — KFS/BW 6-Buchungsmatrix
Quellen: Österreichischer Einheitskontenrahmen KFS/BW 6
(Fachsenat Betriebswirtschaft der Kammer der Wirtschaftstreuhänder
2017; Nutzer-Referenz-Exemplar .additional_docs/KFSBW6_13072017_ RF.pdf, extrahiert nach /tmp/kfsbw6/ — ad hoc, unversioniert);
Nutzer-Entscheidungen 2026-09-12 (NET-Konto 3850; Arbeiter/Angestellte-
Split bestätigt — 600–619 Löhne, 620–639 Gehälten zugeordnet;
BV-Verbindlichkeit 3600; BV-Aufwand Kandidaten 6440 vor 6400).
Umsetzung: models/account_chart_private.py (Matrix + Hook
_configure_payroll_account_at), models/account_posting_private.py
(EKR-Debit-Split), data/hr_payroll_account_private.xml (Trigger für
Bestands-Companies). Tests: test_account_private.py.
Systematik (GP6, verifiziert)
- Odoo-Mechanik:
hr_payroll_accountbuchet je Payslip-Linie aufhr.salary.rule.account_debit/account_credit(Company-Properties); Posting-Schema: Brutto-Regeln nur Debit (Aufwand), DN-Abzüge nur Credit (Verrechnung), NET nur Credit auf das reconcilable NET-Konto (action_register_paymentprüftNET.account_credit.reconcile— deshalb Regelcode-Umbenennung NETTO → NET), DG-Regeln Debit + Credit. Der Move balanciert automatisch; NET-Konto-Saldo = Netto. - Hook-Trigger (beide idempotent): (1) Chart-Load des
AT-Kontenrahmens →
account.chart.template._post_load_data→_load_payroll_accounts('at', company); (2)<function>-Datendatei für Bestands-Companies (res.company.chart_template = 'at'; der ERSTE<value>ist die Record-ID-Liste des Aufrufs — Musterl10n_be_hr_payroll_account). Fehlende Konten werden nur gewarnt (Kontenplan der Referenzbuchhaltung ist verbindlich, GP0-Rest); Ausnahme NET-Konto 3850 („Verbindlichkeiten aus Lohn und Gehalt", EKR-Bereich 370–389): wird angelegt und auf reconcile gesetzt — l10n_at-Standardchart hat es nicht. - EKR-Debit-Split Arbeiter/Angestellte (KFS/BW 6: 600–619 Löhne,
620–639 Gehälter, 650–655/656–659 Sozialaufwand, 660–665/666–669
Abgaben):
l10n_at_personalgruppeam Vertrag steuert je Regel das Override-Debitkontol10n_at_account_debit_arbeiter(Gesamtüberschreibung von_prepare_slip_linesnach Upstream-Muster, Odoo-Pin 19.0+e.20260910 — kein nativer Override-Punkt). Credits gruppenneutral. Option A minimal: Overrides nur für Grundentgelt 6000, Sozialaufwand 6500, Abgaben 6600/6601/6602; Zuschläge (6225), ÜStd (6310), Prämien (6230), SZ (6240) und BV (6440, EKR 644 ohne Split) buchen für Arbeiter bis zur Referenzbuchhaltungs-Fixierung auf die Angestellten-Konten.
Buchungsmatrix
| Regel | Debit Angestellte | Debit Arbeiter (Override) | Credit |
|---|---|---|---|
| KVGEO, URL_UE | 6200 Gehälter | 6000 Löhne | — |
| NACHT_SV, MEHR_* | 6225 Zulagen | — (Option A) | — |
| UE_* | 6310 Überstunden | — (Option A) | — |
| PRAM | 6230 Prämien | — (Option A) | — |
| B13, B14, B14_RUECK | 6240 Sonderzahlungen | — (Option A) | — |
| SVDN_KV/PV/AV/AK/WF, SVDN_SZ | — | — | 3600 SV |
| LST_LFD, LST_SZ | — | — | 3540 Lohnsteuer |
| NET | — | — | 3850 Verbindlichkeiten Lohn/Gehalt (reconcile) |
| SVDG_* (inkl. SZ, UV_GFG) | 6560 Sozialaufwand Angest. | 6500 | 3600 |
| BVG | 6440 (EKR 644; Fallback 6400) | — | 3600 (Abfuhr via KV-Träger) |
| FLAFDB | 6661 FLAF-DB | 6601 | 3541 Verrechnung DG-Beitrag |
| KOMMST | 6660 KommSt | 6600 | 3550 Verrechnung KommSt |
| DZ | 6662 DZ | 6602 | 3542 Verrechnung DG-Zuschlag |
Journal: SLR Lohnverrechnung (Typ allgemein, Default-Konto
6200 Gehälter — Ausgleichsbuchung bei Unbalance, BE-Muster:
Journal-Default = Bezugs-Aufwandskonto; Odoo-Constraint verbietet
Receivable/Payable-Konten als Journal-Default); Structure →
journal_id.
Rechenfälle (Fixtures test_account_private.py)
| RF | Konstellation | Erwartung |
|---|---|---|
| RF-BUCH-1 | Angestellte(r), November mit B13; Hook zweimal | Matrix verdrahtet (6200/6240/6560/6440/6660/6661, Credits 3600/3540/3550/3541, NET 3850, Journal SLR); 3850 nur 1×; Move balanciert; Zeilensalden je Konto = Payslip-Liniensummen (SV-Saldo 3600 = DN+DG+BV; NET = −3850-Saldo) |
| RF-BUCH-2 | Personalgruppe Arbeiter, November mit B13 | Grundentgelt auf 6000 (6200 = 0), SV-DG auf 6500, KommSt/FLAF auf 6600/6601; B13 weiter auf 6240 (Option A); DZ ohne WKO-Flag ohne Zeile; balanciert |
| RF-BUCH-3 | Geringfügiger (500 €, §-53a) | 6200 = 500; §-53a-UV 6,50 auf 6560; BVG 7,65 auf 6440; Credit 3600 = 14,15; NET 500 auf 3850; balanciert |
| RF-BUCH-4 | Ohne 6000/6600er/3850 im Plan | Hook warnt (fehlend-Liste), Arbeiter-Override bleibt leer → Fallback 6200 für Grundentgelt; 6500 existiert → SV-Override gesetzt; NET-Konto 3850 wird angelegt (reconcile) |
Offene Punkte / bewusst nicht in GP6
- Arbeiter-Sub-Konten (Zuschläge/ÜStd/Prämien/SZ im 600er-Bereich) und die 6600er-Kontenbelegung: Option A minimal — endgültige Codes fixiert die Referenzbuchhaltung (GP0-Rest); Company-Properties sind übersteuerbar, fehlende Kandidaten führen nur zu einer Warnung.
- Kein Mapping für DAG (keine Payslip-Zeile, Ausweis GP8), keine Aufrollungs-/Beitragsmonats-Sonderbuchungen (GP8), kein L16/mBGM (GP7). Kein VRV/MVAG/Ansatz — Gemeinde-Schiene bleibt gem360-Brücke.
- Auszahlung über
hr_payroll_account_iso20022(SEPA) — Payment- Registrierung setzt NET-account_credit.reconcile voraus (✓ 3850).