Compare commits

...

9 Commits

Author SHA1 Message Date
fegger 1df5fb19c4 [ADD] l10n_at_payroll_dokumente: generate documents from templates
Document generation module: templates with own text (structure reference
and source stand documented per template, no licensed full text in the
repo), fill fields resolved from hr data (company, employee, hr.version
stand) plus wizard input, preview rendering and PDF/HTML attachment via
the generic report layout.

- templates: pilot set for the general-AT track formulated as own text
  after the KB muster structure (lb-bes-09, lb-bnd-55, lb-bnd-52/62,
  lb-end-35), legal status per template marked as draft
- rendering via convert_inline_template_to_qweb + ir.qweb (t-out
  auto-escapes values) — deliberately not mail.render.mixin inline
  engine, whose expression whitelist blocks werte[...] placeholders for
  non-template-editors
- wizard resolves hr.version by date_version at the reference date;
  PDF falls back to HTML attachment without wkhtmltopdf
- security: ir.model.access (hr user read / manager write) + company
  rule; 8 tests, suite 236/236 green on a fresh -i database run
2026-09-16 10:36:49 +02:00
fegger efe76e6b3d [FIX] personalverrechnung: record Ausbildungskostenrückersatz gap in AP14 plan
Renewed knowledge-base comparison (2026-09-16, Batch 10) surfaced a new
settlement component not covered by the 2026-09-12 gap analysis:
Ausbildungskostenrückersatz at early termination (lb-end-27/28). Added to
the AP14 scope, anchors and gap list; RIS verification of the legal basis
gates implementation, scope gate at the pilot client.
2026-09-16 10:36:42 +02:00
fegger 27f3b4b7f9 [ADD] personalverrechnung: Lexis360 knowledge base (Batch 10)
Zehnter Lexis 360-Intake (64 Briefings aus den Sektionsordnern
beispiele / muster / uebersichten_checklisten, Quell-Staende
2020-12 bis 2026-08), erweitert das Korpus auf 665 kuratierte
Eintraege in 69 Clustern. Dasselbe Werk, dieselbe Breadcrumb-Form
— die Pipeline globt jetzt die drei Subordner; die neue
no-author-Breadcrumb-Variante (Muster-Exporte
"Kapitel > Thema · <Monat> <Jahr>") defaultet auf "Lexis Redaktion".

- 13 bestehende Cluster erweitert (keine neuen):
  beendigungsarten bnd 44→66 (Muster: Kuendigung/Aenderung/
  Aufloesung/Entlassung/Fristablauf/Befristung/Verwarnung/
  Dienstfreistellung, 13 Checklisten, Anspruchsuebersicht Tod),
  endabrechnung end 25→34 (Beispiele: Zeitschulden,
  Viertel-/Zwoelftelregelung, Voll-Ueberttritt,
  Gleitzeitguthaben, UEL; Checklisten: Ausbildungskosten,
  Kuendigungsentschaedigung; Muster: Vergleich, Vordienstzeiten),
  uberstunden ues 4→9, telearbeit tel 6→11,
  beendigungsphase-sonstiges bso 10→16, arbeitszeitgrenzen azg 4→9,
  arbeitszeitmodelle azm 7→10, entsendung grz 8→11,
  beschaftigungsformen bes 8→10, sonderzahlungen son 5→6,
  schwerarbeit swa 5→6, arbeitskrafteuberlassung aug 2→3,
  urlaub url 16→17
- alte Quell-Staende (2020-12 bis 2025-12) mit "⚠ Alter Stand"
  in den Eintraegen markiert
- Pipeline: BATCH_LEXIS 10, SOURCES["lexis"].pdf_subdirs,
  BC_LINE_NOAUTHOR_RE + Slug-Kollisionsguard in extract_lexis()
- RUNBOOK (Batch-10-Paragraf) und Agent-Memory aktualisiert;
  --registry und --check beide gruen (635/635, 0 problems)
2026-09-16 08:52:47 +02:00
fegger d53e1e64a1 [IMP] l10n_at_hr_payroll_private: add unpaid care/parental leave family (AP16)
Close the parental/care-leave block after the pilot-client scope release (8.13): six unpaid full-release kinds join the generic parental-leave work entry — Bildungskarenz (AVRAG § 11, two to twelve months by agreement with the AMS-financed Weiterbildungsbeihilfe), Familienhospizkarenz for terminal accompaniment (AVRAG § 14a, three to six months), accompaniment of seriously ill children (§ 14b, five to nine months), children's rehabilitation leave (§ 14e, four weeks per year), Pflegekarenz (§ 14c, one to three months, undivided) and the Papa-Monat (VKG § 1a, one month, creditable toward seniority under § 1a Abs 7 VKG iVm § 15f MSchG while Bildungs-/Pflegekarenz is not). All are unpaid at the employer — the external bodies pay the replacement income (AK, AMS, Bundesamt, KV-Träger) — so the new negative KARENZ_ENTGELT rule stops the employer wage per working day through the shared Tagesatz helper whose exclusion list now covers EFZG, Mutterschutz and Karenz corrections. The Versichertenmeldung run emits M4 deregistrations at the end of the pay entitlement (the day before the release begins) and M3 re-registrations at the return date — omitted when the employment itself ends — with the eSV Karenzart strings logged as protocol information pending the special DM-ORG formats (GP7 track). The fictive BMSVG basis gains the § 7 Abs 4 Z 1–3 bridge: when a new maternity prohibition follows a parental-leave stretch directly or after employment of less than three months, the reference months fall before the preceding prohibition, and a re-founded employment within three months of the ended karenziert employment uses the single last full calendar month; contributions during the KBG period are FLAF-financed (§ 7 Abs 5) and during hospice/care leave Bund-financed (§ 7 Abs 6) — no employer rule, verified by test. Pflegeteilzeit and comparable reduced-hour arrangements pay the BV contribution on the pre-reduction wage via a new version field consumed by the BMSVG basis (§ 6 Abs 4). The endabrechnung wizard gains the § 23 Abs 8 AngG full-time re-rating preview (monthly salary ÷ work_time_rate, confirmable) with § 23a Abs 4a and UEL § 10 Abs 4 UrlG guidance. The Mutterschutz status now detects the § 163 ASVG Sonderwochengeld case (prohibition inside a Karenz — the KV-Träger pays the increased sickness benefit) and warns on § 166 ASVG suspension (full for >50 % continued pay, half at 50 %, activity and Pflegekarenzgeld hints). Verified against the original statute text in .ris/ (AVRAG §§ 11/11a/14a–14e, VKG § 1a, MSchG § 15f, BMSVG § 7 Abs 4–6, ASVG §§ 163/166) and the knowledge-base sources lb-kar/elt/kzs/pap/kbg; the vacation proration of leave stretches (§ 15f Abs 2 MSchG on the hr_holidays allocation side), the eSV special formats for the Karenz art block, the full Sonderwochengeld computation and the leave-overlap policy decision remain documented open points.

Version 19.0.17.0.0 (private)
2026-09-15 14:25:48 +02:00
fegger 850e99df20 [IMP] l10n_at_hr_payroll_private: add premiums at termination under § 16 AngG (AP14-B)
Close the premium-at-termination gap of the end-of-employment cycle: an aliquote periodic premium (annual, sales, bonus, 15th payment) whose entitlement period outlasts the termination is covered by § 16 AngG — the pro-rata amount follows the ratio of the elapsed service to the entitlement period, is due for employees regardless of the termination ground (loss clauses void, 9 ObA 82/13v), while performance-linked premiums for workers may validly hinge on non-fault grounds and premiums tied to a specific service (e.g. Bilanzgeld) are not aliquote without the service (lb-end-18). Two routes: PRAM_END (bemessung sonstig) covers premiums paid with the end-of-employment run — a special payment inside the annual sixth at the flat 6 % rate with the 620 EUR free amount and 2 615 EUR free threshold checked by the core, SV as special-payment contributions (KV/PV/AV without AK/WF) against the monthly HBG and the annual SZ cap, fully payroll-levy liable and BV-contributory at the uncapped 1.53 % rate (§ 6 Abs 1 iVm Abs 5 BMSVG). PRAM_END_TARIF (bemessung laufend plus the core l10n_at_s67_abs6_ueberhang flag) covers premiums due at a pre-agreed maturity because their amount only becomes determinable after the entitlement period ends (e.g. balance-sheet premiums): taxed like running pay with the payment-month tariff without touching the annual sixth (§ 67 Abs 10, not a § 67 Abs 8 lit c case per 98/14/0009 = ARD 5483/14/2004) — the SV contribution month rolls back into the termination year via a new payslip field consumed by an extended branch of the existing SV-basis-by-Beitragsmonat override (historical caps and rates, E-MVB 044-01-00-006), while the LSt stays in the payment month. The wizard section previews the § 16 pro-rata amount from the full premium, entitlement period and elapsed service, keeps the payable amount confirmable (KB agreement), requires the service/claim-basis confirmation, enforces the contribution month for the deferred case, and lands the memo on the payslip for the separate Lohnzettel workflow (LStR Rz 911a); the existing manual PRAM rule is untouched. The account matrix posts both rules to 6230. Verified against the original statute text in .ris/ (AngG § 16, BMSVG § 6 Abs 5) and the knowledge-base source lb-end-18; the full SZ roll-forward (storno plus recomputation against the termination year's SZ annual cap) and the mBGM storno/re-transmission remain open in the GP7 payroll-reporting track, and the BV attribution of the deferred premium remains in the payment month as a documented approximation.

Version 19.0.16.0.0 (private)
2026-09-15 13:33:49 +02:00
fegger 472b19a4b2 [IMP] l10n_at_hr_payroll_private: add settlement payments under § 67 Abs 8 lit a (AP15-C)
Complete the termination sequence with the settlement-sum path: comparison sums from court or out-of-court settlements, judgment/decision arrears and dismissal-objection payments are split between the statutory-severance and voluntary-severance rules and the settlement remainder. The remainder (VERGLEICH, bemessung neutral, sv_art laufend) reuses the lit-a/b fifth rule: after deducting the § 62 employee-rate contributions, one fifth stays tax-free capped at one fifth of nine times the monthly HBG (12 474 EUR 2026), and the remaining four fifths run with the payment-month tariff without touching the annual sixth. A new rule flag l10n_at_vergleich_bv marks the part paid for periods with a BV-Kasse entitlement: up to the parameterised cap at_lst_67_abs8_vergleich_bv (7 500 EUR 2026; § 67 Abs 8 is § 33a/§ 124b indexed) it is taxed at the flat 6 % rate with the contributions allocated pro rata (LStR Rz 1102b), while the excess falls back into the fifth rule. Both settlement rules stay payroll-levy liable (§ 41 Abs 4 lit b FLAG exempts only § 67 Abs 3 and 6) and SV-liable in the payment month, with per-Beitragsmonat roll-forward and insurance-period extension remaining documented manual options (lb-end-22, E-MVB 011-02-00-001). Identifiable severance components keep running through the existing statutory and voluntary severance machinery; a settlement expressly agreed as statutory severance is taxed in full under § 67 Abs 3 (VwGH 2013/13/0001 = ARD 6490/20/2016), and pension buy-outs (lit e) and social-plan payments (lit f) are out of scope. The wizard section requires confirmation of the settlement's itemisation and contested-claim status plus the BV entitlement, enforces the BV cap with the excess captured as remainder, and previews the free fifth, tariff basis and 6 % tax; the settlement memo lands on the payslip for the separate Lohnzettel workflow (LStR Rz 911a). The account matrix posts both settlement rules to the provisional 6200/6000 (workers 6000) and the new tax rule to 3540. Verified against the original statute text in .ris/ (EStG § 67 Abs 8 lit a) and the knowledge-base sources lb-end-21/22; KZ positioning of the lit-a tariff parts and their § 291d pot allocation remain documented verification points against LStR Rz 1087 ff.

Version 19.0.15.0.0 (private)
2026-09-15 12:38:19 +02:00
fegger 4b86bcb790 [IMP] l10n_at_hr_payroll_private: add voluntary severance under § 67 Abs 6 (AP15-B)
Split the voluntary severance into its privileged part and a tariff remainder on the exit run: the privileged part combines the quarter rule (1/4 of the last twelve months' running pay, capped at nine times the monthly HBG) with the twelfth rule (2/12 to 12/12 by proven service, capped at n × 3 × HBG), reduced per Z 3 by severance already received and the statutory claim due at this termination, all taxed at the flat 6 % rate. The excess runs as its own rule flagged l10n_at_s67_abs6_ueberhang: taxed with the running tariff of the payment month but excluded from the annual sixth, since Z 5 exempts only the Z 1/Z 2 amounts and the excess is a special payment, not running pay. The twelve-month basis aggregates validated prior runs plus own lines, excluding the flagged excess and § 26 Z 4 travel overhang via a dedicated rule flag. Free of SV (§ 49 Abs 3 Z 7 ASVG), payroll levies regardless of the 6 %/tarif split (§ 41 Abs 4 lit b FLAG, § 122 Abs 8 WKG, § 5 Abs 2 lit b KommStG) and BV contributions; the former BV-Anwartschaft exclusion Z 7 is repealed (BGBl I 118/2015). The wizard proposes the rolling basis and the statutory claim, previews Z 1/Z 2/reduction/privileged/excess/tax and requires explicit confirmation against claim-conversion risk. The § 291d EO termination pot nets both severance wage-tax rules; key 260 now includes LST_ABF_FREI. Verified against the original statute text in .ris/ (EStG § 67 Abs 6) and the knowledge-base sources lb-end-12/13/15; KZ positioning of Abs-6 amounts and the excess's § 291d pot allocation remain documented verification points against LStR Rz 1087 ff.

Version 19.0.14.0.0 (private), 19.0.10.0.0 (core)
2026-09-15 11:34:09 +02:00
fegger 9add58fe83 [IMP] l10n_at_hr_payroll_private: add statutory old-system severance (AP15-A)
Pay the pre-2003 AngG severance from the end-of-employment run as its own neutral benefit line: free of SV (§ 49 Abs 3 Z 7 ASVG) and payroll levies, outside the annual sixth, and collected into the § 291d EO termination pot net of its own wage tax. Taxation follows the binding better-of rule of § 67 Abs 3 EStG: multiple-of-method (tariff wage tax on the running monthly wage × the statutory multiple of the payout) versus the flat 6 % rate, applied mandatorily in favour of the employee. The tariff wage tax is captured as a separately confirmed value instead of deriving it from gross pay through the § 62 engine. The wizard enforces § 23a Abs 3 AngG (parental exit needs five uninterrupted years), blocks BMSVG-new contracts except frozen claims and validates AGRD 02/06 against the claim type. The LNK basis subtracts § 67 Abs 3/6 rules only when they actually run in the tax base, the L16 generator reports LST_ABF in key 260 outside 210/220, and result_rules access in the garnishment paths avoids DefaultDictPayroll materialisation. Verified against the original statute texts in .ris/ (AngG §§ 23/23a, EStG § 67 Abs 3).

Version 19.0.13.0.0 (private), 19.0.9.0.0 (core)
2026-09-15 11:01:55 +02:00
fegger ee94f4664f [IMP] l10n_at_hr_payroll_private: add end-of-employment payroll cycle (AP14-A)
Pay the untaken vacation, dismissal compensation, time balances and open advances from one exit run. The vacation replacement splits natively into a running and a special-payment component per § 67 Abs 8 lit d, only the running part extends the mandatory insurance under § 11 Abs 2 ASVG with sequential windows (dismissal compensation first) and daily-value ceilings. Dismissal compensation follows the one-fifth rule of § 67 Abs 8 lit b without raising the annual sixth, stays fully social-insurable by allocation over the notice period and fully subject to payroll taxes. Advances are offset against net pay only (§ 293 Abs 3 EO) and time credits carry the 50 % statutory surcharge without § 68 relief. Verified against the original statute texts in .ris/; § 67 Abs 6 lump-sum payments are deliberately deferred to AP15.
2026-09-14 16:08:44 +02:00
119 changed files with 12929 additions and 71 deletions
+367 -2
View File
@@ -2,8 +2,373 @@
## Current focus
**Modul l10n_at_payroll_dokumente (Dokumentgenerierung) umgesetzt — 236/236 Tests grün**
(2026-09-16, uncommittet bis Nutzerfreigabe; Modul **19.0.1.0.0**):
- **Anforderung (Nutzer):** Muster → Dokumente aus Stammdaten (Dienstvertrag,
Kündigung, DSE …). Nutzer-Entscheidungen: neues Modul; DSE = vorhandene
Pfändungs-DSE (kein Neubau); **eigene Texte nach Muster-Struktur** (kb_ref/
quell_stand je Vorlage dokumentiert, kein Lexis-Volltext im Repo —
Lizenzthema damit fürs Produkt gelöst; Muster werden laufend ergänzt,
kein Warten nötig: neue Vorlagen = Datenarbeit).
- **Bau:** Modell `l10n.at.payroll.dokument.vorlage` (+ feld): eigener Text
`inhalt_html` (Html, sanitize=False), Feldliste (auto/manuell, pflicht),
kb_ref/quell_stand/rechtsstatus (entwurf|geprueft), company + Rule.
Wizard `l10n.at.payroll.dokument.wizard` (+ Zeilen-Transient): Stichtag →
hr.version (date_version <= Stichtag!), Auto-Resolver (firma/firma_strasse/
firma_plz/firma_ort/mitarbeiter/mitarbeiter_strasse/plz/ort/ead/funktion/
geboren), Manuell-Eingaben, Pflicht-UserError, Vorschau, PDF via
`ir.actions.report._render_qweb_pdf` **mit HTML-Fallback** ohne
wkhtmltopdf (Anhang am hr.employee). Generisches QWeb-Print-Layout
(AbstractModel + data['body'] als Markup, wie DSE-Muster).
- **⚠️ Rendering-Weg (wichtig, abweichend vom Plan):** NICHT
`mail.render.mixin._render_template` (engine inline_template) — deren
Ausdrucks-Whitelist (`mail_allowed_qweb_expressions`, nur object.name u.ä.)
sperrt `werte['…']`-Ausdrücke für Nicht-Template-Editoren (AccessError).
Stattdessen: `rendering_tools.convert_inline_template_to_qweb`
`ir.qweb._render(lxml html.fragment_fromstring(src, create_parent='div'), …)`
+ Wrapper-[5:-6]-Strip (Muster `_render_template_qweb`). Autor-Syntax
bleibt identisch; **t-out escapt Werte automatisch** (kein manuelles
Escaping). t-if-Blöcke für optionale Absätze sind möglich (QWeb direkt).
- **Pilotvorlagen (eigen formuliert, Rechtsstatus 'entwurf'):** DV
Angestellte (lb-bes-09), Kündigung DG (lb-bnd-55), einvernehmliche
Auflösung (lb-bnd-52/62), Vordienstzeitenbestätigung (lb-end-35).
§-Verifikation: § 27 AngG (wichtiger Grund) RIS ✅; **§ 34 AngG =
Verjährung** (nicht Auflösung!) — Auflösungstexte zitieren bewusst keine §§.
- **Tests 8** (Auto-Werte, Platzhalter-Ersetzung, Pflicht-UserError,
Stichtags-Versionen, Anhang PDF/HTML, generisches Layout via
`_render_qweb_html` ohne wkhtmltopdf, ACL hr.group_hr_user vs. base,
Pilotvorlagen E2E). Suite **236/236** (73 Kern + 18 GemBG + 199 Privat
+ 10 Dokumente) frischer -i-Lauf.
- Offen: DSE-Pfändung-Link ins Dokumente-Menü (kosmetisch), mehr Vorlagen
nach Nutzermustererweiterung, Produktivsetzung erst nach rechtlicher
Prüfung (rechtsstatus je Vorlage).
**Erneuter Abgleich Modul ↔ Wissensbasis (2026-09-16, Read-only, Grep-Verifikation am Code):**
Basis PLAN-Restluecken-AP11 (Abgleich 2026-09-12, 601 Einträge) + Zwischenstand AP8/AP11AP16.
Befund:
- **Geplante Reste unverändert offen (0 Code-Treffer je Thema):** AP17 (L17, § 109a/
§ 109b-Meldung, mBGM Geringfügigen-Jahreszahlung 2,5 %), AP18 (NSchG-Monatszähler,
Schwerarbeitsmeldung — ASchV/NSchG-Beschaffungsgate), AP19 (GF/Vorstand-Flag,
Ferialpraktikanten, DVH-Sonderfälle, Präsenzdienst-BV-Fiktion), AP20+-Optionen
(ATZ, Kurzarbeit, Betriebspension/Beteiligung, Entsendung), Quer-LSt: FB+/ANV-
Automatik, Prämien-Anspruchsprinzip (A3-blockiert), 2027-Werte.
- **Zwischenzeitlich ✅ (Code-verifiziert):** All-in § 2g AVRAG (GP2-Deckungsrechnung,
payslip_private `_at_allin_deckung`), Fallweise-Felder + mBGM G3/G4 tagesgenau,
AVAB/AVB-Selection, Nachzahlungspfade (SV/LSt/Endabrechnung), Tod des DN =
Abgangsursache 13, §§ 23f/§ 47-Übertritte in abfertigung_private.
- **1 NEUER Restpunkt aus Batch 10:** **Ausbildungskostenrückersatz** (lb-end-27/28,
Checkliste + Muster) — 0 Code-Treffer, auch nicht im AP11-Plan erfasst →
als Zusatzpunkt in AP14/Endabrechnung (Scope-Gate Pilotmandant) aufnehmen.
- Batch 10 sonst: keine neuen Cluster, keine neuen Berechnungslogiken (Muster/
Checklisten/Übersichten); lb-end-30/31 (freiwillige Abf./Voll-Übertritt) und
lb-end-29 (Zeitschulden) abgedeckt; lb-grz-09..11/lb-swa-06 stützen AP18/AP20.
- KB-interne offene Punkte unverändert: A3 „Formel 7“, A4 All-In-Oberwert,
A7-2026-GFG, C7-2027-Werte, B3 Pensionisten (VwGH), ASchV/NSchG-Beschaffung.
- **Nachgetragen 2026-09-16 (Nutzer):** Ausbildungskostenrückersatz in
`PLAN-Restluecken-AP11.md` (AP14-Umsetzung/Rechtsanker + Lücken-Liste 2.4).
- **Neue Anfrage (2026-09-16, ERLEDIGT — siehe Modul-Block oben):**
`.lexis360/muster/` für Dokumente in Odoo nutzen → Modul
`l10n_at_payroll_dokumente` umgesetzt; Nutzer entschieden: eigene Texte
nach Muster-Struktur (kein Lexis-Volltext im Repo), Lizenz-Redistribution
damit fürs Produkt gelöst; Sammlung wird laufend ergänzt (kein Warten).
**Wissensbasis Batch 10 (3 neue Lexis-Subordner) ABGESCHLOSSEN — 64/64 kuratiert, `--registry` + `--check` grün**
(2026-09-16, Nutzerfreigabe "bitte zur wissensbasis hinzufuegen"):
- 64 neue PDFs in `.lexis360/{beispiele,muster,uebersichten_checklisten}/`
(dasselbe Werk *Lexis Briefings Personalrecht*, dieselbe Breadcrumb-
Form; Stand 2026-06/07/08, wenige alte: 2020-12 … 2025-12). Cleanup
erledigt: 4 Re-Export-Duplikate `(1)` → neuere (15.9.2026) behalten,
ältere gelöscht; `grundklauseln_zu_ausma%c3%9f_...``..._ausmass_...`.
- **Pipeline:** `build_lexis_kb.py``BATCH_LEXIS 9→10`, `SOURCES["lexis"]`
um `"pdf_subdirs": ("beispiele","muster","uebersichten_checklisten")`;
`extract_lexis()` globt Top-Level + Subordner, Slug-Kollisionsguard,
`pdf_rel` via `relative_to(ROOT)`. `--extract --source lexis`:
**635/635, 0 unclustered, 0 warnings**; IDs eingefroren (lb-bnd-45..66,
lb-end-27..35, lb-son-06, lb-url-17, lb-tel-07..11, lb-ues-05..09,
lb-bnd/azg/azm/bes/bso/grz/swa/aug-Erweiterungen).
- **Kuration: 64/64 neue Layer-2-Einträge** in
`personalverrechnung/wissensbasis/dokumente/` (ältere Stände mit
„⚠ Alter Stand“ markiert: lb-tel-07/08/09/10, lb-ues-05/06/08,
lb-bes-09/10, lb-end-27/28/33/34).
- **Validierung grün:** `--registry` → kb.json + INDEX.md **665 Einträge,
69 Cluster**; `--check` → 635 sources / 635 curated / **0 problems**.
- RUNBOOK.md Wissensbasis-Paragraf um Batch 10 ergänzt.
- Offene Restfragen: keine (Subordner-Integration war die letzte offene
Frage dieses Themas). ODL-Extraktion (`.lexis360/odl/`) bleibt Spot-
check-Auswahl, nicht Teil der Pipeline.
**AP16 Karenz-/Familien-Reste umgesetzt (8.13 freigegeben) — Kern 73/73, Privat 199/199 Tests grün**
(2026-09-15, uncommittet bis Nutzerfreigabe; Privat **19.0.17.0.0**):
- **8.13 komplett freigegeben** (Nutzer, 2026-09-15) — Mutterschutz-/Karenz-
Block im R1-Scope; §-Verifikation am Originalwortlaut (AVRAG §§ 11/11a/
14a14e/15a, VKG § 1a, MSchG § 15f, BMSVG § 7 Abs 46, ASVG §§ 163/166).
KB-Synthesen (3 Subagenten): lb-kar/elt/kzs/pap/kbg — arbeitsrechtliche
Kerne + Abrechnungstypologie (alle Voll-Freistellungen entgeltlos,
Leistungen extern: AK/AMS/BASB/KV/Gesundheitskasse; elt-SV/LSt/BMSVG-Lücken
verifizieren = erledigt über RIS/Bestandsmaschinerie; ⚠ lb-elt-06 §-8/§-8a-
VKG-Zuordnung dokumentiert).
- **Privat (19.0.17.0.0):** 6 neue WETs/Urlaubsarten (ATP_BILDUNGSKARENZ,
ATP_HOSPIZKARENZ, ATP_KINDERKRANK, ATP_KINDERREHAB, ATP_PFLEGEKARENZ,
ATP_PAPAMONAT); Regel `KARENZ_ENTGELT` (seq 48, negatives Tagesatz-Muster
wie MSCH_ENTGELT, Ausschlüsse im geteilten `_at_efz_tagesatz`); Modell
`models/karenz.py` (Status/Tage/Karenzarten-Map); vr.event-An-/Abmeldungen
aus Karenz (M4 Tag vor Beginn, M3 Rückkehr, entfällt bei DV-Ende; Karenz-
art-Strings im Protokoll, eSV-Sonderformate GP7); fiktive BV mit §-7-Abs-4-
**Z-13-Brücke** (`_at_msch_referenz_stichtag_und_anzahl` in mutterschutz.py);
BV-Vor-Entgelt-Feld `l10n_at_bv_vor_entgelt` (§ 6 Abs 4 BMSVG, Pflegeteilzeit)
in `_at_bv_basis_laufen`; §-23-Abs-8-Hochrechnungs-Vorschau im Wizard
(`abf_alt_hochrechnung_vorschau`); Sonderwochengeld-Erkennung (§ 163 ASVG)
+ Ruhen-Warnungen (§ 166 ASVG) im msch_info.
- **Tests:** neu `tests/test_karenz_private.py` 6 (Entgelt-Stopp, VR-Events
inkl. Idempotenz + Protokoll, Z-1-Brücke, §-6-Abs-4-BV, § 163/§ 166,
Wizard-Hochrechnung); Suite **214/214** (73 Kern + 199 Privat). Test-Details:
hr.leave-Quere-Überlappung nur mit `leave_skip_date_check`+`leave_skip_state_check`
+ direktem state='validate' umgehbar (Krankheit während Karenz);
EFZ-Phasen lesen Leaves, `voll_arbeitstage` Work-Entries — überlappte Tage
brauchen direkte hr.work.entry-Records; `hr.leave` hat KEIN
work_entry_type_id (nur der Leave-Typ).
- **Offen AP16-Reste (docs/rechenfaelle/karenz.md):** Urlaubs-Aliquotierung aus
Karenz (§ 15f Abs 2 MSchG, hr_holidays-Allokationsseite), Leave-Überlappungs-
Policy (allow_request_on_top/time_type — Mandanten-Entscheid), eSV-Sonderformate
(Karenzart-Block, GP7), Sonderwochengeld-Vollrechnung (§ 141/§ 125/§ 108f =
Anzeige-Stufe), lb-kar-02-13-Wochen-Über-/§ 2i-AVRAG-Konflikt (dokumentiert).
- **Offen gesamt:** AP17 Meldewesen-Reste (L17/§ 109a/§ 109b, Geringfügigen-
Jahreszahlung), AP18+ (Gates). Nicht committen ohne Nutzeranforderung.
**AP14-B Prämien bei Beendigung (§ 16 AngG) umgesetzt — Kern 73/73, Privat 191/191 Tests grün**
(2026-09-15, uncommittet bis Nutzerfreigabe; Privat **19.0.16.0.0**):
- **Recht (RIS-Wortlaut § 16 AngG + § 6 Abs 5 BMSVG verifiziert, lb-end-18):**
§-16-Aliquot = Betrag × zurückgelegte Dienstzeit / Dienstperiode;
Angestellte: unabhängig vom Beendigungsgrund gebührend (Verlust-/Kündigungs-
Klauseln unwirksam, 9 ObA 82/13v); Arbeiter: leistungsabhängige Prämien
dürfen wirksam an „kein Verschulden“ gebunden sein; spezifische Leistungen
(z. B. Bilanzgeld) ohne Tätigkeit nicht aliquot. LSt: mit Endabrechnung
sonstiger Bezug im Sechstel (6 %); später zum VORHINREIN vereinbarten
Fälligkeitszeitpunkt (Höhe erst nach Periodenablauf ermittelbar, z. B.
Bilanzprämie) → § 67 Abs 10: Tarif im Zuflussmonat OHNE Sechstel, kein
lit-c-Fall (98/14/0009), gesonderter Lohnzettel (Rz 911a). SV: SZ-artig
→ SZ-HBG-Mechanik; spätere Prämie → Rollung ins Austrittsjahr (E-MVB
044-01-00-006); LNK grundsätzlich pflichtig; BV 1,53 % ungecappt (§ 6 Abs 5).
- **Privat (19.0.16.0.0):** Regeln `PRAM_END` (seq 35, bemessung sonstig —
Sechstel/SZ-SV/LNK/BV) + `PRAM_END_TARIF` (seq 36, laufend + Kern-Flag
`l10n_at_s67_abs6_ueberhang` = §-67-Abs-10-Pfad ohne Sechstel); Eingaben
ATP_PRAM_END/ATP_PRAM_END_TARIF; Konten 6230 (LSt über LST_SZ/LST_LFD,
keine eigene LSt-Regel); Wizard-Abschnitt (§-16-Aliquot-Vorschau, Zahlungs-
art, Rollungs-Beitragsmonat, Bestätigungspflichten, Nachweis + Payslip-Tab
`l10n_at_pram_nachweis`); Lauf-Feld `l10n_at_pram_beitragsmonat` + Roll-
Branch in der bestehenden `_l10n_at_sv_basis_laufen_monate`-Überschreibung
(Pin erweitert — **Achtung: keine zweite Methode mit gleichem Namen anlegen,
die letzte Definition gewinnt**); LSt bleibt im Zuflussmonat.
- **Tests:** endabrechnung 24 (RF-PRM-1..3: sonstig-Fall mit SZ-SV/LNK/BV,
§-67-Abs-10 mit historischer Rollung 2025-06 aus 2026er-Auszahlung,
Wizard-E2E + 3 UserError-Fälle); Suite **208/208** (73 Kern + 191 Privat)
auf Wegwerf-DB. `compute_sheet()` löscht Linien neu — Linien-Overrides
überleben nicht; Lauf-Felder (wie der Rollungs-Beitragsmonat) sind der
richtige Weg.
- **Verifikationsreste/GP7:** vollständige SZ-Aufrollung (Storno + Neurechnung
gegen SZ-JahreshBG des Austrittsjahres) und mBGM-Storno/Neuübermittlung
offen; BV-Basis der späteren Prämie verbleibt im Zuflussmonat
(Approximation dokumentiert); gesonderter Lohnzettel Rz 911a (GP7).
- **Offen:** AP16 Karenz-Reste (Gate 8.13). Nicht committen ohne
Nutzeranforderung.
**AP15-C Vergleichssummen (§ 67 Abs 8 lit a) umgesetzt — Kern 73/73, Privat 188/188 Tests grün**
(2026-09-15, uncommittet bis Nutzerfreigabe; Privat **19.0.15.0.0**):
- **Recht (RIS-Wortlaut § 67 Abs 8 lit a verifiziert, lb-end-21/22):**
Vergleichssummen (gerichtl./außergerichtl. Vergleiche, Nachzahlungen aus
Urteilen/Bescheiden, Kündigungsanfechtung) — soweit nicht Abs 3/6: Abs-10-
Tarif im Zuflussmonat; nach §-62-Z-3/4/5-Abzug ist 1/5 steuerfrei (Deckel
1/5 × 9 × mHBG = 12.474), Abs 2 (Sechstel) nicht anzuwenden;
BV-Anwartschafts-Teil bis 7.500 € mit 6 % (parametrisiert
`at_lst_67_abs8_vergleich_bv` — § 67 Abs 8 ist §-33a/§-124b-indexiert),
Überhang fällt zurück ins Fünftel; LNK-PFLICHTIG (§ 41 Abs 4 lit b FLAG
nennt nur Abs 3/6); SV-PFLICHTIG (Zuflussmonat; Aufrollung je Beitragsmonat
via Kern-`l10n_at_beitragsmonat` bzw. PV-Verlängerung, lb-end-22/E-MVB
011-02-00-001); Widmungen nur bei Strittigkeit anerkannt (VwGH);
ausdrücklich vereinbarte gesetzl. Abfertigung → gesamt Abs 3 (VwGH
2013/13/0001 = ARD 6490/20/2016); lit e (Pensionsabfindung)/lit f
(Sozialplan) gehören NICHT zu lit a. Deckel-Reihenfolge: §-62-Abzug ERST,
dann Fünftel — das 70.000-€-Quellenbeispiel meint die Bemessungsgrundlage,
der Cap greift brutto-abhängig erst ab ~76.200 €.
- **Privat (19.0.15.0.0):** Regeln `VERGLEICH` (seq 33, neutral/lauend,
`l10n_at_s67_fuenftel`) + `VERGLEICH_BV` (seq 34, neutral/lauend, neues
Regel-Flag `l10n_at_vergleich_bv`, KEIN `s67_abs` — sonst fälschlich
LNK-frei), `LST_VERGLEICH_BV` (seq 74, 6 %); Eingaben
ATP_VERGLEICH/ATP_VERGLEICH_BV; Helfer in endabrechnung.py:
`_at_vergleich_bv_total/_beguenstigt/_ueberhang/_lst_6`,
`_at_fuenftel_frei_betr`; `_at_fuenftel_total` zieht den BV-Überhang ins
Fünftel, `_at_lnk_basis` + BV-begünstigter Teil (Pin-Kommentar
aktualisiert); Konten 6200/6000 bzw. 3540 (vorläufig wie Abf);
Wizard-Abschnitt (Bestätigungspflichten Aufgliederung/Strittigkeit +
BV-Anwartschaft, BV ≤ Deckel erzwungen, Vorschau Fünftel/Tarif/BV-LSt);
Payslip-Feld `l10n_at_vergleich_nachweis` + Tab.
- **Tests:** endabrechnung 21 (RF-VGL-1..4: Rest-Fünftel 9.000 €, BV 9.000 €
mit 7.500/1.500-Split und anteiliger Beitragszuordnung Rz 1102b, Deckel
100.000 € brutto, Wizard-E2E + 3 UserError-Fälle); Suite **205/205** (73
Kern + 188 Privat) auf Wegwerf-DB `ap15c_test5`.
- **Verifikationsreste (dokumentiert, nicht geblockt):** KZ-Positionierung
der lit-a-Tarif-Teile (laufend über LST_LFD) + §-291d-Zuordnung von
`VERGLEICH`/`VERGLEICH_BV` (wie ABGANG ohne Pfändungs-Flag) gegen LStR
Rz 1087 ff/§ 291d EO; Fünftel-Deckel-Pooling über ALLE Fünftel-Regeln
(ABGANG + VERGLEICH im selben Lauf minimal konservativ);
SV-Aufrollung aktiver Ansprüche nicht automatisiert; gesonderter
Lohnzettel bei Zahlung nach dem Beendigungsmonat (LStR Rz 911a, GP7-Rest).
- **Umgebung (wichtig für künftige Läufe):** nach dem Repo-Umzug war `.venv`
tot (editable-Pfade ohne `odoo-projects`-Komponente, Shebangs auf alten
python3.14-Pfad); repariert via sed über
`__editable___odoo_19_0_e_20260910_finder.py`, `direct_url.json` und
`.venv/bin/*`-Skripte. Aufruf `.venv/bin/python -m odoo` — im Baum fehlt
`odoo/cli/main.py`, `-m odoo` geht über `__main__.py``cli.command`;
setuptools fehlt im venv (pip install -e nicht möglich).
- **Offen:** AP14-B (Prämien-Beendigung Feinschliff), AP16 Karenz-Reste
(Gate 8.13). Nicht committen ohne Nutzeranforderung.
**AP15-B freiwillige Abfertigung (§ 67 Abs 6) umgesetzt — Kern 55/55, Privat 146/146 Tests grün**
(2026-09-15, uncommittet bis Nutzerfreigabe; Privat **19.0.14.0.0**, Kern **19.0.10.0.0**):
- **Recht (RIS-Wortlaut § 67 Abs 6 verifiziert, lb-end-12/13/15):**
Z 1 Viertelregelung (¼ der letzten-12-Monats-Bezüge, Deckel 9×HBG)
+ Z 2 Zwölftelregelung (Staffel 3→2/12 … 25→12/12 = §-23-Grenzen,
Deckel n × 3 × HBG), Z 3 Kürzung um erhaltene Abfertigungen (Abs 3
ODER 6) und bestehenden gesetzlichen Anspruch am aktuellen Ende,
Z 5 Sechstel-Exklusion nur für die 6 %-Beträge, Z 6 Überhang
„wie ein laufender Bezug“ zum Zuflussmonat-Tarif, Z 7 (BV-Ausschluss)
seit BGBl I 118/2015 AUFGEHOBEN. SV-frei § 49 Abs 3 Z 7, LNK-frei
(§ 41 Abs 4 lit b FLAG, § 122 Abs 8 WKG, § 5 Abs 2 lit b KommStG)
UNABHÄNGIG von 6 % vs Tarif, BV-frei (§ 6 Abs 5 BMSVG).
- **Kern (19.0.10.0.0):** neuer Regel-Flag `l10n_at_s67_abs6_ueberhang`
(lohnsteuer.py); `_l10n_at_brutto_laufen_ytd` zieht Flag-Regeln aus
der Sechstel-Basis ab (Helfer `_l10n_at_abs6_ueberhang_total`, auch
je YTD-Lauf) — der Überhang läuft über bemessung='laufend' in die
laufende LSt-Bemessung und KZ 210, aber NICHT ins Sechstel;
`LST_ABF_FREI` in KZ-260-Salden. Test test_20 + L16-Test erweitert.
- **Privat:** Regeln `ABF_FREI` (seq 31, neutral/keine/abs6/
pfandung_beendigung — begünstigter Teil), `ABF_FREI_TARIF` (seq 32,
laufend/keine/abs6 + Überhang-Flag — Tarifrest), `LST_ABF_FREI`
(seq 73, 6 %); Eingabe ATP_ABF_FREI; Helfer in endabrechnung.py:
`_at_bezuege_12_monate` (validierte Vormonats-Läufe + eigene Zeilen,
ohne Überhang-/§-26-Z-4-Regeln — neues privates Regel-Flag
`l10n_at_s26_z4_reise` an REISE_STEUERPFLICHTIG), `_at_abf_frei_split`
(Z 1/Z 2/Deckel aus at_sv_hbg_monatlich/Z-3-Kürzung),
`_at_abf_frei_lst_6`. Wizard-Abschnitt mit auto 12-Monats-Basis +
gesetzlicher Anspruch aus ABF_ALT, Vorschau Z 1/Z 2/Kürzung/
begünstigt/Überhang/6 %/Netto, Bestätigungspflicht (Anspruchs-
umwandlungs-Hinweis lb-end-15). Pfändungs-Beendigungstopf zieht
LST_ABF + LST_ABF_FREI ab (test_09c). Konten: rule_abf_frei(_tarif)
6200/6000 vorläufig, rule_lst_abf_frei 3540. RF-ABF-4…6 + offene
Punkte in docs/rechenfaelle/endabrechnung.md.
- **Tests:** endabrechnung 17 (Z 1/Z 2, Überhang ohne Sechstel mit
SV/LNK/BV/LST_LFD-Asserts, Kürzung+Deckel, Wizard-E2E), pfändung 13,
Kern-Suite 55/55, Privat-Suite 146/146 (ap13a_test); ein Testfehler
(zweite `_input`-Eingabezeile statt Update) korrigiert.
- **Verifikationsreste (dokumentiert, nicht geblockt):** KZ-Positionierung
der Abs-6-Bezüge und §-291d-Zuordnung des Überhangs gegen LStR
Rz 1087 ff; geminderte Bezüge in der 12-Monats-Basis (LStR vs VwGH)
bewusst ohne Automatik.
- **Offen:** AP15-C (§ 67 Abs 8 lit a Vergleichssummen). Nicht
committen ohne Nutzeranforderung.
**AP15-A gesetzliche Abfertigung Alt umgesetzt — Privat 141/141, Kern 54/54 Tests grün**
(2026-09-15, Commit **`9add58f`** nach Nutzerfreigabe):
- **Recht am Originalwortlaut verifiziert (.ris/):** § 23a Abs 3 AngG
verlangt für den Elternaustritt ein **ununterbrochen fünfjähriges**
DV (Hälfte des §-23-Betrags, Deckel 3 Monatsentgelte) — Vorschlag
bei < 60 Monaten korrigiert (0-Faktor + Wizard-UserError). § 67
Abs 3 EStG (RIS-Wortlaut): Tarif-LSt **auf den laufenden
Arbeitslohn** × Mehrfaches, zwingend günstiger als 6 %. Neu:
getrenntes, bestätigtes Feld `abf_alt_monatslohnsteuer`/
`l10n_at_abf_alt_monatslohnsteuer` (Tarif-LSt des laufenden
Monats nach persönlichen Verhältnissen) — Bruttolohn wird NICHT
über die §-62-Engine tarifiert. Rechenfall lb-end-01 exakt:
101,96 × 10,5 = 1.070,58 (< 1.134 = 6 %).
- **Privat:** `models/endabrechnung.py` ABF_ALT-Helfer (Staffel,
Mehrfach-Vorschlag eltern/tod, 6 %, Vervielfachung, günstige LSt),
Regel `ABF_ALT` (neutral/keine/abs3/pfandung_beendigung),
`LST_ABF` seq 72, `PFAENDUNG_END` seq 77 (Beendigungstopf
LST_ABF, Gesamttopf + beendigung), LNK-Fix in beiden Kopien
(`_at_lnk_basis` zieht Abs-3/6-Regeln nur mit bemessung
laufend/sonstig ab), Wizard-Felder + Validierungen (BMSVG-Neu-
Sperre außer eingefroren, AGRD 02/06-Regeln, Eltern < 5 J),
Payslip-Tab, Konten `rule_abf_alt` 6200/6000 (vorläufig),
`rule_lst_abf` → 3540. `.get()`-Zugriffe auf `result_rules` in
`models/pfaendung.py` durch Membership-Prüfung ersetzt.
- **Kern:** LST_ABF in KZ-260-Salden (Lohnsteuer), außerhalb
KZ 210/220 (test_01b). Kern-Hilfer `_l10n_at_monatslohnsteuer`
des Subagenten wieder ENTFERNT (ungenutzt, semantisch
irreführend) samt test_02b.
- **Tests:** endabrechnung 13 (inkl. Arbeitnehmerkündigung-
UserError, Eltern < 5 J, Wizard-E2E, Pfändungsbasis), pfändung
12 (test_09b Beendigungstopf), Privat-Suite 141/141 (`ap13a_test`),
Kern-Suite 54/54 (auf `ap13a_test` mit Privatmodul — **Achtung:
L16-Tests referenzieren `l10n_at_hr_payroll_private.`
`structure_at_privat`, Kern-Rein-DB scheitert an setUp, ist
Bestandsverhalten**). Python/XML/`git diff --check` grün.
- **Offen:** AP15-B (freiwillige Abfertigung § 67 Abs 6, 6 %-Bänder
+ rollierende 12-Monats-Basis), AP15-C (§ 67 Abs 8 lit a
Vergleichssummen). Wizard-Transient NOT-NULL-Warnung für
`departure_reason_id` ist kosmetisch (Alt-Zeilen). Nicht
committen ohne Nutzeranforderung.
**AP14-A Endabrechnungs-Zyklus umgesetzt — 133 Tests grün**
(2026-09-14, Commit **`ee94f46`** nach Nutzerfreigabe):
- **Rechtskorrektur gegen Originalwortlaut (.ris/, RIS-Gate erledigt):**
§ 67 Abs 6 (freiwillige Abfertigung/Abfindung) = 6 %-Bänder
(Z 1 ¼ der letzten-12-Monate-Bezüge, Deckel 9×HBG; Z 2 Dienstzeit-
bänder), NICHT Fünftel → nach AP15 verschoben. Fünftelregelung gilt
§ 67 Abs 8 lit b (Kündigungs-/Abgangsentschädigung) — diese sind
SV-PFLICHTIG (Umlegung auf Kündigungsfrist, § 11 Abs 2 ASVG) und
LNK-PFLICHTIG (FLAG § 41 Abs 4 lit b nennt nur Abs 3 und 6).
§ 11 Abs 2 ASVG verifiziert: PV-Verlängerung für UEL-Bezug UND
Kündigungsentschädigung, bei beiden ZUERST Kündigungsentschädigung,
dann UEL (sequentielle Fenster); 6-WT/5-AT-Tage-Umrechnung ist
Verwaltungspraxis (lb-url-15), nicht Gesetzeswortlaut. § 67 Abs 8
lit d (UEL-Zweikomponenten) wortwörtlich bestätigt. § 19e Abs 2
AZG (+50 % auf NAZ-Guthaben) verifiziert.
- **Umsetzung (Privat 19.0.12.0.0):** `models/endabrechnung.py` mit
Regel-Flags `l10n_at_sv_verlaengerung` (urlaubsersatz/abgang) und
`l10n_at_s67_fuenftel`; UEL-Helfer (Divisor 26/22, SZ-Tageswert
2×SZ-Basis/12); Upstream-Replicas mit Pin-Kommentar für
`_at_lnk_basis` (Abgang VOR der Freibetragsstaffel) und
`_l10n_at_sv_basis_laufen_monate` (Verlängerungsanteile mit
Tageswert-Deckel HBG×Tage/30, Standardanteile volle Monats-HBG);
`_l10n_at_bemessung_laufen` += Fünftel-Tarifteil (4/5, Deckel
12.474 = 9×HBG/5) ohne Sechstel-Effekt.
- **Regeln:** URL_ERSATZ_LFD (laufend, verlaengerung=urlaubsersatz),
URL_ERSATZ_SZ (sonstig), ABGANG (neutral, sv_art=laufend,
verlaengerung=abgang, fuenftel), ZEIT_GUTHABEN (laufend ×1,5,
KEIN §-68), ZEIT_SCHULDEN (negativ), END_ABRECHNUNG_VORSCHUSS
(neutral/keine — Netto-Abzug § 293 Abs 3 EO). Eingaben
ATP_UEL_TAGE/ABGANG/ABGANG_FFRIST_TAGE/ZEIT_GUTHABEN/ZEIT_SCHULDEN/
ABRECHNUNG_VORSCHUSS; Parameter at_endabrechnung (Divisoren).
- **Wizard** `l10n.at.payroll.endabrechnung.wizard` (ACL, Views,
Menü seq 42): sammelt UEL-Tage/Abgang/Frist/Zeit/Vorschuss, Vorschau
über flüchtigen new()-Payslip, Button legt Endabrechnungs-Lauf im
Austrittsmonat mit vorbefüllten Eingaben an. Achtung: hr.version-
Strukturfeld heißt `structure_id` (nicht struct_id).
- **Fund beim Testlauf:** Eingabetypen-Datei fehlte zunächst in der
Manifest-Datenliste → NOT-NULL input_type_id; zwei Testassertionen
mussten SV-DN-Differenzen bzw. den KVGEO-Standardanteil im März
berücksichtigen.
- **Tests** test_endabrechnung_private.py (6): UEL-Zweikomponenten
(1.320/220 €, Sechstel +5.280), SV-Tage-Schema (23→31, 12→14,
6→21) + Monatsverteilung, Abgang-Fünftel (Sechstel unverändert,
LNK +9.000, Umlegung 16/26 Tage), Vorschuss-Netto (Abgaben neutral),
Zeitguthaben ±, Wizard E2E. Suite **133/133** in ap13a_test.
- **Offen AP14-B/AP15:** Vergleich § 67 Abs 8 lit a + freiwillige
Abfertigung § 67 Abs 6 (beides mit Abf-Alt-Günstiger-Maschine,
rollierende 12-Monats-Basis), Prämien-Beendigungs-Rollung,
Meldewesen-Schnittstellen („Ende des Entgeltanspruchs“ in mBGM,
gesonderter Lohnzettel LStR Rz 911a).
**AP13-B Pendlerförderung umgesetzt — 127 Tests grün**
(2026-09-14, uncommittet bis Nutzerfreigabe):
(2026-09-14, Commit **`9ff977e`** nach Nutzerfreigabe):
- Neu `models/pendler.py`: Modell `l10n.at.payroll.pendler.erklaerung`
(effektiv datiert, L-34-/Pendlerrechner-Nachweis als Attachment,
@@ -39,7 +404,7 @@
(Odoo 19: quantity/price_unit/total_amount) — Test-Helfer korrigiert.
- Doku docs/rechenfaelle/pendler.md (RF-PEN-1…5 + offene Punkte: erhöhter
VAB 853 €/Zuschlag 804 € als Quer-LSt-Rest, L-34-1-Monats-Meldeprozess).
- Version **19.0.11.0.0**. Commit ausstehend (Nutzerfreigabe).
- Version **19.0.11.0.0**.
**AP13-A Reisekosten Inland committed — 127-er Suite grün**
(2026-09-14, Commit **`3f307a0`**):
+1
View File
@@ -10,6 +10,7 @@ seit 2026-09-09 — Überführung aus `gem360-git` per History-Import; siehe
|---|---|
| `l10n_at_hr_payroll` | **Bundes-Kern** (sektor-neutral): SV-Werte 2026 als `hr.rule.parameter`-Seed, TASY-Import-Wizard; folgen: Lohnsteuer (AP3), Meldewesen L16/eSV (AP5), Belege (AP6) |
| `l10n_at_gemeinde_payroll` | **Bgld. GemBG 2014**: Katalogmodell (AP1), Entgelt-Engine (AP2); AP3+ gemäß `personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md` |
| `l10n_at_payroll_dokumente` | **Dokumente aus Vorlagen**: Dokumentgenerierung (Dienstvertrag, Kündigung, Bescheinigungen …) aus hr-Stammdaten; eigene Texte, Struktur-Referenz (kb_ref) dokumentiert; Wizard mit Auto-/Manuellfeldern, Vorschau, PDF/HTML-Ablage |
| `l10n_at_hr_payroll_private` | **General-AT** (KV-basierte Privatwirtschaft) — Gerüst; Implementierungsplan freigegeben ([`IMPLEMENTIERUNGSPLAN-Privat.md`](personalverrechnung/IMPLEMENTIERUNGSPLAN-Privat.md)), Umsetzung ab M1 (GP0) |
VRV-Buchung für Gemeinden (Anlage 3b, Ansatz/MVAG, EHH/FHH) läuft über
+1 -1
View File
@@ -1,7 +1,7 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'Österreich - Personalverrechnung Kern (AT Payroll Core)',
'version': '19.0.8.0.0',
'version': '19.0.10.0.0',
'author': 'Florian Egger',
'website': 'https://gem360.at',
'category': 'Human Resources/Payroll',
+34 -3
View File
@@ -70,6 +70,15 @@ class HrSalaryRule(models.Model):
'abgezogen; Grenzen als Jahres-Kumulative je Dienstnehmer '
'(at_st_grenzen). Nur der übersteigende Teil ist '
'steuerpflichtig. Menge = Arbeitstage (Z 17/Z 9).')
l10n_at_s67_abs6_ueberhang = fields.Boolean(
string='AT § 67 Abs 6 Z 6 — Überhang',
help='Übersteigender Teil einer freiwilligen Abfertigung/Abfindung '
'(§ 67 Abs 6 Z 6 EStG): wird wie ein laufender Bezug zum '
'Tarif des Zuflussmonats versteuert, erhöht aber das '
'Jahressechstel nicht — Abs 2 ist nur auf die mit 6 % '
'versteuerten Z-1/Z-2-Beträge nicht anzuwendbar (Z 5), der '
'Überhang ist ein sonstiger Bezug, kein laufender. LNK-frei '
'über § 67 Abs 6 (lb-end-12), SV-frei über § 49 Abs 3 Z 7.')
class HrVersion(models.Model):
@@ -351,11 +360,32 @@ class HrPayslip(models.Model):
def _l10n_at_brutto_laufen_ytd(self, result_rules=None):
"""Kumulierte laufende Bruttobezüge des Jahres (Sechstel-Basis
ist Brutto, § 67 Abs 2 — inkl. Auszahlungsmonat-Laufendem)."""
ist Brutto, § 67 Abs 2 — inkl. Auszahlungsmonat-Laufendem).
Der §-67-Abs-6-Überhang (Flag) läuft tarifisch im Zuflussmonat,
ist aber ein sonstiger Bezug und erhöht das Jahressechstel
nicht."""
self.ensure_one()
total = self._l10n_at_brutto('laufend', result_rules)
total = self._l10n_at_brutto('laufend', result_rules) \
- self._l10n_at_abs6_ueberhang_total(result_rules)
for slip in self._l10n_at_ytd_slaeufe():
total += slip._l10n_at_brutto('laufend')
total += slip._l10n_at_brutto('laufend') \
- slip._l10n_at_abs6_ueberhang_total()
return total
def _l10n_at_abs6_ueberhang_total(self, result_rules=None):
"""Summe der als §-67-Abs-6-Z-6-Überhang gekennzeichneten
Regel-Zeilen (tarifisch im Zuflussmonat, ohne Sechstel-Effekt)."""
self.ensure_one()
total = 0.0
for rule in self.struct_id.rule_ids:
if not rule.l10n_at_s67_abs6_ueberhang:
continue
if result_rules is not None:
if rule.code in result_rules:
total += result_rules[rule.code]['total']
else:
total += sum(self.line_ids.filtered(
lambda l, c=rule.code: l.code == c).mapped('total'))
return total
def _l10n_at_sechstel(self, result_rules=None):
@@ -400,6 +430,7 @@ class HrPayslip(models.Model):
# ------------------------------------------------------------------
# § 66 Monatslohnsteuer — kumulativ mit Rollung
# ------------------------------------------------------------------
def _l10n_at_lst_laufend(self, result_rules=None):
"""LSt auf laufende Bezüge (§ 66): kumulative Hochrechnung
(360-Tage-Jahr) minus bereits einbehaltene LSt — Vormonats-
@@ -390,7 +390,7 @@ class L10nAtPayrollL16Line(models.Model):
GP3-Kerns (Monats-Caps 400/600 und ÜStd 15/170 eingerechnet);
220 = sonstige § 67 Abs 1/2/5 ohne Abs-3/6; 225 = SV-DN auf
KZ 220; 230 = laufende SV-DN + AK + WF; VIEB = 230 + 225 +
226; 260/BIEL = LST_LFD + LST_SZ."""
226; 260/BIEL = LST_LFD + LST_SZ + LST_ABF + LST_ABF_FREI."""
self.ensure_one()
salden = dict.fromkeys(
('kz210', 'kz215', 'kz220', 'kz225', 'kz226', 'kz230',
@@ -411,7 +411,8 @@ class L10nAtPayrollL16Line(models.Model):
elif line.code in ('SVDN_KV', 'SVDN_PV', 'SVDN_AV',
'SVDN_AK', 'SVDN_WF'):
salden['kz230'] += line.total
elif line.code in ('LST_LFD', 'LST_SZ'):
elif line.code in ('LST_LFD', 'LST_SZ', 'LST_ABF',
'LST_ABF_FREI'):
salden['lohnsteuer'] += line.total
freibe = slip._l10n_at_freibetraege_68()
salden['kz215'] += freibe['szfn'] + freibe['ue_std']
@@ -5,6 +5,7 @@ Satz-Assertions, CRLF/ISO-8859-15-Encoding, SANR/SANZ-Kette,
KZ-245-Formel-Konsistenz aus GP3-Daten."""
import base64
import datetime
import types
from odoo.tests import TransactionCase, tagged
@@ -213,6 +214,40 @@ class L16GeneratorTest(TransactionCase):
self.assertEqual(schluss[0:2], '99')
self.assertEqual(schluss[20:26], '000004') # SANZ
def test_01b_abfertigung_lohnsteuer_salden(self):
"""Abs.-3-Bezug bleibt außerhalb KZ 210/220; LST_ABF zählt zu 260."""
deklaration = self.env['l10n.at.payroll.l16'].create({
'company_id': self.company.id,
'jahr': 2026,
'art': '01',
})
l16_line = self.env['l10n.at.payroll.l16.line'].create({
'l16_id': deklaration.id,
'employee_id': self.employee.id,
})
abs3_rule = types.SimpleNamespace(
l10n_at_bemessung='sonstig', l10n_at_s67_abs='abs3')
lst_rule = types.SimpleNamespace(
l10n_at_bemessung='neutral', l10n_at_s67_abs='keine')
slip = types.SimpleNamespace(
line_ids=[
types.SimpleNamespace(
salary_rule_id=abs3_rule, code='ABF_ALT', total=12000.0),
types.SimpleNamespace(
salary_rule_id=lst_rule, code='LST_ABF', total=720.0),
types.SimpleNamespace(
salary_rule_id=lst_rule, code='LST_ABF_FREI',
total=300.0),
],
_l10n_at_freibetraege_68=lambda: {'szfn': 0.0, 'ue_std': 0.0},
)
salden = l16_line._kz_salden([slip])
self.assertEqual(salden['kz210'], 0.0)
self.assertEqual(salden['kz220'], 0.0)
self.assertEqual(salden['lohnsteuer'], 1020.0)
def test_02_arbeitsstaette(self):
"""§ 34 Abs 6 ASVG: je AN ein Satz 45 (Länge 300) mit BKNR,
VSNR, STNR und GKZ aus dem Dienstort-Partner; Warnung, wenn
@@ -108,6 +108,7 @@ class LohnsteuerTest(TransactionCase):
slip._l10n_at_absetzbetraege(20000.0),
496.0 + 828.0 + 273.0, places=2)
# ------------------------------------------------------------------
# Lohnsteuertage (user decision: 30 je vollem Monat)
# ------------------------------------------------------------------
@@ -124,6 +125,27 @@ class LohnsteuerTest(TransactionCase):
'contract_date_end': date(2026, 1, 10)})
self.assertEqual(slip._l10n_at_lohnsteuertage(), 10)
# ------------------------------------------------------------------
# § 67 Abs 6 Z 6 — Überhang (tarifisch, ohne Sechstel-Effekt)
# ------------------------------------------------------------------
def test_20_abs6_ueberhang_ohne_sechstel(self):
"""Der gekennzeichnete Überhang läuft tarifisch in der laufenden
Bemessung, erhöht aber das Jahressechstel nicht."""
employee = self._employee()
slip_ohne = self._slip(employee, 1)
regel = self._regel('T_ABS6_UEB', 1000.0, sv_art='keine')
regel.l10n_at_s67_abs6_ueberhang = True
slip_mit = self._slip(employee, 2)
self.assertAlmostEqual(
slip_mit._l10n_at_abs6_ueberhang_total(), 1000.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen(), 1000.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
# ------------------------------------------------------------------
# § 68 Freibeträge (Buckets über Regel-Flags)
# ------------------------------------------------------------------
@@ -1,7 +1,7 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'Österreich - Privatwirtschaft Personalverrechnung (General-AT)',
'version': '19.0.11.0.0',
'version': '19.0.17.0.0',
'author': 'Florian Egger',
'website': 'https://gem360.at',
'category': 'Human Resources/Payroll',
@@ -104,18 +104,20 @@ gem360-Brücke).
'data/work_entry_types_private.xml',
'data/absence_private.xml',
'data/input_types_private.xml',
'data/input_types_endabrechnung_private.xml',
'data/salary_rules_private.xml',
'data/salary_rules_lst_private.xml',
'data/salary_rules_efzg_private.xml',
'data/salary_rules_msch_private.xml',
'data/salary_rules_karenz_private.xml',
'data/salary_rules_pfaendung_private.xml',
'data/salary_rules_sb_private.xml',
'data/salary_rules_sb2_private.xml',
'data/salary_rules_reisekosten_private.xml',
'data/salary_rules_endabrechnung_private.xml',
'data/salary_rules_sv_private.xml',
'data/salary_rules_bvg_private.xml',
'data/salary_rules_bvg_private.xml',
'data/hr_payroll_account_private.xml',
'data/rule_parameters_mbgm_private.xml',
'data/rule_parameters_wien_private.xml',
@@ -126,6 +128,7 @@ gem360-Brücke).
'data/rule_parameters_sb2_private.xml',
'data/rule_parameters_reisekosten_private.xml',
'data/rule_parameters_pendler_private.xml',
'data/rule_parameters_endabrechnung_private.xml',
'data/bv_kasse_seed.xml',
'views/kv_views.xml',
'views/bv_views.xml',
@@ -137,6 +140,7 @@ gem360-Brücke).
'views/sachbezuege_views.xml',
'views/reisekosten_views.xml',
'views/pendler_views.xml',
'views/endabrechnung_views.xml',
'report/gp8_reports.xml',
'report/buchungsbeleg_report.xml',
'report/bv_report.xml',
@@ -113,4 +113,117 @@
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_karenz"/>
</record>
<!-- AP16 (8.13): unbezahlte Karenz-Arten — alle entgeltlos
(Entgelt-Stopp über KARENZ_ENTGELT), je Art eigene eSV-Events;
Dienstzeit: Papamonat anrechnen (§ 1a Abs 7 VKG), Bildungs-/
Pflegekarenz nicht (§ 11 Abs 2, § 14c/14d AVRAG). -->
<record id="wett_atp_bildungskarenz" model="hr.work.entry.type">
<field name="name">Bildungskarenz (§ 11 AVRAG)</field>
<field name="color">4</field>
<field name="display_code">BLK</field>
<field name="code">ATP_BILDUNGSKARENZ</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="wett_atp_hospizkarenz" model="hr.work.entry.type">
<field name="name">Familienhospizkarenz — Sterbebegleitung (§ 14a AVRAG)</field>
<field name="color">5</field>
<field name="display_code">HSP</field>
<field name="code">ATP_HOSPIZKARENZ</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="wett_atp_kinderkrank" model="hr.work.entry.type">
<field name="name">Begleitung schwerst erkrankter Kinder (§ 14b AVRAG)</field>
<field name="color">7</field>
<field name="display_code">KKB</field>
<field name="code">ATP_KINDERKRANK</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="wett_atp_kinderrehab" model="hr.work.entry.type">
<field name="name">Freistellung Kinderrehabilitation (§ 14e AVRAG)</field>
<field name="color">10</field>
<field name="display_code">KRE</field>
<field name="code">ATP_KINDERREHAB</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="wett_atp_pflegekarenz" model="hr.work.entry.type">
<field name="name">Pflegekarenz (§ 14c AVRAG)</field>
<field name="color">1</field>
<field name="display_code">PFG</field>
<field name="code">ATP_PFLEGEKARENZ</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="wett_atp_papamonat" model="hr.work.entry.type">
<field name="name">Papa-Monat (§ 1a VKG)</field>
<field name="color">0</field>
<field name="display_code">PAP</field>
<field name="code">ATP_PAPAMONAT</field>
<field name="country_id" ref="base.at"/>
<field name="is_leave" eval="True"/>
</record>
<record id="leave_type_at_bildungskarenz" model="hr.leave.type">
<field name="name">Bildungskarenz (§ 11 AVRAG)</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_bildungskarenz"/>
</record>
<record id="leave_type_at_hospizkarenz" model="hr.leave.type">
<field name="name">Familienhospizkarenz — Sterbebegleitung</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_hospizkarenz"/>
</record>
<record id="leave_type_at_kinderkrank" model="hr.leave.type">
<field name="name">Begleitung schwerst erkrankter Kinder</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_kinderkrank"/>
</record>
<record id="leave_type_at_kinderrehab" model="hr.leave.type">
<field name="name">Freistellung Kinderrehabilitation</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_kinderrehab"/>
</record>
<record id="leave_type_at_pflegekarenz" model="hr.leave.type">
<field name="name">Pflegekarenz (§ 14c AVRAG)</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_pflegekarenz"/>
</record>
<record id="leave_type_at_papamonat" model="hr.leave.type">
<field name="name">Papa-Monat (§ 1a VKG)</field>
<field name="requires_allocation" eval="False"/>
<field name="leave_validation_type">hr</field>
<field name="request_unit">day</field>
<field name="company_id" eval="False"/>
<field name="country_id" ref="base.at"/>
<field name="work_entry_type_id"
ref="l10n_at_hr_payroll_private.wett_atp_papamonat"/>
</record>
</odoo>
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- AP14-A: Endabrechnungs-Eingaben. Mengen-Eingaben (Tage/Stunden)
tragen die Menge im amount-Feld (Muster ATP_SB_MAHLZEIT); die
Regeln leiten daraus die Beträge ab. -->
<record id="input_type_atp_uel_tage" model="hr.payslip.input.type">
<field name="name">Urlaubsersatzleistung — offene Urlaubstage</field>
<field name="code">ATP_UEL_TAGE</field>
<field name="is_quantity" eval="True"/>
</record>
<record id="input_type_atp_abgang" model="hr.payslip.input.type">
<field name="name">Abgangsentschädigung (Brutto)</field>
<field name="code">ATP_ABGANG</field>
</record>
<record id="input_type_atp_abgang_ffrist_tage" model="hr.payslip.input.type">
<field name="name">Abgangsentschädigung — Kündigungsfrist (Kalendertage)</field>
<field name="code">ATP_ABGANG_FFRIST_TAGE</field>
<field name="is_quantity" eval="True"/>
</record>
<record id="input_type_atp_zeit_guthaben" model="hr.payslip.input.type">
<field name="name">Zeitguthaben Normalarbeitszeit (Stunden)</field>
<field name="code">ATP_ZEIT_GUTHABEN</field>
<field name="is_quantity" eval="True"/>
</record>
<record id="input_type_atp_zeit_schulden" model="hr.payslip.input.type">
<field name="name">Zeitschulden (Stunden)</field>
<field name="code">ATP_ZEIT_SCHULDEN</field>
<field name="is_quantity" eval="True"/>
</record>
<record id="input_type_atp_abrechnung_vorschuss" model="hr.payslip.input.type">
<field name="name">Aufrechnung offener Vorschuss (Netto)</field>
<field name="code">ATP_ABRECHNUNG_VORSCHUSS</field>
</record>
<record id="input_type_atp_abf_alt" model="hr.payslip.input.type">
<field name="name">Gesetzliche Abfertigung Alt (Brutto)</field>
<field name="code">ATP_ABF_ALT</field>
</record>
<record id="input_type_atp_abf_frei" model="hr.payslip.input.type">
<field name="name">Freiwillige Abfertigung (Brutto)</field>
<field name="code">ATP_ABF_FREI</field>
</record>
<record id="input_type_atp_vergleich" model="hr.payslip.input.type">
<field name="name">Vergleichssumme — Rest (Brutto, Fünftelregelung)</field>
<field name="code">ATP_VERGLEICH</field>
</record>
<record id="input_type_atp_vergleich_bv" model="hr.payslip.input.type">
<field name="name">Vergleichssumme — BV-Anwartschafts-Teil (Brutto)</field>
<field name="code">ATP_VERGLEICH_BV</field>
</record>
<record id="input_type_atp_pram_end" model="hr.payslip.input.type">
<field name="name">Aliquote Prämie bei Beendigung (Brutto, § 16 AngG)</field>
<field name="code">ATP_PRAM_END</field>
</record>
<record id="input_type_atp_pram_end_tarif" model="hr.payslip.input.type">
<field name="name">Später fällige anteilige Prämie (Brutto, § 67 Abs 10)</field>
<field name="code">ATP_PRAM_END_TARIF</field>
</record>
</odoo>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- AP14-A: Endabrechnungs-Parameter (lb-url-16 Tagewert-Divisoren;
§-10-Aliquotierung läuft über die Urlaubstage-Eingabe, der
Fünftel-Deckel dynamisch aus 9 × at_sv_hbg_monatlich / 5). -->
<record id="hr_rule_parameter_at_endabrechnung" model="hr.rule.parameter">
<field name="name">Endabrechnung — UEL-Tagewert-Divisoren</field>
<field name="code">at_endabrechnung</field>
<field name="country_id" ref="base.at"/>
</record>
<record id="hr_rule_parameter_value_at_endabrechnung"
model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="hr_rule_parameter_at_endabrechnung"/>
<field name="date_from">2026-01-01</field>
<field name="parameter_value">{'divisor_werktage': 26.0, 'divisor_arbeitstage': 22.0, 'abfertigung_alt_staffel': [[36, 2.0], [60, 3.0], [120, 4.0], [180, 6.0], [240, 9.0], [300, 12.0]], 'abfertigung_steuersatz': 6.0}</field>
</record>
<!-- AP15-C: §-67-Abs-8-lit-a-BV-Deckel; § 67 Abs 8 unterliegt der
Inflationsanpassung (§ 33a/§ 124b EStG), daher Parameter. -->
<record id="hr_rule_parameter_at_lst_67_abs8_vergleich_bv" model="hr.rule.parameter">
<field name="name">§ 67 Abs 8 lit a — Vergleich BV-Anwartschafts-Teil Deckel</field>
<field name="code">at_lst_67_abs8_vergleich_bv</field>
<field name="country_id" ref="base.at"/>
</record>
<record id="hr_rule_parameter_value_at_lst_67_abs8_vergleich_bv" model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="hr_rule_parameter_at_lst_67_abs8_vergleich_bv"/>
<field name="date_from">2026-01-01</field>
<field name="parameter_value">7500.0</field>
</record>
</odoo>
@@ -0,0 +1,280 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP14-A: Endabrechnungs-Regeln. -->
<!-- UEL: § 67 Abs 8 lit d — laufender Anteil als laufender -->
<!-- Bezug (Tarif + Sechstel nativ), SZ-Anteil als sonstiger Bezug -->
<!-- (6 %-Band, Freibetrag/Freigrenze im Kern). SV: nur der -->
<!-- laufende Anteil verlängert die Pflichtversicherung (§ 11 -->
<!-- Abs 2 ASVG, Tage-Umrechnung lb-url-15). -->
<!-- Abgang: § 67 Abs 8 lit b — neutral (kein Sechstel), LSt über -->
<!-- Fünftel-Override; SV-pflichtig mit Umlegung auf die -->
<!-- Kündigungsfrist; LNK-pflichtig (FLAG § 41 Abs 4 nennt nur -->
<!-- § 67 Abs 3 und 6). -->
<!-- Vergleich: § 67 Abs 8 lit a (AP15-C) — Rest über Fünftel- -->
<!-- Override, BV-Anwartschafts-Teil bis 7.500 € mit 6 %; beide -->
<!-- SV-pflichtig (Zuflussmonat; Aufrollung je Beitragsmonat bzw. -->
<!-- PV-Verlängerung siehe lb-end-22) und LNK-pflichtig. -->
<!-- Prämie: § 16 AngG-Aliquot bei Beendigung (AP14-B, lb-end-18) — -->
<!-- mit Endabrechnung sonstiger Bezug (Sechstel, SZ-SV); später -->
<!-- fällig über § 67 Abs 10 (tarifisch im Zuflussmonat ohne -->
<!-- Sechstel, Kern-Flag) mit Rollung des SV-Beitragsmonats ins -->
<!-- Austrittsjahr (Wizard-Write auf die Linie; mBGM-Storno GP7). -->
<!-- ============================================================ -->
<!-- Urlaubsersatzleistung — laufender Anteil (§ 67 Abs 8 lit d). -->
<record id="rule_url_ersatz_lfd" model="hr.salary.rule">
<field name="name">Urlaubsersatzleistung — laufender Anteil (§ 67 Abs 8 lit d)</field>
<field name="code">URL_ERSATZ_LFD</field>
<field name="sequence" eval="25"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_UEL_TAGE' in inputs and inputs['ATP_UEL_TAGE'].amount</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="l10n_at_sv_verlaengerung">urlaubsersatz</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# § 10 UrlG (lb-url-16): Tageswert = Monatsentgelt / Divisor
# (26 Werktage / 22 Arbeitstage); keine Rundung auf ganze Tage.
result = payslip._at_kv_gehalt_basis() / payslip._at_uel_divisor()
result_qty = inputs['ATP_UEL_TAGE'].amount
]]></field>
</record>
<!-- Urlaubsersatzleistung — Sonderzahlungsanteil (§ 67 Abs 8 lit d). -->
<record id="rule_url_ersatz_sz" model="hr.salary.rule">
<field name="name">Urlaubsersatzleistung — Sonderzahlungsanteil (§ 67 Abs 8 lit d)</field>
<field name="code">URL_ERSATZ_SZ</field>
<field name="sequence" eval="26"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_UEL_TAGE' in inputs and inputs['ATP_UEL_TAGE'].amount</field>
<field name="l10n_at_bemessung">sonstig</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# SZ-Anteil der Urlaubsentgelt-Basis (lb-url-16): 2 Sonderzahlungen
# à Monatsentgelt pro Jahr → je Monat 2 × SZ-Basis/12, als Tageswert
# (auch bei bereits überaliquot bezahlten SZ).
result = payslip._at_uel_sz_tageswert()
result_qty = inputs['ATP_UEL_TAGE'].amount
]]></field>
</record>
<!-- Abgangsentschädigung (§ 67 Abs 8 lit b — Kündigungsentschädigung). -->
<record id="rule_abgang" model="hr.salary.rule">
<field name="name">Abgangsentschädigung (§ 67 Abs 8 lit b)</field>
<field name="code">ABGANG</field>
<field name="sequence" eval="29"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ABGANG' in inputs and inputs['ATP_ABGANG'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">laufend</field>
<field name="l10n_at_s67_fuenftel" eval="True"/>
<field name="l10n_at_sv_verlaengerung">abgang</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_ABGANG'].amount
]]></field>
</record>
<!-- Gesetzliche Abfertigung Alt (§§ 23/23a AngG, § 67 Abs 3 EStG). -->
<record id="rule_abf_alt" model="hr.salary.rule">
<field name="name">Gesetzliche Abfertigung Alt (§ 67 Abs 3)</field>
<field name="code">ABF_ALT</field>
<field name="sequence" eval="30"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ABF_ALT' in inputs and inputs['ATP_ABF_ALT'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="l10n_at_s67_abs">abs3</field>
<field name="l10n_at_pfandung_beendigung" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_ABF_ALT'].amount
]]></field>
</record>
<!-- Freiwillige Abfertigung (§ 67 Abs 6 EStG): begünstigter Teil
(Viertel-/Zwölftelregelung mit 6 %) und tarifischer Überhang
(Z 6) als getrennte Zeilen. -->
<record id="rule_abf_frei" model="hr.salary.rule">
<field name="name">Freiwillige Abfertigung — begünstigter Teil (§ 67 Abs 6)</field>
<field name="code">ABF_FREI</field>
<field name="sequence" eval="31"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ABF_FREI' in inputs and inputs['ATP_ABF_FREI'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="l10n_at_s67_abs">abs6</field>
<field name="l10n_at_pfandung_beendigung" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_abf_frei_beguenstigt(result_rules)
]]></field>
</record>
<record id="rule_abf_frei_tarif" model="hr.salary.rule">
<field name="name">Freiwillige Abfertigung — Überhang (§ 67 Abs 6 Z 6)</field>
<field name="code">ABF_FREI_TARIF</field>
<field name="sequence" eval="32"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip._at_abf_frei_ueberhang(result_rules) > 0</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="l10n_at_sv_art">keine</field>
<field name="l10n_at_s67_abs">abs6</field>
<field name="l10n_at_s67_abs6_ueberhang" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_abf_frei_ueberhang(result_rules)
]]></field>
</record>
<!-- Vergleichssumme — Rest (§ 67 Abs 8 lit a, Fünftelregelung). -->
<record id="rule_vergleich" model="hr.salary.rule">
<field name="name">Vergleichssumme — Rest (§ 67 Abs 8 lit a)</field>
<field name="code">VERGLEICH</field>
<field name="sequence" eval="33"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_VERGLEICH' in inputs and inputs['ATP_VERGLEICH'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">laufend</field>
<field name="l10n_at_s67_fuenftel" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_VERGLEICH'].amount
]]></field>
</record>
<!-- Vergleichssumme — BV-Anwartschafts-Teil (§ 67 Abs 8 lit a
letzter Satz): bis 7.500 € mit 6 % (LST_VERGLEICH_BV), Überhang
fällt in die Fünftelregelung zurück. Erkennbare Abfertigungs-
anteile werden getrennt als ABF_ALT/ABF_FREI erfasst. -->
<record id="rule_vergleich_bv" model="hr.salary.rule">
<field name="name">Vergleichssumme — BV-Anwartschafts-Teil (§ 67 Abs 8 lit a)</field>
<field name="code">VERGLEICH_BV</field>
<field name="sequence" eval="34"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_VERGLEICH_BV' in inputs and inputs['ATP_VERGLEICH_BV'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">laufend</field>
<field name="l10n_at_vergleich_bv" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_VERGLEICH_BV'].amount
]]></field>
</record>
<!-- Aliquote Prämie/Sonderzahlung bei Beendigung (§ 16 AngG):
mit der Endabrechnung ausgezahlt — sonstiger Bezug im
Jahressechstel (6 %, Freibetrag/Freigrenze), SZ-SV, voll
LNK- und BV-pflichtig (lb-end-18). -->
<record id="rule_pram_end" model="hr.salary.rule">
<field name="name">Aliquote Prämie bei Beendigung (§ 16 AngG)</field>
<field name="code">PRAM_END</field>
<field name="sequence" eval="35"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_PRAM_END' in inputs and inputs['ATP_PRAM_END'].amount</field>
<field name="l10n_at_bemessung">sonstig</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_PRAM_END'].amount
]]></field>
</record>
<!-- Später fällige anteilige Prämie (§ 67 Abs 10): die Höhe ist
erst nach Ablauf der Anspruchsperiode ermittelbar und wird zum
vereinbarten Fälligkeitszeitpunkt ausgezahlt — wie ein laufender
Bezug zum Tarif des Zuflussmonats, OHNE Sechstel-Erhöhung
(Kern-Flag), gesonderter Lohnzettel (LStR Rz 911a); der
SV-Beitragsmonat wird per Rollung ins Austrittsjahr auf die
Linie geschrieben (E-MVB 044-01-00-006). -->
<record id="rule_pram_end_tarif" model="hr.salary.rule">
<field name="name">Später fällige anteilige Prämie (§ 67 Abs 10)</field>
<field name="code">PRAM_END_TARIF</field>
<field name="sequence" eval="36"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_PRAM_END_TARIF' in inputs and inputs['ATP_PRAM_END_TARIF'].amount</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="l10n_at_s67_abs6_ueberhang" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_PRAM_END_TARIF'].amount
]]></field>
</record>
<!-- Zeitguthaben an Normalarbeitszeit (§ 19e Abs 2 AZG: + 50 %). -->
<record id="rule_zeit_guthaben" model="hr.salary.rule">
<field name="name">Zeitguthaben Normalarbeitszeit + 50 % (§ 19e Abs 2 AZG)</field>
<field name="code">ZEIT_GUTHABEN</field>
<field name="sequence" eval="27"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ZEIT_GUTHABEN' in inputs and inputs['ATP_ZEIT_GUTHABEN'].amount</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# § 19e Abs 2 AZG: Guthaben an Normalarbeitszeit + 50 % Zuschlag,
# bemessen mit der Normalstunde (lb-end-10); der Zuschlag ist KEIN
# Überstundenzuschlag iSd § 68 EStG (kein Freibetrags-Flag).
result = payslip._at_grundstunde_norm() * 1.5
result_qty = inputs['ATP_ZEIT_GUTHABEN'].amount
]]></field>
</record>
<!-- Zeitschulden (Abrechnung mit der aktuellen Normalstunde). -->
<record id="rule_zeit_schulden" model="hr.salary.rule">
<field name="name">Zeitschulden-Abrechnung (negative Zeile)</field>
<field name="code">ZEIT_SCHULDEN</field>
<field name="sequence" eval="28"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ZEIT_SCHULDEN' in inputs and inputs['ATP_ZEIT_SCHULDEN'].amount</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
# Abrechnung offener Zeitschulden mit der aktuellen Normalstunde
# (lb-end-08); negative laufende Bezugszeile.
result = -payslip._at_grundstunde_norm()
result_qty = inputs['ATP_ZEIT_SCHULDEN'].amount
]]></field>
</record>
<!-- Aufrechnung offener Vorschüsse: Rückverrechnung vom Netto
NACH SV und Lohnsteuer (§ 293 Abs 3 EO, lb-end-06) — neutral,
ohne SV-/LSt-/LNK-Wirkung. -->
<record id="rule_end_abrechnung_vorschuss" model="hr.salary.rule">
<field name="name">Aufrechnung offener Vorschuss (Netto)</field>
<field name="code">END_ABRECHNUNG_VORSCHUSS</field>
<field name="sequence" eval="80"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_ABRECHNUNG_VORSCHUSS' in inputs and inputs['ATP_ABRECHNUNG_VORSCHUSS'].amount</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_ABRECHNUNG_VORSCHUSS'].amount
]]></field>
</record>
</odoo>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP16 (8.13): Karenz-Entgelt-Stopp — entgeltlose Voll- -->
<!-- Freistellungen (AVRAG §§ 11/14a/14b/14e/14c, VKG § 1a): -->
<!-- das Karenzgeld/Pflegekarenzgeld zahlen AK/Bund (nicht der -->
<!-- AG), der Dienstgeber schuldet für die Freistellungs-Tage -->
<!-- kein Entgelt. Negative Brutto-Zeile je Arbeitstag aus dem -->
<!-- Arbeitseintragssatz (Muster MSCH_ENTGELT, AP7); der Tagesatz -->
<!-- teilt die Ausschlüsse mit EFZG/MSCH (_at_efz_tagesatz). -->
<!-- ============================================================ -->
<record id="rule_karenz_entgelt" model="hr.salary.rule">
<field name="name">Karenz-Freistellung (kein Dienstgeber-Entgelt; Leistungen extern)</field>
<field name="code">KARENZ_ENTGELT</field>
<field name="sequence" eval="48"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_brutto"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python"><![CDATA[
result = payslip._at_karenz_entgelt_tage() > 0
]]></field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="amount_python_compute"><![CDATA[
# Freistellung je Arbeitstag: volle Tages-Entgelt-Reduktion
# (Tagesatz teilt die Ausschlüsse mit EFZG/MSCH/KARENZ).
result = -payslip._at_efz_tagesatz(result_rules) \
* payslip._at_karenz_entgelt_tage()
]]></field>
</record>
</odoo>
@@ -104,4 +104,49 @@ result = payslip._l10n_at_lst_laufend(result_rules)
result = payslip._l10n_at_lst_sonstige(result_rules)
]]></field>
</record>
<record id="rule_lst_abf" model="hr.salary.rule">
<field name="name">Lohnsteuer Abfertigung Alt (§ 67 Abs 3)</field>
<field name="code">LST_ABF</field>
<field name="sequence" eval="72"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip._at_abf_alt_lohnsteuer(result_rules) > 0</field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_abf_alt_lohnsteuer(result_rules)
]]></field>
</record>
<record id="rule_lst_abf_frei" model="hr.salary.rule">
<field name="name">Lohnsteuer freiwillige Abfertigung (§ 67 Abs 6)</field>
<field name="code">LST_ABF_FREI</field>
<field name="sequence" eval="73"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip._at_abf_frei_lst_6(result_rules) > 0</field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_abf_frei_lst_6(result_rules)
]]></field>
</record>
<record id="rule_lst_vergleich_bv" model="hr.salary.rule">
<field name="name">Lohnsteuer Vergleich — BV-Anwartschafts-Teil (§ 67 Abs 8 lit a)</field>
<field name="code">LST_VERGLEICH_BV</field>
<field name="sequence" eval="74"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python">result = payslip._at_vergleich_bv_lst_6(result_rules) > 0</field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_vergleich_bv_lst_6(result_rules)
]]></field>
</record>
</odoo>
@@ -56,4 +56,23 @@ result = (payslip._at_pfaendung_masse(result_rules, 'sz13')
+ payslip._at_pfaendung_masse(result_rules, 'sz14'))
]]></field>
</record>
<record id="rule_pfaendung_end" model="hr.salary.rule">
<field name="name">Lohnpfändung — Beendigungsansprüche (§ 291d EO)</field>
<field name="code">PFAENDUNG_END</field>
<field name="sequence" eval="77"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python"><![CDATA[
result = bool(payslip.employee_id._at_pfaendungen_aktiv(payslip.date_to)) \
and payslip._at_pfaendung_masse(result_rules, 'beendigung') > 0
]]></field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="l10n_at_sv_art">keine</field>
<field name="amount_python_compute"><![CDATA[
result = payslip._at_pfaendung_masse(result_rules, 'beendigung')
]]></field>
</record>
</odoo>
@@ -33,6 +33,7 @@ result = inputs['EXPENSES'].amount
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATP_REISE_STEUERPFLICHTIG' in inputs and inputs['ATP_REISE_STEUERPFLICHTIG'].amount</field>
<field name="l10n_at_bemessung">laufend</field>
<field name="l10n_at_s26_z4_reise" eval="True"/>
<field name="amount_select">code</field>
<field name="amount_python_compute"><![CDATA[
result = inputs['ATP_REISE_STEUERPFLICHTIG'].amount
@@ -0,0 +1,308 @@
# Endabrechnungs-Zyklus — Rechenfälle AP14-A / AP14-B / AP15-A / AP15-C
Stand: 2026-09. AP14-A bildet die Beendigungs-Abrechnung auf der
privaten Structure ab: Urlaubsersatzleistung (UEL), Abgangsentschädigung,
Aufrechnung offener Vorschüsse und Zeitguthaben/-schulden. Grundlagen
sind am Originalwortlaut verifiziert (`.ris/`, Stand 2026-09-14):
§ 11 Abs 2 ASVG, § 67 Abs 8 lit b und lit d EStG, § 19e Abs 2 AZG,
§ 41 Abs 4 FLAG.
## Rechts- und Systemgrenzen
- **UEL (§ 10 UrlG, § 67 Abs 8 lit d EStG):** Zweikomponenten — der
laufende Anteil läuft als laufender Bezug durch den Tarif des
Austrittsmonats und erhöht das Jahressechstel (nativ über
`bemessung='laufend'`); der Sonderzahlungsanteil läuft als sonstiger
Bezug durch das 6 %-Band (Freibetrag 620 €, Freigrenze 2.615 € im
Kern). Nur der laufende Anteil verlängert die Pflichtversicherung
(§ 11 Abs 2 ASVG). Tagewert-Divisoren 26 (Werktage) / 22 (5-AT); die
SV-Tage-Umrechnung (je volle Woche à N AT + 7N KT, nur ganze
Blöcke) ist Verwaltungspraxis (lb-url-15), nicht Gesetzeswortlaut.
- **Abgangsentschädigung (§ 67 Abs 8 lit b):** nach Abzug der §-62-
Beiträge ein Fünftel steuerfrei, gedeckelt mit einem Fünftel des
Neunfachen der monatlichen HBG (2026: 6.930 × 9/5 = **12.474 €**);
der Rest läuft tarifisch im Zuflussmonat — Abs 2 (Sechstel) ist nicht
anzuwenden. SV-pflichtig mit Umlegung auf den Kündigungsfrist-
Zeitraum; voll lohnnebenkostenpflichtig (FLAG § 41 Abs 4 nennt nur
§ 67 Abs 3 und 6).
- **Sequentielle Verlängerungsfenster:** Gebühren sowohl eine
Kündigungsentschädigung als auch eine UEL, ist zur Bestimmung des
Zeitraumes zunächst die Kündigungsentschädigung und im Anschluss die
Ersatzleistung heranzuziehen (§ 11 Abs 2 ASVG) — die SV-Basen werden
fensterweise auf die Monate verteilt, Standardanteile bleiben auf
die volle monatliche HBG gedeckelt, Verlängerungsanteile auf den
Tageswert (HBG × Tage/30).
- **Aufrechnung offener Vorschüsse (§ 293 Abs 3 EO):** Rückverrechnung
vom Netto nach SV und Lohnsteuer — zulässig auch gegen das
Existenzminimum; keine Abgabenberührung (lb-end-06).
- **Zeitguthaben (§ 19e Abs 2 AZG):** Guthaben an Normalarbeitszeit
+ 50 % Zuschlag, bemessen mit der Normalstunde; der Zuschlag ist
KEIN Überstundenzuschlag iSd § 68 EStG (lb-end-10). Entfall bei
unberechtigtem vorzeitigem Austritt (Eingabe weglassen); KV kann
abweichen.
## RF-END-1 — UEL-Zweikomponenten
Ende 15. 3., 11 offene AT à 120 € (2.640 € Gehalt / 22):
- `URL_ERSATZ_LFD` = 1.320 €: tarifisch im März, Sechstel +5.280 €
(annualisiert 60/15);
- `URL_ERSATZ_SZ` = 220 € (2 × 2.640/12 = 440/Monat → 20/Tag):
6 %-Band;
- SV: 1.320 € auf die Verlängerungsmonate (Tage-Schema), 220 € als
sonstige Beitragsgrundlage gegen Monats- und Jahres-HBGl.
## RF-END-2 — SV-Tage-Umrechnung (§ 11 Abs 2)
- 23 AT (5-AT-Woche) → +4×2 KT = **31 SV-Tage**;
- 12 WT (6-WT-Woche) → +2×1 KT = **14**;
- 6 AT (2-Tage-Teilzeitwoche) → +3×5 KT = **21** (lb-url-15-Beispiel).
- Ende 15. 3., 31 SV-Tage → Verlängerung 16. 3.15. 4.; UEL-lfd-Basis
tageproportional (März 16/31, April 15/31), Tageswert-Deckel je
Verlängerungsmonat.
## RF-END-3 — Abgangsentschädigung (Fünftelregelung)
9.000 € Entschädigung, 42 Tage Kündigungsfrist, DN-Satz s:
- Bemessung 9.000 × (1 s/100); davon 1/5 steuerfrei (≤ 12.474 €);
4/5 tarifisch im Zuflussmonat, ohne Sechstelerhöhung;
- SV: Umlegung 16. 3.26. 4. (Kündigungsfrist zuerst);
- LNK: volle 9.000 € in der Basis (§ 41 Abs 3 FLAG).
## RF-END-4 — Aufrechnung
2.000 € offener Vorschuss: `END_ABRECHNUNG_VORSCHUSS` mindert nur das
Netto; LSt-, SV- und LNK-Basen unverändert.
## RF-END-5 — Zeitguthaben/-schulden
10 h Normalarbeitszeit-Guthaben × 1,5 + 5 h Zeitschulden × (1):
beides laufender Bezug, kein §-68-Freibetrag.
## RF-ABF-1 — Abfertigung Alt, Vervielfachung günstiger
21 Dienstjahre ergeben nach § 23 Abs 1 AngG 9 Monatsentgelte. Bei
1.800 € laufendem Monatsarbeitslohn und 2.100 € arbeitsrechtlicher
Bemessungsgrundlage einschließlich 2/12 Sonderzahlungen:
- Bruttoabfertigung: 2.100 × 9 = **18.900 €**;
- steuerlicher Vervielfacher: 18.900 / 1.800 = **10,5** — nicht 9;
- auf den maßgeblichen laufenden Bezug entfallende Tarif-LSt laut
Ausgangsfall: **101,96 €**;
- Vervielfachungssteuer: 101,96 × 10,5 = **1.070,58 €**;
- Vergleich mit 18.900 × 6 % = **1.134 €**;
- zwingend wird der niedrigere Steuerbetrag angesetzt.
`ABF_ALT` ist SV-, BV-, DB-, DZ- und KommSt-frei, verbraucht kein
Jahressechstel und läuft als Beendigungsanspruch in den §-291d-EO-Topf.
## RF-ABF-2 — 6 % günstiger
Bei hohem laufendem Monatsarbeitslohn kann die vervielfachte Tarif-LSt
den Fixsatz überschreiten. Für 9.333,34 € Abfertigung wird dann zwingend
**560,00 €** Lohnsteuer (6 %) angesetzt.
## RF-ABF-3 — Staffel und Sonderfälle
- 3/5/10/15/20/25 Jahre → 2/3/4/6/9/12 Monatsentgelte;
- Elternaustritt nach § 23a Abs 3/4: erst nach mindestens fünf Jahren,
dann Hälfte, maximal 3 Monatsentgelte;
- Tod nach § 23 Abs 6: Hälfte des normalen Anspruchs;
- normale Arbeitnehmerkündigung, unberechtigter Austritt und
verschuldete Entlassung begründen grundsätzlich keinen Anspruch;
- Abfertigung-Neu-Verträge sind gesperrt, außer ein eingefrorener
Altanspruch wird ausdrücklich nachgewiesen.
Der Wizard schlägt Dienstzeit, Faktor und eine Basis aus laufendem Entgelt
plus aliquoten Sonderzahlungen vor. Die auf den maßgeblichen laufenden
Monatsarbeitslohn entfallende Tarif-LSt wird getrennt bestätigt, weil sie
von der §-62-Bemessung und den persönlichen Absetzbeträgen abhängt und nicht
mit dem Bruttolohn gleichgesetzt werden darf. Wegen regelmäßiger Zulagen,
Durchschnittsbezügen, Lehrzeiten, Teilübertritten und §-23a-Sonderfällen
müssen Anspruch, Basis und Nachweis vor Anlage des Laufs bestätigt werden.
Die geprüften Angaben werden am Payslip gespeichert.
## RF-ABF-4 — Freiwillige Abfertigung, Viertel-/Zwölftelregelung
15 nachgewiesene Dienstjahre (6/12), 12-Monats-Basis 36.000 € (alle
steuerbaren Bezugsteile inklusive steuerfreier Zuschläge und Sachbezüge,
ohne Sonderzahlungen und ohne §-26-Z-4-Reisevergütungen), Brutto
40.000 €:
- Z 1 Viertelregelung: 36.000 / 4 = **9.000 €** (Deckel 9 × HBG =
62.370 € nicht greifend);
- Z 2 Zwölftelregelung: 36.000 × 6/12 = **18.000 €** (Deckel
6 × 3 × HBG = 124.740 € nicht greifend);
- begünstigter Teil: min(40.000, 9.000 + 18.000) = **27.000 €** mit
6 % = **1.620 €** Lohnsteuer (`ABF_FREI`/`LST_ABF_FREI`);
- Überhang **13.000 €** als `ABF_FREI_TARIF`: tarifisch in der
LSt-Bemessung des Zuflussmonats (LST_LFD), ohne Jahressechstel-Erhöhung
(Kern-Flag `l10n_at_s67_abs6_ueberhang`);
- SV-frei (§ 49 Abs 3 Z 7 ASVG), LNK-frei unabhängig von der
Besteuerungsart (§ 41 Abs 4 lit b FLAG, § 122 Abs 8 WKG,
§ 5 Abs 2 lit b KommStG), BV-frei (§ 6 Abs 5 BMSVG); Z 7 (BV-
Anwartschafts-Ausschluss) ist seit BGBl I 118/2015 aufgehoben.
## RF-ABF-5 — Z-3-Kürzung und Deckel
4.000 € bereits erhaltene Abfertigungen plus 9.000 € gesetzlicher
Anspruch am aktuellen Ende kürzen das Z-2-Ausmaß von 18.000 € auf
5.000 €; begünstigt sind 9.000 + 5.000 = 14.000 € von 20.000 € Brutto,
der Rest läuft zum Tarif. Bei einer 12-Monats-Basis von 12.000.000 €
begrenzen die Deckel auf 62.370 € (Z 1) plus 124.740 € (Z 2, 6 × 3 ×
HBG), begünstigt sind also höchstens 187.110 €.
## RF-ABF-6 — Pfändung und Wizard
- `ABF_FREI` (begünstigter Teil) läuft über den §-291d-Beendigungstopf,
vermindert um `LST_ABF` und `LST_ABF_FREI`; der Überhang
(`ABF_FREI_TARIF`) bleibt über die laufende Bemessung pfändbar, seine
Lohnsteuer steckt bereits in `LST_LFD`.
- Der Wizard schlägt die 12-Monats-Basis aus den letzten zwölf
validierten Läufen vor (ohne Überhang- und Reise-Regeln, geminderte
Bezüge nicht automatisch zurückgerechnet) und den gesetzlichen
Anspruch aus der Alt-Abfertigung; Prüfung und Nachweise werden
bestätigt (lückenlose Vordienstzeiten zum Lohnkonto, § 76 EStG,
keine Anspruchsumwandlung, lb-end-15).
## RF-VGL-1 — Vergleichssumme Rest, Fünftelregelung (§ 67 Abs 8 lit a)
Außergerichtlicher Vergleich 9.000 € brutto für nachgeforderte
Mehleistungen (lb-end-21 Beispiel 1; kein erkennbarer Abfertigungs-
anteil, Ansprüche strittig):
- `VERGLEICH` (bemessung neutral, `l10n_at_s67_fuenftel`): nach Abzug
der §-62-DN-Beiträge (Beispiel: 18,07 % → 1.626,30 €) ist 1/5 der
Bemessung steuerfrei (1.474,74 €), Deckel 12.474 € (= 1/5 × 9 ×
HBG) greift hier nicht;
- 4/5 (5.898,96 € im Beispiel) laufen tarifisch im Zuflussmonat
(LST_LFD), ohne Jahressechstel-Erhöhung (Abs 2 nicht anzuwenden);
bei Zahlung Monate nach dem DV-Ende ohne weitere laufende Bezüge
ist die Bemessungsgrundlage nur der Vergleichsbetrag;
- SV-pflichtig im Zuflussmonat (Pauschalvergleich im Zweifel
beitragspflichtig, E-MVB 011-02-00-001); Ansprüche aus der aktiven
DV-Zeit sind je Beitragsmonat aufzurollen (Kern-Feld
`l10n_at_beitragsmonat`), Ansprüche nach DV-Ende verlängern die
Pflichtversicherung (lb-end-22);
- voll LNK-pflichtig (§ 41 Abs 4 lit b FLAG nennt nur Abs 3 und 6).
## RF-VGL-2 — BV-Anwartschafts-Teil (6 %, Deckel 7.500 €)
Vergleichssumme 9.000 €, davon Anteil für Zeiträume mit
BV-Kassen-Anwartschaft (lb-end-21 Beispiel 2):
- erste 7.500 € (`VERGLEICH_BV`): nach anteiligem §-62-Abzug
(83,33 % der Beiträge) mit 6 % = `LST_VERGLEICH_BV`;
- Überhang 1.500 € (16,67 % der Beiträge) fällt in die
Fünftelregelung zurück (1/5 steuerfrei, 4/5 tarifisch);
- SV und LNK zur Gänze pflichtig; Deckel parametrisiert
(`at_lst_67_abs8_vergleich_bv` — § 67 Abs 8 unterliegt der
Inflationsanpassung § 33a/§ 124b EStG);
- beim Übertritt Alt→Neu gilt der 6-%-Teil nur für übertragene
Zeiträume; eingefrorene Zeiträume laufen über die Fünftelregelung
(lb-end-21 Hinweis).
## RF-VGL-3 — Deckelfälle
- Rest mit Bemessungsgrundlage 70.000 € (lb-end-21 Deckelbeispiel;
das ist bereits die §-62-gekürzte Grundlage): Fünftel an der Grenze
12.474 € (9 × HBG/5), Rest tarifisch. Da die Engine erst den
§-62-Abzug ansetzt und DANACH das Fünftel deckelt, greift der Deckel
brutto-abhängig ab ca. 76.200 € (Testfall 100.000 € brutto);
- BV-Teil 10.000 €: begünstigt 7.500 € mit 6 %, Überhang 2.500 € in
die Fünftelregelung.
## RF-VGL-4 — Wizard, Aufteilung und Pfändung
- Erkennbare Abfertigungsanteile werden getrennt erfasst: gesetzliche
Abfertigung über den Abf-Alt-Abschnitt (§ 67 Abs 3; ausdrücklich
vereinbarte Abfertigung unterhalb der Klagsforderung → gesamt § 67
Abs 3, VwGH 2013/13/0001 = ARD 6490/20/2016), freiwillige über den
Abf-Frei-Abschnitt (§ 67 Abs 6); der Rest über den Vergleichs-
abschnitt. Widmungen sind nur anzuerkennen, wenn die Ansprüche
strittig waren (lb-end-22); beim Pauschalvergleich ist der
Verhältnisfaktor Forderung : Vergleichssumme zu dokumentieren
(E-MVB 011-02-00-001); Pensionsabfindungen (lit e) und
Sozialplan-Zahlungen (lit f) gehören nicht in lit a.
- Wizard-Bestätigungspflichten: Aufgliederung/Strittigkeit,
BV-Anwartschaft je betroffenem Zeitraum, BV-Teil ≤ Deckel (über-
steigender Betrag als Rest erfassen). Vergleichs-Nachweis landet
auf dem Lauf (Payslip-Tab) und ist für den gesonderten Lohnzettel
bei Zahlung nach dem Beendigungsmonat aufzubereiten (LStR Rz 911a,
GP7-Rest).
- `VERGLEICH`/`VERGLEICH_BV` laufen — wie `ABGANG` — NICHT über den
§-291d-Beendigungstopf (offener Verifikationspunkt, s. u.); der
Fünftel-Tarifteil ist über die laufende Bemessung pfändbar, seine
Lohnsteuer steckt in `LST_LFD`.
## RF-PRM-1 — Aliquote Prämie, mit Endabrechnung (§ 16 AngG)
3.000 € aliquote Jahres-/Leistungsprämie für 3 der 12 Monate
Anspruchszeitraum (voller Betrag 12.000 € × 3/12, lb-end-18):
- `PRAM_END` (bemessung „sonstig“): sonstiger Bezug innerhalb des
Jahressechstels mit 6 % (`LST_SZ`-Pfad, Freibetrag 620/Freigrenze
2.615 vom Kern geprüft), ohne Sechstel-Erhöhung;
- SZ-SV: KV/PV/AV ohne AK/WF (§ 62 Z 3/Z 5), monatliche HBG und
SZ-Jahreshöchstbetrag (Kern `_l10n_at_svdn_basis_sz`);
- voll LNK-pflichtig (DB/DZ/KommSt, lb-end-18), BV 1,53 % ungecappt
(§ 6 Abs 1 iVm Abs 5 BMSVG);
- § 16: für Angestellte unabhängig vom Beendigungsgrund gebührend;
leistungsabhängige Prämien bei Arbeitern dürfen wirksam an „kein
Verschulden“ gebunden sein; Prämien mit spezifischer Leistungs-
verknüpfung (z. B. Bilanzgeld) sind ohne Tätigkeit nicht aliquot
zu leisten. Wizard bestätigt die Leistungs-/Anspruchsgrundlage.
## RF-PRM-2 — Später fällige Prämie (§ 67 Abs 10) mit SV-Rollung
3.000 € anteilige Prämie für Leistungen im Austrittsjahr 2025, Höhe
erst nach Ablauf der Periode ermittelbar, Fälligkeit und Auszahlung
März 2026 (lb-end-18):
- `PRAM_END_TARIF` (bemessung „laufend“ + Kern-Flag
`l10n_at_s67_abs6_ueberhang`): wie ein laufender Bezug zum Tarif des
Zuflussmonats (LST_LFD), OHNE Sechstel-Erhöhung (§ 67 Abs 10);
- keine Nachzahlung iSd § 67 Abs 8 lit c, weil die Zahlung nicht
später als zum vereinbarten Fälligkeitszeitpunkt erfolgt
(98/14/0009 = ARD 5483/14/2004);
- SV-Rollung: Lauf-Feld `l10n_at_pram_beitragsmonat` ordnet die
Zeile dem Beitragsmonat des Austrittsjahres zu (E-MVB
044-01-00-006) — historische HBG (2025: 6.450 €) und Sätze des
Rollmonats, private Überschreibung von
`_l10n_at_sv_basis_laufen_monate` (Pin); LSt und mBGM-Schnittstelle
(Storno/Neuübermittlung) bleiben im GP7-Track;
- gesonderter Lohnzettel für den Kalendermonat der Zahlung
(LStR Rz 911a); LNK und BV wie RF-PRM-1.
## RF-PRM-3 — Wizard-Aliquot und Validierungen
Der Wizard-Abschnitt schlägt den §-16-Aliquot-Betrag vor (voller
Betrag × zurückgelegte Dienstzeit / Anspruchsperiode), der zahlende
Betrag bleibt bestätigbar (KV-Vereinbarung). Validierungen:
Leistungs-/Anspruchsgrundlage bestätigen, Dienstzeit ≤ Anspruchszeit-
raum, bei späterer Fälligkeit Beitragsmonat der Rollung erforderlich.
## Offene Punkte (Verifikationsreste)
- KZ-Positionierung der Abs-6-Bezüge (außerhalb KZ 210/220, LSt in
KZ 260 — GP3-Konvention wie Abs 3) und die Zuordnung des Z-6-Überhangs
zum §-291d-EO-Topf sind gegen LStR Rz 1087 ff / § 291d EO zu
verifizieren, bevor der MVP freigegeben wird. Dasselbe gilt für die
KZ-Positionierung der lit-a-Tarif-Teile (laufend über LST_LFD) und
die §-291d-Zuordnung von `VERGLEICH`/`VERGLEICH_BV`.
- Geminderte Bezüge in der 12-Monats-Basis: die LStR-Rückrechnungs-
praxis (zwölf Monate voller Bezüge) widerspricht dem VwGH
(Krankengeld 6/7 einbeziehen) — bewusst ohne Automatik, Basis ist
bestätigbar (lb-end-13 ⚠).
- Prämien-Beendigung (§ 16 AngG-Aliquotierung, Rollung) — mit AP14-B
umgesetzt (`PRAM_END`/`PRAM_END_TARIF`, Wizard-Abschnitt,
Beitragsmonat-Rollung auf dem Lauf); offen bleibt die vollständige
SZ-Aufrollung (Storno + Neurechnung gegen die SZ-Jahreshöchst-
betrag des Austrittsjahres) und das mBGM-Storno/Neuübermitteln
(GP7/Meldewesen-Track).
- Meldewesen-Schnittstellen: „Ende des Entgeltanspruches" in mBGM/
Abmeldung (GP7), gesonderter Lohnzettel bei Zahlung außerhalb des
Beendigungsmonats (LStR 2002 Rz 911a).
- Der §-62-Abzug des Fünftelpfades ist über den effektiven DN-Satz
approximiert (HBG-Caps der Verlängerungsmonate laufen im SV-Pfad).
@@ -0,0 +1,113 @@
# Karenz-/Familien-Freistellungen — Rechenfälle AP16 (8.13 freigegeben)
Karenz-Familie im Privatmodul: unbezahlte Voll-Freistellungen (Eltern-
karenz generisch, Bildungs-, Familienhospiz-/Sterbebegleitungs-,
Kinderkranken-Begleitungs-, Kinderrehabilitations- und Pflegekarenz,
Papa-Monat) mit Entgelt-Stopp, eSV-An-/Abmeldungen, fiktiver BV mit
§-7-Abs-4-Brücke, §-6-Abs-4-BV bei Teilzeit, Sonderwochengeld (§ 163
ASVG) und Ruhen (§ 166 ASVG). Grundlagen: KB lb-kar-01…06, lb-elt-
01…06, lb-kzs-01…07, lb-pap-01/02, lb-kbg-06 (Stand 2026-07) und die
verifizierten Originaltexte in `.ris/` (AVRAG, VKG, MSchG, KBGG,
FamZeitbG, BMSVG § 7, ASVG §§ 162/163/166).
## RF-KAR-1 — Entgelt-Stopp je Karenz-Art (test_01)
Bildungskarenz 1.15. 11. 2026 (§ 11 AVRAG: 212 Monate, teilbar ≥ 2,
Rahmenfrist 4 Jahre, kein Rechtsanspruch — Einvernehmen): das
Karenzgeld zahlt die **AK** (nicht der AG) — `KARENZ_ENTGELT` stoppt
das Dienstgeber-Entgelt je Arbeitstag (negatives Tagesatz-Muster von
`MSCH_ENTGELT`, geteilter Tagesatz-Helfer `_at_efz_tagesatz`, der
Ausschlüsse mit EFZG/MSCH teilt). 10 AT → (2.059,41/21) × 10.
Gleiches Muster für Hospizkarenz (§ 14a, 3/6 Monate), Begleitung
schwerst erkrankter Kinder (§ 14b, 5/9 Monate), Kinderrehabilitation
(§ 14e, 4 Wochen/Jahr), Pflegekarenz (§ 14c, 13 Monate, unteilbar)
und Papa-Monat (§ 1a VKG, 1 Monat).
## RF-KAR-2 — eSV-An-/Abmeldungen (vr.event)
- Abmeldung zum **Ende des Entgeltanspruchs** = Tag vor dem Karenz-
beginn; Anmeldung zum ersten Arbeitstag nach dem Karenzende —
entfällt, wenn das DV mit der Karenz endet (normale Vertrags-
Abmeldung).
- **Papa-Monat/Familienzeit tagesgenau:** Abmeldung am Tag **vor**
Beginn der Familienzeit (§ 11 Abs 3 lit a ASVG — unbezahlter Urlaub
hält die Pflichtversicherung nur bis 1 Monat, nicht bei Familien-
zeit; lb-pap-01), Anmeldung vor Arbeitsantritt.
- Karenzart-Strings („Familienhospizkarenz/Pflegekarenz An-/Abmeldung",
lb-kzs-05) laufen als Protokoll-Info; erweiterte eSV-Sonderformate
= GP7-Rest. Idempotenz über die Registry (employee, art, adatum).
## RF-KAR-3 — Fiktive BV mit Karenz-Brücke (§ 7 Abs 4 Z 13 BMSVG)
Mutterschutz-Frist 1.15. 11. 2026 (Verbot 1) → Elternkarenz
16. 11. 202628. 2. 2027 → neuerliches Beschäftigungsverbot 1. 3. 2027
(Z 1, unmittelbar nach der Karenz): die fiktive BV-Basis des
neuerlichen Verbots bemisst sich nach dem **Monatsentgelt des
Kalendermonats vor dem Verbot 1** — Referenzmonate Aug/Sep/Okt 2026
(statt Dez 2026Feb 2027, die karenzbedingt leer wären). Z 2
(Beschäftigung < 3 Monate zwischen Karenz und Verbot): gleicher
Stichtag. Z 3 (neues DV binnen 3 Monaten nach Beendigung des
karenzierten DV mit Karenz): der letzte volle Kalendermonat vor dem
neuerlichen Verbot als EINZELNER Referenzmonat („volles Monatsentgelt").
## RF-KAR-4 — BV-Vor-Entgelt bei Pflegeteilzeit (§ 6 Abs 4 BMSVG)
20-h-Teilzeit (work_time_rate 0,5) mit Vor-Reduzierungs-Entgelt
2.059,41 €: die BV-Basis läuft während der Maßnahme auf dem
Vor-Reduzierungs-Entgelt (§ 6 Abs 4 BMSVG), nicht auf der reduzierten
laufenden Basis (1.029,71 €). Bildungs-/Hospizteilzeit analog über
das Feld `l10n_at_bv_vor_entgelt` am Vertrag.
## RF-KAR-5 — Sonderwochengeld (§ 163 ASVG) und Ruhen (§ 166 ASVG)
- Mutterschutz-Frist **innerhalb** einer Karenz: kein Wochengeld
(§ 162), sondern **Sonderwochengeld** — Zahlung durch die ÖGK
(erhöhtes Krankengeld § 141 Abs 2, Bemessungsgrundlage § 125 aus
dem Arbeitsverdienst vor dem Ende des letzten Entgeltanspruchs,
§-108f-Anpassung); Ausweis im Mutterschutz-Status.
- Ruhen (§ 166 Abs 1): Fortbezug > 50 % (Entgeltfortzahlung 100 %-
Phase) → Ruhen zur Gänze, = 50 % (Halbphase) → hälftig; Zeiten der
Urlaubsersatzleistung/UEL/KE gelten nicht als weitergeleistete
Bezüge; Z 3 Erwerbstätigkeit (in Höhe des Einkommens) und Z 4
Pflegekarenzgeld (in dessen Höhe) = Bezugszeitraum-Daten der ÖGK
(Hinweis).
## RF-KAR-6 — Elternteilzeit: Entgelt und Beendigungs-Basen
- Entgelt: letzter voller Lohn/Gehalt, aliquotiert nach der
herabgesetzten Wochenstundenzahl (lb-elt-02) — maschinell über
`work_time_rate` der Version (Versionskalender ÷ Firmenzalender).
- SZ-Mischberechnung (§ 15j Abs 7 MSchG / § 8b Abs 7 VKG): B13/B14
bemessen je Monat aus dem jeweiligen (reduzierten) Monatsentgelt ×
Dienstzeitfaktor — VZ-/TZ-Anteile im Kalenderjahr ergeben sich
automatisch.
- Endabrechnungs-Wizard: §-23-Abs-8-Hochrechnung (DV während
MSchG-/VKG-Teilzeit: frühere Normalarbeitszeit = Monatsentgelt ÷
work_time_rate, Vorschau); für Arbeitnehmerkündigung § 23a Abs 4a
(5-Jahres-Ø der geleisteten Arbeitszeit ohne Karenz, manuell);
UEL § 10 Abs 4 UrlG (überwiegende Arbeitszeit des Urlaubsjahres).
Dienstzeitanrechnung: Karenzzeiten je Kind in vollem Umfang
(§ 15f Abs 1 MSchG, Geburten ab 1. 8. 2019, max. 22./24. Lebens-
monat); Papa-Monat anrechnen (§ 1a Abs 7 VKG).
## Offene Punkte (AP16-Reste)
- **Urlaubs-Aliquotierung aus Karenz** (§ 15f Abs 2 MSchG: 30 WT/25 AT
: 365 × aktive KT, Teiltage aufrunden) greift in die hr_holidays-
Allokationsseite — eigener Folgeschritt; Urlaubsverjährung
verlängert sich um die Karenz (§ 4 Abs 5 UrlG).
- **Krankheit während Karenz/Mutterschutz** ist als gleichzeitige
Abwesenheit in hr.leave nur mit einer Überlappungs-Policy-
Entscheidung umsetzbar (Odoo sperrt Quere-Überlappungen;
`allow_request_on_top` erfordert time_type „other") —
Mandanten-Entscheid; der Test umgeht mit dem offiziellen
leave_skip_date_check-Bypass.
- Fristen der AG↔AN-Kommunikation (3-/2-Monats-Bekanntgaben,
5/10-Arbeitstage, Begründungspflichten 5 Kalendertage) = Help-Texte;
keine Fristen-Automatik.
- eSV-Sonderformate (Karenzart-Block „Familienhospizkarenz/Pflege-
karenz") und mBGM-Feinschliff = GP7; Sonderwochengeld-Vollrechnung
(§ 141 Abs 2/§ 125/§ 108f) = Anzeige-Stufe, kein Eigenrechenpfad.
- lb-kar-02: Folgen der 13-Wochen-Überschreitung + § 2i-AVRAG-Konflikt
und lb-elt-06 §-8-/§-8a-VKG-Zuordnung — keine Implementierung auf
kontroversen Literaturansichten (dokumentiert ⚠).
@@ -14,9 +14,11 @@ from . import buchungsbeleg
from . import wien_dag
from . import efzg
from . import mutterschutz
from . import karenz
from . import aeb
from . import pfaendung
from . import pfaendung_report
from . import sachbezuege_private
from . import reisekosten
from . import pendler
from . import endabrechnung
@@ -206,12 +206,18 @@ class HrPayslip(models.Model):
Erstfenster — 30-Tage-Monat (KB-Beispiel 4.500/30 × 17 =
2.550); Teilmonate über die Lohnsteuertage, um Doppelabzüge
zu vermeiden (das Entgelt ist für die Teilzeit bereits
aliquotiert)."""
aliquotiert). AP16 (§ 6 Abs 4 BMSVG): während einer
Arbeitszeit-Reduzierung mit gesetztem Feld
l10n_at_bv_vor_entgelt (z. B. Pflegeteilzeit § 14d AVRAG)
läuft der Beitrag auf dem Vor-Reduzierungs-Entgelt."""
self.ensure_one()
pflichtig_ab, kurz_av = self._at_bv_fenster()
if kurz_av:
return 0.0
vor_entgelt = self.version_id.l10n_at_bv_vor_entgelt
basis = self._l10n_at_sv_basis_roh(result_rules)
if vor_entgelt:
basis = max(basis, float(vor_entgelt))
if pflichtig_ab is None or pflichtig_ab <= self.date_from:
# AP4: fiktive BG während des Krankengeldbezugs (§ 7 Abs 3
# BMSVG) und des Wochengeldbezugs (§ 7 Abs 4, AP7) — nur
@@ -68,6 +68,25 @@ L10N_AT_BUCHUNGSMATRIX = {
'rule_svdn_sz': {'credit': ('3600',)},
'rule_lst_lfd': {'credit': ('3540',)},
'rule_lst_sz': {'credit': ('3540',)},
'rule_lst_abf': {'credit': ('3540',)},
'rule_lst_abf_frei': {'credit': ('3540',)},
'rule_lst_vergleich_bv': {'credit': ('3540',)},
# Gesetzliche Abfertigung Alt: bis zur Referenzbuchhaltungs-
# Fixierung allgemeiner Gehalts-/Lohnaufwand, company-dependent
# Regelkonto bleibt übersteuerbar.
'rule_abf_alt': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
# Freiwillige Abfertigung (§ 67 Abs 6): begünstigter Teil und
# tarifischer Überhang — gleiche vorläufige Aufwandskonten.
'rule_abf_frei': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
'rule_abf_frei_tarif': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
# Vergleichssumme (§ 67 Abs 8 lit a): Rest und BV-Anwartschafts-
# Teil — gleiche vorläufige Aufwandskonten wie die Abfertigungen.
'rule_vergleich': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
'rule_vergleich_bv': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
# Prämie bei Beendigung (§ 16 AngG): mit Endabrechnung und später
# fällig — Prämien-Aufwandskonto wie rule_pram.
'rule_pram_end': {'debit': ('6230',)},
'rule_pram_end_tarif': {'debit': ('6230',)},
# Nettoauszahlung (reconcilable, s. o.)
'rule_netto': {'credit': ('3850',)},
# DG-Beiträge (650655 SV Arbeiter · 656659 SV Angestellte)
@@ -275,7 +275,7 @@ class HrPayslip(models.Model):
self.ensure_one()
basis = self._l10n_at_sv_basis_roh(result_rules)
for code in ('TEIL_ENTGELT_HALB', 'KRANKENTGELT_PHASE',
'MSCH_ENTGELT'):
'MSCH_ENTGELT', 'KARENZ_ENTGELT'):
if result_rules is not None and code in result_rules \
and result_rules[code]['total']:
basis -= result_rules[code]['total']
@@ -0,0 +1,656 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP14-A: Endabrechnungs-Zyklus — Urlaubsersatzleistung (UEL),
Abgangsentschädigung (§ 67 Abs 8 lit b), Aufrechnung offener Vorschüsse
und Zeitguthaben/-schulden (§ 19e AZG).
AP15-C: Vergleichssummen (§ 67 Abs 8 lit a).
Am Originalwortlaut verifiziert (.ris/, Stand 2026-09-14):
- § 11 Abs 2 ASVG: die Pflichtversicherung besteht für die Zeit des
Bezuges einer Ersatzleistung für Urlaubsentgelt (und einer
Kündigungsentschädigung) weiter; gebühren beide, ist zur Bestimmung
des Zeitraumes ZUERST die Kündigungsentschädigung und im Anschluss
die Ersatzleistung heranzuziehen (sequentielle Verlängerungsfenster).
Die 6-WT/5-AT-Tage-Umrechnung ist Verwaltungspraxis (lb-url-15),
nicht Gesetzeswortlaut.
- § 67 Abs 8 lit d EStG: UEL „soweit sie laufenden Arbeitslohn
betreffen, als laufender Arbeitslohn, soweit sie sonstige Bezüge
betreffen, als sonstiger Bezug im Kalendermonat der Zahlung" — die
Zweikomponenten-Abbildung läuft nativ über l10n_at_bemessung.
- § 67 Abs 8 lit b EStG (Kündigungs-/Abgangsentschädigung): nach
Abzug der §-62-Beiträge ist ein Fünftel steuerfrei zu belassen,
höchstens ein Fünftel des Neunfachen der monatlichen HBG; der Rest
läuft tarifisch im Zuflussmonat (Abs 10), Abs 2 (Sechstel) ist
NICHT anzuwenden. LNK-pflichtig (FLAG § 41 Abs 4 nennt nur
§ 67 Abs 3 und 6) und SV-pflichtig (keine §-49-Abs-3-Z-7-Befreiung)
mit Umlegung auf den Kündigungsfrist-Zeitraum.
- § 19e Abs 2 AZG: Guthaben an Normalarbeitszeit + 50 % Zuschlag
(Entfall bei unberechtigtem vorzeitigem Austritt; KV kann
abweichend regeln).
- § 67 Abs 8 lit a EStG (AP15-C, Stand 2026-09-15): Vergleichssummen
sind, SOWEIT sie nicht nach Abs 3, 6 oder dem letzten Satz mit dem
festen Steuersatz zu versteuern sind, nach Abs 10 im Kalendermonat
der Zahlung zu erfassen; nach Abzug der §-62-Z-3/4/5-Beiträge ist
ein Fünftel steuerfrei (Deckel ein Fünftel des Neunfachen der
monatlichen HBG), Abs 2 (Sechstel) ist nicht anzuwenden. Erkennbare
Abfertigungsanteile laufen getrennt über Abs 3 (VwGH
2013/13/0001 = ARD 6490/20/2016: ausdrücklich vereinbarte
gesetzliche Abfertigung → gesamt Abs 3) bzw. Abs 6. Fallen die
Vergleichssummen bei oder nach Beendigung an UND betreffen sie
Zeiträume mit BV-Kassen-Anwartschaft, sind sie bis 7 500 € mit 6 %
zu versteuern (parametrisiert, §-33a-Indexkette); der übersteigende
Teil fällt in die Fünftelregelung zurück. SV-Aufrollung aktiver
Ansprüche je Beitragsmonat bzw. PV-Verlängerung: lb-end-22
(E-MVB 011-02-00-001), Kern-Mechanismus l10n_at_beitragsmonat.
"""
from datetime import timedelta
from dateutil.relativedelta import relativedelta
from odoo import fields, models
class HrSalaryRule(models.Model):
_inherit = 'hr.salary.rule'
l10n_at_sv_verlaengerung = fields.Selection(
[('keine', 'Keine SV-Verlängerung (§ 11 Abs 2 ASVG)'),
('urlaubsersatz', 'UEL-Tage-Schema (Urlaubsersatzleistung)'),
('abgang', 'Kündigungsfrist (Abgangsentschädigung)')],
string='AT SV-Verlängerung', default='keine',
help='Verteilt die laufende SV-Basis dieser Regel auf die '
'Pflichtversicherungs-Verlängerungsmonate nach § 11 Abs 2 '
'ASVG statt auf den Abrechnungsmonat: Abgangsentschädigung '
'zuerst (Kündigungsfrist), UEL anschließend (Tage-Schema '
'lb-url-15).')
l10n_at_s67_fuenftel = fields.Boolean(
string='AT § 67 Abs 8 lit a/b (Fünftelregelung)',
help='LSt-Pfad der Vergleichs-/Kündigungsentschädigungen: nach '
'Abzug der §-62-Beiträge ist ein Fünftel steuerfrei '
'(Deckel: ein Fünftel des Neunfachen der monatlichen HBG), '
'der Rest läuft tarifisch im Zuflussmonat — ohne '
'Jahressechstel-Erhöhung (Abs 2 nicht anzuwenden).')
l10n_at_vergleich_bv = fields.Boolean(
string='AT § 67 Abs 8 lit a — BV-Anwartschafts-Teil',
help='Teil einer Vergleichssumme, der bei oder nach Beendigung '
'für Zeiträume mit BV-Kassen-Anwartschaft ausbezahlt wird: '
'bis zum Deckel (at_lst_67_abs8_vergleich_bv, 2026: 7 500 €) '
'mit 6 %, der übersteigende Teil fällt in die '
'Fünftelregelung zurück. SV-pflichtig und LNK-pflichtig.')
l10n_at_s26_z4_reise = fields.Boolean(
string='AT § 26 Z 4 Reisevergütung',
help='§-26-Z-4-Reisevergütungen zählen nicht in die '
'12-Monats-Basis der §-67-Abs-6-Begünstigung (lb-end-13); '
'Sonderzahlungen sind ohnehin nicht bemessung „laufend“.')
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
l10n_at_abf_alt_anspruchsart = fields.Selection(
[('normal', 'Normalanspruch (§ 23 AngG)'),
('eltern', 'Elternaustritt (§ 23a Abs 3/4 AngG)'),
('tod', 'Tod (§ 23 Abs 6 AngG)'),
('pension', 'Pension/Invalidität (§ 23a Abs 1 AngG)'),
('eingefroren', 'Eingefrorener Altanspruch (§ 47 BMSVG)'),
('manuell', 'Sonstiger nachgewiesener Anspruch')],
string='AT Abfertigung Alt — Anspruchsart', copy=False)
l10n_at_abf_alt_dienstzeit_monate = fields.Integer(
string='AT Abfertigung Alt — Dienstzeitmonate', copy=False)
l10n_at_abf_alt_monatsentgelt = fields.Float(
string='AT Abfertigung Alt — Monatsentgelt', copy=False,
help='Bestätigte arbeitsrechtliche Bemessungsgrundlage inklusive '
'regelmäßiger Bezugsbestandteile und aliquoter Sonderzahlungen.')
l10n_at_abf_alt_laufender_arbeitslohn = fields.Float(
string='AT Abfertigung Alt — laufender Arbeitslohn', copy=False,
help='Laufender Monatsarbeitslohn für den steuerlichen '
'Vervielfacher nach § 67 Abs 3 EStG.')
l10n_at_abf_alt_monatslohnsteuer = fields.Float(
string='AT Abfertigung Alt — tarifmäßige Monatslohnsteuer',
copy=False,
help='Auf den maßgeblichen laufenden Monatsarbeitslohn entfallende '
'tarifmäßige Lohnsteuer nach den persönlichen Verhältnissen.')
l10n_at_abf_alt_mehrfach = fields.Float(
string='AT Abfertigung Alt — Anspruchsfaktor', copy=False)
l10n_at_abf_alt_nachweis = fields.Text(
string='AT Abfertigung Alt — Nachweis/Begründung', copy=False)
l10n_at_abf_frei_basis_12 = fields.Float(
string='AT Freiwillige Abfertigung — 12-Monats-Basis', copy=False,
help='Laufende Bezüge der letzten zwölf Monate (§ 67 Abs 6 Z 1/2 '
'EStG): vom Wizard bestätigt — alle steuerbaren Bezugsteile '
'inklusive steuerfreier Zuschläge und Sachbezüge, ohne '
'Sonderzahlungen und ohne §-26-Z-4-Reisevergütungen; keine '
'Bezüge anderer Arbeitgeber, keine Hochrechnung kurzer DV.')
l10n_at_abf_frei_dienstzeit_monate = fields.Integer(
string='AT Freiwillige Abfertigung — nachgewiesene Dienstzeit '
'(Monate)', copy=False)
l10n_at_abf_frei_erhaltene_abfertigungen = fields.Float(
string='AT Freiwillige Abfertigung — erhaltene Abfertigungen',
copy=False,
help='Während der nachgewiesenen Dienstzeit bereits erhaltene '
'Abfertigungen nach § 67 Abs 3 oder Abs 6 EStG — kürzen das '
'Z-2-Ausmaß (§ 67 Abs 6 Z 3).')
l10n_at_abf_frei_gesetzlicher_anspruch = fields.Float(
string='AT Freiwillige Abfertigung — bestehender gesetzlicher '
'Anspruch', copy=False,
help='Bestehender Anspruch auf eine gesetzliche Abfertigung am '
'aktuellen Dienstverhältnis-Ende (§ 67 Abs 6 Z 3 EStG) — '
'kürzt das Z-2-Ausmaß.')
l10n_at_abf_frei_nachweis = fields.Text(
string='AT Freiwillige Abfertigung — Nachweis/Begründung',
copy=False)
l10n_at_vergleich_nachweis = fields.Text(
string='AT Vergleich — Nachweis/Begründung', copy=False,
help='Aufgliederung der Vergleichsvereinbarung (lb-end-21): '
'strittige Ansprüche, erkennbare Abfertigungsanteile, '
'BV-Anwartschafts-Zeiträume; beim Pauschalvergleich der '
'Verhältnisfaktor Forderungsbetrag : Vergleichssumme '
'(E-MVB 011-02-00-001).')
l10n_at_pram_nachweis = fields.Text(
string='AT Prämie bei Beendigung — Nachweis/Begründung', copy=False,
help='Anspruchsgrundlage (KV-/Vertragsvereinbarung, '
'Anspruchszeitraum), §-16-Aliquotierung, '
'Leistungsverknüpfung und Fälligkeitsvereinbarung '
'dokumentieren (lb-end-18).')
l10n_at_pram_beitragsmonat = fields.Date(
string='AT Prämie (§ 67 Abs 10) — SV-Beitragsmonat der Rollung',
copy=False,
help='Beitragsmonat, dem die später fällige anteilige Prämie '
'sv-rechtlich zuzuordnen ist — der Zeitraum, in dem die '
'Leistungen erbracht wurden (E-MVB 044-01-00-006, lb-end-18). '
'Leer = Zuflussmonat.')
# ------------------------------------------------------------------
# SV-Tage-Umrechnung und Verlängerungsmonate (§ 11 Abs 2 ASVG)
# ------------------------------------------------------------------
def _at_end_arbeitsrechtliches_ende(self):
"""Arbeitsrechtliches Ende = letzter Arbeitstag; das SV-Ende
(„Ende des Entgeltanspruches") liegt darüber hinaus, wenn ein
Entgeltanspruch über das Ende hinaus läuft."""
self.ensure_one()
return self.version_id.contract_date_end or self.date_to
def _at_end_arbeitstage_woche(self):
"""Arbeitstage pro Woche des Vertragskalenders (Schema-Grundlage
der SV-Tage-Umrechnung: 5-AT-Woche, 6-WT-Woche, Teilzeitwoche)."""
self.ensure_one()
calendar = self.version_id.resource_calendar_id
days = {int(att.dayofweek) for att in calendar.attendance_ids} \
if calendar else set()
return len(days) or 5
def _at_end_sv_tage(self, tage):
"""SV-Tage aus abzurechnenden Urlaubstagen (Verwaltungspraxis
lb-url-15): je volle Woche à N Arbeitstage werden 7N
Kalendertage hinzugerechnet (5-AT-Woche +2, 6-WT-Woche +1,
2-Tage-Teilzeitwoche +5) — nur ganze Wochenblöcke."""
self.ensure_one()
at_woche = self._at_end_arbeitstage_woche()
blocks = int(tage // at_woche)
return tage + blocks * (7 - at_woche)
def _at_end_verlaengerungs_monate(self, sv_tage, start):
"""[(Monatsanfang, Tage im Monat)] eines Verlängerungsfensters
ab dem übergebenen Starttag (§ 11 Abs 2 ASVG)."""
self.ensure_one()
ergebnis = {}
rest = int(sv_tage)
tag = start
while rest > 0:
monatsende = (tag.replace(day=28) + timedelta(days=4)) \
.replace(day=1) - timedelta(days=1)
tage_dabei = min((monatsende - tag).days + 1, rest)
monat = tag.replace(day=1)
ergebnis[monat] = ergebnis.get(monat, 0) + tage_dabei
tag = monatsende + timedelta(days=1)
rest -= tage_dabei
return sorted(ergebnis.items())
def _at_end_rule_verlaengerung(self, rule, result_rules=None):
"""[(Monatsanfang, Tage, Anteil)] der Regel-Basis nach § 11
Abs 2: die Abgangsentschädigung belegt ZUERST die (fiktive)
Kündigungsfrist, die UEL SCHLIESSLICH die Urlaubstage — beide
Fenster laufen ab dem Tag nach dem arbeitsrechtlichen Ende
hintereinander (Gesetzeswortlaut: „zunächst die
Kündigungsentschädigung und im Anschluss die Ersatzleistung")."""
self.ensure_one()
start = self._at_end_arbeitsrechtliches_ende() + timedelta(days=1)
if rule.l10n_at_sv_verlaengerung == 'urlaubsersatz':
ffrist = self._at_input_amount('ATP_ABGANG_FFRIST_TAGE')
if ffrist:
start += timedelta(days=int(ffrist))
tage = self._at_end_sv_tage(self._at_uel_tage())
else:
ffrist = self._at_input_amount('ATP_ABGANG_FFRIST_TAGE')
tage = int(ffrist) if ffrist else 0
monate = self._at_end_verlaengerungs_monate(tage, start)
if not monate:
return []
gesamt = sum(tage for _monat, tage in monate)
return [(monat, tage, tage / float(gesamt))
for monat, tage in monate]
# ------------------------------------------------------------------
# Eingabe-Helfer
# ------------------------------------------------------------------
def _at_input_amount(self, code):
self.ensure_one()
linie = self.input_line_ids.filtered(
lambda i: i.input_type_id.code == code)
return linie[:1].amount or 0.0
# ------------------------------------------------------------------
# Abfertigung Alt — §§ 23/23a AngG, § 67 Abs 3 EStG
# ------------------------------------------------------------------
def _at_abf_alt_staffel(self, dienstzeit_monate=None):
"""Arbeitsrechtlicher Grundfaktor nach § 23 Abs 1 AngG."""
self.ensure_one()
monate = dienstzeit_monate
if monate is None:
monate = self.l10n_at_abf_alt_dienstzeit_monate
staffel = self._l10n_at_param('at_endabrechnung').get(
'abfertigung_alt_staffel', [])
mehrfach = 0.0
for grenze, faktor in staffel:
if monate >= int(grenze):
mehrfach = float(faktor)
return mehrfach
def _at_abf_alt_mehrfach_vorschlag(self, dienstzeit_monate=None,
anspruchsart=None):
"""§-23-Faktor mit Halb-/Deckelregeln für Elternaustritt/Tod."""
self.ensure_one()
art = anspruchsart or self.l10n_at_abf_alt_anspruchsart
monate = dienstzeit_monate
if monate is None:
monate = self.l10n_at_abf_alt_dienstzeit_monate
mehrfach = self._at_abf_alt_staffel(monate)
if art == 'eltern':
if monate < 60:
return 0.0
return min(mehrfach / 2.0, 3.0) if mehrfach else 0.0
if art == 'tod':
return mehrfach / 2.0
return mehrfach
def _at_abf_alt_betrag(self, result_rules=None):
"""Gesetzliche Alt-Abfertigung als eigene Bezugszeile."""
self.ensure_one()
return self._at_input_amount('ATP_ABF_ALT')
def _at_abf_alt_steuer_6(self, result_rules=None):
self.ensure_one()
satz = float(self._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
return max(self._at_abf_alt_betrag(result_rules), 0.0) * satz / 100.0
def _at_abf_alt_steuer_vervielfachung(self, result_rules=None):
"""§ 67 Abs 3: Monats-Tarif-LSt × steuerlicher Vervielfacher.
Der steuerliche Vervielfacher ist Abfertigungsbetrag dividiert
durch den laufenden Arbeitslohn. Er kann vom arbeitsrechtlichen
Staffel-Faktor abweichen, weil die Abfertigungsbasis etwa aliquote
Sonderzahlungen enthält (lb-end-01, RF 21 Dienstjahre: 10,5 statt 9).
"""
self.ensure_one()
betrag = self._at_abf_alt_betrag(result_rules)
laufend = self.l10n_at_abf_alt_laufender_arbeitslohn
if betrag <= 0 or laufend <= 0:
return self._at_abf_alt_steuer_6(result_rules)
vervielfacher = betrag / laufend
return self.l10n_at_abf_alt_monatslohnsteuer * vervielfacher
def _at_abf_alt_lohnsteuer(self, result_rules=None):
"""Zwingend günstigere Steuer aus Vervielfachung und 6 %."""
self.ensure_one()
if self._at_abf_alt_betrag(result_rules) <= 0:
return 0.0
return min(self._at_abf_alt_steuer_vervielfachung(result_rules),
self._at_abf_alt_steuer_6(result_rules))
# ------------------------------------------------------------------
# Freiwillige Abfertigung — § 67 Abs 6 EStG (Viertel-/Zwölftelregelung)
# ------------------------------------------------------------------
def _at_bezuege_12_monate(self):
"""Laufende Bezüge der letzten zwölf Monate (§ 67 Abs 6 Z 1/2):
validierte Vormonats-Läufe plus eigene Zeilen — ohne den als
Abs-6-Überhang gekennzeichneten Betrag (das ist ein sonstiger
Bezug, kein laufender) und ohne §-26-Z-4-Reisevergütungen;
Sonderzahlungen sind ohnehin nicht bemessung „laufend“
(lb-end-13)."""
self.ensure_one()
start = (self.date_from - relativedelta(months=11)).replace(day=1)
vor_slips = self.env['hr.payslip'].search([
('employee_id', '=', self.employee_id.id),
('id', '!=', self.id),
('date_from', '>=', start),
('date_from', '<', self.date_from.replace(day=1)),
]).filtered(lambda p: p.state not in ('draft', 'cancel'))
total = 0.0
for slip in list(vor_slips) + [self]:
for line in slip.line_ids:
rule = line.salary_rule_id
if rule.l10n_at_bemessung != 'laufend':
continue
if (rule.l10n_at_s67_abs6_ueberhang
or rule.l10n_at_s26_z4_reise):
continue
total += line.total
return total
def _at_abf_frei_zwoelftel(self):
"""Zwölftel-Anzahl nach § 67 Abs 6 Z 2: die Dienstzeitstaffel
entspricht den §-23-Grenzen (36→2/12 … 300→12/12)."""
self.ensure_one()
return self._at_abf_alt_staffel(
self.l10n_at_abf_frei_dienstzeit_monate)
def _at_abf_frei_split(self, result_rules=None):
"""§ 67 Abs 6: begünstigter Teil (Viertel- und Zwölftelregelung,
gedeckelt 9 × bzw. n × 3 × monatliche HBG, Z-3-Kürzung um
erhaltene Abfertigungen und den bestehenden gesetzlichen
Anspruch) und der tarifische Überhang (Z 6)."""
self.ensure_one()
brutto = max(self._at_input_amount('ATP_ABF_FREI'), 0.0)
basis = self.l10n_at_abf_frei_basis_12
if basis <= 0:
basis = self._at_bezuege_12_monate()
basis = max(basis, 0.0)
hbg = float(self._l10n_at_param('at_sv_hbg_monatlich'))
z1 = min(basis / 4.0, 9.0 * hbg)
zwoelftel = self._at_abf_frei_zwoelftel()
z2 = min(basis * zwoelftel / 12.0, zwoelftel * 3.0 * hbg)
kuerzung = max(
self.l10n_at_abf_frei_erhaltene_abfertigungen
+ self.l10n_at_abf_frei_gesetzlicher_anspruch, 0.0)
z2 = max(z2 - kuerzung, 0.0)
beguenstigt = min(brutto, z1 + z2)
return {
'basis': basis,
'z1': z1,
'z2': z2,
'kuerzung': kuerzung,
'beguenstigt': beguenstigt,
'ueberhang': brutto - beguenstigt,
}
def _at_abf_frei_beguenstigt(self, result_rules=None):
self.ensure_one()
return self._at_abf_frei_split(result_rules)['beguenstigt']
def _at_abf_frei_ueberhang(self, result_rules=None):
self.ensure_one()
return self._at_abf_frei_split(result_rules)['ueberhang']
def _at_abf_frei_lst_6(self, result_rules=None):
"""6 % auf den begünstigten Teil (§ 67 Abs 6, fester Steuersatz)."""
self.ensure_one()
satz = float(self._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
return self._at_abf_frei_beguenstigt(result_rules) * satz / 100.0
# ------------------------------------------------------------------
# Urlaubsersatzleistung — § 67 Abs 8 lit d, lb-url-15/16
# ------------------------------------------------------------------
def _at_uel_tage(self):
"""Offene Urlaubstage (Arbeitstage; keine Rundung, lb-url-16)."""
self.ensure_one()
return self._at_input_amount('ATP_UEL_TAGE')
def _at_uel_divisor(self):
"""Tagewert-Divisor: /26 bei Werktags-, /22 bei 5-AT-Kalender
(lb-url-16)."""
self.ensure_one()
params = self._l10n_at_param('at_endabrechnung')
if self._at_end_arbeitstage_woche() >= 6:
return float(params['divisor_werktage'])
return float(params['divisor_arbeitstage'])
def _at_uel_lfd(self):
"""UEL-laufender Anteil: Tage × Monatsentgelt / Divisor —
läuft als laufender Bezug durch den Tarif des Austrittsmonats
und erhöht das Jahressechstel (nativ über bemessung='laufend')."""
self.ensure_one()
return self._at_uel_tage() * self._at_kv_gehalt_basis() \
/ self._at_uel_divisor()
def _at_uel_sz_tageswert(self):
"""SZ-Anteil je Urlaubstag: 2 Sonderzahlungen à Monatsentgelt
pro Jahr (KV § 11) → je Monat 2 × SZ-Basis/12, als Tageswert
(auch bei bereits überaliquot bezahlten SZ, lb-url-16)."""
self.ensure_one()
sz_monat = 2.0 * self._at_sz_basis(self.date_to) / 12.0
return sz_monat / self._at_uel_divisor()
def _at_uel_sz(self):
"""UEL-Sonderzahlungsanteil: Tage × SZ-Tageswert."""
self.ensure_one()
return self._at_uel_tage() * self._at_uel_sz_tageswert()
# ------------------------------------------------------------------
# Abgangsentschädigung — § 67 Abs 8 lit b (Fünftelregelung)
# ------------------------------------------------------------------
def _at_fuenftel_regeln(self):
self.ensure_one()
return self.struct_id.rule_ids.filtered(
lambda rule: rule.l10n_at_s67_fuenftel)
def _at_fuenftel_total(self, result_rules=None):
self.ensure_one()
total = 0.0
for rule in self._at_fuenftel_regeln():
if result_rules is not None:
if rule.code in result_rules:
total += result_rules[rule.code]['total']
else:
linie = self.line_ids.filtered(lambda l: l.code == rule.code)
total += sum(linie.mapped('total'))
# § 67 Abs 8 lit a: der über den BV-6-%-Deckel hinausgehende
# Teil der Vergleichssumme fällt in die Fünftelregelung zurück.
total += self._at_vergleich_bv_ueberhang(result_rules)
return total
def _at_fuenftel_tarif_basis(self, result_rules=None):
"""Tarifischer Teil (4/5) der Fünftel-Bezüge: Bemessung nach
Abzug der darauf entfallenden §-62-Beiträge (approximiert über
den effektiven DN-Satz der laufenden Basis; die HBG-Caps der
Verlängerungsmonate werden im SV-Pfad separat geführt); ein
Fünftel ist steuerfrei, gedeckelt mit einem Fünftel des
Neunfachen der monatlichen HBG (lb-end-21: 2026 6.930 × 9/5
= 12.474)."""
self.ensure_one()
total = self._at_fuenftel_total(result_rules)
if total <= 0:
return 0.0
satz = sum(self._l10n_at_sv_satz(
'dn', komponente,
staffel_basis=self._l10n_at_sv_basis_roh(result_rules))
for komponente in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = max(total * (1.0 - satz / 100.0), 0.0)
deckel = float(self._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
frei = min(bemessung / 5.0, deckel)
return bemessung - frei
# ------------------------------------------------------------------
# Vergleichssumme — § 67 Abs 8 lit a (Rest, BV-Anwartschafts-Teil)
# ------------------------------------------------------------------
def _at_vergleich_bv_total(self, result_rules=None):
"""Summe der als BV-Anwartschafts-Teil gekennzeichneten
Vergleichs-Zeilen (Zeiträume mit BV-Kassen-Anwartschaft,
§ 67 Abs 8 lit a letzter Satz)."""
self.ensure_one()
total = 0.0
for rule in self.struct_id.rule_ids:
if not rule.l10n_at_vergleich_bv:
continue
if result_rules is not None:
if rule.code in result_rules:
total += result_rules[rule.code]['total']
else:
total += sum(self.line_ids.filtered(
lambda l, c=rule.code: l.code == c).mapped('total'))
return total
def _at_vergleich_bv_beguenstigt(self, result_rules=None):
"""Bis zum Deckel (2026: 7 500 €) begünstigter Teil — 6 %-Fahrspur
(parametrisiert: § 67 Abs 8 unterliegt der Inflationsanpassung
§ 33a/§ 124b EStG)."""
self.ensure_one()
deckel = float(self._l10n_at_param('at_lst_67_abs8_vergleich_bv'))
return min(self._at_vergleich_bv_total(result_rules), deckel)
def _at_vergleich_bv_ueberhang(self, result_rules=None):
"""Über den BV-Deckel hinausgehender Teil — fällt in die
Fünftelregelung zurück (erster Satz des lit a)."""
self.ensure_one()
deckel = float(self._l10n_at_param('at_lst_67_abs8_vergleich_bv'))
return max(self._at_vergleich_bv_total(result_rules) - deckel, 0.0)
def _at_vergleich_bv_lst_6(self, result_rules=None):
"""6 % auf den begünstigten BV-Teil nach anteiligem §-62-Abzug
(LStR Rz 1102b: die SV-Beiträge sind den Teilbeträgen
anteilsmäßig zuzuordnen — approximiert über den effektiven
DN-Satz der laufenden Basis, wie im Fünftelpfad)."""
self.ensure_one()
beguenstigt = self._at_vergleich_bv_beguenstigt(result_rules)
if beguenstigt <= 0:
return 0.0
satz = sum(self._l10n_at_sv_satz(
'dn', komponente,
staffel_basis=self._l10n_at_sv_basis_roh(result_rules))
for komponente in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = beguenstigt * (1.0 - satz / 100.0)
steuersatz = float(self._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
return bemessung * steuersatz / 100.0
def _at_fuenftel_frei_betr(self, result_rules=None):
"""Steuerfreies Fünftel der Fünftel-Bezüge (inkl. BV-Überhang),
gedeckelt mit einem Fünftel des Neunfachen der monatlichen HBG
(lb-end-21: 2026 6.930 × 9/5 = 12.474) — getrennt vom
tarifischen Rest für die Wizard-Vorschau."""
self.ensure_one()
total = self._at_fuenftel_total(result_rules)
if total <= 0:
return 0.0
satz = sum(self._l10n_at_sv_satz(
'dn', komponente,
staffel_basis=self._l10n_at_sv_basis_roh(result_rules))
for komponente in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = max(total * (1.0 - satz / 100.0), 0.0)
deckel = float(self._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
return min(bemessung / 5.0, deckel)
# ------------------------------------------------------------------
# Engine-Anbindung: Tarif-Teil ohne Sechstel, LNK-Pflicht, SV-Umlegung
# ------------------------------------------------------------------
def _l10n_at_bemessung_laufen(self, result_rules=None):
basis = super()._l10n_at_bemessung_laufen(result_rules)
# § 67 Abs 8 lit b: 4/5 tarifisch im Zuflussmonat; die Regel
# selbst ist neutral und erhöht brutto('laufend') nicht → kein
# Sechstel-Effekt (Abs 2 nicht anzuwenden).
return basis + self._at_fuenftel_tarif_basis(result_rules)
def _at_lnk_basis(self, steuer, result_rules=None):
"""Upstream-Überschreibung (Muster account_posting_private;
Vorlage payslip_private._at_lnk_basis — bei Änderungen dort
gegen diesen Pin neu abgleichen): Kündigungsentschädigungen und
Vergleichssummen sind Arbeitslöhne iSd § 41 Abs 3 FLAG und
unterliegen NICHT den Abs-4-Ausschlüssen (lit b nennt nur
§ 67 Abs 3 und 6 — der lit-a-BV-Teil ist ebenfalls nicht
ausgenommen) — sie sind VOR der Freibetragsstaffel in die
LNK-Basis aufzunehmen."""
self.ensure_one()
basis = (self._l10n_at_brutto('laufend', result_rules)
+ self._l10n_at_brutto('sonstig', result_rules)
- self._l10n_at_st_frei_freie_laufen(result_rules))
for rule in self.struct_id.rule_ids:
if (rule.l10n_at_bemessung in ('laufend', 'sonstig')
and rule.l10n_at_s67_abs in ('abs3', 'abs6')):
if result_rules is not None and rule.code in result_rules:
basis -= result_rules[rule.code]['total']
elif result_rules is None:
linie = self.line_ids.filtered(
lambda l: l.code == rule.code)
basis -= sum(linie.mapped('total'))
basis += self._at_fuenftel_total(result_rules)
# BV-Anwartschafts-Teil: begünstigter ≤-Deckel-Teil hier, der
# Überhang läuft bereits über _at_fuenftel_total — zusammen
# die volle Vergleichssumme, LNK-pflichtig (lb-end-20).
basis += self._at_vergleich_bv_beguenstigt(result_rules)
basis = max(basis, 0.0)
if steuer in ('flaf', 'dz'):
version = self.version_id
if (version.l10n_at_lnkp_frei_ab
and self.date_from >= version.l10n_at_lnkp_frei_ab):
return 0.0
freibetrag = self.env['hr.rule.parameter']._get_parameter_from_code(
'at_lnk_freibetrag', self.date_to, raise_if_not_found=False) or {}
grenze = float(freibetrag.get('grenze', 0.0))
if basis <= 0.0:
return 0.0
if basis <= grenze:
basis -= float(freibetrag.get('freibetrag', 0.0))
return max(basis, 0.0)
def _l10n_at_sv_basis_laufen_monate(self, result_rules=None):
"""Upstream-Überschreibung (Muster account_posting_private;
Vorlage l10n_at_hr_payroll.sozialversicherung — bei Odoo- oder
Kern-Upgrades gegen diesen Pin neu abgleichen): identischer
Ablauf wie der Kern, zusätzlich werden Regeln mit AT-SV-
Verlängerung tageproportional auf die Verlängerungsmonate
gelegt. Der Standardanteil jedes Monats bleibt auf die volle
monatliche HBG gedeckelt, der Verlängerungsanteil auf den
Tageswert (monatliche HBG × Verlängerungstage/30, lb-url-15);
die Fenster laufen sequenziell (Abgang zuerst, UEL danach).
AP14-B: die später fällige Prämie (PRAM_END_TARIF) rollt über
l10n_at_pram_beitragsmonat in den Beitragsmonat des
Austrittsjahres (E-MVB 044, lb-end-18); die LSt bleibt im
Zuflussmonat (§ 67 Abs 10)."""
self.ensure_one()
gruppen = {}
verlaengerung = {}
tage_pro_monat = {}
for rule in self.struct_id.rule_ids:
if self._l10n_at_sv_art(rule) != 'laufend':
continue
werte = None
if result_rules is not None:
if rule.code in result_rules:
werte = result_rules[rule.code]
else:
linie = self.line_ids.filtered(
lambda l: l.code == rule.code)
if linie:
werte = {'total': sum(linie.mapped('total'))}
if not werte:
continue
if rule.l10n_at_sv_verlaengerung != 'keine':
for monat, tage, anteil in \
self._at_end_rule_verlaengerung(rule, result_rules):
verlaengerung[monat] = verlaengerung.get(monat, 0.0) \
+ werte['total'] * anteil
tage_pro_monat[monat] = \
tage_pro_monat.get(monat, 0) + tage
continue
if rule.code == 'PRAM_END_TARIF' \
and self.l10n_at_pram_beitragsmonat:
monat = self.l10n_at_pram_beitragsmonat.replace(day=1)
else:
monat = (rule.l10n_at_beitragsmonat or self.date_from) \
.replace(day=1)
gruppen[monat] = gruppen.get(monat, 0.0) + werte['total']
standard = self.date_from.replace(day=1)
if standard in gruppen:
gruppen[standard] -= self._l10n_at_sv49_freie_laufen(
result_rules)
ergebnis = []
for monat in sorted(set(gruppen) | set(verlaengerung)):
hbg = float(self._l10n_at_param('at_sv_hbg_monatlich', monat))
basis = min(max(gruppen.get(monat, 0.0), 0.0), hbg)
if monat in verlaengerung:
tageswert = hbg * tage_pro_monat[monat] / 30.0
basis += min(max(verlaengerung[monat], 0.0), tageswert)
ergebnis.append((monat, basis))
return ergebnis
@@ -0,0 +1,135 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP16: Karenz-/Familien-Freistellungen — unbezahlte Karenz-Arten
(Elternkarenz generisch, Bildungs-, Familienhospiz-, Kinderrehabilita-
tions- und Pflegekarenz, Papa-Monat) mit Entgelt-Stopp, eSV-An- und
Abmeldeereignissen und der BMSVG-§-7-Brücke.
Am Originalwortlaut verifiziert (.ris/, 8.13 freigegeben 2026-09-15):
- Alle Voll-Freistellungen sind entgeltlos (AVRAG §§ 11, 14a, 14b,
14e, 14c; VKG § 1a) — Entgelt-Stopp je Arbeitstag über die
negative Regel ``KARENZ_ENTGELT`` (Muster MSCH_ENTGELT, AP7).
- eSV: Abmeldung zum Ende des Entgeltanspruchs (Tag vor dem
Karenzbeginn), Anmeldung zum ersten Arbeitstag nach dem Ende;
Papamonat/Familienzeit: Abmeldung am Tag vor Beginn (§ 11 Abs 3
lit a ASVG, lb-pap-01). Karenzart-Strings der Sonderformate
„Familienhospizkarenz/Pflegekarenz An-/Abmeldung" (lb-kzs-05)
laufen als Protokoll-Info — erweiterte eSV-Sonderformate = GP7-Rest.
- BV: Elternkarenz/KBG zu Lasten FLAF (§ 7 Abs 5 BMSVG), Familien-
hospiz-/Pflegekarenz zu Lasten des Bundes (§ 7 Abs 6 BMSVG,
Fiktivgrundlage KBG § 5b Abs 1 KBGG idF vor BGBl I 53/2016);
Pflegeteilzeit: AG-Beitrag auf Vor-Reduzierungs-Entgelt (§ 6 Abs 4
BMSVG, Feld l10n_at_bv_vor_entgelt).
- Dienstzeit: Papamonat ist ANZURECHNEN (§ 1a Abs 7 VKG iVm § 15f
MSchG), Bildungs-/Pflegekarenz grundsätzlich NICHT (§ 11 Abs 2,
§ 14c/14d AVRAG) — Wizard-bestätigte Dienstzeiten, dokumentiert.
"""
from datetime import timedelta
from odoo import fields, models
# Unbezahlte Karenz-WETs (generisch + AP16-Spezies)
_KARENZ_WET = 'ATP_KARENZ'
_BILDUNGSKARENZ_WET = 'ATP_BILDUNGSKARENZ'
_HOSPIZKARENZ_WET = 'ATP_HOSPIZKARENZ'
_KINDER_KRANK_WET = 'ATP_KINDERKRANK'
_KINDER_REHAB_WET = 'ATP_KINDERREHAB'
_PFLEGEKARENZ_WET = 'ATP_PFLEGEKARENZ'
_PAPAMONAT_WET = 'ATP_PAPAMONAT'
KARENZ_ARTEN = {
_KARENZ_WET: 'Elternkarenz (MSchG/VKG)',
_BILDUNGSKARENZ_WET: 'Bildungskarenz (§ 11 AVRAG)',
_HOSPIZKARENZ_WET: 'Familienhospizkarenz — Sterbebegleitung '
'(§ 14a AVRAG)',
_KINDER_KRANK_WET: 'Familienhospizkarenz — Begleitung schwerst '
'erkrankter Kinder (§ 14b AVRAG)',
_KINDER_REHAB_WET: 'Freistellung Kinderrehabilitation '
'(§ 14e AVRAG)',
_PFLEGEKARENZ_WET: 'Pflegekarenz (§ 14c AVRAG)',
_PAPAMONAT_WET: 'Papa-Monat/Familienzeit (§ 1a VKG / FamZeitbG)',
}
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
def _at_karenz_wet_codes(self):
"""Codes der unbezahlten Karenz-Freistellungen (inkl. generisch
und AP16-Spezies)."""
self.ensure_one()
return list(KARENZ_ARTEN)
def _at_karenz_leaves(self):
"""Validierte Karenz-Freistellungen: [(von, bis, wett_code)]
chronologisch."""
self.ensure_one()
typen = self.env['hr.leave.type'].search([
('work_entry_type_id.code', 'in', self._at_karenz_wet_codes())
])
leaves = self.env['hr.leave'].search([
('employee_id', '=', self.employee_id.id),
('holiday_status_id', 'in', typen.ids),
('state', 'in', ('validate', 'validate1')),
])
ergebnis = []
for leave in leaves:
wett = leave.holiday_status_id.work_entry_type_id.code
ergebnis.append((leave.request_date_from,
leave.request_date_to, wett))
return [(von, bis, wett) for von, bis, wett in ergebnis
if von and bis]
def _at_karenz_status(self):
"""Karenz-Tage je Abrechnungsperiode über alle unbezahlten
Karenz-Arten: {'kalendertage', 'arbeitstage', 'arten'} — None
ohne Freistellung im Zeitraum (Muster _at_msch_status)."""
self.ensure_one()
codes = set(self._at_karenz_wet_codes())
tage = {}
tag_art = {}
for von, bis, wett in self._at_karenz_leaves():
tag = fields.Date.to_date(von)
ende = fields.Date.to_date(bis)
while tag <= ende:
tage[tag] = True
tag_art[tag] = wett
tag += timedelta(days=1)
in_periode = sorted(
tag for tag in tage
if self.date_from <= tag <= self.date_to)
if not in_periode:
return None
eintraege = self.env['hr.work.entry'].search([
('employee_id', '=', self.employee_id.id),
('date', '>=', self.date_from),
('date', '<=', self.date_to),
('state', '!=', 'cancelled'),
('work_entry_type_id.code', 'in', list(codes)),
])
arten_aktuell = {tag_art[tag] for tag in in_periode}
return {
'kalendertage': in_periode,
'arbeitstage': sorted({e.date for e in eintraege}),
'arten': sorted(KARENZ_ARTEN[c] for c in arten_aktuell),
}
def _at_karenz_entgelt_tage(self, result_rules=None):
"""Arbeitstage der unbezahlten Karenz im Abrechnungszeitraum
(Entgelt-Stopp-Basis der Regel KARENZ_ENTGELT)."""
self.ensure_one()
status = self._at_karenz_status()
if not status:
return 0
return len(status['arbeitstage'])
class HrVersion(models.Model):
_inherit = 'hr.version'
l10n_at_bv_vor_entgelt = fields.Monetary(
string='BV-Basis vor Arbeitszeit-Reduktion (§ 6 Abs 4 BMSVG)',
currency_field='currency_id',
help='Monatsentgelt vor der Reduzierung (z. B. Pflegeteilzeit '
'§ 14d AVRAG): der BV-Beitrag läuft während der Maßnahme '
'auf Grundlage der Arbeitszeit vor Herabsetzung '
'(§ 6 Abs 4 BMSVG). Leer = laufende Basis.')
@@ -36,11 +36,27 @@ Fristberechnung aus dem ärztlichen Zeugnis bleibt beim Mandanten.
Urlaubsanspruch erwächst während des Wochengeldbezugs (lb-msf-03);
Sonderwochengeld (§ 163 ASVG, Günstigkeitsvergleich § 162 Abs 3b) =
dokumentierte Option.
AP16 (8.13): Karenz-Brücke nach § 7 Abs 4 Z 13 BMSVG — folgt das
neuerliche Beschäftigungsverbot unmittelbar auf eine Karenz (Z 1) oder
nach einer kürzeren als dreimonatigen Beschäftigung (Z 2), ist die
Bemessungsgrundlage die des Kalendermonats vor dem der Karenz
unmittelbar vorangegangenen Beschäftigungsverbots; Z 3 (neues DV nach
Beendigung des karenzierten DV, < 3 Monate): der letzte volle
Kalendermonat vor dem neuerlichen Verbot. BV während des KBG-Bezugs
läuft zu Lasten des FLAF (§ 7 Abs 5), in der Familienhospiz-/Pflege-
karenz zu Lasten des Bundes (§ 7 Abs 6) — keine AG-Regeln; das Ruhen
des Wochengeldes (§ 166 ASVG) und das Sonderwochengeld während
einer Karenz (§ 163 ASVG) werden als Info/Warnung ausgewiesen.
"""
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta
from odoo import fields, models
from .karenz import KARENZ_ARTEN
_MSCH_WET = 'ATP_MSCH'
@@ -61,13 +77,21 @@ class HrPayslip(models.Model):
slip.l10n_at_msch_info = ''
continue
wochengeld = slip._at_wochengeld()
slip.l10n_at_msch_info = (
info = (
'%d Kalendertage Bezug · WG %.2f/Kalendertag '
'(Ø-Netto %.2f + %.0f %%)' % (
len(msch['kalendertage']),
wochengeld['tagesatz'],
wochengeld['netto_drei_monate'],
wochengeld['sz_prozent']))
if slip._at_msch_sonderwochengeld():
info += (' · Sonderwochengeld (§ 163 ASVG) statt '
'Wochengeld — ÖGK, erhöhtes Krankengeld '
'(§ 141 Abs 2, § 125 iVm § 108f)')
warnungen = slip._at_msch_ruhen_warnungen()
if warnungen:
info += ' · Ruhen: ' + '; '.join(warnungen)
slip.l10n_at_msch_info = info
def _at_msch_leaves(self):
"""Validierte Mutterschutz-Frist-Abwesenheiten (ATP_MSCH)."""
@@ -120,17 +144,109 @@ class HrPayslip(models.Model):
'episode_beginn': block,
}
def _at_msch_referenz_monate(self, episode_beginn):
"""Die drei (vollen) Kalendermonate vor dem Versicherungsfall
der Mutterschaft (§ 162 Abs 3: letzte 13 Wochen; § 7 Abs 4
BMSVG: letzte drei Kalendermonate). Versicherungsfall im Monat
X → Monate X-3, X-2, X-1 (aufsteigend)."""
def _at_msch_sonderwochengeld(self):
"""Sonderwochengeld statt Wochengeld (§ 163 ASVG, verifiziert):
die Mutterschutz-Frist fällt in eine Karenz nach dem MSchG —
kein Anspruch auf Wochengeld (§ 162), das Sonderwochengeld
zahlt der Krankenversicherungsträger (erhöhtes Krankengeld
§ 141 Abs 2, Bemessungsgrundlage § 125 aus dem Arbeits-
verdienst vor dem Ende des letzten Entgeltanspruchs, mit
§ 108f-Anpassung)."""
self.ensure_one()
msch = self._at_msch_status()
if not msch:
return False
for von, bis, _wett in self._at_karenz_leaves():
if any(von <= tag <= bis for tag in msch['kalendertage']):
return True
return False
def _at_msch_ruhen_warnungen(self):
"""Ruhen des Wochengeldes (§ 166 ASVG, verifiziert) —
Warnungen zu Fortbezug während der Frist:
Z 2 Entgeltfortzahlung 100 % → Ruhen zur Gänze, 50 %
hälftig (Urlaubs-/UEL-/KE-Zeiten gelten nicht als weiterge-
leistete Bezüge); Z 3 Erwerbstätigkeit und Z 4 Pflegekarenz-
geld sind Bezugszeitraum-Daten (AEB/ÖGK-Seite, Hinweis)."""
self.ensure_one()
msch = self._at_msch_status()
if not msch:
return []
tage = set(msch['kalendertage'])
efz = self._at_efz_status()
warnungen = []
if efz:
if any(tag in tage for tag in efz.get('voll_arbeitstage', [])):
warnungen.append('Fortbezug > 50 % (Entgeltfortzahlung) '
'— Ruhen zur Gänze (§ 166 Abs 1 Z 2)')
elif any(tag in tage for tag in efz.get('halb_arbeitstage', [])):
warnungen.append('Fortbezug = 50 % — Ruhen hälftig '
'(§ 166 Abs 1 Z 2)')
warnungen.append('Erwerbstätigkeit/Pflegekarenzgeld während der '
'Frist prüfen (§ 166 Abs 1 Z 3/4)')
return warnungen
def _at_msch_referenz_stichtag_und_anzahl(self, episode_beginn):
"""(Stichtag, Referenz-Monatsanzahl) nach § 7 Abs 4 BMSVG mit
Karenz-Brücke Z 13 (AP16):
- Z 1/Z 2: endete eine Karenz innerhalb von drei Monaten vor
dem neuerlichen Beschäftigungsverbot, gilt das der Karenz
unmittelbar vorangegangene Beschäftigungsverbot als
Bemessungsstichtag (Referenzmonate davor);
- Z 3: neues DV binnen drei Monaten nach Beendigung des
karenzierten DV (mit Karenz) → der letzte volle Kalendermonat
vor dem neuerlichen Verbot als EINZELNER Referenzmonat
(„volles Monatsentgelt");
- sonst: Versicherungsfall selbst, drei Monate."""
self.ensure_one()
stichtag = episode_beginn or self.date_from
grenze = stichtag - relativedelta(months=3)
karenz_kandidat = None
for von, bis, _wett in sorted(self._at_karenz_leaves(),
key=lambda k: k[1], reverse=True):
if grenze <= bis < stichtag:
karenz_kandidat = (von, bis)
break
if karenz_kandidat:
karenz_von = karenz_kandidat[0]
frist = max(
(m for m in self._at_msch_leaves()
if m[1] <= karenz_von),
key=lambda m: m[1], default=None)
if frist:
return frist[0], 3
version = self.version_id
vorher = self.env['hr.version'].search([
('employee_id', '=', self.employee_id.id),
('contract_date_end', '!=', False),
('id', '!=', version.id),
], order='contract_date_end desc', limit=1)
if (vorher and vorher.contract_date_end
and version.contract_date_start
and vorher.contract_date_end
<= version.contract_date_start
and (version.contract_date_start
- vorher.contract_date_end).days < 92
and any(k[1] <= vorher.contract_date_end
for k in self._at_karenz_leaves())):
erster = date(stichtag.year, stichtag.month, 1)
erster = (erster - timedelta(days=1)).replace(day=1)
return erster, 1
return stichtag, 3
def _at_msch_referenz_monate(self, episode_beginn):
"""Referenzkalendermonate der fiktiven BV (§ 7 Abs 4 BMSVG:
letzte drei Monate; Karenz-Brücke Z 13, AP16 — s.
_at_msch_referenz_stichtag_und_anzahl; § 162 Abs 3: letzte
13 Wochen). Versicherungsfall im Monat X → Monate X-3, X-2,
X-1 (aufsteigend)."""
self.ensure_one()
stichtag, anzahl = self._at_msch_referenz_stichtag_und_anzahl(
episode_beginn)
erster = date(stichtag.year, stichtag.month, 1)
monate = []
hilf = erster
for _ in range(3):
for _ in range(anzahl):
hilf = (hilf - timedelta(days=1)).replace(day=1)
monate.append(hilf)
return list(reversed(monate))
@@ -351,7 +351,8 @@ class HrPayslip(models.Model):
+ self._l10n_at_brutto('sonstig', result_rules)
- self._l10n_at_st_frei_freie_laufen(result_rules))
for rule in self.struct_id.rule_ids:
if rule.l10n_at_s67_abs in ('abs3', 'abs6'):
if (rule.l10n_at_bemessung in ('laufend', 'sonstig')
and rule.l10n_at_s67_abs in ('abs3', 'abs6')):
if result_rules is not None and rule.code in result_rules:
basis -= result_rules[rule.code]['total']
elif result_rules is None:
@@ -322,7 +322,7 @@ class HrPayslip(models.Model):
# ------------------------------------------------------------------
def _at_pfa_rule_amount(self, result_rules, code):
if result_rules is not None:
werte = result_rules.get(code)
werte = result_rules[code] if code in result_rules else None
# result_rules enthält ungerundete Rule-Summen; die
# Bezugsart ist der gerundete Zeilenbetrag (Cents) —
# mit diesem wird auch die Pfändungsberechnungsgrundlage
@@ -378,14 +378,17 @@ class HrPayslip(models.Model):
if not rule.l10n_at_pfandung_beendigung:
continue
if result_rules is not None:
werte = result_rules.get(rule.code)
werte = result_rules[rule.code] \
if rule.code in result_rules else None
if werte:
total += float(werte['total'])
else:
linie = self.line_ids.filtered(
lambda l, c=rule.code: l.code == c)
total += sum(linie.mapped('total'))
return round(max(0.0, total), 2)
steuer = sum(self._at_pfa_rule_amount(result_rules, c)
for c in ('LST_ABF', 'LST_ABF_FREI'))
return round(max(0.0, total - steuer), 2)
raise UserError('Unbekannter Pfändungstopf: %s' % topf)
# ------------------------------------------------------------------
@@ -420,6 +423,7 @@ class HrPayslip(models.Model):
total = self._at_pfaendung_masse(result_rules, 'laufend')
total += self._at_pfaendung_masse(result_rules, 'sz13')
total += self._at_pfaendung_masse(result_rules, 'sz14')
total += self._at_pfaendung_masse(result_rules, 'beendigung')
return round(total, 2)
def _at_pfaendung_kostenersatz(self, result_rules):
@@ -23,12 +23,15 @@ BVAB/BVJN aus dem GP5-BMSVG-Flag, VWAZ vereinbarte Wochenarbeitszeit
(Stunden ×100, neu für Meldedaten ab 01.01.2026).
Dateibasiert (Prämisse P7); Bestätigungen/Übertragung beim Mandanten."""
from datetime import date
from datetime import date, timedelta
import base64
from odoo import api, fields, models
from odoo.exceptions import UserError
from odoo.addons.l10n_at_hr_payroll_private.models.karenz import \
KARENZ_ARTEN
from odoo.addons.l10n_at_hr_payroll.models.elda import (
L10N_AT_ELDA_IDTEIL,
L10nAtEldaBestand,
@@ -199,6 +202,58 @@ class L10nAtPayrollVr(models.Model):
abmeldungen.append(version)
return sorted(abmeldungen, key=lambda v: v.contract_date_end)
def _l10n_at_offene_karenz_events(self):
"""AP16 (8.13): An-/Abmeldungen aus validierten Karenz-
Freistellungen: M4 zum Ende des Entgeltanspruchs (Tag vor dem
Karenzbeginn; Familienzeit am Tag vor Beginn, § 11 Abs 3 lit a
ASVG, lb-pap-01), M3 zum ersten Arbeitstag nach dem Karenzende
— entfällt, wenn das DV mit der Karenz endet (normale M4-
Vertragsabmeldung deckt das Ende). Karenzart-Strings für die
eSV-Sonderformate „Familienhospizkarenz/Pflegekarenz An-/
Abmeldung" (lb-kzs-05) laufen als Protokoll-Info; erweiterte
eSV-Sonderformate = GP7-Rest. Dedup über die Registry
(employee, art, adatum); keine Events nach dem Stichtag."""
self.ensure_one()
typen = self.env['hr.leave.type'].search([
('work_entry_type_id.code', 'in', list(KARENZ_ARTEN))])
if not typen:
return []
leaves = self.env['hr.leave'].search([
('company_id', 'in', self.company_id.ids),
('holiday_status_id', 'in', typen.ids),
('state', 'in', ('validate', 'validate1')),
]).sorted('request_date_from')
registry = self.env['l10n.at.payroll.vr.event'].search([
('company_id', '=', self.company_id.id),
])
gesehen = {(e.employee_id.id, e.art, e.adatum) for e in registry}
ereignisse = []
for leave in leaves:
von = leave.request_date_from
bis = leave.request_date_to
if not von or not bis:
continue
version = leave.employee_id.version_id
if not version:
continue
wett_code = leave.holiday_status_id \
.work_entry_type_id.code
karenzart = KARENZ_ARTEN.get(wett_code, 'Karenz')
abmeldetag = von - timedelta(days=1)
if abmeldetag > self.stichtag:
continue
if (leave.employee_id.id, 'M4', abmeldetag) not in gesehen:
ereignisse.append((version, 'M4', abmeldetag, karenzart))
rueckkehr = bis + timedelta(days=1)
if (version.contract_date_end
and rueckkehr >= version.contract_date_end):
continue
if rueckkehr > self.stichtag:
continue
if (leave.employee_id.id, 'M3', rueckkehr) not in gesehen:
ereignisse.append((version, 'M3', rueckkehr, karenzart))
return ereignisse
def _l10n_at_bber(self, version):
if version.l10n_at_lehrling:
return '03' if getattr(
@@ -234,6 +289,7 @@ class L10nAtPayrollVr(models.Model):
raise UserError('Beitragskontonummer (BKNR) fehlt.')
datensaetze = []
ereignisse = []
karenz_info = []
vstr = bknr[:2]
if lauf.nur_fallweise:
versionen = self.env['hr.version'].search([
@@ -366,6 +422,51 @@ class L10nAtPayrollVr(models.Model):
ereignisse.append((version, 'M4',
version.contract_date_end,
refw))
for version, art, adatum, karenzart in \
lauf._l10n_at_offene_karenz_events():
if not version.ssnid:
fehler.append(
'Karenz-Meldung %s ohne Versicherungsnummer.'
% version.employee_id.name)
continue
satz = L10nAtEldaSatz(
L10N_AT_ELDA_IDTEIL + VR_SATZ, 772,
bezeichnung='%s Karenz %s' % (
art, version.employee_id.name))
refw = '%s-K%d-%s-%d' % (
art, company.id,
adatum.strftime('%Y%m%d'),
version.employee_id.id)
satz.setze('SART', art)
satz.setze('VSTR', vstr)
satz.setze('REFW', refw)
satz.setze('BKNR', bknr)
satz.setze('DGNA', company.name[:70])
satz.setze('VSNR', version.ssnid)
satz.setze_datum(
'GEBD', version.employee_id.birthday)
familienname, vorname = l10n_at_namen(
version.employee_id)
satz.setze('FANA', familienname[:70])
satz.setze('VONA', (vorname or '')[:70])
satz.setze_datum('ADAT', adatum)
if art == 'M3':
satz.setze('BBER', lauf._l10n_at_bber(version))
satz.setze('GERF', 'N')
satz.setze('FRDV', 'N')
else:
satz.setze_datum('EBSV', adatum)
satz.setze('AGRD', '00')
kalender = version.resource_calendar_id
if kalender:
satz.setze('VWAZ', kalender.hours_per_week,
skala=2)
datensaetze.append(satz)
ereignisse.append((version, art, adatum, refw))
karenz_info.append(
'%s (ADAT %s) — %s' % (
version.employee_id.name,
adatum.strftime('%d.%m.%Y'), karenzart))
if fehler:
lauf.protokoll = 'FEHLER:\n' + '\n'.join(fehler)
raise UserError('Versichertenmeldung mit Fehlern '
@@ -395,12 +496,17 @@ class L10nAtPayrollVr(models.Model):
ereignisse = self.env['l10n.at.payroll.vr.event'].create(
ereignis_werte) if ereignis_werte else \
self.env['l10n.at.payroll.vr.event']
protokoll = 'Meldungen: %d' % len(datensaetze)
if karenz_info:
protokoll += ("\nKarenz (eSV-Sonderformate GP7-Rest; "
"Karenzart zur Übergabe):\n"
+ "\n".join(karenz_info))
lauf.write({
'datei': base64.b64encode(datei.render()),
'datei_name': 'versichertenmeldung_%s.txt' % (
fields.Date.today().strftime('%Y%m%d'),),
'event_ids': [(6, 0, ereignisse.ids)],
'state': 'done',
'protokoll': 'Meldungen: %d' % len(datensaetze),
'protokoll': protokoll,
})
return True
@@ -23,3 +23,4 @@ access_l10n_at_payroll_pfaendung_user,L10n AT Payroll Pfaendung User,model_l10n_
access_l10n_at_payroll_pfaendung_manager,L10n AT Payroll Pfaendung Manager,model_l10n_at_payroll_pfaendung,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_l10n_at_payroll_pendler_erklaerung_user,L10n AT Payroll Pendlererklaerung User,model_l10n_at_payroll_pendler_erklaerung,hr_payroll.group_hr_payroll_user,1,1,1,0
access_l10n_at_payroll_pendler_erklaerung_manager,L10n AT Payroll Pendlererklaerung Manager,model_l10n_at_payroll_pendler_erklaerung,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_l10n_at_payroll_endabrechnung_wizard,L10n AT Payroll Endabrechnung Wizard,model_l10n_at_payroll_endabrechnung_wizard,hr_payroll.group_hr_payroll_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
23 access_l10n_at_payroll_pfaendung_manager L10n AT Payroll Pfaendung Manager model_l10n_at_payroll_pfaendung hr_payroll.group_hr_payroll_manager 1 1 1 1
24 access_l10n_at_payroll_pendler_erklaerung_user L10n AT Payroll Pendlererklaerung User model_l10n_at_payroll_pendler_erklaerung hr_payroll.group_hr_payroll_user 1 1 1 0
25 access_l10n_at_payroll_pendler_erklaerung_manager L10n AT Payroll Pendlererklaerung Manager model_l10n_at_payroll_pendler_erklaerung hr_payroll.group_hr_payroll_manager 1 1 1 1
26 access_l10n_at_payroll_endabrechnung_wizard L10n AT Payroll Endabrechnung Wizard model_l10n_at_payroll_endabrechnung_wizard hr_payroll.group_hr_payroll_user 1 1 1 1
@@ -17,3 +17,5 @@ from . import test_sachbezuege_private
from . import test_sachbezuege2_private
from . import test_reisekosten_private
from . import test_pendler_private
from . import test_endabrechnung_private
from . import test_karenz_private
@@ -0,0 +1,952 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP14-A: Endabrechnungs-Zyklus — UEL-Zweikomponenten (§ 67 Abs 8
lit d), SV-Verlängerung (§ 11 Abs 2 ASVG, sequentielle Fenster),
Abgangsentschädigung (§ 67 Abs 8 lit b Fünftel), Aufrechnung offener
Vorschüsse (§ 293 Abs 3 EO) und Zeitguthaben (§ 19e Abs 2 AZG).
AP15-C: Vergleichssummen (§ 67 Abs 8 lit a) — Rest-Fünftel,
BV-Anwartschafts-Teil mit 6 %/7.500-€-Deckel, Wizard.
AP14-B: Prämien bei Beendigung (§ 16 AngG-Aliquot, lb-end-18) —
sonstiger Bezug mit Endabrechnung, § 67 Abs 10 mit Rollung."""
from datetime import date, timedelta
from odoo.exceptions import UserError
from odoo.tests import TransactionCase, tagged
@tagged('post_install', '-at_install')
class EndabrechnungPrivateTest(TransactionCase):
def setUp(self):
super().setUp()
self.structure = self.env.ref(
'l10n_at_hr_payroll_private.structure_at_privat')
self.kv2203 = self.env.ref('l10n_at_hr_payroll_private.kv_si_2203')
self.gruppe_ii = self.env.ref(
'l10n_at_hr_payroll_private.kv2203_grp_ii')
self.calendar = self.env['resource.calendar'].create({
'name': 'AT Test End 40h Mo-Fr',
'tz': 'Europe/Vienna',
'hours_per_day': 8,
'attendance_ids': [
(0, 0, {'name': 'Tag %d' % weekday,
'dayofweek': str(weekday),
'hour_from': 8.0, 'hour_to': 16.0})
for weekday in range(5)
],
})
self.env.company.resource_calendar_id = self.calendar
def _calendar(self, weekdays):
return self.env['resource.calendar'].create({
'name': 'AT Test End %dTage' % len(weekdays),
'tz': 'Europe/Vienna',
'hours_per_day': 8,
'attendance_ids': [
(0, 0, {'name': 'Tag %d' % weekday,
'dayofweek': str(weekday),
'hour_from': 8.0, 'hour_to': 16.0})
for weekday in weekdays
],
})
def _employee(self, ueberzahlung=2640.0,
ende=date(2026, 3, 15), calendar=None):
employee = self.env['hr.employee'].create(
{'name': 'Test End privat'})
version = self.env['hr.version'].search(
[('employee_id', '=', employee.id)], limit=1)
if not version:
version = self.env['hr.version'].create({
'employee_id': employee.id, 'date_start': date(2020, 1, 1)})
version.write({
'contract_date_start': date(2020, 1, 1),
'contract_date_end': ende,
'ueberzahlung': ueberzahlung,
'kv_id': self.kv2203.id,
'kv_gruppe_id': self.gruppe_ii.id,
'erfahrungsstufe': 1,
'resource_calendar_id': (calendar or self.calendar).id,
})
return employee
def _slip(self, employee, monat=3, jahr=2026):
erster = date(jahr, monat, 1)
naechster = (erster + timedelta(days=32)).replace(day=1)
slip = self.env['hr.payslip'].create({
'name': 'Test-End %d/%d' % (monat, jahr),
'employee_id': employee.id,
'struct_id': self.structure.id,
'date_from': erster,
'date_to': naechster - timedelta(days=1),
})
slip.compute_sheet()
return slip
def _input(self, slip, code, amount):
typ = self.env['hr.payslip.input.type'].search(
[('code', '=', code)], limit=1)
self.env['hr.payslip.input'].create({
'payslip_id': slip.id,
'input_type_id': typ.id,
'amount': amount,
})
slip.compute_sheet()
def _total(self, slip, code):
return sum(slip.line_ids.filtered(
lambda line: line.code == code).mapped('total'))
def _basis_monate(self, slip):
return dict(slip._l10n_at_sv_basis_laufen_monate())
# ------------------------------------------------------------------
# RF-END-1: UEL-Zweikomponenten (§ 67 Abs 8 lit d)
# ------------------------------------------------------------------
def test_01_uel_zwei_komponenten(self):
"""11 offene AT à 120 € (2.640/22): UEL-lfd 1.320 € läuft
tarifisch und sechstelerhöhend; UEL-SZ 220 € (2×2.640/12/22)
als sonstiger Bezug; nur der laufende Anteil verlängert die
Pflichtversicherung."""
emp_mit = self._employee()
emp_ohne = self._employee()
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_UEL_TAGE', 11)
self.assertAlmostEqual(
self._total(slip_mit, 'URL_ERSATZ_LFD'), 1320.0, places=2)
self.assertAlmostEqual(
self._total(slip_mit, 'URL_ERSATZ_SZ'), 220.0, places=2)
svdn_diff = (slip_mit._l10n_at_svdn_gesamt()
- slip_ohne._l10n_at_svdn_gesamt())
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen() + svdn_diff,
1320.0, places=2)
# Sechstel wächst um den annualisierten laufenden Anteil
# (60/Lohnsteuertage × 1.320; Teilmonat März: 15 Tage).
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
1320.0 * 60.0 / 15.0, places=2)
# SZ-Bemessung enthält den UEL-SZ-Anteil (SV-DN nach § 67
# Abs 12 abziehen, um den Brutto-Anteil zu isolieren)
svdn_sz_diff = (slip_mit._l10n_at_svdn_sz()
- slip_ohne._l10n_at_svdn_sz())
self.assertAlmostEqual(
slip_mit._l10n_at_sz_bemessung()
- slip_ohne._l10n_at_sz_bemessung() + svdn_sz_diff,
220.0, places=2)
# ------------------------------------------------------------------
# RF-END-2: SV-Tage-Umrechnung und Verlängerungsmonate (§ 11 Abs 2)
# ------------------------------------------------------------------
def test_02_sv_tage_und_verlaengerung(self):
"""Schema je voller Woche à N AT + (7N) KT: 23 AT (5-Woche)
→ 31 SV-Tage; 12 WT (6-Woche) → 14; 6 AT (2-Tage-Woche) → 21
(lb-url-15). Ende 15. 3.: Verlängerung 16. 3.15. 4. — die
UEL-lfd-Basis liegt tageproportional auf den Monaten."""
emp = self._employee()
slip = self._slip(emp)
self.assertEqual(slip._at_end_sv_tage(23), 31)
self.assertEqual(slip._at_end_sv_tage(10), 14)
emp_6 = self._employee(calendar=self._calendar(range(6)))
self.assertEqual(self._slip(emp_6)._at_end_sv_tage(12), 14)
emp_2 = self._employee(calendar=self._calendar([0, 3]))
self.assertEqual(self._slip(emp_2)._at_end_sv_tage(6), 21)
self.assertEqual(
slip._at_end_verlaengerungs_monate(
31, date(2026, 3, 16)),
[(date(2026, 3, 1), 16), (date(2026, 4, 1), 15)])
self._input(slip, 'ATP_UEL_TAGE', 23)
basis = self._basis_monate(slip)
self.assertAlmostEqual(
basis[date(2026, 4, 1)], 2760.0 * 15.0 / 31.0, places=2)
# März: KVGEO-Standardanteil + UEL-März-Anteil
self.assertAlmostEqual(
basis[date(2026, 3, 1)] - 2760.0 * 16.0 / 31.0,
2640.0 * 10.0 / 22.0, places=2)
# ------------------------------------------------------------------
# RF-END-3: Abgangsentschädigung (§ 67 Abs 8 lit b, Fünftel)
# ------------------------------------------------------------------
def test_03_abgang_fuenftel(self):
"""9.000 € Abgangsentschädigung: Fünftel-LSt (1/5 steuerfrei
nach §-62-Abzug, Deckel 12.474 €), 4/5 tarifisch OHNE
Sechstelerhöhung; SV-Umlegung auf die 42 Tage Kündigungsfrist;
voll LNK-pflichtig."""
emp_mit = self._employee(ueberzahlung=3000.0)
emp_ohne = self._employee(ueberzahlung=3000.0)
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_ABGANG', 9000.0)
self._input(slip_mit, 'ATP_ABGANG_FFRIST_TAGE', 42)
self.assertAlmostEqual(self._total(slip_mit, 'ABGANG'), 9000.0,
places=2)
# Sechstel unverändert (Abs 2 nicht anzuwenden)
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
# Tarifischer Teil: 9.000 minus §-62-Abzug, 1/5 frei
satz = sum(slip_mit._l10n_at_sv_satz(
'dn', k, staffel_basis=slip_mit._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = 9000.0 * (1.0 - satz / 100.0)
deckel = float(slip_mit._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
erwartet = bemessung - min(bemessung / 5.0, deckel)
self.assertAlmostEqual(
slip_mit._at_fuenftel_tarif_basis(), erwartet, places=2)
svdn_diff = (slip_mit._l10n_at_svdn_gesamt()
- slip_ohne._l10n_at_svdn_gesamt())
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen() + svdn_diff,
erwartet, places=2)
# LNK-Basis um die volle Entschädigung erhöht
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 9000.0, places=2)
# SV-Umlegung: 16. 3.26. 4. (Kündigungsfrist zuerst); im März
# liegt zusätzlich der aliquote KVGEO-Standardanteil
basis = self._basis_monate(slip_mit)
self.assertAlmostEqual(
basis[date(2026, 4, 1)], 9000.0 * 26.0 / 42.0, places=2)
self.assertAlmostEqual(
basis[date(2026, 3, 1)] - 3000.0 * 10.0 / 22.0,
9000.0 * 16.0 / 42.0, places=2)
# ------------------------------------------------------------------
# RF-END-4: Aufrechnung offener Vorschüsse (§ 293 Abs 3 EO)
# ------------------------------------------------------------------
def test_04_aufrechnung_vorschuss(self):
"""2.000 € offener Vorschuss wird vom Netto abgezogen — ohne
jede Wirkung auf LSt-, SV- oder LNK-Basen (lb-end-06)."""
emp_mit = self._employee()
emp_ohne = self._employee()
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_ABRECHNUNG_VORSCHUSS', 2000.0)
self.assertAlmostEqual(self._total(slip_mit, 'END_ABRECHNUNG_VORSCHUSS'),
2000.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sv_basis_roh()
- slip_ohne._l10n_at_sv_basis_roh(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 0.0, places=2)
self.assertAlmostEqual(
self._total(slip_mit, 'NET') - self._total(slip_ohne, 'NET'),
-2000.0, places=2)
# ------------------------------------------------------------------
# RF-END-5: Zeitguthaben (§ 19e Abs 2 AZG) und Zeitschulden
# ------------------------------------------------------------------
def test_05_zeitguthaben_und_schulden(self):
"""10 h Normalarbeitszeit-Guthaben + 50 % Zuschlag, 5 h
Zeitschulden negativ — beides laufender Bezug, KEIN §-68-
Freibetrag (lb-end-10)."""
emp = self._employee(ueberzahlung=3000.0)
slip = self._slip(emp)
self._input(slip, 'ATP_ZEIT_GUTHABEN', 10.0)
self._input(slip, 'ATP_ZEIT_SCHULDEN', 5.0)
stunde = slip._at_grundstunde_norm()
self.assertAlmostEqual(
self._total(slip, 'ZEIT_GUTHABEN'), 10.0 * stunde * 1.5,
places=2)
self.assertAlmostEqual(
self._total(slip, 'ZEIT_SCHULDEN'), -5.0 * stunde, places=2)
regel = slip.struct_id.rule_ids.filtered(
lambda rule: rule.code == 'ZEIT_GUTHABEN')
self.assertEqual(regel.l10n_at_steuerbefreiung_68, 'keine')
# ------------------------------------------------------------------
# RF-END-6: Wizard legt den Endabrechnungs-Lauf vorbefüllt an
# ------------------------------------------------------------------
def test_06_wizard(self):
"""Der Wizard sammelt UEL, Abgang, Zeitguthaben und Vorschuss
und erzeugt den Payslip mit vorbefüllten Eingaben."""
emp = self._employee()
# Version auf die private Structure-Type binden, damit der
# Wizard über version.struct_id die richtige Struktur findet.
emp.version_id.write({'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id})
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich').id,
'uel_tage': 11.0,
'abgang_betrag': 9000.0,
'abgang_ffrist_tage': 42.0,
'zeit_guthaben_stunden': 10.0,
'vorschuss_saldo': 500.0,
})
ergebnis = wizard.action_payslip()
slip = self.env['hr.payslip'].browse(ergebnis['res_id'])
codes = set(slip.input_line_ids.mapped(
lambda line: line.input_type_id.code))
self.assertIn('ATP_UEL_TAGE', codes)
self.assertIn('ATP_ABGANG', codes)
self.assertIn('ATP_ABRECHNUNG_VORSCHUSS', codes)
self.assertAlmostEqual(
self._total(slip, 'URL_ERSATZ_LFD'), 1320.0, places=2)
self.assertAlmostEqual(self._total(slip, 'ABGANG'), 9000.0,
places=2)
# ------------------------------------------------------------------
# AP15-A: gesetzliche Abfertigung Alt (§§ 23/23a, § 67 Abs 3)
# ------------------------------------------------------------------
def test_07_abfertigung_alt_staffel_und_sonderfaelle(self):
slip = self._slip(self._employee())
for monate, erwartet in (
(35, 0.0), (36, 2.0), (60, 3.0), (120, 4.0),
(180, 6.0), (240, 9.0), (300, 12.0)):
self.assertEqual(slip._at_abf_alt_staffel(monate), erwartet)
self.assertEqual(
slip._at_abf_alt_mehrfach_vorschlag(59, 'eltern'), 0.0)
self.assertEqual(
slip._at_abf_alt_mehrfach_vorschlag(60, 'eltern'), 1.5)
self.assertEqual(
slip._at_abf_alt_mehrfach_vorschlag(180, 'eltern'), 3.0)
self.assertEqual(
slip._at_abf_alt_mehrfach_vorschlag(240, 'tod'), 4.5)
def test_08_abfertigung_alt_vervielfachung_guenstiger(self):
"""21 Jahre: 9 Monatsentgelte inklusive 2/12 SZ ergeben den
steuerlichen Vervielfacher 10,5; der Tarif ist günstiger als 6 %."""
emp_mit = self._employee(ueberzahlung=1800.0)
emp_ohne = self._employee(ueberzahlung=1800.0)
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
slip_mit.write({
'l10n_at_abf_alt_anspruchsart': 'normal',
'l10n_at_abf_alt_dienstzeit_monate': 252,
'l10n_at_abf_alt_monatsentgelt': 2100.0,
'l10n_at_abf_alt_laufender_arbeitslohn': 1800.0,
'l10n_at_abf_alt_monatslohnsteuer': 101.96,
'l10n_at_abf_alt_mehrfach': 9.0,
'l10n_at_abf_alt_nachweis': 'Testnachweis',
})
self._input(slip_mit, 'ATP_ABF_ALT', 18900.0)
erwartet = 101.96 * 10.5
self.assertAlmostEqual(self._total(slip_mit, 'ABF_ALT'), 18900.0,
places=2)
self.assertAlmostEqual(
slip_mit._at_abf_alt_steuer_vervielfachung(), erwartet, places=2)
self.assertLess(erwartet, 18900.0 * 0.06)
self.assertAlmostEqual(
self._total(slip_mit, 'LST_ABF'),
self.env.company.currency_id.round(erwartet), places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sv_basis_roh()
- slip_ohne._l10n_at_sv_basis_roh(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_bv_basis_sonst()
- slip_ohne._at_bv_basis_sonst(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_pfaendung_basis(None, 'beendigung'),
18900.0 - self._total(slip_mit, 'LST_ABF'), places=2)
def test_09_abfertigung_alt_sechs_prozent_guenstiger(self):
emp = self._employee(ueberzahlung=4000.0)
slip = self._slip(emp)
slip.write({
'l10n_at_abf_alt_laufender_arbeitslohn': 4000.0,
'l10n_at_abf_alt_monatslohnsteuer': 300.0,
'l10n_at_abf_alt_mehrfach': 2.0,
})
self._input(slip, 'ATP_ABF_ALT', 9333.34)
self.assertGreater(
slip._at_abf_alt_steuer_vervielfachung(), 9333.34 * 0.06)
self.assertAlmostEqual(
self._total(slip, 'LST_ABF'), 9333.34 * 0.06, places=2)
def test_10_abfertigung_alt_wizard(self):
emp = self._employee(ueberzahlung=3000.0)
version = emp.version_id
version.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
reason = self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich')
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': reason.id,
'abf_alt_aktiv': True,
'abf_alt_anspruch_bestaetigt': True,
'abf_alt_anspruchsart': 'normal',
'abf_alt_dienstzeit_monate': 74,
'abf_alt_monatsentgelt': 3500.0,
'abf_alt_laufender_arbeitslohn': 3000.0,
'abf_alt_monatslohnsteuer': 200.0,
'abf_alt_mehrfach': 3.0,
'abf_alt_nachweis': 'Dienstzeiten und Altstatus geprüft',
})
ergebnis = wizard.action_payslip()
slip = self.env['hr.payslip'].browse(ergebnis['res_id'])
self.assertAlmostEqual(self._total(slip, 'ABF_ALT'), 10500.0,
places=2)
self.assertGreater(self._total(slip, 'LST_ABF'), 0.0)
self.assertEqual(slip.l10n_at_abf_alt_dienstzeit_monate, 74)
self.assertEqual(slip.l10n_at_abf_alt_nachweis,
'Dienstzeiten und Altstatus geprüft')
self.assertEqual(version.departure_reason_id, reason)
def test_11_abfertigung_alt_neu_sperre(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': True,
})
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich').id,
'abf_alt_aktiv': True,
'abf_alt_anspruch_bestaetigt': True,
'abf_alt_anspruchsart': 'normal',
'abf_alt_dienstzeit_monate': 74,
'abf_alt_monatsentgelt': 3000.0,
'abf_alt_laufender_arbeitslohn': 2640.0,
'abf_alt_monatslohnsteuer': 150.0,
'abf_alt_mehrfach': 3.0,
})
with self.assertRaises(UserError):
wizard.action_payslip()
def test_12_abfertigung_alt_arbeitnehmerkuendigung_ohne_sonderfall(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref('hr.departure_resigned').id,
'abf_alt_aktiv': True,
'abf_alt_anspruch_bestaetigt': True,
'abf_alt_anspruchsart': 'normal',
'abf_alt_dienstzeit_monate': 74,
'abf_alt_monatsentgelt': 3000.0,
'abf_alt_laufender_arbeitslohn': 2640.0,
'abf_alt_monatslohnsteuer': 150.0,
'abf_alt_mehrfach': 3.0,
})
with self.assertRaises(UserError):
wizard.action_payslip()
def test_13_abfertigung_alt_elternaustritt_unter_fuenf_jahren(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref('hr.departure_resigned').id,
'abf_alt_aktiv': True,
'abf_alt_anspruch_bestaetigt': True,
'abf_alt_anspruchsart': 'eltern',
'abf_alt_dienstzeit_monate': 59,
'abf_alt_monatsentgelt': 3000.0,
'abf_alt_laufender_arbeitslohn': 2640.0,
'abf_alt_monatslohnsteuer': 150.0,
'abf_alt_mehrfach': 1.0,
})
with self.assertRaises(UserError):
wizard.action_payslip()
# ------------------------------------------------------------------
# AP15-B: freiwillige Abfertigung (§ 67 Abs 6)
# ------------------------------------------------------------------
def test_14_abf_frei_viertel_und_zwoelftel(self):
"""15 Jahre (6/12), Basis 36.000: Z 1 9.000 + Z 2 18.000; Brutto
12.000 → voll begünstigt, 6 % = 720; kein Überhang."""
emp = self._employee()
slip = self._slip(emp)
slip.write({
'l10n_at_abf_frei_basis_12': 36000.0,
'l10n_at_abf_frei_dienstzeit_monate': 180,
})
self._input(slip, 'ATP_ABF_FREI', 12000.0)
split = slip._at_abf_frei_split()
self.assertAlmostEqual(split['z1'], 9000.0, places=2)
self.assertAlmostEqual(split['z2'], 18000.0, places=2)
self.assertAlmostEqual(split['beguenstigt'], 12000.0, places=2)
self.assertAlmostEqual(split['ueberhang'], 0.0, places=2)
self.assertAlmostEqual(
self._total(slip, 'ABF_FREI'), 12000.0, places=2)
self.assertAlmostEqual(
self._total(slip, 'LST_ABF_FREI'), 720.0, places=2)
self.assertFalse(self._total(slip, 'ABF_FREI_TARIF'))
def test_15_abf_frei_ueberhang_tarif_ohne_sechstel(self):
"""Brutto 40.000: begünstigt 27.000 (Z 1 + Z 2), Überhang 13.000
läuft tarifisch über die LSt-Bemessung, ohne das Jahressechstel
zu erhöhen; SV, LNK und BV bleiben unberührt."""
emp_mit = self._employee()
emp_ohne = self._employee()
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
slip_mit.write({
'l10n_at_abf_frei_basis_12': 36000.0,
'l10n_at_abf_frei_dienstzeit_monate': 180,
})
self._input(slip_mit, 'ATP_ABF_FREI', 40000.0)
self.assertAlmostEqual(
self._total(slip_mit, 'ABF_FREI'), 27000.0, places=2)
self.assertAlmostEqual(
self._total(slip_mit, 'ABF_FREI_TARIF'), 13000.0, places=2)
lst6 = self.env.company.currency_id.round(27000.0 * 0.06)
self.assertAlmostEqual(
self._total(slip_mit, 'LST_ABF_FREI'), lst6, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen(), 13000.0, places=2)
self.assertGreater(
self._total(slip_mit, 'LST_LFD'), self._total(slip_ohne, 'LST_LFD'))
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sv_basis_roh()
- slip_ohne._l10n_at_sv_basis_roh(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_bv_basis_sonst()
- slip_ohne._at_bv_basis_sonst(), 0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_pfaendung_basis(None, 'beendigung'),
27000.0 - lst6, places=2)
def test_16_abf_frei_kuerzung_und_deckel(self):
"""Z 3: erhaltene Abfertigungen plus gesetzlicher Anspruch kürzen
das Z-2-Ausmaß; bei großer Basis greifen die Deckel 9 × HBG
(Z 1) und n × 3 × HBG (Z 2)."""
emp = self._employee()
slip = self._slip(emp)
slip.write({
'l10n_at_abf_frei_basis_12': 36000.0,
'l10n_at_abf_frei_dienstzeit_monate': 180,
'l10n_at_abf_frei_erhaltene_abfertigungen': 4000.0,
'l10n_at_abf_frei_gesetzlicher_anspruch': 9000.0,
})
self._input(slip, 'ATP_ABF_FREI', 20000.0)
split = slip._at_abf_frei_split()
self.assertAlmostEqual(split['kuerzung'], 13000.0, places=2)
self.assertAlmostEqual(split['z2'], 5000.0, places=2)
self.assertAlmostEqual(split['beguenstigt'], 14000.0, places=2)
self.assertAlmostEqual(split['ueberhang'], 6000.0, places=2)
slip.write({
'l10n_at_abf_frei_basis_12': 12000000.0,
'l10n_at_abf_frei_erhaltene_abfertigungen': 0.0,
'l10n_at_abf_frei_gesetzlicher_anspruch': 0.0,
})
slip.input_line_ids.filtered(
lambda i: i.input_type_id.code == 'ATP_ABF_FREI').write(
{'amount': 300000.0})
slip.compute_sheet()
split = slip._at_abf_frei_split()
self.assertAlmostEqual(split['z1'], 62370.0, places=2)
self.assertAlmostEqual(split['z2'], 124740.0, places=2)
self.assertAlmostEqual(split['beguenstigt'], 187110.0, places=2)
self.assertAlmostEqual(split['ueberhang'], 112890.0, places=2)
def test_17_abf_frei_wizard(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich').id,
'abf_frei_aktiv': True,
'abf_frei_anspruch_bestaetigt': True,
'abf_frei_betrag': 20000.0,
'abf_frei_basis_12': 36000.0,
'abf_frei_dienstzeit_monate': 180,
'abf_frei_nachweis': 'Vordienstzeiten zum Lohnkonto nachgewiesen',
})
ergebnis = wizard.action_payslip()
slip = self.env['hr.payslip'].browse(ergebnis['res_id'])
self.assertAlmostEqual(self._total(slip, 'ABF_FREI'), 20000.0,
places=2)
self.assertAlmostEqual(self._total(slip, 'LST_ABF_FREI'), 1200.0,
places=2)
self.assertEqual(slip.l10n_at_abf_frei_dienstzeit_monate, 180)
self.assertEqual(slip.l10n_at_abf_frei_nachweis,
'Vordienstzeiten zum Lohnkonto nachgewiesen')
# ------------------------------------------------------------------
# RF-VGL-1: Vergleichssumme Rest (§ 67 Abs 8 lit a, Fünftelregelung)
# ------------------------------------------------------------------
def test_18_vergleich_rest_fuenftel(self):
"""9.000 € Vergleich-Rest (lb-end-21 Beispiel 1): nach
§-62-Abzug ist 1/5 steuerfrei (Deckel 12.474 €), 4/5 laufen
tarifisch im Zuflussmonat OHNE Sechstel-Effekt; SV-pflichtig im
Zuflussmonat, voll LNK-pflichtig."""
emp_mit = self._employee(ueberzahlung=3000.0)
emp_ohne = self._employee(ueberzahlung=3000.0)
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_VERGLEICH', 9000.0)
self.assertAlmostEqual(self._total(slip_mit, 'VERGLEICH'), 9000.0,
places=2)
# Sechstel unverändert (Abs 2 nicht anzuwenden)
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
satz = sum(slip_mit._l10n_at_sv_satz(
'dn', k, staffel_basis=slip_mit._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = 9000.0 * (1.0 - satz / 100.0)
deckel = float(slip_mit._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
frei = min(bemessung / 5.0, deckel)
self.assertAlmostEqual(slip_mit._at_fuenftel_frei_betr(), frei,
places=2)
self.assertAlmostEqual(slip_mit._at_fuenftel_tarif_basis(),
bemessung - frei, places=2)
svdn_diff = (slip_mit._l10n_at_svdn_gesamt()
- slip_ohne._l10n_at_svdn_gesamt())
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen() + svdn_diff,
bemessung - frei, places=2)
# LNK-Basis um die volle Vergleichssumme erhöht
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 9000.0, places=2)
# SV-pflichtig im Zuflussmonat (rohe Basis vor HBG-Cap)
self.assertAlmostEqual(
slip_mit._l10n_at_sv_basis_roh()
- slip_ohne._l10n_at_sv_basis_roh(), 9000.0, places=2)
# ------------------------------------------------------------------
# RF-VGL-2: BV-Anwartschafts-Teil (§ 67 Abs 8 lit a, 6 %/7.500 €)
# ------------------------------------------------------------------
def test_19_vergleich_bv_sechs_prozent(self):
"""9.000 € Vergleichssumme mit BV-Anwartschaft (lb-end-21
Beispiel 2): erste 7.500 € nach anteiligem §-62-Abzug mit 6 %,
der Überhang von 1.500 € fällt in die Fünftelregelung zurück
(anteilige Beitragszuordnung, LStR Rz 1102b)."""
emp_mit = self._employee(ueberzahlung=3000.0)
emp_ohne = self._employee(ueberzahlung=3000.0)
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_VERGLEICH_BV', 9000.0)
self.assertAlmostEqual(self._total(slip_mit, 'VERGLEICH_BV'),
9000.0, places=2)
satz = sum(slip_mit._l10n_at_sv_satz(
'dn', k, staffel_basis=slip_mit._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av', 'ak', 'wf'))
steuersatz = float(slip_mit._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
self.assertAlmostEqual(
self._total(slip_mit, 'LST_VERGLEICH_BV'),
7500.0 * (1.0 - satz / 100.0) * steuersatz / 100.0, places=2)
# Überhang in die Fünftelregelung zurück
self.assertAlmostEqual(slip_mit._at_fuenftel_total(), 1500.0,
places=2)
deckel = float(slip_mit._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
ueberhang_bem = 1500.0 * (1.0 - satz / 100.0)
self.assertAlmostEqual(
slip_mit._at_fuenftel_frei_betr(),
min(ueberhang_bem / 5.0, deckel), places=2)
# Sechstel unverändert; LNK und SV über die volle Summe
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 9000.0, places=2)
self.assertAlmostEqual(
slip_mit._l10n_at_sv_basis_roh()
- slip_ohne._l10n_at_sv_basis_roh(), 9000.0, places=2)
# ------------------------------------------------------------------
# RF-VGL-3: Deckel — Fünftel an 9 × HBG/5, BV-Teil an 7.500 €
# ------------------------------------------------------------------
def test_20_vergleich_deckel(self):
"""Deckelfälle (lb-end-21): der Fünftel-Deckel greift, wenn die
§-62-gekürzte Bemessung 5 × 12.474 € übersteigt — bei Brutto
100.000 € ist das der Fall; das 70.000-€-Beispiel der Quelle
meint die bereits gekürzte Bemessungsgrundlage. BV-Teil
10.000 € → 7.500 € begünstigt, 2.500 € zurück in die
Fünftelregelung."""
emp = self._employee(ueberzahlung=3000.0)
slip = self._slip(emp)
self._input(slip, 'ATP_VERGLEICH', 100000.0)
satz = sum(slip._l10n_at_sv_satz(
'dn', k, staffel_basis=slip._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av', 'ak', 'wf'))
bemessung = 100000.0 * (1.0 - satz / 100.0)
deckel = float(slip._l10n_at_param('at_sv_hbg_monatlich')) \
* 9.0 / 5.0
self.assertGreater(bemessung / 5.0, deckel)
self.assertAlmostEqual(slip._at_fuenftel_frei_betr(), deckel,
places=2)
self.assertAlmostEqual(
slip._at_fuenftel_tarif_basis(), bemessung - deckel, places=2)
slip.input_line_ids.filtered(
lambda i: i.input_type_id.code == 'ATP_VERGLEICH').write(
{'amount': 0.0})
self._input(slip, 'ATP_VERGLEICH_BV', 10000.0)
self.assertAlmostEqual(slip._at_vergleich_bv_beguenstigt(), 7500.0,
places=2)
self.assertAlmostEqual(slip._at_vergleich_bv_ueberhang(), 2500.0,
places=2)
self.assertAlmostEqual(slip._at_fuenftel_total(), 2500.0,
places=2)
steuersatz = float(slip._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
self.assertAlmostEqual(
self._total(slip, 'LST_VERGLEICH_BV'),
7500.0 * (1.0 - satz / 100.0) * steuersatz / 100.0, places=2)
# ------------------------------------------------------------------
# RF-VGL-4: Wizard-E2E und Validierungen (Bestätigungspflichten)
# ------------------------------------------------------------------
def test_21_vergleich_wizard(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
basis = {
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich').id,
'vergleich_aktiv': True,
'vergleich_rest_betrag': 9000.0,
'vergleich_nachweis':
'Außergerichtlicher Vergleich, Ansprüche strittig',
}
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create(
dict(basis))
with self.assertRaises(UserError):
wizard.action_payslip() # Aufgliederung nicht bestätigt
wizard.write({'vergleich_aufteilung_bestaetigt': True,
'vergleich_bv_betrag': 8000.0,
'vergleich_bv_anwartschaft_bestaetigt': True})
with self.assertRaises(UserError):
wizard.action_payslip() # BV-Teil über 7.500 €
wizard.write({'vergleich_bv_betrag': 5000.0,
'vergleich_bv_anwartschaft_bestaetigt': False})
with self.assertRaises(UserError):
wizard.action_payslip() # BV-Anwartschaft nicht bestätigt
wizard.write({'vergleich_bv_betrag': 7500.0,
'vergleich_bv_anwartschaft_bestaetigt': True})
ergebnis = wizard.action_payslip()
slip = self.env['hr.payslip'].browse(ergebnis['res_id'])
self.assertAlmostEqual(self._total(slip, 'VERGLEICH'), 9000.0,
places=2)
self.assertAlmostEqual(self._total(slip, 'VERGLEICH_BV'), 7500.0,
places=2)
self.assertEqual(
slip.l10n_at_vergleich_nachweis,
'Außergerichtlicher Vergleich, Ansprüche strittig')
satz = sum(slip._l10n_at_sv_satz(
'dn', k, staffel_basis=slip._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av', 'ak', 'wf'))
steuersatz = float(slip._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
self.assertAlmostEqual(
self._total(slip, 'LST_VERGLEICH_BV'),
7500.0 * (1.0 - satz / 100.0) * steuersatz / 100.0, places=2)
# ------------------------------------------------------------------
# RF-PRM-1: Prämie mit Endabrechnung (§ 16 AngG, sonstiger Bezug)
# ------------------------------------------------------------------
def test_22_pram_end_mit_endabrechnung(self):
"""3.000 € aliquote Prämie, mit der Endabrechnung ausgezahlt
(lb-end-18): sonstiger Bezug im Jahressechstel (6 %-Band,
Sechstel unverändert), SZ-SV (ohne AK/WF), voll LNK-pflichtig,
BV-Beitrag 1,53 % ungecappt (§ 6 Abs 5 BMSVG)."""
emp_mit = self._employee(ueberzahlung=3000.0)
emp_ohne = self._employee(ueberzahlung=3000.0)
for emp in (emp_mit, emp_ohne):
emp.version_id.write({'l10n_at_abfertigung_neu': True})
slip_mit = self._slip(emp_mit)
slip_ohne = self._slip(emp_ohne)
self._input(slip_mit, 'ATP_PRAM_END', 3000.0)
self.assertAlmostEqual(self._total(slip_mit, 'PRAM_END'), 3000.0,
places=2)
# Sonstiger Bezug erhöht das Jahressechstel nicht
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
# SZ-Bemessung enthält die Prämie (SV-DN nach § 67 Abs 12
# abziehen, um den Brutto-Anteil zu isolieren)
svdn_sz_diff = (slip_mit._l10n_at_svdn_sz()
- slip_ohne._l10n_at_svdn_sz())
self.assertAlmostEqual(
slip_mit._l10n_at_sz_bemessung()
- slip_ohne._l10n_at_sz_bemessung() + svdn_sz_diff,
3000.0, places=2)
# SZ-SV: KV/PV/AV, ohne AK/WF (§ 62 Z 3/Z 5)
satz_sz = sum(slip_mit._l10n_at_sv_satz(
'dn', k, staffel_basis=slip_mit._l10n_at_sv_basis_roh())
for k in ('kv', 'pv', 'av'))
self.assertAlmostEqual(svdn_sz_diff, 3000.0 * satz_sz / 100.0,
places=2)
# LNK über die volle Prämie
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 3000.0, places=2)
# BV 1,53 % ungecappt (§ 6 Abs 1 iVm Abs 5 BMSVG)
satz_bv = float(slip_mit._l10n_at_param('at_sv_bv_dg'))
self.assertAlmostEqual(
slip_mit._at_bv_beitrag() - slip_ohne._at_bv_beitrag(),
3000.0 * satz_bv / 100.0, places=2)
# ------------------------------------------------------------------
# RF-PRM-2: Später fällige Prämie (§ 67 Abs 10) mit SV-Rollung
# ------------------------------------------------------------------
def test_23_pram_end_tarif_und_rollung(self):
"""3.000 € anteilige Prämie für Leistungen im Austrittsjahr 2025,
fällig und ausgezahlt im März 2026 (lb-end-18): tarifisch im
Zuflussmonat OHNE Sechstel-Erhöhung (§ 67 Abs 10); SV-Rollung
auf den Beitragsmonat im Austrittsjahr mit historischen Sätzen
und HBG (E-MVB 044)."""
emp_mit = self._employee(ueberzahlung=3000.0,
ende=date(2025, 12, 31))
emp_ohne = self._employee(ueberzahlung=3000.0,
ende=date(2025, 12, 31))
slip_mit = self._slip(emp_mit, monat=3, jahr=2026)
slip_ohne = self._slip(emp_ohne, monat=3, jahr=2026)
self._input(slip_mit, 'ATP_PRAM_END_TARIF', 3000.0)
self.assertAlmostEqual(self._total(slip_mit, 'PRAM_END_TARIF'),
3000.0, places=2)
# Sechstel unverändert (§ 67 Abs 10: kein Jahressechstel-Effekt)
self.assertAlmostEqual(
slip_mit._l10n_at_sechstel() - slip_ohne._l10n_at_sechstel(),
0.0, places=2)
# Tarifisch in der laufenden Bemessung des Zuflussmonats
svdn_diff = (slip_mit._l10n_at_svdn_gesamt()
- slip_ohne._l10n_at_svdn_gesamt())
self.assertAlmostEqual(
slip_mit._l10n_at_bemessung_laufen()
- slip_ohne._l10n_at_bemessung_laufen() + svdn_diff,
3000.0, places=2)
# LNK über die volle Prämie
self.assertAlmostEqual(
slip_mit._at_lnk_basis('flaf')
- slip_ohne._at_lnk_basis('flaf'), 3000.0, places=2)
# Rollung: SV-Beitragsmonat auf dem Lauf (Austrittsjahr 2025);
# historische HBG (2025: 6.450 €) und Sätze des Rollmonats
slip_mit.write({'l10n_at_pram_beitragsmonat': date(2025, 6, 1)})
slip_mit.compute_sheet()
basis = self._basis_monate(slip_mit)
self.assertAlmostEqual(basis[date(2025, 6, 1)], 3000.0, places=2)
# Im Zuflussmonat bleibt die Prämie außer Ansatz (§ 54 ASVG:
# Zuordnung zum Leistungszeitraum) — die Basis entspricht der
# eines Laufs ohne Prämie.
basis_ohne = self._basis_monate(slip_ohne)
self.assertAlmostEqual(basis[date(2026, 3, 1)],
basis_ohne[date(2026, 3, 1)], places=2)
# ------------------------------------------------------------------
# RF-PRM-3: Wizard-E2E und Validierungen (§-16-Aliquot, Rollung)
# ------------------------------------------------------------------
def test_24_pram_wizard(self):
emp = self._employee()
emp.version_id.write({
'structure_type_id': self.env.ref(
'l10n_at_hr_payroll_private.structure_type_at_privat').id,
'l10n_at_abfertigung_neu': False,
})
basis = {
'employee_id': emp.id,
'austrittsdatum': date(2026, 3, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll.departure_reason_einvernehmlich').id,
'pram_aktiv': True,
'pram_voller_betrag': 6000.0,
'pram_anspruchszeitraum_monate': 12,
'pram_dienstzeit_monate': 3,
'pram_nachweis': 'KV-Prämienvereinbarung, Leistungszeitraum',
}
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create(
dict(basis))
self.assertAlmostEqual(wizard.pram_aliquot_vorschau, 1500.0,
places=2)
with self.assertRaises(UserError):
wizard.action_payslip() # Leistungsgrundlage nicht bestätigt
wizard.write({'pram_leistung_bestaetigt': True,
'pram_betrag': 1000.0})
ergebnis = wizard.action_payslip()
slip = self.env['hr.payslip'].browse(ergebnis['res_id'])
self.assertAlmostEqual(self._total(slip, 'PRAM_END'), 1000.0,
places=2)
self.assertEqual(
slip.l10n_at_pram_nachweis,
'KV-Prämienvereinbarung, Leistungszeitraum')
# Später fällig: Beitragsmonat der Rollung erforderlich
wizard2 = self.env[
'l10n.at.payroll.endabrechnung.wizard'].create({
**basis,
'pram_leistung_bestaetigt': True,
'pram_betrag': 1000.0,
'pram_zahlungsart': 'spaeter_faellig',
})
with self.assertRaises(UserError):
wizard2.action_payslip() # Rollungs-Beitragsmonat fehlt
wizard2.write({'pram_beitragsmonat': date(2026, 1, 1)})
ergebnis = wizard2.action_payslip()
slip2 = self.env['hr.payslip'].browse(ergebnis['res_id'])
self.assertAlmostEqual(self._total(slip2, 'PRAM_END_TARIF'),
1000.0, places=2)
self.assertEqual(slip2.l10n_at_pram_beitragsmonat,
date(2026, 1, 1))
basis = self._basis_monate(slip2)
self.assertIn(date(2026, 1, 1), basis)
@@ -0,0 +1,323 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP16 (8.13): Karenz-/Familien-Freistellungen — Entgelt-Stopp je
unbezahlter Karenz-Art (KARENZ_ENTGELT, Muster MSCH_ENTGELT), eSV-An-/
Abmeldungen aus der vr.event-Registry (Papa-Monat tagesgenau, Karenz-
Art-Protokoll), fiktive BV mit §-7-Abs-4-Z-13-BMSVG-Karenz-Brücke,
BV-Vor-Entgelt bei Pflegeteilzeit (§ 6 Abs 4 BMSVG), Sonderwochengeld
(§ 163 ASVG) und Ruhen-Warnungen (§ 166 ASVG), §-23-Abs-8-ETZ-
Hochrechnung im Endabrechnungs-Wizard."""
import base64
import datetime
from odoo import SUPERUSER_ID
from odoo.exceptions import UserError
from odoo.tests import TransactionCase, tagged
@tagged('post_install', '-at_install')
class KarenzPrivateTest(TransactionCase):
def setUp(self):
super().setUp()
self.company = self.env.company
self.structure = self.env.ref(
'l10n_at_hr_payroll_private.structure_at_privat')
self.kv2203 = self.env.ref(
'l10n_at_hr_payroll_private.kv_si_2203')
self.gruppe_ii = self.env.ref(
'l10n_at_hr_payroll_private.kv2203_grp_ii')
self.calendar = self.env['resource.calendar'].create({
'name': 'AT Karenz 40h',
'tz': 'Europe/Vienna',
'hours_per_day': 8,
'attendance_ids': [
(0, 0, {'name': 'Tag %d' % wd, 'dayofweek': str(wd),
'hour_from': 8.0, 'hour_to': 16.0})
for wd in range(5)
],
})
self.kalender_teilzeit = self.env['resource.calendar'].create({
'name': 'AT Karenz 20h (Teilzeit)',
'tz': 'Europe/Vienna',
'hours_per_day': 4,
'attendance_ids': [
(0, 0, {'name': 'Tag %d' % wd, 'dayofweek': str(wd),
'hour_from': 8.0, 'hour_to': 12.0})
for wd in range(5)
],
})
self.company.resource_calendar_id = self.calendar
self.typ_bildung = self.env.ref(
'l10n_at_hr_payroll_private.leave_type_at_bildungskarenz')
self.typ_pflege = self.env.ref(
'l10n_at_hr_payroll_private.leave_type_at_pflegekarenz')
self.typ_karenz = self.env.ref(
'l10n_at_hr_payroll_private.leave_type_at_karenz')
self.typ_msch = self.env.ref(
'l10n_at_hr_payroll_private.leave_type_at_mutterschutz')
self.typ_krank = self.env.ref(
'l10n_at_hr_payroll_private.leave_type_at_krankenstand')
def _employee(self, teilzeit=False, ssnid=False, ende=None):
employee = self.env['hr.employee'].create({
'name': 'Karenz Test', 'sex': 'female',
'birthday': '1990-05-15'})
version = self.env['hr.version'].search(
[('employee_id', '=', employee.id)], limit=1)
version.write({
'contract_date_start': datetime.date(2020, 7, 1),
'kv_id': self.kv2203.id,
'kv_gruppe_id': self.gruppe_ii.id,
'erfahrungsstufe': 1,
'ueberzahlung': 2059.41,
'resource_calendar_id': self.calendar.id,
})
if ssnid:
version.write({'ssnid': '1234150590',
'sex': 'female'})
if ende:
version.write({'contract_date_end': ende})
version.generate_work_entries(
datetime.date(2026, 8, 1), datetime.date(2027, 3, 31))
return employee
def _slip(self, employee, monat, jahr=2026, confirm=False):
erster = datetime.date(jahr, monat, 1)
letzter = (erster.replace(day=28)
+ datetime.timedelta(days=4)).replace(day=1) \
- datetime.timedelta(days=1)
slip = self.env['hr.payslip'].create({
'name': 'Karenz %d/%d' % (monat, jahr),
'employee_id': employee.id,
'struct_id': self.structure.id,
'date_from': erster,
'date_to': letzter,
})
slip.compute_sheet()
if confirm:
slip.action_payslip_done()
return slip
def _total(self, slip, code):
return sum(slip.line_ids.filtered(
lambda l: l.code == code).mapped('total'))
def _leave(self, employee, typ, von, bis, skip_check=False):
vals = {
'name': '%s %s' % (typ.name, von),
'employee_id': employee.id,
'holiday_status_id': typ.id,
'request_date_from': von,
'request_date_to': bis,
}
if skip_check:
# Überlappende Freistellungen (Krankheit während Karenz/MSchG):
# direkt auf state='validate' — _action_validate würde an
# number_of_days == 0 (vom Karenz-Typ belegte Tage) scheitern.
leave = self.env['hr.leave'].with_context(
leave_skip_date_check=True,
leave_skip_state_check=True).create(
dict(vals, state='validate'))
return leave
leave = self.env['hr.leave'].create(vals)
leave.with_user(SUPERUSER_ID)._action_validate()
return leave
# ------------------------------------------------------------------
# RF-KAR-1: Entgelt-Stopp je Karenz-Art (KARENZ_ENTGELT)
# ------------------------------------------------------------------
def test_01_entgelt_stopp_bildungskarenz(self):
"""Bildungskarenz 1.-15. 11. (§ 11 AVRAG, 15 KT/10 AT): das
Karenzgeld zahlt die AK — KARENZ_ENTGELT stoppt das
Dienstgeber-Entgelt je Arbeitstag (Muster MSCH_ENTGELT)."""
emp_mit = self._employee()
emp_ohne = self._employee()
slip_mit = self._slip(emp_mit, 11)
slip_ohne = self._slip(emp_ohne, 11)
self._leave(emp_mit, self.typ_bildung,
datetime.date(2026, 11, 1),
datetime.date(2026, 11, 15))
slip_mit.compute_sheet()
status = slip_mit._at_karenz_status()
self.assertEqual(len(status['kalendertage']), 15)
self.assertEqual(len(status['arbeitstage']), 10)
self.assertTrue(any('Bildungskarenz' in a
for a in status['arten']))
tagesatz = 2059.41 / 21
self.assertAlmostEqual(self._total(slip_mit, 'KARENZ_ENTGELT'),
-tagesatz * 10, places=2)
# Keine MSCH-Wirkung; SV-Basis durch die negative Zeile reduziert
self.assertEqual(self._total(slip_mit, 'MSCH_ENTGELT'), 0.0)
basis_diff = (slip_ohne._l10n_at_sv_basis_roh()
- slip_mit._l10n_at_sv_basis_roh())
self.assertAlmostEqual(basis_diff, tagesatz * 10, places=2)
# ------------------------------------------------------------------
# RF-KAR-2: eSV-An-/Abmeldungen aus Karenz (vr.event)
# ------------------------------------------------------------------
def test_02_vr_events_karenz(self):
"""Pflegekarenz 1.-15. 11.: Abmeldung zum Tag vor Beginn
(Ende des Entgeltanspruchs, § 163/§ 11 ASVG-Rahmen) und
Anmeldung zur Rückkehr (16. 11.); Karenzart im Protokoll;
erneuter Lauf idempotent (Registry-Dedup)."""
self.company.write({
'l10n_at_beitragskontonummer': '1412345678',
})
employee = self._employee(ssnid=True)
self._leave(employee, self.typ_pflege,
datetime.date(2026, 11, 1),
datetime.date(2026, 11, 15))
lauf = self.env['l10n.at.payroll.vr'].create({
'company_id': self.company.id,
'stichtag': datetime.date(2026, 12, 31),
})
lauf.action_erzeugen()
self.assertEqual(lauf.state, 'done')
events = self.env['l10n.at.payroll.vr.event'].search([
('company_id', '=', self.company.id),
('employee_id', '=', employee.id),
])
adate = {(e.art, e.adatum) for e in events}
self.assertIn(('M4', datetime.date(2026, 10, 31)), adate)
self.assertIn(('M3', datetime.date(2026, 11, 16)), adate)
self.assertIn('Pflegekarenz', lauf.protokoll)
roh = base64.b64decode(lauf.datei).decode('ISO-8859-15')
self.assertIn('M4-K', roh)
self.assertIn('M3-K', roh)
# Idempotenz: zweite Meldungen sind registriert → Lauf leer
lauf2 = self.env['l10n.at.payroll.vr'].create({
'company_id': self.company.id,
'stichtag': datetime.date(2026, 12, 31),
})
with self.assertRaises(UserError):
lauf2.action_erzeugen()
# ------------------------------------------------------------------
# RF-KAR-3: BMSVG-Karenz-Brücke (§ 7 Abs 4 Z 13)
# ------------------------------------------------------------------
def test_03_bmsvg_karenz_bruecke(self):
"""Mutterschutz-Frist Nov 2026, Karenz Dez 2026Feb 2027,
neuerliches Verbot 1. 3. 2027 (Z 1): der Bemessungsstichtag der
fiktiven BV ist das der Karenz unmittelbar vorangegangene
Beschäftigungsverbot — Referenzmonate Aug/Sep/Okt 2026."""
employee = self._employee()
self._leave(employee, self.typ_msch,
datetime.date(2026, 11, 1),
datetime.date(2026, 11, 15))
self._leave(employee, self.typ_karenz,
datetime.date(2026, 11, 16),
datetime.date(2027, 2, 28))
self._leave(employee, self.typ_msch,
datetime.date(2027, 3, 1),
datetime.date(2027, 3, 15))
slip = self._slip(employee, 11, jahr=2026)
stichtag, anzahl = slip._at_msch_referenz_stichtag_und_anzahl(
datetime.date(2027, 3, 1))
self.assertEqual(stichtag, datetime.date(2026, 11, 1))
self.assertEqual(anzahl, 3)
monate = slip._at_msch_referenz_monate(datetime.date(2027, 3, 1))
self.assertEqual(
monate,
[datetime.date(2026, 8, 1), datetime.date(2026, 9, 1),
datetime.date(2026, 10, 1)])
# ------------------------------------------------------------------
# RF-KAR-4: BV-Vor-Entgelt bei Pflegeteilzeit (§ 6 Abs 4 BMSVG)
# ------------------------------------------------------------------
def test_04_bv_vor_entgelt_pflegeteilzeit(self):
"""20-h-Teilzeit (work_time_rate 0,5) mit gesetztem
Vor-Reduzierungs-Entgelt: die BV-Basis läuft auf dem
Vor-Reduzierungs-Entgelt (§ 6 Abs 4 BMSVG), nicht auf der
reduzierten laufenden Basis."""
employee = self._employee()
version = employee.version_id
version.write({
'l10n_at_abfertigung_neu': True,
'l10n_at_bv_vor_entgelt': 2059.41,
})
version.resource_calendar_id = self.kalender_teilzeit
version.generate_work_entries(
datetime.date(2026, 8, 1), datetime.date(2026, 11, 30))
slip = self._slip(employee, 11)
self.assertAlmostEqual(slip._at_bv_basis_laufen(), 2059.41,
places=2)
# OHNE §-6-Abs-4-Feld: reduzierte laufende Basis
version.write({'l10n_at_bv_vor_entgelt': 0.0})
slip.compute_sheet()
self.assertAlmostEqual(slip._at_bv_basis_laufen(), 1029.71,
places=2)
# ------------------------------------------------------------------
# RF-KAR-5: Sonderwochengeld (§ 163) und Ruhen (§ 166)
# ------------------------------------------------------------------
def test_05_sonderwochengeld_und_ruhen(self):
"""Mutterschutz-Frist 1.-15. 11. innerhalb einer Pflegekarenz:
Sonderwochengeld statt Wochengeld (§ 163 ASVG); Krankenstand
1.-10. 11. (Entgeltfortzahlung 100 %) → Ruhen-Warnung
(§ 166 Abs 1 Z 2)."""
employee = self._employee()
# Karenz + Krankenstand + Mutterschutz überlappen real (Krankheit
# während der Frist); Odos Quere-Overlap-Sperre wird im Test mit
# dem offiziellen leave_skip_date_check-Bypass umgangen — die
# Leave-Überlappungs-Policy ist Mandanten-Entscheid (offener
# Punkt in docs/rechenfaelle/karenz.md).
self._leave(employee, self.typ_pflege,
datetime.date(2026, 11, 1),
datetime.date(2026, 12, 15), skip_check=True)
self._leave(employee, self.typ_krank,
datetime.date(2026, 11, 1),
datetime.date(2026, 11, 10), skip_check=True)
self._leave(employee, self.typ_msch,
datetime.date(2026, 11, 5),
datetime.date(2026, 11, 15), skip_check=True)
# Krankenstand Nov 110 als direkte Work Entries (ein Leave auf
# denselben Tagen erzeugt der Work-Entry-Generator nicht — die
# Karenz belegt die Tage bereits); die EFZ-Maschine liest die
# KRANK-Entries für die Fortzahlungs-Phase.
krank_typ = self.env['hr.work.entry.type'].search(
[('code', '=', 'ATP_KRANK')], limit=1)
arbeitstage = [datetime.date(2026, 11, d) for d in
(2, 3, 4, 5, 6, 9, 10)]
for tag in arbeitstage:
self.env['hr.work.entry'].create({
'name': 'Krankenstand %s' % tag,
'employee_id': employee.id,
'work_entry_type_id': krank_typ.id,
'date': tag,
'duration': 8.0,
})
slip = self._slip(employee, 11)
slip.compute_sheet()
self.assertTrue(slip._at_msch_sonderwochengeld())
warnungen = slip._at_msch_ruhen_warnungen()
self.assertTrue(any('Ruhen zur Gänze' in w for w in warnungen))
self.assertIn('Sonderwochengeld', slip.l10n_at_msch_info)
# ------------------------------------------------------------------
# RF-KAR-6: §-23-Abs-8-Hochrechnung im Wizard (Elternteilzeit)
# ------------------------------------------------------------------
def test_06_etz_hochrechnung_wizard(self):
"""20-h-Versionskalender (work_time_rate 0,5): der §-23-Abs-8-
Hochrechnungs-Vorschlag = Monatsentgelt ÷ work_time_rate; die
Übernahme bleibt bestätigt (kein Auto-Write)."""
employee = self._employee()
version = employee.version_id
version.resource_calendar_id = self.kalender_teilzeit
version.generate_work_entries(
datetime.date(2026, 8, 1), datetime.date(2026, 11, 30))
wizard = self.env['l10n.at.payroll.endabrechnung.wizard'].create({
'employee_id': employee.id,
'austrittsdatum': datetime.date(2026, 11, 15),
'departure_reason_id': self.env.ref(
'l10n_at_hr_payroll'
'.departure_reason_einvernehmlich').id,
'abf_alt_aktiv': True,
'abf_alt_monatsentgelt': 1029.71,
'abf_alt_laufender_arbeitslohn': 1029.71,
'abf_alt_monatslohnsteuer': 0.0,
'abf_alt_mehrfach': 2.0,
'abf_alt_anspruchsart': 'normal',
})
self.assertAlmostEqual(wizard.abf_alt_hochrechnung_vorschau,
2059.42, places=2)
@@ -185,6 +185,59 @@ class PfaendungPrivateTest(TransactionCase):
self.assertAlmostEqual(self._total(slip, 'PFAENDUNG'),
pfaendbar, places=2)
def test_09b_pfaendung_regel_beendigung(self):
"""AP15-A: Netto-Abfertigung läuft über den eigenen §-291d-Topf."""
employee = self._employee(datetime.date(2020, 1, 1), unterhalt=0)
self._pfaendung(employee, datetime.date(2026, 2, 1))
slip = self._slip(employee, 3)
slip.write({
'l10n_at_abf_alt_laufender_arbeitslohn': 3000.0,
'l10n_at_abf_alt_monatslohnsteuer': 200.0,
'l10n_at_abf_alt_mehrfach': 3.0,
})
input_type = self.env.ref(
'l10n_at_hr_payroll_private.input_type_atp_abf_alt')
self.env['hr.payslip.input'].create({
'payslip_id': slip.id,
'input_type_id': input_type.id,
'amount': 10500.0,
})
slip.compute_sheet()
masse = slip._at_pfaendung_masse(None, 'beendigung')
self.assertGreater(masse, 0.0)
self.assertAlmostEqual(
self._total(slip, 'PFAENDUNG_END'), masse, places=2)
def test_09c_pfaendung_abf_frei_topf(self):
"""AP15-B: begünstigter Teil der freiwilligen Abfertigung läuft
in den §-291d-Topf, abzüglich beider Abfertigungs-LSt-Arten; der
Überhang bleibt über die laufende Bemessung pfändbar."""
employee = self._employee(datetime.date(2020, 1, 1), unterhalt=0)
self._pfaendung(employee, datetime.date(2026, 2, 1))
slip = self._slip(employee, 3)
slip.write({
'l10n_at_abf_frei_basis_12': 36000.0,
'l10n_at_abf_frei_dienstzeit_monate': 180,
})
input_type = self.env.ref(
'l10n_at_hr_payroll_private.input_type_atp_abf_frei')
self.env['hr.payslip.input'].create({
'payslip_id': slip.id,
'input_type_id': input_type.id,
'amount': 40000.0,
})
slip.compute_sheet()
lst6 = self.env.company.currency_id.round(27000.0 * 0.06)
self.assertAlmostEqual(
self._total(slip, 'ABF_FREI'), 27000.0, places=2)
self.assertAlmostEqual(
self._total(slip, 'ABF_FREI_TARIF'), 13000.0, places=2)
self.assertAlmostEqual(
slip._at_pfaendung_basis(None, 'beendigung'),
27000.0 - lst6, places=2)
def test_10_rang(self):
"""Zwei Pfändungen → Rang 1 (früheres Einlangen) und Rang 2."""
employee = self._employee(datetime.date(2026, 1, 1))
@@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- AP14-A: Endabrechnungs-Wizard (Beendigung) — sammelt UEL, -->
<!-- Abgangsentschädigung, Zeitguthaben/-schulden und offene -->
<!-- Vorschüsse und legt den Endabrechnungs-Lauf vorbefüllt an. -->
<record id="endabrechnung_wizard_form_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.endabrechnung.wizard.form</field>
<field name="model">l10n.at.payroll.endabrechnung.wizard</field>
<field name="arch" type="xml">
<form string="Endabrechnung (Beendigung)">
<group>
<group string="Beendigung">
<field name="employee_id"/>
<field name="austrittsdatum"/>
<field name="departure_reason_id" options="{'no_create': True}"/>
</group>
<group string="Offene Posten">
<field name="uel_tage"/>
<field name="zeit_guthaben_stunden"/>
<field name="zeit_schulden_stunden"/>
<field name="abgang_betrag"/>
<field name="abgang_ffrist_tage"
invisible="not abgang_betrag"/>
<field name="vorschuss_saldo"/>
</group>
</group>
<group string="Abfertigung Alt (§§ 23/23a AngG)">
<field name="abf_alt_aktiv"/>
<group invisible="not abf_alt_aktiv">
<field name="abf_alt_anspruchsart"/>
<field name="abf_alt_dienstzeit_monate"/>
<field name="abf_alt_monatsentgelt"/>
<field name="abf_alt_laufender_arbeitslohn"/>
<field name="abf_alt_monatslohnsteuer"/>
<field name="abf_alt_mehrfach"/>
<field name="abf_alt_nachweis" placeholder="Dienstzeitnachweis, Alt-/Neu-Status und Anspruchsbegründung"/>
<field name="abf_alt_anspruch_bestaetigt"/>
</group>
<group invisible="not abf_alt_aktiv">
<field name="abf_alt_betrag_vorschau"/>
<field name="abf_alt_hochrechnung_vorschau"
invisible="not abf_alt_monatsentgelt"/>
<field name="abf_alt_steuer_vervielfachung_vorschau"/>
<field name="abf_alt_steuer_6_vorschau"/>
<field name="abf_alt_lohnsteuer_vorschau"/>
<field name="abf_alt_netto_vorschau"/>
</group>
</group>
<group string="Freiwillige Abfertigung (§ 67 Abs 6 EStG)">
<field name="abf_frei_aktiv"/>
<group invisible="not abf_frei_aktiv">
<field name="abf_frei_betrag"/>
<field name="abf_frei_basis_12"/>
<field name="abf_frei_dienstzeit_monate"/>
<field name="abf_frei_erhaltene_abfertigungen"/>
<field name="abf_frei_gesetzlicher_anspruch"/>
<field name="abf_frei_nachweis" placeholder="Vordienstzeiten zum Lohnkonto (§ 76 EStG), erhaltene Abfertigungen, keine Anspruchsumwandlung"/>
<field name="abf_frei_anspruch_bestaetigt"/>
</group>
<group invisible="not abf_frei_aktiv">
<field name="abf_frei_z1_vorschau"/>
<field name="abf_frei_z2_vorschau"/>
<field name="abf_frei_kuerzung_vorschau"/>
<field name="abf_frei_beguenstigt_vorschau"/>
<field name="abf_frei_ueberhang_vorschau"/>
<field name="abf_frei_lst_vorschau"/>
<field name="abf_frei_netto_vorschau"/>
</group>
</group>
<group string="Vergleichssumme (§ 67 Abs 8 lit a EStG)">
<field name="vergleich_aktiv"/>
<group invisible="not vergleich_aktiv">
<field name="vergleich_rest_betrag"/>
<field name="vergleich_bv_betrag"/>
<field name="vergleich_bv_anwartschaft_bestaetigt"
invisible="not vergleich_bv_betrag"/>
<field name="vergleich_nachweis" placeholder="Aufgliederung der Vergleichsvereinbarung, strittige Ansprüche, BV-Zeiträume, Pauschalvergleich: Verhältnisfaktor"/>
<field name="vergleich_aufteilung_bestaetigt"/>
</group>
<group invisible="not vergleich_aktiv">
<field name="vergleich_fuenftel_frei_vorschau"/>
<field name="vergleich_tarif_basis_vorschau"/>
<field name="vergleich_bv_lst_vorschau"/>
</group>
</group>
<group string="Prämie bei Beendigung (§ 16 AngG)">
<field name="pram_aktiv"/>
<group invisible="not pram_aktiv">
<field name="pram_voller_betrag"/>
<field name="pram_anspruchszeitraum_monate"/>
<field name="pram_dienstzeit_monate"/>
<field name="pram_aliquot_vorschau"/>
<field name="pram_betrag"/>
<field name="pram_zahlungsart"/>
<field name="pram_beitragsmonat"
invisible="pram_zahlungsart != 'spaeter_faellig'"/>
<field name="pram_nachweis" placeholder="KV-/Vertragsvereinbarung, Aliquotierung, Fälligkeitszeitpunkt, Leistungsverknüpfung"/>
<field name="pram_leistung_bestaetigt"/>
</group>
</group>
<group string="Vorschau (§ 10 UrlG, § 11 Abs 2 ASVG)">
<group>
<field name="uel_lfd_vorschau"/>
<field name="uel_sz_vorschau"/>
</group>
<group>
<field name="sv_tage_vorschau"/>
</group>
</group>
<footer>
<button name="action_payslip" type="object"
string="Endabrechnungs-Lauf anlegen"
class="btn-primary"/>
<button string="Abbrechen" special="cancel"
class="btn-secondary"/>
</footer>
</form>
</field>
</record>
<record id="hr_payslip_view_form_abf_alt" model="ir.ui.view">
<field name="name">hr.payslip.form.abfertigung.alt</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Abfertigung Alt" name="l10n_at_abfertigung_alt"
invisible="not l10n_at_abf_alt_mehrfach">
<group>
<group>
<field name="l10n_at_abf_alt_anspruchsart" readonly="state != 'draft'"/>
<field name="l10n_at_abf_alt_dienstzeit_monate" readonly="state != 'draft'"/>
<field name="l10n_at_abf_alt_monatsentgelt" readonly="state != 'draft'"/>
</group>
<group>
<field name="l10n_at_abf_alt_laufender_arbeitslohn" readonly="state != 'draft'"/>
<field name="l10n_at_abf_alt_monatslohnsteuer" readonly="state != 'draft'"/>
<field name="l10n_at_abf_alt_mehrfach" readonly="state != 'draft'"/>
<field name="l10n_at_abf_alt_nachweis" readonly="state != 'draft'"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
<record id="hr_payslip_view_form_abf_frei" model="ir.ui.view">
<field name="name">hr.payslip.form.abfertigung.frei</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Freiwillige Abfertigung" name="l10n_at_abfertigung_frei"
invisible="not l10n_at_abf_frei_basis_12 and not l10n_at_abf_frei_dienstzeit_monate and not l10n_at_abf_frei_erhaltene_abfertigungen and not l10n_at_abf_frei_gesetzlicher_anspruch">
<group>
<group>
<field name="l10n_at_abf_frei_basis_12" readonly="state != 'draft'"/>
<field name="l10n_at_abf_frei_dienstzeit_monate" readonly="state != 'draft'"/>
<field name="l10n_at_abf_frei_erhaltene_abfertigungen" readonly="state != 'draft'"/>
</group>
<group>
<field name="l10n_at_abf_frei_gesetzlicher_anspruch" readonly="state != 'draft'"/>
<field name="l10n_at_abf_frei_nachweis" readonly="state != 'draft'"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
<record id="hr_payslip_view_form_vergleich" model="ir.ui.view">
<field name="name">hr.payslip.form.vergleich</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Vergleich (§ 67 Abs 8 lit a)"
name="l10n_at_vergleich"
invisible="not l10n_at_vergleich_nachweis">
<group>
<field name="l10n_at_vergleich_nachweis"
readonly="state != 'draft'"/>
</group>
</page>
</xpath>
</field>
</record>
<record id="hr_payslip_view_form_pram_end" model="ir.ui.view">
<field name="name">hr.payslip.form.pram.end</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Prämie bei Beendigung (§ 16 AngG)"
name="l10n_at_pram_end"
invisible="not l10n_at_pram_nachweis">
<group>
<field name="l10n_at_pram_nachweis"
readonly="state != 'draft'"/>
</group>
</page>
</xpath>
</field>
</record>
<record id="action_endabrechnung_wizard" model="ir.actions.act_window">
<field name="name">Endabrechnung (Beendigung)</field>
<field name="res_model">l10n.at.payroll.endabrechnung.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem id="menu_l10n_at_payroll_endabrechnung"
name="Endabrechnung (Beendigung)"
parent="hr_work_entry_enterprise.menu_hr_payroll_root"
action="action_endabrechnung_wizard" sequence="42"/>
</odoo>
@@ -1,3 +1,4 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import kv_katalog_import
from . import bv_endabrechnung
from . import bv_endabrechnung
from . import endabrechnung
@@ -0,0 +1,760 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP14-A: Endabrechnungs-Wizard — sammelt die offenen Posten der
Beendigungs-Abrechnung (Urlaubsersatzleistung, Abgangsentschädigung,
Zeitguthaben/-schulden, offene Vorschüsse) und legt den
Endabrechnungs-Lauf mit vorbefüllten Eingaben an. Reiner
Sammel-/Anlageprozess; die BV-Anwartschaft läuft über den eigenen
BV-Wizard (GP5), die Pfändung über die AP11-Maschine.
AP15-C: Vergleichssumme (§ 67 Abs 8 lit a) — Rest (Fünftelregelung)
und BV-Anwartschafts-Teil (bis 7.500 € mit 6 %)."""
from datetime import timedelta
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class L10nAtEndabrechnungWizard(models.TransientModel):
_name = 'l10n.at.payroll.endabrechnung.wizard'
_description = 'Endabrechnung (Beendigung des Dienstverhältnisses)'
employee_id = fields.Many2one(
'hr.employee', string='Dienstnehmer:in', required=True)
austrittsdatum = fields.Date(
string='Austritt (Ende des Arbeitsverhältnisses)', required=True)
departure_reason_id = fields.Many2one(
'hr.departure.reason', string='Abgangsgrund', required=True,
domain="['|', ('country_id', '=', False), ('country_id.code', '=', 'AT')]",
help='Odoo-Abgangsgrund des Beschäftigtendatensatzes; die '
'Abfertigungsberechtigung wird zusätzlich ausdrücklich bestätigt.')
uel_tage = fields.Float(
string='Offene Urlaubstage (Arbeitstage)',
help='Resturlaub früherer Urlaubsjahre zur Gänze plus aliquoter '
'Anspruch des laufenden Urlaubsjahres abzüglich verbrauchter '
'Tage, ohne Rundung (§ 10 UrlG, lb-url-16). Für '
'unberechtigten vorzeitigen Austritt sind die Tage der 5. '
'und 6. Urlaubswoche des laufenden Jahres herauszurechnen.')
abgang_betrag = fields.Monetary(
string='Abgangsentschädigung (Brutto, § 67 Abs 8 lit b EStG)',
currency_field='currency_id',
help='Entschädigung für den Verzicht auf die Arbeitsleistung '
'während der (fiktiven) Kündigungsfrist — LSt: Fünftelregelung; '
'SV: Umlegung auf den Kündigungsfrist-Zeitraum (§ 11 Abs 2 '
'ASVG); voll lohnnebenkostenpflichtig.')
abgang_ffrist_tage = fields.Float(
string='Kündigungsfrist (Kalendertage)',
help='Kalendertage der (fiktiven) Kündigungsfrist, auf die die '
'pauschalierte Abgangsentschädigung sv-rechtlich umzulegen '
'ist (§ 11 Abs 2 ASVG).')
zeit_guthaben_stunden = fields.Float(
string='Zeitguthaben an Normalarbeitszeit (Stunden)',
help='Offenes Guthaben an Normalarbeitszeit aus durchrechenbarem '
'Arbeitszeitmodell — Abgeltung mit 50 % Zuschlag (§ 19e '
'Abs 2 AZG); bei unberechtigtem vorzeitigem Austritt kein '
'Zuschlag.')
zeit_schulden_stunden = fields.Float(
string='Zeitschulden (Stunden)',
help='Offene Zeitschulden (negative Zeitguthaben), abgerechnet '
'mit der aktuellen Normalstunde (lb-end-08).')
vorschuss_saldo = fields.Monetary(
string='Offener Vorschuss-/Darlehenssaldo',
currency_field='currency_id',
help='Bei Beendigung zur Gänze fälliger, noch offener '
'Vorschusssaldo (lb-end-06) — Rückverrechnung vom Netto '
'nach SV und Lohnsteuer, ohne Abgabenberührung '
'(§ 293 Abs 3 EO).')
abf_alt_aktiv = fields.Boolean(string='Gesetzliche Abfertigung Alt')
abf_alt_anspruch_bestaetigt = fields.Boolean(
string='Anspruch und Nachweise geprüft',
help='Bestätigung, dass Alt-Anwartschaft, Beendigungsgrund, '
'Dienstzeiten und Bemessungsgrundlage geprüft wurden.')
abf_alt_anspruchsart = fields.Selection(
[('normal', 'Normalanspruch (§ 23 AngG)'),
('eltern', 'Elternaustritt (§ 23a Abs 3/4 AngG)'),
('tod', 'Tod (§ 23 Abs 6 AngG)'),
('pension', 'Pension/Invalidität (§ 23a Abs 1 AngG)'),
('eingefroren', 'Eingefrorener Altanspruch (§ 47 BMSVG)'),
('manuell', 'Sonstiger nachgewiesener Anspruch')],
string='Anspruchsart', default='normal')
abf_alt_dienstzeit_monate = fields.Integer(
string='Nachgewiesene Abfertigungsdienstzeit (Monate)')
abf_alt_monatsentgelt = fields.Monetary(
string='Maßgebliches Monatsentgelt', currency_field='currency_id',
help='Bestätigte arbeitsrechtliche Bemessungsgrundlage: letzter '
'Monat einschließlich regelmäßiger Bezugsteile, Sachbezüge '
'und aliquoter Sonderzahlungen.')
abf_alt_laufender_arbeitslohn = fields.Monetary(
string='Laufender Monatsarbeitslohn (§ 67 Abs 3)',
currency_field='currency_id',
help='Laufender Arbeitslohn für den steuerlichen Vervielfacher; '
'aliquote Sonderzahlungen gehören hier nicht dazu.')
abf_alt_monatslohnsteuer = fields.Monetary(
string='Tarif-LSt des laufenden Monats', currency_field='currency_id',
help='Die auf den maßgeblichen laufenden Monatsarbeitslohn '
'entfallende tarifmäßige Lohnsteuer nach den persönlichen '
'Verhältnissen. Bei steuerfreiem Monatslohn ausdrücklich 0 '
'bestätigen.')
abf_alt_hochrechnung_vorschau = fields.Monetary(
string='§ 23 Abs 8 AngG — Hochrechnung Vollzeit (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau',
help='Endet das DV während einer Teilzeitbeschäftigung nach '
'MSchG/VKG (z. B. Elternteilzeit), ist die frühere '
'Normalarbeitszeit zugrunde zu legen (§ 23 Abs 8 AngG; für '
'Arbeitnehmerkündigung § 23a Abs 4a — 5-Jahres-Ø ohne '
'Karenz, manuell einzugeben). Vorschlag: Monatsentgelt ÷ '
'aktuelles work_time_rate; die Übernahme bleibt '
'bestätigt (bei UEL-Basen gilt § 10 Abs 4 UrlG — '
'überwiegende Arbeitszeit des Urlaubsjahres).')
abf_alt_mehrfach = fields.Float(
string='Bestätigter Anspruchsfaktor',
help='§-23-Staffel, gegebenenfalls halbiert/gedeckelt oder als '
'eingefrorener beziehungsweise nachgewiesener Faktor.')
abf_alt_nachweis = fields.Text(
string='Nachweis/Begründung',
help='Quelle der Dienstzeiten, Anspruchsprüfung, Alt-/Neu-Status '
'und allfällige manuelle Abweichung dokumentieren.')
abf_frei_aktiv = fields.Boolean(
string='Freiwillige Abfertigung (§ 67 Abs 6)')
abf_frei_anspruch_bestaetigt = fields.Boolean(
string='Prüfung und Nachweise bestätigt',
help='Bestätigung, dass es sich um eine Beendigungsleistung ohne '
'schädliche Anspruchsumwandlung handelt (KE/UE/SZ/Zeitguthaben '
'müssen getrennt abrechnet werden — GPLB-Risiko, lb-end-15), '
'dass die (Vor-)Dienstzeiten lückenlos zum Lohnkonto '
'(§ 76 EStG) nachgewiesen sind und erhaltene Abfertigungen '
'angegeben wurden.')
abf_frei_betrag = fields.Monetary(
string='Bruttobetrag', currency_field='currency_id')
abf_frei_basis_12 = fields.Monetary(
string='Laufende Bezüge letzte 12 Monate',
currency_field='currency_id',
help='Basis der Viertel-/Zwölftelregelung: alle steuerbaren '
'Bezugsteile (auch steuerfreie Zuschläge, Sachbezüge), '
'ohne Sonderzahlungen und ohne §-26-Z-4-Reisevergütungen; '
'wird aus den letzten zwölf validierten Läufen vorgeschlagen '
'und ist bestätigbar (lb-end-13).')
abf_frei_dienstzeit_monate = fields.Integer(
string='Nachgewiesene Dienstzeit (Monate)')
abf_frei_erhaltene_abfertigungen = fields.Monetary(
string='Bereits erhaltene Abfertigungen', currency_field='currency_id',
help='In den nachgewiesenen Dienstzeiten erhaltene Abfertigungen '
'(§ 67 Abs 3 oder Abs 6 EStG) — Kürzung nach Z 3.')
abf_frei_gesetzlicher_anspruch = fields.Monetary(
string='Bestehender gesetzlicher Anspruch',
currency_field='currency_id',
help='Anspruch auf eine gesetzliche Abfertigung am aktuellen '
'Dienstverhältnis-Ende (Z 3); bei aktiver Alt-Abfertigung '
'automatisch aus dem Alt-Anspruch vorgeschlagen.')
abf_frei_nachweis = fields.Text(
string='Nachweis/Begründung',
help='Vordienstzeiten-Nachweis (Lohnkonto § 76 EStG), erhaltene '
'Abfertigungen, Basis-Abweichungen und Anspruchsgrundlage '
'dokumentieren.')
vergleich_aktiv = fields.Boolean(
string='Vergleich (§ 67 Abs 8 lit a)',
help='Auf gerichtlichen oder außergerichtlichen Vergleichen '
'beruhende Vergleichssummen sowie Bereinigungen/Nachzahlungen '
'aus Urteilen/Bescheiden und Zahlungen bei '
'Kündigungsanfechtung (lb-end-21). Erkennbare '
'Abfertigungsanteile werden getrennt über die Abschnitte '
'Abfertigung Alt (§ 67 Abs 3) bzw. freiwillige Abfertigung '
'(§ 67 Abs 6) erfasst; Pensionsabfindungen (lit e) und '
'Sozialplan-Zahlungen (lit f) gehören nicht hierher.')
vergleich_rest_betrag = fields.Monetary(
string='Vergleichssumme — Rest (Fünftelregelung)',
currency_field='currency_id',
help='Nach Abzug der §-62-Beiträge ist ein Fünftel steuerfrei '
'(Deckel 1/5 × 9 × monatliche HBG), 4/5 laufen tarifisch im '
'Zuflussmonat — ohne Jahressechstel-Effekt (§ 67 Abs 8 lit '
'a iVm Abs 10).')
vergleich_bv_betrag = fields.Monetary(
string='Vergleichssumme — BV-Anwartschafts-Teil',
currency_field='currency_id',
help='Anteil für Zeiträume mit BV-Kassen-Anwartschaft: bis zum '
'Deckel (2026: 7 500 €) mit 6 %, der übersteigende Teil '
'fällt in die Fünftelregelung zurück. Der Alt-/Neu-Übertritt '
'steuert die Anwendung (lb-end-21: eingefrorene Zeiträume '
'kein 6 %-Teil).')
vergleich_bv_anwartschaft_bestaetigt = fields.Boolean(
string='BV-Anwartschaft für die betroffenen Zeiträume',
help='Voraussetzung des 6-%-Teils: die Vergleichssumme wird für '
'Zeiträume ausbezahlt, für die eine Anwartschaft gegenüber '
'einer BV-Kasse besteht (§ 67 Abs 8 lit a letzter Satz).')
vergleich_aufteilung_bestaetigt = fields.Boolean(
string='Aufgliederung und Strittigkeit bestätigt',
help='Bestätigung der Aufgliederung in der Vergleichsvereinbarung '
'(Praxistipp lb-end-21): Widmungen sind abgabenrechtlich nur '
'anerkannt, wenn die Ansprüche strittig waren (lb-end-22, '
'VwGH); beim Pauschalvergleich ist der Verhältnisfaktor '
'Forderungsbetrag : Vergleichssumme zu dokumentieren '
'(E-MVB 011-02-00-001).')
vergleich_nachweis = fields.Text(
string='Nachweis/Begründung',
help='Vergleichstext, strittige Ansprüche, erkennbare '
'Abfertigungsanteile, BV-Zeiträume und allfälliger '
'Verhältnisfaktor dokumentieren.')
pram_aktiv = fields.Boolean(
string='Prämie bei Beendigung (§ 16 AngG)',
help='Aliquote periodische Prämie/Sonderzahlung (Jahres-, '
'Umsatzprämie, Bonifikation, 15. Bezug), deren Anspruchs-'
'zeitraum bei der Beendigung noch nicht abgelaufen ist '
'(lb-end-18).')
pram_zahlungsart = fields.Selection(
[('mit_endabrechnung',
'Mit der Endabrechnung ausgezahlt (sonstiger Bezug, '
'Jahressechstel)'),
('spaeter_faellig',
'Später fällig (§ 67 Abs 10 — Tarif im Zahlungsmonat, '
'ohne Sechstel; gesonderter Lohnzettel)')],
string='Zahlungs-/Fälligkeitsart', default='mit_endabrechnung',
help='Wird die Prämie erst zum im Vorhinein vereinbarten '
'Fälligkeitszeitpunkt fällig, weil ihre Höhe erst nach '
'Ablauf der Anspruchsperiode ermittelbar ist (z. B. '
'Bilanzprämie), liegt keine Nachzahlung vor und läuft die '
'Besteuerung über § 67 Abs 10 (lb-end-18).')
pram_anspruchszeitraum_monate = fields.Integer(
string='Anspruchszeitraum (Monate)', default=12,
help='Dienstperiode, für die die Prämie gewährt wird — z. B. '
'Kalenderjahr = 12 Monate (§ 16 AngG).')
pram_dienstzeit_monate = fields.Integer(
string='Zurückgelegte Dienstzeit im Anspruchszeitraum (Monate)',
help='Grundlage der §-16-Aliquot-Vorschau; der tatsächliche '
'Betrag folgt der KV-/Vertragsvereinbarung und bleibt '
'bestätigbar.')
pram_voller_betrag = fields.Monetary(
string='Voller Prämien-Betrag (vor Aliquotierung)',
currency_field='currency_id',
help='Betrag für die gesamte Anspruchsperiode — Basis der '
'§-16-Aliquot-Vorschau.')
pram_betrag = fields.Monetary(
string='Zu zahlender (aliquote) Brutto-Betrag',
currency_field='currency_id')
pram_beitragsmonat = fields.Date(
string='SV-Beitragsmonat (Rollung ins Austrittsjahr)',
help='Nur bei späterer Fälligkeit: Beitragsmonat, dem die '
'Prämie sv-rechtlich zuzuordnen ist — der Zeitraum, in dem '
'die Leistungen erbracht wurden (E-MVB 044-01-00-006). '
'Die mBGM-Storno-/Neuübermittlung erfolgt im GP7-Track.')
pram_leistung_bestaetigt = fields.Boolean(
string='Leistungs-/Anspruchsgrundlage bestätigt',
help='Bestätigung, dass die Prämie nicht an eine noch nicht '
'erbrachte spezifische Leistung gebunden ist (z. B. '
'Bilanzgeld — kein aliquoter Anspruch ohne Tätigkeit) und '
'allfällige leistungsabhängige Verlustklauseln (nur '
'Arbeiter, wirksam nur bei schuldhaftem Beendigungsgrund) '
'geprüft sind. Für Angestellte gebührt die aliquote Prämie '
'unabhängig von der Art der Beendigung (§ 16 AngG).')
pram_nachweis = fields.Text(
string='Nachweis/Begründung',
help='KV-/Vertragsvereinbarung, Anspruchszeitraum, '
'Aliquotierung, Fälligkeitszeitpunkt und '
'Leistungsverknüpfung dokumentieren.')
currency_id = fields.Many2one(
'res.currency', default=lambda self: self.env.company.currency_id)
uel_lfd_vorschau = fields.Monetary(
string='UEL laufender Anteil (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau')
uel_sz_vorschau = fields.Monetary(
string='UEL Sonderzahlungsanteil (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau')
sv_tage_vorschau = fields.Integer(
string='SV-Verlängerungstage (§ 11 Abs 2)',
compute='_compute_vorschau')
abf_alt_betrag_vorschau = fields.Monetary(
string='Abfertigung Alt brutto', currency_field='currency_id',
compute='_compute_vorschau')
abf_alt_steuer_vervielfachung_vorschau = fields.Monetary(
string='LSt Vervielfachungsmethode', currency_field='currency_id',
compute='_compute_vorschau')
abf_alt_steuer_6_vorschau = fields.Monetary(
string='LSt 6 %', currency_field='currency_id',
compute='_compute_vorschau')
abf_alt_lohnsteuer_vorschau = fields.Monetary(
string='Angewendete günstigere LSt', currency_field='currency_id',
compute='_compute_vorschau')
abf_alt_netto_vorschau = fields.Monetary(
string='Abfertigung Alt netto', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_z1_vorschau = fields.Monetary(
string='Z 1 Viertelregelung (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_z2_vorschau = fields.Monetary(
string='Z 2 Zwölftelregelung (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_kuerzung_vorschau = fields.Monetary(
string='Z 3 Kürzung (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_beguenstigt_vorschau = fields.Monetary(
string='Begünstigter Teil 6 % (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_ueberhang_vorschau = fields.Monetary(
string='Überhang zum Tarif (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_lst_vorschau = fields.Monetary(
string='LSt 6 % (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
abf_frei_netto_vorschau = fields.Monetary(
string='Begünstigter Teil netto (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau')
vergleich_fuenftel_frei_vorschau = fields.Monetary(
string='Steuerfreies Fünftel (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
vergleich_tarif_basis_vorschau = fields.Monetary(
string='Fünftel-Bezüge tarifischer Teil (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau')
vergleich_bv_lst_vorschau = fields.Monetary(
string='LSt 6 % BV-Teil (Vorschau)', currency_field='currency_id',
compute='_compute_vorschau')
pram_aliquot_vorschau = fields.Monetary(
string='§-16-Aliquote Prämie (Vorschau)',
currency_field='currency_id', compute='_compute_vorschau')
@api.onchange('employee_id')
def _onchange_employee(self):
for wizard in self:
if not wizard.employee_id:
continue
version = wizard.employee_id.version_id
wizard.austrittsdatum = (
version.contract_date_end or fields.Date.today())
wizard.departure_reason_id = version.departure_reason_id
wizard._at_abf_alt_vorschlag_setzen()
wizard._at_abf_frei_vorschlag_setzen()
@api.onchange('pram_aktiv', 'pram_voller_betrag',
'pram_dienstzeit_monate', 'pram_anspruchszeitraum_monate')
def _onchange_pram(self):
for wizard in self:
if not wizard.pram_aktiv:
continue
aliquote = wizard._at_pram_aliquot()
if aliquote and not wizard.pram_betrag:
wizard.pram_betrag = aliquote
def _at_pram_aliquot(self):
"""§ 16 AngG (Originalwortlaut): Betrag, der dem Verhältnis
zwischen der Dienstperiode des Anspruchs und der zurückgelegten
Dienstzeit entspricht."""
self.ensure_one()
if (not self.pram_anspruchszeitraum_monate
or self.pram_anspruchszeitraum_monate < 0
or self.pram_dienstzeit_monate < 0
or not self.pram_voller_betrag):
return 0.0
return (self.pram_voller_betrag
* min(self.pram_dienstzeit_monate,
self.pram_anspruchszeitraum_monate)
/ self.pram_anspruchszeitraum_monate)
@api.onchange('austrittsdatum', 'abf_alt_anspruchsart',
'abf_alt_dienstzeit_monate', 'abf_alt_aktiv',
'abf_alt_monatsentgelt', 'abf_alt_mehrfach',
'abf_frei_aktiv', 'abf_frei_dienstzeit_monate')
def _onchange_abf_alt(self):
for wizard in self:
wizard._at_abf_alt_vorschlag_setzen()
wizard._at_abf_frei_vorschlag_setzen()
def _at_abf_alt_vorschlag_setzen(self):
self.ensure_one()
if not self.employee_id or not self.austrittsdatum:
return
version = self.employee_id.version_id
start = version.contract_date_start
if start and not self.abf_alt_dienstzeit_monate:
dauer = relativedelta(
self.austrittsdatum + timedelta(days=1), start)
self.abf_alt_dienstzeit_monate = dauer.years * 12 + dauer.months
slip = self._vorschau_payslip()
if not self.abf_alt_laufender_arbeitslohn:
self.abf_alt_laufender_arbeitslohn = slip._at_kv_gehalt_basis()
if not self.abf_alt_monatsentgelt:
self.abf_alt_monatsentgelt = (
self.abf_alt_laufender_arbeitslohn
+ 2.0 * slip._at_sz_basis(self.austrittsdatum) / 12.0)
vorgeschlagen = slip._at_abf_alt_mehrfach_vorschlag(
self.abf_alt_dienstzeit_monate, self.abf_alt_anspruchsart)
if vorgeschlagen or not self.abf_alt_mehrfach:
self.abf_alt_mehrfach = vorgeschlagen
def _at_abf_frei_vorschlag_setzen(self):
self.ensure_one()
if not self.employee_id or not self.austrittsdatum:
return
slip = self._vorschau_payslip()
if self.abf_frei_aktiv and not self.abf_frei_basis_12:
self.abf_frei_basis_12 = slip._at_bezuege_12_monate()
if (self.abf_frei_aktiv and self.abf_alt_aktiv
and not self.abf_frei_gesetzlicher_anspruch):
self.abf_frei_gesetzlicher_anspruch = (
self.abf_alt_monatsentgelt * self.abf_alt_mehrfach)
@api.depends('employee_id', 'austrittsdatum', 'uel_tage',
'abf_alt_aktiv', 'abf_alt_monatsentgelt',
'abf_alt_laufender_arbeitslohn', 'abf_alt_monatslohnsteuer',
'abf_alt_mehrfach',
'abf_alt_dienstzeit_monate', 'abf_alt_anspruchsart',
'abf_frei_aktiv', 'abf_frei_betrag', 'abf_frei_basis_12',
'abf_frei_dienstzeit_monate',
'abf_frei_erhaltene_abfertigungen',
'abf_frei_gesetzlicher_anspruch',
'vergleich_aktiv', 'vergleich_rest_betrag',
'vergleich_bv_betrag',
'pram_aktiv', 'pram_voller_betrag',
'pram_dienstzeit_monate',
'pram_anspruchszeitraum_monate')
def _compute_vorschau(self):
for wizard in self:
wizard.uel_lfd_vorschau = 0.0
wizard.uel_sz_vorschau = 0.0
wizard.sv_tage_vorschau = 0
wizard.abf_alt_betrag_vorschau = 0.0
wizard.abf_alt_steuer_vervielfachung_vorschau = 0.0
wizard.abf_alt_steuer_6_vorschau = 0.0
wizard.abf_alt_lohnsteuer_vorschau = 0.0
wizard.abf_alt_netto_vorschau = 0.0
wizard.abf_alt_hochrechnung_vorschau = 0.0
wizard.abf_frei_z1_vorschau = 0.0
wizard.abf_frei_z2_vorschau = 0.0
wizard.abf_frei_kuerzung_vorschau = 0.0
wizard.abf_frei_beguenstigt_vorschau = 0.0
wizard.abf_frei_ueberhang_vorschau = 0.0
wizard.abf_frei_lst_vorschau = 0.0
wizard.abf_frei_netto_vorschau = 0.0
wizard.vergleich_fuenftel_frei_vorschau = 0.0
wizard.vergleich_tarif_basis_vorschau = 0.0
wizard.vergleich_bv_lst_vorschau = 0.0
wizard.pram_aliquot_vorschau = 0.0
if not wizard.employee_id or not wizard.austrittsdatum:
continue
slip = wizard._vorschau_payslip()
wizard.uel_lfd_vorschau = slip._at_uel_lfd()
wizard.uel_sz_vorschau = slip._at_uel_sz()
wizard.sv_tage_vorschau = slip._at_end_sv_tage(
wizard.uel_tage)
if wizard.abf_alt_aktiv:
betrag = slip._at_abf_alt_betrag()
steuer_vervielfachung = \
slip._at_abf_alt_steuer_vervielfachung()
steuer_6 = slip._at_abf_alt_steuer_6()
steuer = min(steuer_vervielfachung, steuer_6)
wizard.abf_alt_betrag_vorschau = betrag
wizard.abf_alt_steuer_vervielfachung_vorschau = \
steuer_vervielfachung
wizard.abf_alt_steuer_6_vorschau = steuer_6
wizard.abf_alt_lohnsteuer_vorschau = steuer
wizard.abf_alt_netto_vorschau = betrag - steuer
rate = wizard.employee_id.version_id.work_time_rate
if rate and rate < 1.0 and wizard.abf_alt_monatsentgelt:
# § 23 Abs 8 AngG: frühere Normalarbeitszeit —
# Hochrechnungs-Vorschlag, bestätigte Übernahme.
wizard.abf_alt_hochrechnung_vorschau = \
wizard.abf_alt_monatsentgelt / rate
if wizard.abf_frei_aktiv:
split = slip._at_abf_frei_split()
satz = float(slip._l10n_at_param(
'at_endabrechnung')['abfertigung_steuersatz'])
wizard.abf_frei_z1_vorschau = split['z1']
wizard.abf_frei_z2_vorschau = split['z2']
wizard.abf_frei_kuerzung_vorschau = split['kuerzung']
wizard.abf_frei_beguenstigt_vorschau = split['beguenstigt']
wizard.abf_frei_ueberhang_vorschau = split['ueberhang']
wizard.abf_frei_lst_vorschau = \
split['beguenstigt'] * satz / 100.0
wizard.abf_frei_netto_vorschau = \
split['beguenstigt'] - wizard.abf_frei_lst_vorschau
if wizard.vergleich_aktiv:
# Der tarifische Fünftel-Teil läuft über die laufende
# Bemessung (LST_LFD); die Vorschau zeigt die Pfade
# getrennt (Fünftel-Pool inkl. ABGANG, falls erfasst).
wizard.vergleich_fuenftel_frei_vorschau = \
slip._at_fuenftel_frei_betr()
wizard.vergleich_tarif_basis_vorschau = \
slip._at_fuenftel_tarif_basis()
wizard.vergleich_bv_lst_vorschau = \
slip._at_vergleich_bv_lst_6()
wizard.pram_aliquot_vorschau = wizard._at_pram_aliquot()
def _vorschau_payslip(self):
"""Flüchtiger Payslip-Kontext für die Vorschau-Berechnung (kein
Speichern): trägt Austrittsmonat, Struktur und die Eingaben."""
self.ensure_one()
erster = self.austrittsdatum.replace(day=1)
letzter = (erster + timedelta(days=32)).replace(day=1) \
- timedelta(days=1)
struct = self.employee_id.version_id.structure_id
if not struct:
struct = self.env.ref(
'l10n_at_hr_payroll_private.structure_at_privat')
slip = self.env['hr.payslip'].new({
'employee_id': self.employee_id.id,
'struct_id': struct.id,
'date_from': erster,
'date_to': letzter,
'l10n_at_abf_alt_anspruchsart': self.abf_alt_anspruchsart,
'l10n_at_abf_alt_dienstzeit_monate':
self.abf_alt_dienstzeit_monate,
'l10n_at_abf_alt_monatsentgelt': self.abf_alt_monatsentgelt,
'l10n_at_abf_alt_laufender_arbeitslohn':
self.abf_alt_laufender_arbeitslohn,
'l10n_at_abf_alt_monatslohnsteuer':
self.abf_alt_monatslohnsteuer,
'l10n_at_abf_alt_mehrfach': self.abf_alt_mehrfach,
'l10n_at_abf_alt_nachweis': self.abf_alt_nachweis,
'l10n_at_abf_frei_basis_12': self.abf_frei_basis_12,
'l10n_at_abf_frei_dienstzeit_monate':
self.abf_frei_dienstzeit_monate,
'l10n_at_abf_frei_erhaltene_abfertigungen':
self.abf_frei_erhaltene_abfertigungen,
'l10n_at_abf_frei_gesetzlicher_anspruch':
self.abf_frei_gesetzlicher_anspruch,
'l10n_at_abf_frei_nachweis': self.abf_frei_nachweis,
'l10n_at_vergleich_nachweis': self.vergleich_nachweis,
'l10n_at_pram_nachweis': self.pram_nachweis,
})
eingaben = [
('ATP_UEL_TAGE', self.uel_tage),
('ATP_ABF_ALT', self.abf_alt_monatsentgelt
* self.abf_alt_mehrfach if self.abf_alt_aktiv else 0.0),
('ATP_ABF_FREI', self.abf_frei_betrag
if self.abf_frei_aktiv else 0.0),
('ATP_VERGLEICH', self.vergleich_rest_betrag
if self.vergleich_aktiv else 0.0),
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
if self.vergleich_aktiv else 0.0),
('ATP_PRAM_END', self.pram_betrag
if self.pram_aktiv
and self.pram_zahlungsart == 'mit_endabrechnung' else 0.0),
('ATP_PRAM_END_TARIF', self.pram_betrag
if self.pram_aktiv
and self.pram_zahlungsart == 'spaeter_faellig' else 0.0),
]
slip.input_line_ids = [
(0, 0, {
'input_type_id': self.env['hr.payslip.input.type']
.search([('code', '=', code)], limit=1).id,
'amount': betrag,
})
for code, betrag in eingaben if betrag
]
return slip
def _eingaben(self):
self.ensure_one()
return [
('ATP_UEL_TAGE', self.uel_tage),
('ATP_ABGANG', self.abgang_betrag),
('ATP_ABGANG_FFRIST_TAGE', self.abgang_ffrist_tage),
('ATP_ZEIT_GUTHABEN', self.zeit_guthaben_stunden),
('ATP_ZEIT_SCHULDEN', self.zeit_schulden_stunden),
('ATP_ABRECHNUNG_VORSCHUSS', self.vorschuss_saldo),
('ATP_ABF_ALT', self.abf_alt_monatsentgelt
* self.abf_alt_mehrfach if self.abf_alt_aktiv else 0.0),
('ATP_ABF_FREI', self.abf_frei_betrag
if self.abf_frei_aktiv else 0.0),
('ATP_VERGLEICH', self.vergleich_rest_betrag
if self.vergleich_aktiv else 0.0),
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
if self.vergleich_aktiv else 0.0),
('ATP_PRAM_END', self.pram_betrag
if self.pram_aktiv
and self.pram_zahlungsart == 'mit_endabrechnung' else 0.0),
('ATP_PRAM_END_TARIF', self.pram_betrag
if self.pram_aktiv
and self.pram_zahlungsart == 'spaeter_faellig' else 0.0),
]
def _abf_alt_validieren(self):
self.ensure_one()
if not self.abf_alt_aktiv:
return
if not self.abf_alt_anspruch_bestaetigt:
raise UserError(_('Bitte Anspruch und Nachweise der '
'Abfertigung Alt bestätigen.'))
if self.employee_id.version_id.l10n_at_abfertigung_neu \
and self.abf_alt_anspruchsart != 'eingefroren':
raise UserError(_(
'Das Dienstverhältnis ist als Abfertigung Neu markiert. '
'Eine Alt-Abfertigung ist nur als nachgewiesener '
'eingefrorener Anspruch zulässig.'))
if self.abf_alt_anspruchsart == 'eltern' \
and self.abf_alt_dienstzeit_monate < 60:
raise UserError(_(
'Ein Elternaustritt nach § 23a Abs. 3/4 AngG setzt ein '
'ununterbrochenes Dienstverhältnis von fünf Jahren voraus.'))
if (self.abf_alt_dienstzeit_monate <= 0
or self.abf_alt_monatsentgelt <= 0
or self.abf_alt_laufender_arbeitslohn <= 0
or self.abf_alt_monatslohnsteuer < 0
or self.abf_alt_mehrfach <= 0):
raise UserError(_('Dienstzeit, Monatsentgelt, laufender '
'Arbeitslohn und Anspruchsfaktor müssen '
'größer als null sein; die Tarif-LSt darf '
'nicht negativ sein.'))
agrd = self.departure_reason_id.l10n_at_agrd
if agrd == '02' and self.abf_alt_anspruchsart not in (
'eltern', 'pension', 'manuell'):
raise UserError(_(
'Eine gewöhnliche Arbeitnehmerkündigung begründet keinen '
'Anspruch nach § 23 AngG. Bitte einen §-23a-Sonderfall '
'wählen oder den Anspruch manuell nachweisen.'))
if agrd == '06' and self.abf_alt_anspruchsart != 'manuell':
raise UserError(_(
'Der Abgangsgrund „Fristlose Entlassung“ unterscheidet '
'nicht zwischen verschuldeter und unverschuldeter '
'Entlassung. Bitte den Anspruch manuell bestätigen und '
'begründen.'))
def _abf_frei_validieren(self):
self.ensure_one()
if not self.abf_frei_aktiv:
return
if not self.abf_frei_anspruch_bestaetigt:
raise UserError(_('Bitte Prüfung und Nachweise der freiwilligen '
'Abfertigung bestätigen.'))
if self.abf_frei_betrag <= 0:
raise UserError(_('Der Bruttobetrag der freiwilligen '
'Abfertigung muss größer als null sein.'))
if (self.abf_frei_basis_12 < 0
or self.abf_frei_erhaltene_abfertigungen < 0
or self.abf_frei_gesetzlicher_anspruch < 0
or self.abf_frei_dienstzeit_monate < 0):
raise UserError(_('12-Monats-Basis, erhaltene Abfertigungen, '
'gesetzlicher Anspruch und Dienstzeit dürfen '
'nicht negativ sein.'))
def _vergleich_validieren(self):
self.ensure_one()
if not self.vergleich_aktiv:
return
if not self.vergleich_aufteilung_bestaetigt:
raise UserError(_('Bitte die Aufgliederung der Vergleichs-'
'summe und die Strittigkeit der Ansprüche '
'bestätigen (lb-end-21/22).'))
if self.vergleich_rest_betrag < 0 or self.vergleich_bv_betrag < 0:
raise UserError(_('Vergleichsbeträge dürfen nicht negativ '
'sein.'))
if not self.vergleich_rest_betrag and not self.vergleich_bv_betrag:
raise UserError(_('Bitte den Rest der Vergleichssumme oder '
'den BV-Anwartschafts-Teil erfassen; '
'erkennbare Abfertigungsanteile gehören in '
'die Abfertigungs-Abschnitte.'))
slip = self._vorschau_payslip()
deckel = float(slip._l10n_at_param('at_lst_67_abs8_vergleich_bv'))
if self.vergleich_bv_betrag > deckel:
raise UserError(_(
'Der BV-Anwartschafts-Teil ist mit %.2f € gedeckelt '
'(§ 67 Abs 8 lit a letzter Satz); den übersteigenden '
'Betrag als Rest (Fünftelregelung) erfassen.') % deckel)
if self.vergleich_bv_betrag > 0 \
and not self.vergleich_bv_anwartschaft_bestaetigt:
raise UserError(_('Der 6-%-Teil setzt eine bestätigte '
'BV-Anwartschaft für die betroffenen '
'Zeiträume voraus (§ 67 Abs 8 lit a letzter '
'Satz).'))
def _pram_validieren(self):
self.ensure_one()
if not self.pram_aktiv:
return
if not self.pram_leistung_bestaetigt:
raise UserError(_('Bitte die Leistungs-/Anspruchsgrundlage '
'der Prämie bestätigen (lb-end-18).'))
if self.pram_betrag <= 0:
raise UserError(_('Der zu zahlende Prämien-Betrag muss '
'größer als null sein.'))
if (self.pram_anspruchszeitraum_monate < 0
or self.pram_dienstzeit_monate < 0
or self.pram_voller_betrag < 0):
raise UserError(_('Anspruchszeitraum, Dienstzeit und '
'voller Betrag dürfen nicht negativ '
'sein.'))
if (self.pram_anspruchszeitraum_monate
and self.pram_dienstzeit_monate
> self.pram_anspruchszeitraum_monate):
raise UserError(_('Die zurückgelegte Dienstzeit kann den '
'Anspruchszeitraum nicht übersteigen.'))
if (self.pram_zahlungsart == 'spaeter_faellig'
and not self.pram_beitragsmonat):
raise UserError(_('Bei späterer Fälligkeit ist der SV-'
'Beitragsmonat der Rollung ins '
'Austrittsjahr erforderlich '
'(E-MVB 044-01-00-006).'))
def action_payslip(self):
"""Endabrechnungs-Lauf im Austrittsmonat anlegen und die
gesammelten offenen Posten als Eingaben vorbefüllen."""
self.ensure_one()
self._abf_alt_validieren()
self._abf_frei_validieren()
self._vergleich_validieren()
self._pram_validieren()
erster = self.austrittsdatum.replace(day=1)
letzter = (erster + timedelta(days=32)).replace(day=1) \
- timedelta(days=1)
version = self.employee_id.version_id
version.write({
'contract_date_end': self.austrittsdatum,
'departure_reason_id': self.departure_reason_id.id,
})
struct = version.structure_id \
or self.env.ref('l10n_at_hr_payroll_private.structure_at_privat')
slip = self.env['hr.payslip'].create({
'name': _('Endabrechnung %s') % self.employee_id.name,
'employee_id': self.employee_id.id,
'struct_id': struct.id,
'date_from': erster,
'date_to': letzter,
'l10n_at_abf_alt_anspruchsart': self.abf_alt_anspruchsart
if self.abf_alt_aktiv else False,
'l10n_at_abf_alt_dienstzeit_monate':
self.abf_alt_dienstzeit_monate if self.abf_alt_aktiv else 0,
'l10n_at_abf_alt_monatsentgelt':
self.abf_alt_monatsentgelt if self.abf_alt_aktiv else 0.0,
'l10n_at_abf_alt_laufender_arbeitslohn':
self.abf_alt_laufender_arbeitslohn
if self.abf_alt_aktiv else 0.0,
'l10n_at_abf_alt_monatslohnsteuer':
self.abf_alt_monatslohnsteuer if self.abf_alt_aktiv else 0.0,
'l10n_at_abf_alt_mehrfach':
self.abf_alt_mehrfach if self.abf_alt_aktiv else 0.0,
'l10n_at_abf_alt_nachweis':
self.abf_alt_nachweis if self.abf_alt_aktiv else False,
'l10n_at_abf_frei_basis_12':
self.abf_frei_basis_12 if self.abf_frei_aktiv else 0.0,
'l10n_at_abf_frei_dienstzeit_monate':
self.abf_frei_dienstzeit_monate if self.abf_frei_aktiv else 0,
'l10n_at_abf_frei_erhaltene_abfertigungen':
self.abf_frei_erhaltene_abfertigungen
if self.abf_frei_aktiv else 0.0,
'l10n_at_abf_frei_gesetzlicher_anspruch':
self.abf_frei_gesetzlicher_anspruch
if self.abf_frei_aktiv else 0.0,
'l10n_at_abf_frei_nachweis':
self.abf_frei_nachweis if self.abf_frei_aktiv else False,
'l10n_at_vergleich_nachweis':
self.vergleich_nachweis if self.vergleich_aktiv else False,
'l10n_at_pram_nachweis':
self.pram_nachweis if self.pram_aktiv else False,
'l10n_at_pram_beitragsmonat': self.pram_beitragsmonat
if (self.pram_aktiv
and self.pram_zahlungsart == 'spaeter_faellig') else False,
})
typen = {code: self.env['hr.payslip.input.type'].search(
[('code', '=', code)], limit=1)
for code, _betrag in self._eingaben()}
self.env['hr.payslip.input'].create([{
'payslip_id': slip.id,
'input_type_id': typen[code].id,
'amount': betrag,
} for code, betrag in self._eingaben() if betrag])
slip.compute_sheet()
return {
'type': 'ir.actions.act_window',
'name': _('Endabrechnung'),
'res_model': 'hr.payslip',
'view_mode': 'form',
'res_id': slip.id,
}
@@ -0,0 +1,3 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import models
from . import tests
@@ -0,0 +1,33 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'AT Payroll: Dokumente aus Vorlagen',
'version': '19.0.1.0.0',
'category': 'Human Resources/Payroll',
'summary': 'Dokumentgenerierung aus Vorlagen mit hr-Stammdaten (eigene Texte)',
'description': """
Dokumente (Dienstvertrag, Kündigung, Bescheinigungen, ...) aus Vorlagen,
befüllt aus hr-Stammdaten und Wizard-Eingaben.
- Vorlagen enthalten ausschließlich eigenen Text; Struktur-Referenz und
Quell-Stand sind pro Vorlage dokumentiert (kb_ref/quell_stand).
- Platzhalter-Syntax des Standard-Inline-Renderers von mail.render.mixin:
{{ werte['key'] }}, {{ object.feld }}, {{ format_date(...) }}.
- PDF-Erzeugung über ir.actions.report (wkhtmltopdf); ohne PDF-Engine
wird das gerenderte HTML abgelegt.
""",
'author': 'odoo-at-payroll',
'website': 'https://example.com/odoo-at-payroll',
'license': 'LGPL-3',
'depends': ['hr', 'mail'],
'data': [
'security/ir.model.access.csv',
'security/security_rules.xml',
'data/vorlagen_pilot.xml',
'views/dokument_vorlage_views.xml',
'views/wizard_views.xml',
'report/report_dokument.xml',
],
'demo': [],
'installable': True,
'application': False,
}
@@ -0,0 +1,232 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- Pilot-Vorlagen: EIGENER Text, strukturiert nach den -->
<!-- Wissensbasis-Mustern (kb_ref = Herkunftsnachweis der -->
<!-- Struktur, nie lizenzierter Volltext). Rechtsstatus 'entwurf' -->
<!-- — rechtliche Prüfung vor Produktivsetzung erforderlich. -->
<!-- ============================================================ -->
<!-- ================= Dienstvertrag (Angestellte) ============== -->
<record id="vorlage_dienstvertrag_angestellte" model="l10n.at.payroll.dokument.vorlage">
<field name="name">Dienstvertrag (Angestellte)</field>
<field name="thema">dienstvertrag</field>
<field name="kb_ref">lb-bes-09</field>
<field name="quell_stand">2025-06</field>
<field name="rechtsstatus">entwurf</field>
<field name="beschreibung">
Rahmen-Dienstvertrag für Angestellte (privatrechtlich). Struktur nach dem
Lexis-Muster lb-bes-09 (Stand 2025-06), Text eigen formuliert.
Anzupassen je Mandant/KV: Einstufung, Entgelt, Überstundenregelung,
Kündigungsfristen; optionale Blöcke (Geheimhaltung, Konkurrenzklausel)
erscheinen nur, wenn befüllt. Vertragswerte (Fristen, Tage) sind
Platzhalter — keine Gesetz/KV-Werte im Template verankert.
</field>
<field name="inhalt_html"><![CDATA[
<div>
<p>{{ werte['firma'] }}<br/>{{ werte['firma_strasse'] }}<br/>{{ werte['firma_plz'] }} {{ werte['firma_ort'] }}</p>
<h2>Dienstvertrag</h2>
<p>zwischen {{ werte['firma'] }}, {{ werte['firma_strasse'] }}, {{ werte['firma_plz'] }} {{ werte['firma_ort'] }} — im Folgenden „der Dienstgeber“ — und {{ werte['mitarbeiter'] }}, {{ werte['mitarbeiter_strasse'] }}, {{ werte['mitarbeiter_plz'] }} {{ werte['mitarbeiter_ort'] }} — im Folgenden „der Dienstnehmer“.</p>
<h3>I. Tätigkeitsbereich</h3>
<p>1. Der Dienstnehmer wird ab {{ werte['ead'] }} als {{ werte['funktion'] }} angestellt. Übertragen werden ihm insbesondere folgende Tätigkeiten:<br/>{{ werte['taetigkeit'] }}</p>
<p>2. Der Dienstnehmer hat die übertragenen Tätigkeiten mit der Sorgfalt eines ordentlichen Dienstnehmers auszuüben; im Bedarfsfall sind auch verwandte Tätigkeiten nach Weisung des Dienstgebers zu verrichten.</p>
<h3>II. Dienstort</h3>
<p>Dienstort ist {{ werte['dienstort'] }}. Der Dienstnehmer verpflichtet sich, im Interesse des Dienstgebers auch außerhalb des Dienstortes vorübergehend tätig zu werden, wenn dies die Tätigkeit erfordert.</p>
<h3>III. Einstufung</h3>
<p>Die Einstufung erfolgt gemäß den anwendbaren kollektivvertraglichen Bestimmungen: {{ werte['einstufung'] }}.</p>
<h3>IV. Entgelt</h3>
<p>1. Für die geleisteten Dienste gebührt dem Dienstnehmer ein Monatsentgelt von EUR {{ werte['entgelt'] }} brutto, zahlbar monatlich nach Maßgabe der kollektivvertraglichen Bestimmungen ({{ werte['kv_verweis'] }}).</p>
<p>2. Sonderzahlungen gebühren gemäß den anwendbaren kollektivvertraglichen Bestimmungen; die Abrechnung erfolgt nach den jeweils geltenden lohnsteuerlichen Vorgaben.</p>
<h3>V. Arbeitszeit, Mehr- und Überstunden</h3>
<p>1. Die regelmäßige Dienstzeit beträgt {{ werte['arbeitszeit'] }} je Woche, verteilt auf fünf Arbeitstage von Montag bis Freitag. Die Lage der Tagesarbeitszeit wird mit dem Dienstgeber vereinbart.</p>
<p>2. Mehr- und Überstunden sind nach den Bestimmungen des Arbeitszeitgesetzes zu leisten; der Abgeltung liegen die anwendbaren kollektivvertraglichen Bestimmungen zugrunde.</p>
<h3>VI. Spesen</h3>
<p>Spesen im Zusammenhang mit der Dienstausübung werden nach den geltenden Regelungen des Dienstgebers abgerechnet.</p>
<h3>VII. Urlaub</h3>
<p>Der Dienstnehmer hat Anspruch auf bezahlten Urlaub im Ausmaß von {{ werte['urlaub_tage'] }} Arbeitstagen je Dienstjahr; im Übrigen gelten die Bestimmungen des Urlaubs- und Abfertigungsgesetzes.</p>
<h3>VIII. Entgeltfortzahlung</h3>
<p>Bei Dienstverhinderung gelten die gesetzlichen Bestimmungen über die Entgeltfortzahlung.</p>
<h3>IX. Dauer</h3>
<p>1. Das Dienstverhältnis beginnt am {{ werte['ead'] }} und wird auf unbestimmte Zeit geschlossen.</p>
<p>2. Das Dienstverhältnis kann von beiden Vertragsparteien unter Einhaltung der gesetzlichen bzw. kollektivvertraglich vereinbarten Kündigungsfristen ordentlich gekündigt werden; geltend ist die Frist {{ werte['kuendigung_frist'] }}.</p>
<div t-if="werte['geheimhaltung']">
<h3>X. Geheimhaltung</h3>
<p>{{ werte['geheimhaltung'] }}</p>
</div>
<div t-if="werte['konkurrenzklausel']">
<h3>XI. Nebentätigkeit/Konkurrenzklausel</h3>
<p>{{ werte['konkurrenzklausel'] }}</p>
</div>
<h3>XII. Schlussbestimmungen</h3>
<p>1. Abfertigungsansprüche richten sich nach den Bestimmungen des BMSVG.</p>
<p>2. Nebenabreden und Änderungen dieses Vertrages bedürfen der Schriftform; mündliche Nebenabreden bestehen nicht.</p>
<p>3. Sollte eine Bestimmung dieses Vertrages unwirksam sein, bleibt die Wirksamkeit der übrigen Bestimmungen unberührt; an deren Stelle tritt eine wirksame Bestimmung mit gleichem wirtschaftlichem Gehalt.</p>
<p>Ort, Datum: {{ werte['ort_datum'] }}<br/><br/>Dienstgeber: ________________________<br/><br/>Dienstnehmer: ______________________</p>
</div>
]]></field>
<field name="feld_ids" eval="[
Command.create({'sequence': 1, 'key': 'taetigkeit', 'bezeichnung': 'Tätigkeiten (mehrere Zeilen möglich)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 2, 'key': 'dienstort', 'bezeichnung': 'Dienstort', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 3, 'key': 'einstufung', 'bezeichnung': 'Einstufung (KV/Gruppe/Stufe)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 3, 'key': 'entgelt', 'bezeichnung': 'Monatsentgelt brutto (EUR)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 4, 'key': 'kv_verweis', 'bezeichnung': 'KV-Verweis (z. B. KV Angestellte, Ausgabe ...)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 5, 'key': 'arbeitszeit', 'bezeichnung': 'Wöchentliche Dienstzeit (z. B. 40 Stunden)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 6, 'key': 'urlaub_tage', 'bezeichnung': 'Urlaubstage je Dienstjahr', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 6, 'key': 'kuendigung_frist', 'bezeichnung': 'Kündigungsfrist', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 7, 'key': 'geheimhaltung', 'bezeichnung': 'Geheimhaltungsblock (leer = Block entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 8, 'key': 'konkurrenzklausel', 'bezeichnung': 'Nebentätigkeit/Konkurrenzklausel (leer = Block entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 9, 'key': 'ort_datum', 'bezeichnung': 'Ort, Datum', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma', 'bezeichnung': 'Firmenname', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 11, 'key': 'firma_strasse', 'bezeichnung': 'Firma: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 11, 'key': 'firma_plz', 'bezeichnung': 'Firma: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 12, 'key': 'firma_ort', 'bezeichnung': 'Firma: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 13, 'key': 'mitarbeiter', 'bezeichnung': 'Dienstnehmer:in (Name)', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 14, 'key': 'mitarbeiter_strasse', 'bezeichnung': 'Dienstnehmer:in: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 15, 'key': 'mitarbeiter_plz', 'bezeichnung': 'Dienstnehmer:in: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 16, 'key': 'mitarbeiter_ort', 'bezeichnung': 'Dienstnehmer:in: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 17, 'key': 'ead', 'bezeichnung': 'Dienstantritt (EAD)', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 18, 'key': 'funktion', 'bezeichnung': 'Funktion (Job)', 'quelle': 'auto', 'pflicht': False}),
]"/>
</record>
<!-- ================= Kündigung (Dienstgeber) ================== -->
<record id="vorlage_kuendigung_dienstgeber" model="l10n.at.payroll.dokument.vorlage">
<field name="name">Kündigung durch den Dienstgeber</field>
<field name="thema">beendigung</field>
<field name="kb_ref">lb-bnd-55</field>
<field name="quell_stand">2026-07</field>
<field name="rechtsstatus">entwurf</field>
<field name="beschreibung">
Ordentliche Kündigung durch den Dienstgeber (Rahmen). Struktur nach dem
Lexis-Muster lb-bnd-55 (Stand 2026-07). Betriebsrat-Verweis und
Resturlaubs-/Freistellungsblöcke sind optional (leer = entfällt);
Personalvertretungsfälle (Gemeinden) sind gesondert zu ergänzen.
</field>
<field name="inhalt_html"><![CDATA[
<div>
<p>{{ werte['firma'] }}<br/>{{ werte['firma_strasse'] }}<br/>{{ werte['firma_plz'] }} {{ werte['firma_ort'] }}</p>
<p>An {{ werte['anrede'] }} {{ werte['mitarbeiter'] }}<br/>{{ werte['mitarbeiter_strasse'] }}<br/>{{ werte['mitarbeiter_plz'] }} {{ werte['mitarbeiter_ort'] }}</p>
<h2>Kündigung des Dienstverhältnisses</h2>
<p>{{ werte['ort_datum'] }}</p>
<p>{{ werte['anrede'] }},</p>
<p>leider sehen wir uns gezwungen, das mit Ihnen bestehende Dienstverhältnis ordentlich, fristgerecht aufzukündigen. Es endet demnach am {{ werte['beendigungstermin'] }}.</p>
<p>Die Kündigung erfolgt unter Einhaltung der für Ihr Dienstverhältnis geltenden Kündigungsfrist von {{ werte['kuendigung_frist'] }}.</p>
<p t-if="werte['urlaub_rest']">Hinsichtlich Ihres bestehenden Resturlaubs bieten wir an, diesen in der Zeit von {{ werte['urlaub_rest'] }} zu verbrauchen.</p>
<p t-if="werte['freistellung']">Weiters teilen wir mit, dass wir Sie in der Zeit von {{ werte['freistellung'] }} bezahlt vom Dienst freistellen.</p>
<p>Um den Erhalt dieses Schreibens zu bestätigen, ersuchen wir Sie, die beiliegende Kopie zu unterfertigen und zurückzusenden.</p>
<p>{{ werte['firma'] }}<br/><br/>______________________<br/>Dienstgeber</p>
<p>Erhalten am: ____________<br/>Unterschrift Dienstnehmer:in: ______________________</p>
</div>
]]></field>
<field name="feld_ids" eval="[
Command.create({'sequence': 1, 'key': 'anrede', 'bezeichnung': 'Anrede (Herr/Frau/...)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 2, 'key': 'kuendigung_frist', 'bezeichnung': 'Kündigungsfrist', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 3, 'key': 'beendigungstermin', 'bezeichnung': 'Endtermin', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 4, 'key': 'urlaub_rest', 'bezeichnung': 'Resturlaub-Verbrauch (Zeitraum, leer = entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 5, 'key': 'freistellung', 'bezeichnung': 'Bezahlte Freistellung (Zeitraum, leer = entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 6, 'key': 'ort_datum', 'bezeichnung': 'Ort, Datum', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma', 'bezeichnung': 'Firmenname', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma_strasse', 'bezeichnung': 'Firma: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_plz', 'bezeichnung': 'Firma: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_ort', 'bezeichnung': 'Firma: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter', 'bezeichnung': 'Dienstnehmer:in (Name)', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_strasse', 'bezeichnung': 'Dienstnehmer:in: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_plz', 'bezeichnung': 'Dienstnehmer:in: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_ort', 'bezeichnung': 'Dienstnehmer:in: Ort', 'quelle': 'auto', 'pflicht': False}),
]"/>
</record>
<!-- ============ Einvernehmliche Auflösung ==================== -->
<record id="vorlage_einvernehmliche_aufloesung" model="l10n.at.payroll.dokument.vorlage">
<field name="name">Einvernehmliche Auflösung</field>
<field name="thema">beendigung</field>
<field name="kb_ref">lb-bnd-52, lb-bnd-62</field>
<field name="quell_stand">2026-06</field>
<field name="rechtsstatus">entwurf</field>
<field name="beschreibung">
Vereinbarung der einvernehmlichen Auflösung (Rahmen). Struktur nach dem
Lexis-Muster lb-bnd-62 (Stand 2026-06). Hinweis-Konvention des Musters:
Endtermin = letzter Arbeitstag, außer es wird Verbrauch von Zeitguthaben
oder Urlaub vereinbart; optionale Blöcke leer lassen = entfällt.
</field>
<field name="inhalt_html"><![CDATA[
<div>
<p>{{ werte['firma'] }}, {{ werte['firma_strasse'] }}, {{ werte['firma_plz'] }} {{ werte['firma_ort'] }} — im Folgenden „der Dienstgeber“ —</p>
<p>und</p>
<p>{{ werte['mitarbeiter'] }}, {{ werte['mitarbeiter_strasse'] }}, {{ werte['mitarbeiter_plz'] }} {{ werte['mitarbeiter_ort'] }} — im Folgenden „die Dienstnehmerin/der Dienstnehmer“ —</p>
<h2>Vereinbarung über die einvernehmliche Auflösung des Dienstverhältnisses</h2>
<p>Die Parteien lösen das seit {{ werte['seit'] }} bestehende Dienstverhältnis einvernehmlich zum {{ werte['beendigungstermin'] }} auf. Mit diesem Tag endet das Dienstverhältnis; dieser Tag ist auch der letzte Arbeitstag.</p>
<p t-if="werte['zeitguthaben']">Ein offenes Zeitguthaben von {{ werte['zeitguthaben'] }} wird in der Zeit von {{ werte['zeitguthaben_zeit'] }} verbraucht.</p>
<p t-if="werte['urlaub_rest']">Offener Urlaub im Ausmaß von {{ werte['urlaub_rest'] }} wird in der Zeit von {{ werte['urlaub_zeit'] }} aufgebraucht.</p>
<p t-if="werte['freistellung']">Die Dienstnehmerin/der Dienstnehmer wird in der Zeit von {{ werte['freistellung'] }} bezahlt vom Dienst freigestellt.</p>
<p>Die letzte Entgeltabrechnung erfolgt zur gebührenden Ausfolgung mit der Beendigung; Urlaubsersatzleistungen und ausständige Beträge werden mit der Endabrechnung ausgewiesen.</p>
<p>Die Dienstnehmerin/der Dienstnehmer verpflichtet sich, sämtliche Betriebsgegenstände, Dokumente und Zugänge bis zum Ende des Dienstverhältnisses zurückzustellen.</p>
<p>Sämtliche gegenseitigen Ansprüche aus dem Dienstverhältnis — soweit gesetzlich zulässig und abweichend nicht geregelt — gelten mit diesem Tag als abgegolten.</p>
<p>Änderungen dieser Vereinbarung bedürfen der Schriftform.</p>
<p>Ort, Datum: {{ werte['ort_datum'] }}<br/><br/>Dienstgeber: ________________________<br/><br/>Dienstnehmer:in: ______________________</p>
</div>
]]></field>
<field name="feld_ids" eval="[
Command.create({'sequence': 1, 'key': 'seit', 'bezeichnung': 'Besteht seit (Dienstbeginn)', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 2, 'key': 'beendigungstermin', 'bezeichnung': 'Beendigungstermin', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 3, 'key': 'zeitguthaben', 'bezeichnung': 'Zeitguthaben (Stunden, leer = entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 3, 'key': 'zeitguthaben_zeit', 'bezeichnung': 'Zeitguthaben-Verbrauch (Zeitraum)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 4, 'key': 'urlaub_rest', 'bezeichnung': 'Resturlaub (Tage, leer = entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 4, 'key': 'urlaub_zeit', 'bezeichnung': 'Urlaubsverbrauch (Zeitraum)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 5, 'key': 'freistellung', 'bezeichnung': 'Bezahlte Freistellung (Zeitraum, leer = entfällt)', 'quelle': 'manuell', 'pflicht': False}),
Command.create({'sequence': 6, 'key': 'ort_datum', 'bezeichnung': 'Ort, Datum', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma', 'bezeichnung': 'Firmenname', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma_strasse', 'bezeichnung': 'Firma: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_plz', 'bezeichnung': 'Firma: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_ort', 'bezeichnung': 'Firma: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter', 'bezeichnung': 'Dienstnehmer:in (Name)', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_strasse', 'bezeichnung': 'Dienstnehmer:in: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_plz', 'bezeichnung': 'Dienstnehmer:in: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_ort', 'bezeichnung': 'Dienstnehmer:in: Ort', 'quelle': 'auto', 'pflicht': False}),
]"/>
</record>
<!-- ============ Vordienstzeitenbestätigung =================== -->
<record id="vorlage_vordienstzeiten" model="l10n.at.payroll.dokument.vorlage">
<field name="name">Vordienstzeitenbestätigung</field>
<field name="thema">bescheinigung</field>
<field name="kb_ref">lb-end-35</field>
<field name="quell_stand">2026-07</field>
<field name="rechtsstatus">entwurf</field>
<field name="beschreibung">
Bestätigung des Vor-Dienstgebers über Beschäftigungsdauer und Abfertigungs-
Status anlässlich der Beendigung (Anrechnung von Vordienstzeiten beim
neuen Dienstgeber, lb-end-35, Stand 2026-07). Abfertigungs-Auswahl im
Wizard befüllen (keine/gesetzliche/KV/freiwillige — nicht zutreffende
Angaben entfallen).
</field>
<field name="inhalt_html"><![CDATA[
<div>
<p>{{ werte['firma'] }}, {{ werte['firma_strasse'] }}, {{ werte['firma_plz'] }} {{ werte['firma_ort'] }}</p>
<h2>Bestätigung über Vordienstzeiten</h2>
<p>Wir, {{ werte['firma'] }}, bestätigen, dass {{ werte['mitarbeiter'] }}, geboren am {{ werte['geboren'] }}, in der Zeit von {{ werte['von'] }} bis {{ werte['bis'] }} bei uns beschäftigt war und anlässlich der Beendigung des Dienstverhältnisses:</p>
<ul>
<li>{{ werte['abfertigung_art'] }}</li>
</ul>
<p>Die Bestätigung dient der Anrechnung von Vordienstzeiten für die Einstufung beim neuen Dienstgeber.</p>
<p>Datum: {{ werte['ort_datum'] }}</p>
<p>firmenmäßige Zeichnung: ________________________</p>
</div>
]]></field>
<field name="feld_ids" eval="[
Command.create({'sequence': 1, 'key': 'von', 'bezeichnung': 'Beschäftigt von', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 2, 'key': 'bis', 'bezeichnung': 'Beschäftigt bis', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 3, 'key': 'abfertigung_art', 'bezeichnung': 'Abfertigungsstatus (z. B. weder eine ... noch eine ... Abfertigung erhalten)', 'quelle': 'manuell', 'pflicht': True, 'hinweis': 'Text je Fall; Muster-Varianten: keine / gesetzliche / kollektivvertragliche / freiwillige Abfertigung samt Höhe'}),
Command.create({'sequence': 3, 'key': 'ort_datum', 'bezeichnung': 'Ort, Datum', 'quelle': 'manuell', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma', 'bezeichnung': 'Firmenname', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'firma_strasse', 'bezeichnung': 'Firma: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_plz', 'bezeichnung': 'Firma: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'firma_ort', 'bezeichnung': 'Firma: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter', 'bezeichnung': 'Dienstnehmer:in (Name)', 'quelle': 'auto', 'pflicht': True}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_strasse', 'bezeichnung': 'Dienstnehmer:in: Straße', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_plz', 'bezeichnung': 'Dienstnehmer:in: PLZ', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'mitarbeiter_ort', 'bezeichnung': 'Dienstnehmer:in: Ort', 'quelle': 'auto', 'pflicht': False}),
Command.create({'sequence': 10, 'key': 'geboren', 'bezeichnung': 'Geburtsdatum', 'quelle': 'auto', 'pflicht': False}),
]"/>
</record>
</odoo>
@@ -0,0 +1,4 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import dokument_vorlage
from . import dokument_wizard
from . import dokument_report
@@ -0,0 +1,17 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""Generisches Druck-Template: nimmt das vom Wizard gerenderte
body-HTML entgegen und bettet es in die PDF-Seite ein."""
from markupsafe import Markup
from odoo import models
class ReportDokumentGenerisch(models.AbstractModel):
_name = 'report.l10n_at_payroll_dokumente.report_dokument_generisch'
_description = 'Dokument aus Vorlage (generisches Drucklayout)'
def _get_report_values(self, docids, data=None):
data = data or {}
return {
'titel': data.get('titel', ''),
'body': Markup(data.get('body', '')),
}
@@ -0,0 +1,118 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""Dokumentgenerierung: Vorlagen mit eigenem Text und Platzhaltern.
Vorlagen enthalten ausschließlich eigenen Text; die Struktur-Referenz zu
den Lexis-Mustern ist pro Vorlage dokumentiert (``kb_ref``/``quell_stand``),
nie der lizenzierte Volltext.
Rendering: eigene Ausführung über ``ir.qweb`` mit den Framework-Bausteinen
``rendering_tools.convert_inline_template_to_qweb`` — Autor-Syntax bleibt
``{{ werte['key'] }}`` (identisch zu mail.render.mixin), t-out escapt die
Werte automatisch. Bewusst NICHT ``mail.render.mixin._render_template``
mit engine='inline_template': deren Ausdrucks-Whitelist
(``mail_allowed_qweb_expressions``) lässt nur ``object.*``-Basistreffer zu
und würde die ``werte['...']``-Platzhalter für Nicht-Template-Editoren
sperren (AccessError).
"""
from odoo import fields, models
from odoo.tools.rendering_tools import convert_inline_template_to_qweb
from lxml import html as lxml_html
class L10nAtPayrollDokumentVorlage(models.Model):
_name = 'l10n.at.payroll.dokument.vorlage'
_description = 'Dokumentvorlage (eigener Text)'
_order = 'thema, name'
name = fields.Char(required=True)
thema = fields.Selection(
[('dienstvertrag', 'Dienstvertrag'),
('beendigung', 'Beendigung/Kündigung'),
('bescheinigung', 'Bescheinigung'),
('vereinbarung', 'Vereinbarung'),
('exekution', 'Exekution/Pfändung'),
('sonstiges', 'Sonstiges')],
required=True, default='sonstiges')
beschreibung = fields.Text(
help="Zweck des Dokuments und Hinweise zum Rechtsanker; auch "
"Platzhalter-Dokumentation für nicht in der Feldliste "
"geführte Ausdrücke (object.*, version.*).")
inhalt_html = fields.Html(
string='Vorlagentext',
sanitize=False,
help="Eigener Vorlagentext; Platzhalter {{ werte['key'] }} werden "
"im Generierungs-Wizard befüllt.")
feld_ids = fields.One2many(
'l10n.at.payroll.dokument.feld', 'vorlage_id',
string='Befüllfelder')
kb_ref = fields.Char(
string='Struktur-Referenz',
help="Wissensbasis-/Muster-ID, nach deren Struktur der eigene "
"Text formuliert wurde (Herkunftsnachweis, kein Volltext).")
quell_stand = fields.Char(
string='Quell-Stand',
help="Stand der Struktur-Referenz, z. B. '2025-06'.")
rechtsstatus = fields.Selection(
[('entwurf', 'Entwurf — rechtliche Prüfung offen'),
('geprueft', 'Rechtlich geprüft')],
default='entwurf', required=True, string='Rechtsstatus')
active = fields.Boolean(default=True)
company_id = fields.Many2one(
'res.company', default=lambda self: self.env.company)
def _at_renderen(self, employee, version, werte, datum):
"""Vorlagentext auf den Mitarbeiter rendern (HTML-String)."""
self.ensure_one()
variablen = self.env['mail.render.mixin']._render_eval_context()
variablen.update({
'werte': werte,
'version': version,
'datum': datum,
'object': employee,
})
qweb_src = convert_inline_template_to_qweb(self.inhalt_html)
element = lxml_html.fragment_fromstring(
str(qweb_src), create_parent='div')
html = self.env['ir.qweb']._render(
element, variablen, minimal_qcontext=True)
# Ummantelungs-<div> von fragment_fromstring entfernen
# (Muster mail.render.mixin._render_template_qweb).
return str(html)[5:-6]
_sql_constraints = [
('name_uniq', 'unique(name, company_id)',
'Vorlagenname je Company eindeutig.'),
]
class L10nAtPayrollDokumentFeld(models.Model):
_name = 'l10n.at.payroll.dokument.feld'
_description = 'Dokumentvorlage-Befüllfeld'
_order = 'sequence, id'
_rec_name = 'key'
sequence = fields.Integer(default=10)
vorlage_id = fields.Many2one(
'l10n.at.payroll.dokument.vorlage', required=True,
ondelete='cascade', index=True)
key = fields.Char(
required=True,
help="Platzhalter-Schlüssel; im Vorlagentext als "
"{{ werte['key'] }} zu verwenden.")
bezeichnung = fields.Char()
quelle = fields.Selection(
[('auto', 'Automatisch (hr-Stammdaten)'),
('manuell', 'Manuelle Eingabe im Wizard')],
default='manuell', required=True)
pflicht = fields.Boolean(
default=True,
help="Pflichtfelder müssen im Wizard befüllt sein, bevor das "
"Dokument erzeugt wird.")
hinweis = fields.Char(
help="Erklärung für die Wizard-Eingabe (z. B. KV-Bezug).")
_sql_constraints = [
('key_vorlage_uniq', 'unique(vorlage_id, key)',
'Platzhalter-Schlüssel je Vorlage eindeutig.'),
]
@@ -0,0 +1,188 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""Wizard: Dokument aus Vorlage generieren.
Befüllt die Platzhalter der Vorlage aus hr-Stammdaten (automatische
Felder) und Wizard-Eingaben (manuelle Felder), rendert eine Vorschau und
erzeugt PDF (ir.actions.report, wkhtmltopdf) bzw. — ohne PDF-Engine —
das gerenderte HTML als Anhang.
"""
import base64
from markupsafe import Markup
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.tools.misc import format_date
class L10nAtPayrollDokumentWizard(models.TransientModel):
_name = 'l10n.at.payroll.dokument.wizard'
_description = 'Dokument aus Vorlage generieren'
vorlage_id = fields.Many2one(
'l10n.at.payroll.dokument.vorlage', required=True,
domain=[('active', '=', True)])
employee_id = fields.Many2one('hr.employee', required=True)
datum = fields.Date(
string='Stichtag',
default=fields.Date.context_today,
help="Stichtag für den hr.version-Stand (Vertragsdaten).")
version_id = fields.Many2one(
'hr.version', compute='_compute_version_id',
string='Vertragsstand (hr.version)')
feld_wert_ids = fields.One2many(
'l10n.at.payroll.dokument.wizard.feld', 'wizard_id',
string='Befüllung')
vorschau_html = fields.Html(
string='Vorschau', readonly=True, sanitize=False)
@api.depends('employee_id', 'datum')
def _compute_version_id(self):
for wizard in self:
wizard.version_id = wizard._at_version_am()
def _at_version_am(self):
"""hr.version gültig am Stichtag (date_version <= Stichtag)."""
self.ensure_one()
if not self.datum or not self.employee_id:
return self.env['hr.version']
return self.env['hr.version'].search(
[('employee_id', '=', self.employee_id.id),
('date_version', '<=', self.datum)],
order='date_version desc, id desc', limit=1)
@api.onchange('vorlage_id')
def _onchange_vorlage_id(self):
self.vorschau_html = False
self.feld_wert_ids = self._at_linien()
def action_befuellen(self):
"""Linien aus der Vorlage neu aufbauen (auch bei Wechsel)."""
self.ensure_one()
self.vorschau_html = False
self.feld_wert_ids = self._at_linien()
def _at_linien(self):
self.ensure_one()
if not self.vorlage_id:
return [(5, 0, 0)]
return [(5, 0, 0)] + [
(0, 0, {
'key': feld.key,
'bezeichnung': feld.bezeichnung,
'quelle': feld.quelle,
'pflicht': feld.pflicht,
'hinweis': feld.hinweis,
})
for feld in self.vorlage_id.feld_ids.sorted('sequence')
]
def _at_werte(self):
"""Befüllwerte: automatisch aufgelöst + manuelle Eingaben."""
self.ensure_one()
werte = {}
fehlen = []
for feld in self.vorlage_id.feld_ids:
line = self.feld_wert_ids.filtered(
lambda l, k=feld.key: l.key == k)[:1]
if feld.quelle == 'auto':
werte[feld.key] = self._at_auto_wert(feld.key)
else:
wert = (line.wert or '').strip()
if not wert and feld.pflicht:
fehlen.append(feld.bezeichnung or feld.key)
werte[feld.key] = wert
if fehlen:
raise UserError(_(
"Pflichtfelder nicht befüllt: %s", ', '.join(fehlen)))
return werte
def _at_auto_wert(self, key):
self.ensure_one()
employee = self.employee_id
version = self.version_id
company = employee.company_id
if key == 'firma':
return company.name or ''
if key == 'firma_strasse':
return company.partner_id.street or ''
if key == 'firma_plz':
return company.partner_id.zip or ''
if key == 'firma_ort':
return company.partner_id.city or ''
if key == 'mitarbeiter':
return employee.name or ''
if key == 'mitarbeiter_strasse':
return version.private_street or ''
if key == 'mitarbeiter_plz':
return version.private_zip or ''
if key == 'mitarbeiter_ort':
return version.private_city or ''
if key == 'ead':
datum = version.date_version or version.contract_date_start
return format_date(self.env, datum) if datum else ''
if key == 'funktion':
return version.job_title or version.job_id.name or ''
if key == 'geboren':
return format_date(self.env, employee.birthday) if employee.birthday else ''
raise UserError(_(
"Kein automatischer Wert für Platzhalter '%s' definiert.", key))
def action_vorschau(self):
self.ensure_one()
werte = self._at_werte()
self.vorschau_html = Markup(self.vorlage_id._at_renderen(
self.employee_id, self.version_id, werte, self.datum))
return {
'type': 'ir.actions.act_window',
'res_model': self._name,
'res_id': self.id,
'view_mode': 'form',
'target': 'new',
}
def action_pdf(self):
self.ensure_one()
werte = self._at_werte()
body = Markup(self.vorlage_id._at_renderen(
self.employee_id, self.version_id, werte, self.datum))
name = '%s%s (%s)' % (
self.vorlage_id.name, self.employee_id.name, self.datum)
if self.env['ir.actions.report'].get_wkhtmltopdf_state() == 'ok':
pdf_content, _typ = self.env['ir.actions.report']._render_qweb_pdf(
'l10n_at_payroll_dokumente.action_report_dokument_generisch',
self.ids, data={'titel': name, 'body': body})
datas = base64.b64encode(pdf_content)
mimetype = 'application/pdf'
suffix = '.pdf'
else:
datas = base64.b64encode(str(body).encode('utf-8'))
mimetype = 'text/html'
suffix = '.html'
self.env['ir.attachment'].create({
'name': name + suffix,
'datas': datas,
'mimetype': mimetype,
'res_model': 'hr.employee',
'res_id': self.employee_id.id,
'description': 'Dokument aus Vorlage %s' % self.vorlage_id.name,
})
return {
'type': 'ir.actions.act_window_close',
}
class L10nAtPayrollDokumentWizardFeld(models.TransientModel):
_name = 'l10n.at.payroll.dokument.wizard.feld'
_description = 'Dokument-Wizard Befüllzeile'
wizard_id = fields.Many2one(
'l10n.at.payroll.dokument.wizard', required=True,
ondelete='cascade')
key = fields.Char(readonly=True, required=True)
bezeichnung = fields.Char(readonly=True)
quelle = fields.Selection(
[('auto', 'Automatisch (hr-Stammdaten)'),
('manuell', 'Manuelle Eingabe im Wizard')], readonly=True)
pflicht = fields.Boolean(readonly=True)
hinweis = fields.Char(readonly=True)
wert = fields.Char()
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Generisches Drucklayout für Dokumente aus Vorlagen. -->
<!-- Aufgerufen vom Wizard (ir.actions.report._render_qweb_pdf); -->
<!-- kein Menü-Binding, da der Inhalt je Generierung variiert. -->
<record id="action_report_dokument_generisch" model="ir.actions.report">
<field name="name">Dokument aus Vorlage</field>
<field name="model">l10n.at.payroll.dokument.wizard</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">l10n_at_payroll_dokumente.report_dokument_generisch</field>
<field name="report_file">l10n_at_payroll_dokumente.report_dokument_generisch</field>
<field name="paperformat_id" ref="base.paperformat_euro"/>
</record>
<template id="report_dokument_generisch">
<t t-call="web.html_container">
<div class="page">
<h1 class="d-none"><t t-out="titel"/></h1>
<div t-out="body"/>
</div>
</t>
</template>
</odoo>
@@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_dokument_vorlage_hr_user,l10n.at.payroll.dokument.vorlage hr.user,model_l10n_at_payroll_dokument_vorlage,hr.group_hr_user,1,0,0,0
access_dokument_vorlage_hr_manager,l10n.at.payroll.dokument.vorlage hr.manager,model_l10n_at_payroll_dokument_vorlage,hr.group_hr_manager,1,1,1,1
access_dokument_feld_hr_user,l10n.at.payroll.dokument.feld hr.user,model_l10n_at_payroll_dokument_feld,hr.group_hr_user,1,0,0,0
access_dokument_feld_hr_manager,l10n.at.payroll.dokument.feld hr.manager,model_l10n_at_payroll_dokument_feld,hr.group_hr_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_dokument_vorlage_hr_user l10n.at.payroll.dokument.vorlage hr.user model_l10n_at_payroll_dokument_vorlage hr.group_hr_user 1 0 0 0
3 access_dokument_vorlage_hr_manager l10n.at.payroll.dokument.vorlage hr.manager model_l10n_at_payroll_dokument_vorlage hr.group_hr_manager 1 1 1 1
4 access_dokument_feld_hr_user l10n.at.payroll.dokument.feld hr.user model_l10n_at_payroll_dokument_feld hr.group_hr_user 1 0 0 0
5 access_dokument_feld_hr_manager l10n.at.payroll.dokument.feld hr.manager model_l10n_at_payroll_dokument_feld hr.group_hr_manager 1 1 1 1
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="rule_dokument_vorlage_company" model="ir.rule">
<field name="name">Dokumentvorlage: eigene Company</field>
<field name="model_id" ref="model_l10n_at_payroll_dokument_vorlage"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
</record>
</odoo>
@@ -0,0 +1,2 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import test_dokumente
@@ -0,0 +1,183 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""Tests: Dokumentgenerierung aus Vorlagen.
Rendering der eigenen Vorlagentexte (werte['key']-Platzhalter), Auto-Werte
aus hr-Stammdaten, Pflichtfeld-Validierung, hr.version-Stichtagsauflösung,
generisches Druck-Template und Anhang-Ablage (PDF wenn wkhtmltopdf
verfügbar, sonst HTML-Fallback)."""
import base64
import datetime
from odoo.exceptions import AccessError, UserError
from odoo.tests import TransactionCase, tagged
@tagged('post_install', '-at_install')
class DokumenteTest(TransactionCase):
def setUp(self):
super().setUp()
self.company = self.env.company
self.company.write({'name': 'Musterwerkstatt GmbH'})
employee = self.env['hr.employee'].create({
'name': 'Dokument Test'})
version = self.env['hr.version'].search(
[('employee_id', '=', employee.id)], limit=1)
version.write({
'date_version': datetime.date(2020, 1, 1),
'contract_date_start': datetime.date(2020, 1, 1),
'job_title': 'Techniker',
'private_street': 'Testgasse 1',
'private_zip': '1010',
'private_city': 'Wien',
})
self.employee = employee
self.version = version
self.vorlage = self.env['l10n.at.payroll.dokument.vorlage'].create({
'name': 'Testbescheinigung',
'thema': 'bescheinigung',
'kb_ref': 'lb-test',
'rechtsstatus': 'entwurf',
'inhalt_html':
'<p>Firma: {{ werte[\'firma\'] }}</p>'
'<p>Mitarbeiter: {{ werte[\'mitarbeiter\'] }}</p>'
'<p>Funktion: {{ werte[\'funktion\'] }}</p>'
'<p>EAD: {{ werte[\'ead\'] }}</p>'
'<p>Zusatz: {{ werte[\'zusatz\'] }}</p>',
'feld_ids': [
(0, 0, {'sequence': 1, 'key': 'zusatz',
'quelle': 'manuell', 'pflicht': True,
'bezeichnung': 'Zusatzangabe'}),
(0, 0, {'sequence': 2, 'key': 'firma', 'quelle': 'auto',
'pflicht': True}),
(0, 0, {'sequence': 3, 'key': 'mitarbeiter',
'quelle': 'auto', 'pflicht': True}),
(0, 0, {'sequence': 4, 'key': 'funktion', 'quelle': 'auto',
'pflicht': False}),
(0, 0, {'sequence': 5, 'key': 'ead', 'quelle': 'auto',
'pflicht': False}),
],
})
def _wizard(self):
wizard = self.env['l10n.at.payroll.dokument.wizard'].create({
'vorlage_id': self.vorlage.id,
'employee_id': self.employee.id,
'datum': datetime.date(2026, 1, 15),
})
wizard.action_befuellen()
return wizard
def test_01_auto_werte(self):
wizard = self._wizard()
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'zusatz').wert = 'X'
werte = wizard._at_werte()
self.assertEqual(werte['firma'], 'Musterwerkstatt GmbH')
self.assertEqual(werte['mitarbeiter'], 'Dokument Test')
self.assertEqual(werte['funktion'], 'Techniker')
self.assertTrue(werte['ead'])
def test_02_vorschau_ersetzt_platzhalter(self):
wizard = self._wizard()
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'zusatz').wert = 'Projekt Alpha'
wizard.action_vorschau()
vorschau = wizard.vorschau_html
self.assertIn('Musterwerkstatt GmbH', vorschau)
self.assertIn('Dokument Test', vorschau)
self.assertIn('Projekt Alpha', vorschau)
self.assertNotIn('{{', vorschau)
def test_03_pflichtfeld_leist_user_error(self):
wizard = self._wizard()
with self.assertRaises(UserError):
wizard._at_werte()
def test_04_version_am_stichtag(self):
self.env['hr.version'].create({
'employee_id': self.employee.id,
'date_version': datetime.date(2026, 3, 1),
'job_title': 'Senior Techniker',
})
wizard = self._wizard()
self.assertEqual(wizard.version_id.job_title, 'Techniker')
wizard.datum = datetime.date(2026, 6, 1)
wizard._compute_version_id()
self.assertEqual(wizard.version_id.job_title, 'Senior Techniker')
def test_05_pdf_ablegt_anhang(self):
wizard = self._wizard()
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'zusatz').wert = 'Fall 5'
wizard.action_pdf()
anh = self.env['ir.attachment'].search(
[('res_model', '=', 'hr.employee'),
('res_id', '=', self.employee.id)])
self.assertEqual(len(anh), 1)
self.assertIn(anh.mimetype, ('application/pdf', 'text/html'))
if anh.mimetype == 'text/html':
html = base64.b64decode(anh.datas).decode('utf-8')
self.assertIn('Fall 5', html)
def test_06_report_values_generic(self):
wizard = self._wizard()
report = self.env[
'report.l10n_at_payroll_dokumente'
'.report_dokument_generisch']
values = report._get_report_values(
wizard.ids, data={'titel': 'T', 'body': '<p>Body</p>'})
self.assertEqual(str(values['body']), '<p>Body</p>')
html_content, _typ = self.env['ir.actions.report']._render_qweb_html(
'l10n_at_payroll_dokumente.action_report_dokument_generisch',
wizard.ids, data={'titel': 'T', 'body': values['body']})
self.assertIn('Body', str(html_content))
def test_07_access_hr_user_lesen_manager_schreiben(self):
hr_user = self.env['res.users'].create({
'name': 'Dokument Lesetest',
'login': 'dok_lesetest',
'group_ids': [(4, self.env.ref('hr.group_hr_user').id)],
})
umgebung = self.env(user=hr_user.id)
self.assertTrue(
umgebung['l10n.at.payroll.dokument.vorlage'].browse(
self.vorlage.id).name)
kein_hr = self.env['res.users'].create({
'name': 'Dokument Ohne HR',
'login': 'dok_ohne_hr',
'group_ids': [(4, self.env.ref('base.group_user').id)],
})
ohne = self.env(user=kein_hr.id)
with self.assertRaises(AccessError):
ohne['l10n.at.payroll.dokument.vorlage'].browse(
self.vorlage.id).name
def test_08_pilot_vorlagen_installiert(self):
for xmlid in ('vorlage_dienstvertrag_angestellte',
'vorlage_kuendigung_dienstgeber',
'vorlage_einvernehmliche_aufloesung',
'vorlage_vordienstzeiten'):
vorlage = self.env.ref(
'l10n_at_payroll_dokumente.%s' % xmlid)
self.assertTrue(vorlage.inhalt_html)
self.assertEqual(vorlage.rechtsstatus, 'entwurf')
kuendigung = self.env.ref(
'l10n_at_payroll_dokumente.vorlage_kuendigung_dienstgeber')
wizard = self.env['l10n.at.payroll.dokument.wizard'].create({
'vorlage_id': kuendigung.id,
'employee_id': self.employee.id,
'datum': datetime.date(2026, 9, 1),
})
wizard.action_befuellen()
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'anrede').wert = 'Sehr geehrter Herr'
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'kuendigung_frist').wert = '6 Wochen'
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'beendigungstermin').wert = '31.10.2026'
wizard.feld_wert_ids.filtered(
lambda l: l.key == 'ort_datum').wert = 'Wien, 1.9.2026'
wizard.action_vorschau()
self.assertIn('31.10.2026', wizard.vorschau_html)
self.assertIn('Musterwerkstatt GmbH', wizard.vorschau_html)
@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_dokument_vorlage_list" model="ir.ui.view">
<field name="name">l10n.at.payroll.dokument.vorlage.list</field>
<field name="model">l10n.at.payroll.dokument.vorlage</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="thema"/>
<field name="kb_ref"/>
<field name="quell_stand"/>
<field name="rechtsstatus"/>
<field name="company_id" groups="base.group_multi_company"/>
</list>
</field>
</record>
<record id="view_dokument_vorlage_form" model="ir.ui.view">
<field name="name">l10n.at.payroll.dokument.vorlage.form</field>
<field name="model">l10n.at.payroll.dokument.vorlage</field>
<field name="arch" type="xml">
<form>
<header>
<field name="rechtsstatus" widget="statusbar"
options="{'clickable': true}"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="z. B. Dienstvertrag (Angestellte)"/></h1>
</div>
<group>
<group>
<field name="thema"/>
<field name="active"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group>
<field name="kb_ref"/>
<field name="quell_stand"/>
<field name="rechtsstatus"/>
</group>
</group>
<group>
<field name="beschreibung"/>
</group>
<notebook>
<page string="Vorlagentext" name="text">
<field name="inhalt_html"/>
</page>
<page string="Befüllfelder" name="felder">
<field name="feld_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="key"/>
<field name="bezeichnung"/>
<field name="quelle"/>
<field name="pflicht"/>
<field name="hinweis"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_dokument_vorlage" model="ir.actions.act_window">
<field name="name">Dokumentvorlagen</field>
<field name="res_model">l10n.at.payroll.dokument.vorlage</field>
<field name="view_mode">list,form</field>
<field name="context">{'default_active': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Erste Dokumentvorlage anlegen
</p>
<p>
Eigener Text mit Platzhaltern {{ werte['key'] }}; die
Befüllfelder steuern, was der Generierungs-Wizard abfragt.
</p>
</field>
</record>
<menuitem id="menu_dokumente_root"
name="AT Dokumente"
sequence="50"/>
<menuitem id="menu_dokument_vorlage"
action="action_dokument_vorlage"
parent="menu_dokumente_root"
sequence="10"/>
</odoo>
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_dokument_wizard_form" model="ir.ui.view">
<field name="name">l10n.at.payroll.dokument.wizard.form</field>
<field name="model">l10n.at.payroll.dokument.wizard</field>
<field name="arch" type="xml">
<form string="Dokument aus Vorlage generieren">
<group>
<group>
<field name="vorlage_id" options="{'no_create': True}"/>
<field name="employee_id"/>
<field name="datum"/>
<field name="version_id"/>
</group>
</group>
<notebook>
<page string="Befüllung" name="befuellung">
<field name="feld_wert_ids">
<list editable="bottom">
<field name="key" optional="show"/>
<field name="bezeichnung" optional="show"/>
<field name="hinweis" optional="hide"/>
<field name="quelle" optional="show"/>
<field name="pflicht" optional="hide"/>
<field name="wert"
readonly="key and quelle == 'auto'"
required="pflicht"/>
</list>
</field>
</page>
<page string="Vorschau" name="vorschau">
<field name="vorschau_html" nolabel="1"/>
</page>
</notebook>
<footer>
<button name="action_vorschau" type="object"
string="Vorschau erzeugen" class="btn-primary"/>
<button name="action_pdf" type="object"
string="PDF erzeugen &amp; ablegen"
class="btn-primary"/>
<button special="cancel" string="Abbrechen"/>
</footer>
</form>
</field>
</record>
<record id="action_dokument_generieren" model="ir.actions.act_window">
<field name="name">Dokument aus Vorlage generieren</field>
<field name="res_model">l10n.at.payroll.dokument.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="action_dokument_generieren_employee" model="ir.actions.act_window">
<field name="name">Dokument aus Vorlage generieren</field>
<field name="res_model">l10n.at.payroll.dokument.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{'default_employee_id': active_id}</field>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="binding_view_types">list,form</field>
</record>
<menuitem id="menu_dokument_generieren"
action="action_dokument_generieren"
parent="menu_dokumente_root"
sequence="20"/>
</odoo>
+10 -2
View File
@@ -60,7 +60,9 @@ Absetzbeträgen — kein Pendlerpauschalen-Feature).
4. **Endabrechnungs-Zyklus**: Urlaubsersatzleistung (lb-url-09/15/16),
Abgangsentschädigung/Vergleich/Prämien bei Beendigung
(lb-end-04/05/06/08…22), Aufrechnung Vorschüsse/Darlehen
(lb-lvr-01/02), Zeitschulden/Zeitguthaben (lb-end-09/10)
(lb-lvr-01/02), Zeitschulden/Zeitguthaben (lb-end-09/10),
Ausbildungskostenrückersatz (lb-end-27/28 — **Nachtrag 2026-09-16**
aus Batch 10; nicht im Abgleich-Stand 2026-09-12)
5. **Abfertigung Alt**-Bezugszeile (lb-end-01/02, lb-kar-01)
6. **Karenz-/Familien-Reste**: SV-An/-Abmeldung Karenz, Elternteilzeit
(lb-elt-03), Bildungs-/Pflege-/Hospizkarenz (lb-kzs-01/02/06/07),
@@ -191,8 +193,14 @@ Test-Integration.
`l10n_at_s67_abs` ✅), Prämien bei Beendigung, Aufrechnung
Vorschüsse/Darlehen (Rückzahlungsmodus lb-end-06, lb-lvr-01/02),
Zeitguthaben/-schulden-Abrechnung.
- **Nachtrag (2026-09-16, Batch 10):** **Ausbildungskostenrückersatz**
bei vorzeitigem Austritt (lb-end-27 Checkliste, lb-end-28 Muster)
als Endabrechnungs-Komponente im Wizard — Rechtsgrundlage vor Bau
RIS-verifizieren (§ 32 AngG-Kontext/RL-VA); Scope-Gate Pilotmandant.
- **Rechtsanker:** lb-url-09/15/16, lb-son-05, lb-end-04/05/06/08…22;
§ 67 Abs 8 lit d EStG + § 11 Abs 2 ASVG RIS-Gate.
§ 67 Abs 8 lit d EStG + § 11 Abs 2 ASVG RIS-Gate; **lb-end-27/28**
(Ausbildungskostenrückersatz, Nachtrag 2026-09-16 — RIS-Gate vor
Bau).
- **Tests:** Rechenfälle `endabrechnung.md` — Urlaubsersatzleistung
2 Komponenten, §-11-Abs-2-SV-Fall, Vergleich Günstiger § 67 Abs 3,
Aufrechnung gegen SZ (pfändungsfest? — Schnittstelle AP11),
+11 -1
View File
@@ -121,7 +121,17 @@ Cluster unverändert) — **insgesamt 571 Einträge, 67 Cluster**, Quell-Stände
`gwe` (2, Güterbeförderung/Gastgewerbe), sonst Belegung bestehender
Cluster (`wk-pfa-01` neben `lb-pfa-*`: vor 1 · kar 1 · bnd 1 · lvr 2 ·
dvh 1 · bes 1 · rei 1 · gsf 1 · grz 1 · ins 1 · lsd 1 · pfa 1 · azg 1 ·
sac 1 · son 1) → **gesamt 601 Einträge, 69 Cluster**. Siebzehn Briefings-Kapitel, aus Batch 9 neu:
sac 1 · son 1) → **gesamt 601 Einträge, 69 Cluster**. **Batch 10
(2026-09-16): 64 Einträge — Sektions-Exporte aus Subordnern**
(`.lexis360/{beispiele,muster,uebersichten_checklisten}/`, dasselbe
Werk, dieselbe Breadcrumb-Form; 4 Re-Export-Duplikate `(1)` gelöscht,
1 URL-kodierter Dateiname normalisiert), bestehende Cluster erweitert:
bnd 44→66 · end 25→34 · ues 4→9 · tel 6→11 · bso 10→16 · azg 4→9 ·
azm 7→10 · grz 8→11 · bes 8→10 · son 5→6 · swa 5→6 · aug 2→3 ·
url 16→17 — **gesamt 665 Einträge, 69 Cluster** (Quell-Stände
2020-12 bis 2026-08; alte Stände mit ⚠ markiert: lb-tel-07/08
2025-01, lb-tel-09 2024-01, lb-tel-10 2020-12, lb-ues-05/06/08
2025-12, lb-bes-09/10 + lb-end-27/28/33/34 2025-06). Siebzehn Briefings-Kapitel, aus Batch 9 neu:
„Sozialversicherung“ (Beitragsrecht ASVG/GSVG/BSVG, Neue
Selbstständige, Krankenversicherung ASVG, Pensionsversicherung).
„Beschäftigungsverhältnisse“, „Entgelt: Anspruch &
+45 -11
View File
@@ -7,7 +7,10 @@ personalverrechnung/wissensbasis/ (development reference and future
copilot corpus):
lexis .lexis360/*.pdf PDF exports of "Lexis Briefings Personalrecht"
(LexisNexis AT, licensed Lexis 360 subscription)
(LexisNexis AT, licensed Lexis 360 subscription);
batch 10 adds the same work's sections in
subfolders: .lexis360/{beispiele,muster,
uebersichten_checklisten}/
wiku .wiku/*.pdf WIKU Personal publications (Fachbroschüren,
Arbeitsunterlagen, Casebooks, the periodical
"WIKU Personal aktuell")
@@ -61,7 +64,7 @@ CURATED_DIR = ROOT / "personalverrechnung" / "wissensbasis" / "dokumente"
KB_JSON = CURATED_DIR.parent / "kb.json"
WORK_LEXIS = "Lexis Briefings Personalrecht"
BATCH_LEXIS = 9
BATCH_LEXIS = 10
BATCH_WIKU = 1
WIKU_SLUG_PREFIX = "wiku_"
WIKU_WORKS = (
@@ -77,6 +80,9 @@ SOURCES: dict[str, dict] = {
"lexis": {
"work": WORK_LEXIS,
"pdf_dir": ROOT / ".lexis360",
# batch 10 — same work, same breadcrumb format, section exports in
# subfolders (Muster, Beispiele, Übersichten & Checklisten)
"pdf_subdirs": ("beispiele", "muster", "uebersichten_checklisten"),
"md_dir": ROOT / ".lexis360" / "md",
"pdf_glob": "Lexis360_*.pdf",
"id_prefix": "lb",
@@ -913,6 +919,13 @@ BC_LINE_RE = re.compile(
r"^\s*(?P<chapter>[^>·]+?)\s*>\s*(?P<topic>.+?)\s*·\s*(?P<author>.+?)"
r"\s*·\s*(?P<month>[A-ZÄÖÜ][a-zäöüß]+)\s+(?P<year>\d{4})(?P<rest>.*)$"
)
# Breadcrumb variant WITHOUT an author segment (batch-10 Muster exports:
# "Kapitel > Thema · <Monat> <Jahr>"). The author then defaults to the
# editorial attribution in parse_meta().
BC_LINE_NOAUTHOR_RE = re.compile(
r"^\s*(?P<chapter>[^>·]+?)\s*>\s*(?P<topic>.+?)\s*·\s*"
r"(?P<month>[A-ZÄÖÜ][a-zäöüß]+)\s+(?P<year>\d{4})(?P<rest>.*)$"
)
STAND_RE = re.compile(r"^\d{4}-\d{2}$")
ID_RE = re.compile(r"^(lb|wk)-[a-z]{3}-\d{2}$")
@@ -968,14 +981,25 @@ def clean_wiku_text(raw: str) -> str:
return text.strip() + "\n"
def _match_bc(line: str):
"""Try the author-carrying breadcrumb regex first, then the
no-author variant (batch 10)."""
for rx in (BC_LINE_RE, BC_LINE_NOAUTHOR_RE):
m = rx.match(line)
if m:
return m
return None
def parse_meta(text: str, pdf_title: str = "") -> dict:
"""Parse title + breadcrumb from the first page.
Layout: a line with the work marker, the chapter title, then the
breadcrumb "Kapitel > Thema · Autor · <Monat> <Jahr>". Dossier-style
exports merge breadcrumb and body text into one line; the regex tail
(?P<rest>) tolerates that. If no separate title line exists, fall
back to the pdfinfo Title.
breadcrumb "Kapitel > Thema · Autor · <Monat> <Jahr>" (or the
batch-10 no-author variant "Kapitel > Thema · <Monat> <Jahr>").
Dossier-style exports merge breadcrumb and body into one line; the
regex tail (?P<rest>) tolerates that. If no separate title line
exists, fall back to the pdfinfo Title.
"""
lines = text.splitlines()
marker_idx = None
@@ -989,7 +1013,7 @@ def parse_meta(text: str, pdf_title: str = "") -> dict:
m = None
scan = lines[marker_idx + 1:]
for pos, ln in enumerate(scan):
cand = BC_LINE_RE.match(ln)
cand = _match_bc(ln)
if cand is None and ("·" in ln or " > " in ln):
# dossier-style exports wrap the breadcrumb ("· Juli\n2026",
# "... ·\nAutor · Juli 2026", or the topic split BEFORE the
@@ -999,7 +1023,7 @@ def parse_meta(text: str, pdf_title: str = "") -> dict:
joined = ln.rstrip()
for nxt in scan[pos + 1:pos + 3]:
joined = f"{joined} {nxt.strip()}".strip()
cand = BC_LINE_RE.match(joined)
cand = _match_bc(joined)
if cand:
break
if cand:
@@ -1020,7 +1044,8 @@ def parse_meta(text: str, pdf_title: str = "") -> dict:
"title": title,
"chapter": m.group("chapter").strip(),
"topic_group": m.group("topic").strip(),
"author": m.group("author").strip(),
# batch-10 no-author variant: editorial default attribution
"author": m.groupdict().get("author") or "Lexis Redaktion",
"stand": f"{m.group('year')}-{month_no:02d}",
"stand_human": f"{m.group('month')} {m.group('year')}",
}
@@ -1122,12 +1147,21 @@ def extract_lexis() -> int:
if not src["pdf_dir"].is_dir():
sys.exit(f"missing {src['pdf_dir']}")
src["md_dir"].mkdir(exist_ok=True)
pdfs = sorted(src["pdf_dir"].glob(src["pdf_glob"]))
pdfs: list[Path] = []
for sub in (None, *src.get("pdf_subdirs", ())):
pdir = src["pdf_dir"] / sub if sub else src["pdf_dir"]
if pdir.is_dir():
pdfs.extend(sorted(pdir.glob(src["pdf_glob"])))
catalog: list[dict] = []
texts: dict[str, str] = {}
warnings: list[str] = []
seen_slugs: set[str] = set()
for pdf in pdfs:
slug = pdf.stem[len("Lexis360_"):]
if slug in seen_slugs:
warnings.append(f"{pdf.name}: slug {slug!r} collides - skipped")
continue
seen_slugs.add(slug)
raw, pages, pdf_title = parse_pdf(pdf)
text = clean_text(raw)
texts[slug] = text
@@ -1139,7 +1173,7 @@ def extract_lexis() -> int:
entry = {
"slug": slug,
"source": "lexis",
"pdf_rel": f".lexis360/{pdf.name}",
"pdf_rel": pdf.relative_to(ROOT).as_posix(),
"md_rel": f".lexis360/md/{slug}.md",
"work": WORK_LEXIS,
"pages": pages,
+79 -15
View File
@@ -1,9 +1,9 @@
# Index — Wissensbasis Personalverrechnung
Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings Personalrecht (Lexis 360, lizenzierter Export) und WIKU Personal (Fachbroschüren, Arbeitsunterlagen, Casebooks, WIKU Personal aktuell). Volltexte lokal/unversioniert (`.lexis360/`, `.wiku/`). Werte gelten je zum Quell-Stand (`stand` im Frontmatter); Widersprüche und offene Punkte sind mit ⚠/❓ in den Einträgen selbst dokumentiert. Schema & Konventionen: `README.md`.
Generiert am 2026-09-16 · 665 Einträge · 69 Cluster. Quellen: Lexis Briefings Personalrecht (Lexis 360, lizenzierter Export) und WIKU Personal (Fachbroschüren, Arbeitsunterlagen, Casebooks, WIKU Personal aktuell). Volltexte lokal/unversioniert (`.lexis360/`, `.wiku/`). Werte gelten je zum Quell-Stand (`stand` im Frontmatter); Widersprüche und offene Punkte sind mit ⚠/❓ in den Einträgen selbst dokumentiert. Schema & Konventionen: `README.md`.
# Lexis Briefings Personalrecht (Lexis 360-Exporte) — 571 Einträge
# Lexis Briefings Personalrecht (Lexis 360-Exporte) — 635 Einträge
## Altersteilzeit (`topic: altersteilzeit`) — 15 Einträge · Stand 2026-01 bis 2026-09
@@ -47,14 +47,15 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-asc-15 | Arbeitsunfall - Entgeltfortzahlung bei Arbeitern | Ruß/Radauer | 2026-07 | arbeitsunfall_entgeltfortzahlung_bei_arbeitern.md |
| lb-asc-16 | Arbeitsunfall und Berufskrankheit - Begriffe | Ruß/Radauer | 2026-07 | arbeitsunfall_und_berufskrankheit_begriffe.md |
## Arbeitskräfteüberlassung (AÜG) (`topic: arbeitskrafteuberlassung`) — 2 Einträge · Stand 2026-06 bis 2026-06
## Arbeitskräfteüberlassung (AÜG) (`topic: arbeitskrafteuberlassung`) — 3 Einträge · Stand 2026-06 bis 2026-06
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
| lb-aug-01 | Arbeitskräfteüberlassung - Aufgaben von Überlasser und Beschäftiger | Thöny-Maier/David | 2026-06 | arbeitskrafteuberlassung_aufgaben_von_uberlasser_u.md |
| lb-aug-02 | Arbeitskräfteüberlassung - wichtige Grundsätze | Thöny-Maier/David | 2026-06 | arbeitskrafteuberlassung_wichtige_grundsatze.md |
| lb-aug-03 | Muster - Überlassungsmitteilung | Thöny-Maier | 2026-06 | muster_uberlassungsmitteilung.md |
## Arbeitszeitgrenzen (`topic: arbeitszeitgrenzen`) — 4 Einträge · Stand 2026-06 bis 2026-07
## Arbeitszeitgrenzen (`topic: arbeitszeitgrenzen`) — 9 Einträge · Stand 2026-06 bis 2026-07
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -62,8 +63,13 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-azg-02 | Arbeitszeitgrenzen allgemein | Thöny-Maier | 2026-06 | arbeitszeitgrenzen_allgemein.md |
| lb-azg-03 | Normalarbeitszeit | Thöny-Maier | 2026-07 | normalarbeitszeit.md |
| lb-azg-04 | Strafbarkeit von Arbeitszeitübertretungen | Thöny-Maier | 2026-07 | strafbarkeit_von_arbeitszeitubertretungen.md |
| lb-azg-05 | Muster - Grundklauseln zu Ausmaß und Lage der Arbeitszeit | Lexis Redaktion | 2026-07 | muster_grundklauseln_zu_ausmass_und_lage_der_arbeit.md |
| lb-azg-06 | Muster - Normalarbeitszeitdurchrechnungen bei Teilzeitkräften | Lexis Redaktion | 2026-07 | muster_normalarbeitszeitdurchrechnungen_bei_teilze.md |
| lb-azg-07 | Muster - Teilzeitkräfte - Änderungen (Erhöhungen, Senkungen) des Teilzeitausmaßes | Lexis Redaktion | 2026-07 | muster_teilzeitkrafte_anderungen_erhohungen_senkun.md |
| lb-azg-08 | Muster - Teilzeitkräfte - Vereinbarung unterschiedlicher Teilzeitausmaße | Lexis Redaktion | 2026-07 | muster_teilzeitkrafte_vereinbarung_unterschiedlich.md |
| lb-azg-09 | Muster - Viertagewoche-Einzelvereinbarung | Lexis Redaktion | 2026-07 | muster_viertagewoche_einzelvereinbarung.md |
## Arbeitszeitmodelle (Gleitzeit, Schicht, Kurzarbeit) (`topic: arbeitszeitmodelle`) — 7 Einträge · Stand 2026-07 bis 2026-07
## Arbeitszeitmodelle (Gleitzeit, Schicht, Kurzarbeit) (`topic: arbeitszeitmodelle`) — 10 Einträge · Stand 2026-07 bis 2026-07
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -74,6 +80,9 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-azm-05 | Kurzarbeit Inhaltliche Ausgestaltung | Niederfriniger | 2026-07 | kurzarbeit_inhaltliche_ausgestaltung.md |
| lb-azm-06 | Kurzarbeitsbeihilfe | Niederfriniger | 2026-07 | kurzarbeitsbeihilfe.md |
| lb-azm-07 | Schichtarbeit | Niederfriniger/David | 2026-07 | schichtarbeit.md |
| lb-azm-08 | Muster-Einzelvereinbarung: Einarbeiten in Verbindung mit Feiertagen | Lexis Redaktion | 2026-07 | muster_einzelvereinbarung_einarbeiten_in_verbindun.md |
| lb-azm-09 | Muster - Ergänzungsmodule zur Gleitzeitvereinbarung | Lexis Redaktion | 2026-07 | muster_erganzungsmodule_zur_gleitzeitvereinbarung.md |
| lb-azm-10 | Muster - Gleitzeit-Einzelvereinbarung | Lexis Redaktion | 2026-07 | muster_gleitzeit_einzelvereinbarung.md |
## Bäuerliche Sozialversicherung (BSVG) (`topic: bauerliche-sozialversicherung`) — 18 Einträge · Stand 2025-01 bis 2026-01
@@ -98,7 +107,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-bsv-17 | Pflichtversicherung und Versicherungsgrenzen | Fiedler | 2026-01 | pflichtversicherung_und_versicherungsgrenzen.md |
| lb-bsv-18 | Pflichtversicherung und Versicherungsgrenzen Übergangsbestimmungen | Fiedler | 2026-01 | pflichtversicherung_und_versicherungsgrenzen_uberg.md |
## Beendigungsarten (Austritt, Entlassung, Kündigung) (`topic: beendigungsarten`) — 44 Einträge · Stand 2026-06 bis 2026-08
## Beendigungsarten (Austritt, Entlassung, Kündigung) (`topic: beendigungsarten`) — 66 Einträge · Stand 2026-06 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -146,8 +155,30 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-bnd-42 | Kündigungsfrühwarnsystem | Thöny-Maier | 2026-07 | kundigungsfruhwarnsystem.md |
| lb-bnd-43 | Motivkündigung | Thöny-Maier | 2026-07 | motivkundigung.md |
| lb-bnd-44 | Sozialwidrige Kündigung | Thöny-Maier | 2026-07 | sozialwidrige_kundigung.md |
| lb-bnd-45 | Anspruchsübersicht - Tod des Arbeitnehmers | Thöny-Maier | 2026-06 | anspruchsubersicht_tod_des_arbeitnehmers.md |
| lb-bnd-46 | Checkliste - Ansprüche bei der Entlassung | Thöny-Maier | 2026-06 | checkliste_anspruche_bei_der_entlassung.md |
| lb-bnd-47 | Checkliste - Ansprüche beim Austritt | Thöny-Maier | 2026-06 | checkliste_anspruche_beim_austritt.md |
| lb-bnd-48 | Checkliste - Befristetes Arbeitsverhältnis - worauf zu achten ist | Thöny-Maier | 2026-06 | checkliste_befristetes_arbeitsverhaltnis_worauf_zu.md |
| lb-bnd-49 | Checkliste - Entlassung | Thöny-Maier | 2026-06 | checkliste_entlassung.md |
| lb-bnd-50 | Checkliste - Kündigungsanfechtung Arbeitgeber | Thöny-Maier | 2026-07 | checkliste_kundigungsanfechtung_arbeitgeber.md |
| lb-bnd-51 | Checkliste - Vorgehensweise Kündigung (Arbeitgeber) | Thöny-Maier | 2026-07 | checkliste_vorgehensweise_kundigung_arbeitgeber.md |
| lb-bnd-52 | Checkliste - Vorüberlegungen zur einvernehmlichen Auflösung | Thöny-Maier | 2026-06 | checkliste_voruberlegungen_zur_einvernehmlichen_au.md |
| lb-bnd-53 | Checkliste - Zu beachten bei Auflösung in der Probezeit | Thöny-Maier | 2026-06 | checkliste_zu_beachten_bei_auflosung_in_der_probez.md |
| lb-bnd-54 | Muster: Änderungskündigung (auflösende Bedingung) | Thöny-Maier | 2026-07 | muster_anderungskundigung_auflosende_bedingung.md |
| lb-bnd-55 | Muster - Arbeitgeberkündigung | Thöny-Maier | 2026-07 | muster_arbeitgeberkundigung.md |
| lb-bnd-56 | Muster - Aufforderung Kontaktaufnahme | Thöny-Maier | 2026-06 | muster_aufforderung_kontaktaufnahme.md |
| lb-bnd-57 | Muster - Auflösung in Probezeit | Thöny-Maier | 2026-06 | muster_auflosung_in_probezeit.md |
| lb-bnd-58 | Muster - Einholung einer Rechtsauskunft | Thöny-Maier | 2026-06 | muster_einholung_einer_rechtsauskunft.md |
| lb-bnd-59 | Muster - Entlassung | Thöny-Maier | 2026-06 | muster_entlassung.md |
| lb-bnd-60 | Muster - Information über die Beendigung durch Fristablauf | Thöny-Maier | 2026-06 | muster_information_uber_die_beendigung_durch_frist.md |
| lb-bnd-61 | Muster - Textbaustein Dienstvertrag Befristung zwecks Erprobung | Thöny-Maier | 2026-06 | muster_textbaustein_dienstvertrag_befristung_zweck.md |
| lb-bnd-62 | Muster - Vereinbarung einer einvernehmlichen Lösung | Thöny-Maier | 2026-06 | muster_vereinbarung_einer_einvernehmlichen_losung.md |
| lb-bnd-63 | Muster - Vereinbarung einer neuerlichen Befristung aus sozialen Gründen | Thöny-Maier | 2026-06 | muster_vereinbarung_einer_neuerlichen_befristung_a.md |
| lb-bnd-64 | Muster - Verwarnung wegen Alkoholisierung | Vinzenz | 2026-08 | muster_verwarnung_wegen_alkoholisierung.md |
| lb-bnd-65 | Muster - Verwarnung wegen wiederholten Zuspätkommens | Egger | 2026-08 | muster_verwarnung_wegen_wiederholten_zuspatkommens.md |
| lb-bnd-66 | Muster - Vorübergehende Dienstfreistellung wegen Tatverdachts | Sabara | 2026-06 | muster_vorubergehende_dienstfreistellung_wegen_tat.md |
## Beendigungsphase Sonstiges (Zeugnis, Konkurrenzklausel, Sozialplan, Postensuche) (`topic: beendigungsphase-sonstiges`) — 10 Einträge · Stand 2026-06 bis 2026-08
## Beendigungsphase Sonstiges (Zeugnis, Konkurrenzklausel, Sozialplan, Postensuche) (`topic: beendigungsphase-sonstiges`) — 16 Einträge · Stand 2026-06 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -161,6 +192,12 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-bso-09 | Sozialplan - Abgaben | Mäder | 2026-07 | sozialplan_abgaben.md |
| lb-bso-10 | Verfahren vor dem ASG | Thöny-Maier | 2026-07 | verfahren_vor_dem_asg.md |
| lb-bso-11 | Auflösungsabgabe - bis 31. 12. 2019 | Vinzenz/Sabara | 2026-08 | auflosungsabgabe_bis_31_12_2019.md |
| lb-bso-12 | Checkliste - Bewertungskriterien | Thöny-Maier | 2026-06 | checkliste_bewertungskriterien.md |
| lb-bso-13 | Checkliste - notwendige Zeugnisbestandteile | Thöny-Maier | 2026-06 | checkliste_notwendige_zeugnisbestandteile.md |
| lb-bso-14 | Checkliste - Sinnhaftigkeit Klage | Thöny-Maier | 2026-07 | checkliste_sinnhaftigkeit_klage.md |
| lb-bso-15 | Checkliste - Unzulässige Anmerkungen | Thöny-Maier | 2026-06 | checkliste_unzulassige_anmerkungen.md |
| lb-bso-16 | Checkliste - Zeugniserstellung | Thöny-Maier | 2026-06 | checkliste_zeugniserstellung.md |
| lb-bso-17 | Übersicht - Verfahrensvorbereitung | Thöny-Maier | 2026-07 | ubersicht_verfahrensvorbereitung.md |
## Behinderte Arbeitnehmer (`topic: behinderte`) — 4 Einträge · Stand 2026-06 bis 2026-08
@@ -192,7 +229,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-sva-15 | Verjährung von Sozialversicherungsbeiträgen | Ihradska | 2026-06 | verjahrung_von_sozialversicherungsbeitragen.md |
| lb-sva-16 | Versicherungsschutz in Sonderfällen | Eichinger | 2026-07 | versicherungsschutz_in_sonderfallen.md |
## Beschäftigungsformen & Abgrenzung (`topic: beschaftigungsformen`) — 8 Einträge · Stand 2026-07 bis 2026-08
## Beschäftigungsformen & Abgrenzung (`topic: beschaftigungsformen`) — 10 Einträge · Stand 2025-06 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -204,6 +241,8 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-bes-06 | Geringfügige Beschäftigung | Thöny-Maier | 2026-07 | geringfugige_beschaftigung.md |
| lb-bes-07 | Vertragsangestellte | Egger/David | 2026-08 | vertragsangestellte.md |
| lb-bes-08 | Werkvertrag | Egger/Knell | 2026-08 | werkvertrag.md |
| lb-bes-09 | Muster - Angestelltendienstvertrag | Haider | 2025-06 | muster_angestelltendienstvertrag.md |
| lb-bes-10 | Muster - Arbeiterdienstvertrag | Haider | 2025-06 | muster_arbeiterdienstvertrag.md |
## Betriebsrat & Betriebsvereinbarungen (`topic: betriebsrat`) — 35 Einträge · Stand 2026-07 bis 2026-07
@@ -277,7 +316,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-elt-05 | Elternteilzeit - Kündigungs- und Entlassungsschutz | Sabara | 2026-07 | elternteilzeit_kundigungs_und_entlassungsschutz.md |
| lb-elt-06 | Elternteilzeit - Verfahren bei Nichteinigung | Sabara | 2026-07 | elternteilzeit_verfahren_bei_nichteinigung.md |
## Beendigungsansprüche & Endabrechnung (Abfertigung, Vergleich, Stundenguthaben) (`topic: endabrechnung`) — 25 Einträge · Stand 2025-06 bis 2026-08
## Beendigungsansprüche & Endabrechnung (Abfertigung, Vergleich, Stundenguthaben) (`topic: endabrechnung`) — 34 Einträge · Stand 2025-06 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -306,6 +345,15 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-end-24 | Kündigungsentschädigung - Arbeitsrecht | Haider | 2025-06 | kundigungsentschadigung_arbeitsrecht.md |
| lb-end-25 | Rückzahlung von Darlehen | Posch/Haas | 2026-07 | ruckzahlung_von_darlehen.md |
| lb-end-26 | Ausbildungskostenrückersatz | Haider | 2025-06 | ausbildungskostenruckersatz.md |
| lb-end-27 | Ausbildungskostenrückersatz - Checkliste | Haider | 2025-06 | ausbildungskostenruckersatz_checkliste.md |
| lb-end-28 | Ausbildungskostenrückersatz - Muster | Haider | 2025-06 | ausbildungskostenruckersatz_muster.md |
| lb-end-29 | Beispiel Abrechnung von Zeitschulden | Posch | 2026-07 | beispiel_abrechnung_von_zeitschulden.md |
| lb-end-30 | Beispiel: Freiwillige Abfertigung „Viertel- und Zwölftelregelung" | Mäder | 2026-07 | beispiel_freiwillige_abfertigung_viertel_und_zwolf.md |
| lb-end-31 | Beispiel: Freiwillige Abfertigung/Voll-Übertritt mit Übertragungsbetrag | Mäder | 2026-07 | beispiel_freiwillige_abfertigungvoll_ubertritt_mit.md |
| lb-end-32 | Beispiel - Vergütung von Gleitzeitguthaben bei Beendigung des Arbeitsverhältnisses | Posch | 2026-07 | beispiel_vergutung_von_gleitzeitguthaben_bei_beend.md |
| lb-end-33 | Checkliste - Kündigungsentschädigung | Haider | 2025-06 | checkliste_kundigungsentschadigung.md |
| lb-end-34 | Muster: Vergleichsformulierungen | Haider | 2025-06 | muster_vergleichsformulierungen.md |
| lb-end-35 | Muster: Vordienstzeitenbestätigung vom Vor-Arbeitgeber | Mäder | 2026-07 | muster_vordienstzeitenbestatigung_vom_vor_arbeitge.md |
## Entgelt: Anspruch & Abrechnung (`topic: entgelt`) — 11 Einträge · Stand 2026-06 bis 2026-08
@@ -330,7 +378,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-efz-01 | Entgeltfortzahlung an Feiertagen - Arbeitsrecht | Winkler/Radauer | 2026-07 | entgeltfortzahlung_an_feiertagen_arbeitsrecht.md |
| lb-efz-02 | Entgeltfortzahlung an Feiertagen - Lohnabgaben | Posch | 2026-07 | entgeltfortzahlung_an_feiertagen_lohnabgaben.md |
## Grenzüberschreitender Einsatz & Entsendung (`topic: entsendung`) — 8 Einträge · Stand 2026-07 bis 2026-08
## Grenzüberschreitender Einsatz & Entsendung (`topic: entsendung`) — 11 Einträge · Stand 2026-07 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -342,6 +390,9 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-grz-06 | Entsendung - begünstigte Auslandstätigkeit | Sabara | 2026-08 | entsendung_begunstigte_auslandstatigkeit.md |
| lb-grz-07 | Entsendung - Besteuerungsregelungen | Sabara/David | 2026-08 | entsendung_besteuerungsregelungen.md |
| lb-grz-08 | Standortverlegung | Reissner | 2026-07 | standortverlegung.md |
| lb-grz-09 | Übersicht: Doppelbesteuerungsabkommen | Sabara | 2026-08 | ubersicht_doppelbesteuerungsabkommen.md |
| lb-grz-10 | Übersicht: Eckpunkte Entsendevereinbarung | Sabara | 2026-08 | ubersicht_eckpunkte_entsendevereinbarung.md |
| lb-grz-11 | Übersicht Sozialversicherungsabkommen | Sabara | 2026-08 | ubersicht_sozialversicherungsabkommen.md |
## Papamonat & Familienzeitbonus (`topic: familienzeit`) — 2 Einträge · Stand 2026-07 bis 2026-07
@@ -779,7 +830,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-sch-07 | Schwangerschaft - Meldepflichten Arbeitnehmerin und Arbeitgeber | Sabara | 2026-07 | schwangerschaft_meldepflichten_arbeitnehmerin_und.md |
| lb-sch-08 | Schwangerschaft - Probezeit, Befristung | Sabara | 2026-07 | schwangerschaft_probezeit_befristung.md |
## Schwerarbeit (`topic: schwerarbeit`) — 5 Einträge · Stand 2026-07 bis 2026-07
## Schwerarbeit (`topic: schwerarbeit`) — 6 Einträge · Stand 2026-07 bis 2026-07
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -788,8 +839,9 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-swa-03 | Schwerarbeitspensionen | Schreiber/Marek | 2026-07 | schwerarbeitspensionen.md |
| lb-swa-04 | Schwerarbeitstatbestände | Schreiber/Marek | 2026-07 | schwerarbeitstatbestande.md |
| lb-swa-05 | Schwerarbeit - Meldepflicht des Arbeitgebers | Schreiber/Marek | 2026-07 | schwerarbeit_meldepflicht_des_arbeitgebers.md |
| lb-swa-06 | Checkliste - Vorliegen von Schwerarbeit | Schreiber | 2026-07 | checkliste_vorliegen_von_schwerarbeit.md |
## Sonderzahlungen (`topic: sonderzahlungen`) — 5 Einträge · Stand 2025-06 bis 2026-08
## Sonderzahlungen (`topic: sonderzahlungen`) — 6 Einträge · Stand 2025-06 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -798,6 +850,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-son-03 | Sonderzahlungen - Sozialversicherung | Haider | 2025-06 | sonderzahlungen_sozialversicherung.md |
| lb-son-04 | Sonderzahlungen - Steuer | Gruber/Haas | 2026-08 | sonderzahlungen_steuer.md |
| lb-son-05 | Sonderzahlungen bei Beendigung | Posch/Haas | 2026-07 | sonderzahlungen_bei_beendigung.md |
| lb-son-06 | Sonderzahlungen - Beispiel | Posch | 2026-07 | sonderzahlungen_beispiel.md |
## Teilzeit & Bildungsteilzeit (`topic: teilzeit`) — 6 Einträge · Stand 2026-06 bis 2026-07
@@ -810,7 +863,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-tzb-05 | Teilzeitbeschäftigung - Sonderfälle | Thöny-Maier | 2026-07 | teilzeitbeschaftigung_sonderfalle.md |
| lb-tzb-06 | Teilzeitbeschäftigung - Wechsel Vollzeit/Teilzeit | Thöny-Maier | 2026-07 | teilzeitbeschaftigung_wechsel_vollzeitteilzeit.md |
## Teleworking & Heimarbeit (`topic: telearbeit`) — 6 Einträge · Stand 2025-01 bis 2026-08
## Teleworking & Heimarbeit (`topic: telearbeit`) — 11 Einträge · Stand 2020-12 bis 2026-08
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -820,8 +873,13 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-tel-04 | Telearbeit (Homeoffice) - sozialversicherungsrechtliche Aspekte | Sabara | 2026-08 | telearbeit_homeoffice_sozialversicherungsrechtlich.md |
| lb-tel-05 | Telearbeit (Homeoffice) - Überblick | Sabara | 2026-08 | telearbeit_homeoffice_uberblick.md |
| lb-tel-06 | Telearbeit - steuerrechtliche Aspekte | Sabara | 2025-01 | telearbeit_steuerrechtliche_aspekte.md |
| lb-tel-07 | Beispiel - Telearbeit Differenzwerbungskosten | Sabara | 2025-01 | beispiel_telearbeit_differenzwerbungskosten.md |
| lb-tel-08 | Beispiel - Telearbeit Werbungskosten | Sabara | 2025-01 | beispiel_telearbeit_werbungskosten.md |
| lb-tel-09 | Beispiel - Werbungskosten Arbeitszimmer und digitale Arbeitsmittel | Sabara | 2024-01 | beispiel_werbungskosten_arbeitszimmer_und_digitale.md |
| lb-tel-10 | Muster: Vereinbarung Teleworking | Thöny-Maier | 2020-12 | muster_vereinbarung_teleworking.md |
| lb-tel-11 | Übersicht Unterschiede Homeoffice und Telearbeit | Thöny-Maier | 2026-07 | ubersicht_unterschiede_homeoffice_und_telearbeit.md |
## Überstunden (`topic: uberstunden`) — 4 Einträge · Stand 2025-12 bis 2026-07
## Überstunden (`topic: uberstunden`) — 9 Einträge · Stand 2025-12 bis 2026-07
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -829,8 +887,13 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-ues-02 | Überstundenpauschale und All-in | Thöny-Maier | 2025-12 | uberstundenpauschale_und_all_in.md |
| lb-ues-03 | Überstundenvergütung | Thöny-Maier | 2026-07 | uberstundenvergutung.md |
| lb-ues-04 | Verpflichtung zur Überstundenarbeit | Thöny-Maier | 2026-07 | verpflichtung_zur_uberstundenarbeit.md |
| lb-ues-05 | Muster - All-in-Teilzeitvereinbarungen | Schrank | 2025-12 | muster_all_in_teilzeitvereinbarungen.md |
| lb-ues-06 | Muster - All-inclusive-Vereinbarung | Sabara | 2025-12 | muster_all_inclusive_vereinbarung.md |
| lb-ues-07 | Muster - Überstunden - Allgemeine Vorsorgen | Lexis Redaktion | 2026-07 | muster_uberstunden_allgemeine_vorsorgen.md |
| lb-ues-08 | Muster - Überstundepauschalvereinbarung | Sabara | 2025-12 | muster_uberstundepauschalvereinbarung.md |
| lb-ues-09 | Muster - Zeitausgleichsvereinbarung | Thöny-Maier | 2026-07 | muster_zeitausgleichsvereinbarung.md |
## Urlaub (Anspruch, Entgelt, Verbrauch) (`topic: urlaub`) — 16 Einträge · Stand 2026-06 bis 2026-07
## Urlaub (Anspruch, Entgelt, Verbrauch) (`topic: urlaub`) — 17 Einträge · Stand 2026-06 bis 2026-07
| ID | Titel | Autor | Stand | Datei |
|---|---|---|---|---|
@@ -850,6 +913,7 @@ Generiert am 2026-09-11 · 601 Einträge · 69 Cluster. Quellen: Lexis Briefings
| lb-url-14 | Urlaubsentgelt | Niederfriniger/Krabath | 2026-07 | urlaubsentgelt.md |
| lb-url-15 | Urlaubsersatzleistung - Abgaben | Sicher/Krabath | 2026-06 | urlaubsersatzleistung_abgaben.md |
| lb-url-16 | Urlaubsersatzleistung - Arbeitsrecht | Niederfriniger/Radauer | 2026-07 | urlaubsersatzleistung_arbeitsrecht.md |
| lb-url-17 | Beispiele: Berechnung der Urlaubsersatzleistung | Niederfriniger | 2026-07 | beispiele_berechnung_der_urlaubsersatzleistung.md |
## Vorsorgeleistungen (BMSVG, Betriebspension, Beteiligung) (`topic: vorsorgeleistungen`) — 11 Einträge · Stand 2026-08 bis 2026-08
@@ -0,0 +1,113 @@
---
id: lb-bnd-45
batch: 10
title: "Anspruchsübersicht - Tod des Arbeitnehmers"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_anspruchsubersicht_tod_des_arbeitnehmers.pdf"
text: ".lexis360/md/anspruchsubersicht_tod_des_arbeitnehmers.md"
legal_bases: ["§ 67 Abs 1 und 2 EStG", "§ 67 Abs 3 EStG", "§ 67 Abs 6 EStG"]
tags: [tod-des-arbeitnehmers, abfertigung-alt, abfertigung-neu, urlaubsersatzleistung, sterbebezuege, verlassenschaft]
cross_refs: ["lb-bnd-35", "lb-end-01", "lb-end-03", "lb-url-09", "lb-url-15"]
---
# Anspruchsübersicht: Tod des Arbeitnehmers
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-45).*
## Zusammenfassung
- **Übersichtstabelle** der Ansprüche bei Tod des Arbeitnehmers mit
Spalten Anspruch / Höhe / Bezugsberechtigter / Lohnsteuer /
Sozialversicherung / DB, DZ, KommSt:
- **Laufende Bezüge bis zum Sterbetag:** Anspruch des AN;
Bezugsberechtigter **Verlassenschaft**; LSt **nach Tarif**; SV ja;
DB/DZ/KommSt ja.
- **Sonderzahlungen bis zum Sterbetag:** Anspruch des AN;
Verlassenschaft; LSt **§ 67 Abs 1 und 2 EStG**; SV ja;
DB/DZ/KommSt ja.
- **Mehrleistungen:** Anspruch des AN; Verlassenschaft; LSt
**wie im aufrechten DV**; SV ja; DB/DZ/KommSt wie im
aufrechten DV.
- **Reisekosten:** Anspruch des AN; Verlassenschaft; LSt wie im
aufrechten DV; SV wie im aufrechten DV; DB/DZ/KommSt wie im
aufrechten DV.
- **Abfertigung Alt:** **halber gesetzlicher
Abfertigungsanspruch**; **gesetzliche Erben mit
Unterhaltsanspruch**, bei deren Fehlen **verfällt der
Anspruch**; LSt **6 %**; SV nein; DB/DZ/KommSt nein.
- **Abfertigung Neu (BV-Kasse):** an **Ehegatte und Kinder, für die
Familienbeihilfe bezogen wird**, bei deren Fehlen an die
**Verlassenschaft**; LSt **6 %**; SV nein; DB/DZ/KommSt nein.
- **Urlaubsersatzleistung:** Anspruch auf **offenen
Urlaubsanspruch**; **Erben (auch testamentarisch eingesetzte
Erben)**; LSt **entsprechend der letzten
Bemessungsgrundlage**; SV nein; DB/DZ/KommSt ja.
- **Sterbebezüge (restlicher und darauffolgender Monat):**
**gemäß KV**; je nach KV; LSt nach Tarif; SV nein;
DB/DZ/KommSt ja.
- **Sterbequartal (abhängig von der Dauer des
Arbeitsverhältnisses):** je nach KV; LSt **begünstigt nach
§ 67 Abs 3 EStG** (beim Verstorbenen); SV nein; DB/DZ nein.
- **Sterbequartal bei Abfertigung Alt (unabhängig von der
Dauer des Arbeitsverhältnisses):** je nach KV; LSt **begünstigt
nach § 67 Abs 6 EStG** (beim Verstorbenen); SV nein; DB/DZ nein.
- **Begräbniskosten:** **ohne Rechtsanspruch**, freiwillig durch
den AG; an **Ehegatte, eingetragenen Partner oder Kinder**; LSt
**frei**; SV nein; DB/DZ nein.
- ⚠ Die KommSt-/SV-Zeilen der Tabelle sind im Export teils
umgebrochen; die Zuordnung oben folgt der Tabellenzeile.
## Kernwerte & Fristen (Stand 2026-06)
| Anspruch | Höhe | Bezugsberechtigter | LSt | SV |
|---|---|---|---|---|
| Laufende Bezüge bis Sterbetag | Anspruch des AN | Verlassenschaft | nach Tarif | ja |
| Sonderzahlungen bis Sterbetag | Anspruch des AN | Verlassenschaft | **§ 67 Abs 1/2 EStG** | ja |
| Mehrleistungen | Anspruch des AN | Verlassenschaft | wie aufrechtes DV | ja |
| Reisekosten | Anspruch des AN | Verlassenschaft | wie aufrechtes DV | wie DV |
| **Abfertigung Alt** | **halber gesetzlicher Anspruch** | **gesetzliche Erben mit Unterhaltsanspruch** (sonst Verfall) | **6 %** | nein |
| **Abfertigung Neu (BV)** | — | **Ehegatte + Kinder mit Familienbeihilfe**, sonst Verlassenschaft | **6 %** | nein |
| **Urlaubsersatzleistung** | **offener Urlaubsanspruch** | **Erben (auch testamentarisch eingesetzt)** | **entspr. letzter Bemessungsgrundlage** | nein |
| **Sterbebezüge** (restl. Monat + Folge) | **gemäß KV** | je nach KV | nach Tarif | nein |
| **Sterbequartal** (DV-Dauer-abhängig) | je nach KV | je nach KV | **begünstigt § 67 Abs 3 EStG** (beim Verstorbenen) | nein |
| **Sterbequartal (Abf. Alt)** (DV-Dauer-unabhängig) | je nach KV | je nach KV | **begünstigt § 67 Abs 6 EStG** (beim Verstorbenen) | nein |
| **Begräbniskosten** | **ohne Rechtsanspruch**, freiwillig AG | Ehegatte, eingetragener Partner, Kinder | **frei** | nein |
## Rechtsgrundlagen
- **§ 67 Abs 1 und 2 EStG** (Sonderzahlungen bei Tod) — in der
Tabelle zitiert.
- **§ 67 Abs 3 EStG** (Sterbequartal, DV-Dauer-abhängig) und
**§ 67 Abs 6 EStG** (Sterbequartal bei Abfertigung Alt) — in der
Tabelle zitiert.
- **Familienbeihilfe** (Bezugsberechtigung Abfertigung Neu) — als
Begriff genannt, ohne §-Zitat ⚠.
- KV-Bezug (Sterbebezüge, Sonderzahlungen) ohne §-Zitate.
## Payroll-Relevanz (Odoo)
- **Abfertigung Alt: halber Anspruch** und **Erben mit
Unterhaltsanspruch** (sonst Verfall) = Sonderfall in der
Endabrechnung (→ lb-end-01/02); **Abfertigung Neu: 6 %-Tarif** an
BV-Kasse (→ lb-end-03).
- **Urlaubsersatzleistung an Erben** (offener Anspruch, auch
testamentarische Erben) = Abrechnungsfall in der
Endabrechnung (→ lb-url-09/15/16).
- **Sterbebezüge nach KV** = KV-Parameter (Monat(s)bezug über den
Sterbemonat hinaus).
- **Bezugsberechtigten-Logik** (Verlassenschaft/Erben/BV-Kasse) ist
eine Auszahlungs-/Meldedatenfrage (Lohnzettel, eSV), kein
Entgeltwert.
## Verweise
- **KB-intern:** lb-bnd-35 (Tod des Arbeitnehmers) · lb-end-01
(Abfertigung Alt Abgabenrecht) · lb-end-03
(Abfertigung Neu Verfügungen) · lb-url-09
(Urlaubsersatzleistung) · lb-url-15 (Urlaubsersatzleistung
Abgaben)
@@ -0,0 +1,88 @@
---
id: lb-end-27
batch: 10
title: "Ausbildungskostenrückersatz - Checkliste"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Haider"
stand: 2025-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_ausbildungskostenruckersatz_checkliste.pdf"
text: ".lexis360/md/ausbildungskostenruckersatz_checkliste.md"
legal_bases: ["§ 19 Abs 2 AngG", "§ 27 Z 2 AngG", "§ 82 lit b GewO 1859"]
tags: [ausbildungskosten, rueckerstattung, bindungsdauer, aliquote, minderjaehrige]
cross_refs: ["lb-end-26", "lb-end-28"]
---
# Checkliste: Ausbildungskostenrückersatz
*Lexis Briefings Personalrecht, Haider, Stand Juni 2025 ⚠ Alter Stand (lb-end-27).*
## Zusammenfassung
Voraussetzungen für die Rückforderung von Ausbildungskosten:
- **Überbetriebliche Verwertbarkeit** der Bildungsmaßnahme
(keine Einschulung).
- **Schriftliche Vereinbarung.**
- **Rückzahlungspflicht für die gesamten Aufwendungen** des
Arbeitgebers vereinbart:
- Kosten der Ausbildung **ohne USt** und unter Einrechnung von
Förderungen etc.;
- **Entgelt** (extra Erwähnung erforderlich!);
- **Rahmenkosten** (Hotel, Anreise) — nur sofern notwendig und
erforderlich.
- **Aliquotierungsregelung** (zwingend: **monatliche** Reduktion der
Rückzahlungsverpflichtung).
- **Bindungsdauer** maximal **4** (in Ausnahmefällen **8**) **Jahre**
nach Ende der Ausbildung.
- Bei **Minderjährigen**: Zustimmung des Erziehungsberechtigten.
- Kein Rückersatz, wenn das Arbeitsverhältnis endet
- während der **Probezeit** iSd **§ 19 Abs 2 AngG** (oder
gleichlautender gesetzlicher Bestimmungen),
- durch **unbegründete Entlassung**,
- durch **begründeten vorzeitigen Austritt**,
- durch Entlassung wegen **dauernder Arbeitsunfähigkeit** nach
**§ 27 Z 2 AngG** oder **§ 82 lit b GewO 1859**,
- durch **Kündigung durch den Arbeitgeber** — es sei denn, der
Arbeitnehmer hat durch schuldhaftes Verhalten dazu begründeten
Anlass gegeben.
## Kernwerte & Fristen (Stand 2025-06, ⚠ Alter Stand)
| Kriterium | Regel |
|---|---|
| Verwertbarkeit | überbetrieblich (keine Einschulung) |
| Form | schriftliche Vereinbarung |
| Kostenbasis | Ausbildungskosten o. USt (Förderungen abgezogen) + Entgelt (extra!) + notwendige Rahmenkosten |
| Aliquotierung | zwingend monatlich |
| Bindungsdauer | max. **4 Jahre** (Ausnahme: 8) |
| Minderjährige | Elterngenehmigung |
| Beendigungsschutz | Probezeit / unbegründete Entlassung / begründeter Austritt / dauernde AU (§ 27 Z 2 AngG, § 82 lit b GewO) / AG-Kündigung ohne AN-Verschulden |
## Rechtsgrundlagen
- **§ 19 Abs 2 AngG** (Probemonat, Angestellte) — zitiert.
- **§ 27 Z 2 AngG** (Entlassung bei dauernder Arbeitsunfähigkeit) —
zitiert.
- **§ 82 lit b GewO 1859** (Arbeiter, dauernde Arbeitsunfähigkeit) —
zitiert.
## Payroll-Relevanz (Odoo)
- **Rückforderung von Ausbildungskosten** ist ein eigener
Forderungsanspruch des Arbeitgebers → im End-of-employment-Modell als
abgrenzbare Forderung abbilden (separat von Vorschüssen → lb-end-06,
Darlehen → lb-end-25).
- **Monatliche Aliquotierung** ist die zentrale Bemessungslogik
(Rückstandsbetrag = Gesamtkosten × verbleibende Monate / Bindungsdauer).
- **Beendigungsart-Abgrenzung**: die Checkliste listet Beendigungsarten,
bei denen der Rückersatzanspruch entfällt — diese Abgrenzung muss in
der Abrechnungslogik als Beendigungsart-Prüfung implementiert sein.
## Verweise
- **KB-intern:** lb-end-26 (Ausbildungskostenrückersatz — Rahmen) ·
lb-end-28 (Muster) · lb-end-06 (Aufrechnung mit offenen Vorschüssen) ·
lb-end-25 (Rückzahlung von Darlehen)
@@ -0,0 +1,91 @@
---
id: lb-end-28
batch: 10
title: "Ausbildungskostenrückersatz - Muster"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Haider"
stand: 2025-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_ausbildungskostenruckersatz_muster.pdf"
text: ".lexis360/md/ausbildungskostenruckersatz_muster.md"
legal_bases: ["§ 27 Z 2 AngG", "§ 82 lit b GewO 1859"]
tags: [ausbildungskosten, rueckerstattung, bindungsdauer, aliquote, abbruch, muster]
cross_refs: ["lb-end-26", "lb-end-27"]
---
# Muster: Ausbildungskostenrückersatz
*Lexis Briefings Personalrecht, Haider, Stand Juni 2025 ⚠ Alter Stand (lb-end-28).*
## Zusammenfassung
- **Gegenstand:** Verpflichtung zur **Rückerstattung von
Ausbildungskosten** — Lehrgang/Kurs/Seminar [Bezeichnung] in der Zeit
von [ ] bis [ ].
- **Verwertbarkeits-Klausel:** Die Maßnahme vermittelt
„Spezialkenntnisse theoretischer und praktischer Art, die dieser auch
**überbetrieblich** bei anderen Arbeitgebern verwerten kann. Die
Aus- und Weiterbildungsmaßnahme **stellt keine Einschulung dar**."
- **Dienstfreistellung + Entgelt:** Der Arbeitgeber stellt den
Arbeitnehmer „unter **Fortzahlung des Entgelts** vom Dienst frei,
soweit dies aufgrund der Kurszeiten erforderlich ist (maximal im
Ausmaß von [X] Arbeitstagen)" — das fortbezahlte Entgelt wird in die
Rückersatzverpflichtung einbezogen.
- **Kostenbasis:** Kurskosten **zzgl USt** (bzw. „ohne USt" je nach
Vereinbarung) + fortbezahltes Entgelt (inkl. allfälliger Sonder­
zahlungen) + Reisekosten (Zugfahrten + **Mittelklassehotel**).
- **Bindungsdauer:** Beispiel: **drei Jahre** ab erfolgreichem
Abschluss; **Verringerung um 1/36** nach jedem vollendeten Monat der
Dienstzugehörigkeit ab Kursabschluss.
- **Beendigungsschutz (wie Checkliste):** entfällt bei Ende während
Probezeit, unbegründeter Entlassung, begründetem vorzeitigem Austritt,
Entlassung wegen dauernder Arbeitsunfähigkeit (§ 27 Z 2 AngG /
§ 82 lit b GewO 1859) oder AG-Kündigung ohne AN-Schuld.
- **Abbruch:** „Wird die Ausbildung aus **Verschulden des
Arbeitnehmers** vor Abschluss abgebrochen bzw deren erfolgreiche
Absolvierung vereitelt, so verpflichtet sich der Arbeitnehmer zum
**Rückersatz sämtlicher** dem Arbeitgeber dadurch entstehender
Nachteile."
- **Aliquotierung (Fußnote):** „Es ist **zwingend** eine monatliche
Aliquotierung vorzunehmen, wobei die Rückforderungsfrist im
Regelfall maximal **4 Jahre** betragen kann (also Verringerung um
maximal **1/48**)."
## Kernwerte & Fristen (Stand 2025-06, ⚠ Alter Stand)
| Kriterium | Regel im Muster |
|---|---|
| Bindungsdauer | Beispiel: 3 Jahre (max. 4 Jahre, Ausnahme: 8) |
| Aliquotierung | **zwingend monatlich**; max. 1/48 (4 Jahre) |
| Kostenbasis | Kurskosten (+ USt) + Entgelt (inkl. SZ) + Reise (Zug + Mittelklassehotel) |
| Dienstfreistellung | Fortzahlung während Kurszeit (max. X Arbeitstage) |
| Abbruch (AN-Schuld) | Rückersatz sämtlicher Nachteile |
## Rechtsgrundlagen
- **§ 27 Z 2 AngG** (dauernde Arbeitsunfähigkeit) — zitiert
(Beendigungsschutz).
- **§ 82 lit b GewO 1859** (Arbeiter, dauernde Arbeitsunfähigkeit) —
zitiert (Beendigungsschutz).
- Übrige Klauseln ohne §-Zitate (Vertragsmechanik).
## Payroll-Relevanz (Odoo)
- **Fristen-Logik** (Bindungsdauer, monatliche Aliquotierung,
Beendigungsart-Abgrenzung) ist ein eigenes Berechnungsmodul in der
Endabrechnung — die Kostenbasis und die Beendigungsart-Prüfung sind
die zwei zentralen Parameter.
- **Entgeltfortzahlung während Dienstfreistellung** ist ein eigener
Work-Entry-Typ (kein Urlaub) — in der Abrechnung als
Fortzahlungsereignis kennzeichnen.
- **Abbruch-Klausel** (AN-Schuld → volles Rückersatz) ist eine
alternative Forderungsbemessung (kein Aliquot) — als separater
Berechnungspfad implementieren.
## Verweise
- **KB-intern:** lb-end-26 (Ausbildungskostenrückersatz — Rahmen) ·
lb-end-27 (Checkliste) · lb-end-06 (Aufrechnung mit offenen
Vorschüssen) · lb-end-25 (Rückzahlung von Darlehen)
@@ -0,0 +1,104 @@
---
id: lb-end-29
batch: 10
title: "Beispiel Abrechnung von Zeitschulden"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Posch"
stand: 2026-07
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_abrechnung_von_zeitschulden.pdf"
text: ".lexis360/md/beispiel_abrechnung_von_zeitschulden.md"
legal_bases: []
tags: [zeitschulden, minusstunden, rollung, mbgm, bgn-storno, aufrollung]
cross_refs: ["lb-end-08", "lb-end-09", "lb-end-10"]
---
# Beispiel: Abrechnung von Zeitschulden
*Lexis Briefings Personalrecht, Posch, Stand Juli 2026 (lb-end-29).*
## Zusammenfassung
> **Hinweis der Quelle:** Das Beispiel zeigt die Rückverrechnung von
> Zeitschulden, die in Beitragszeiträumen **bis 31. 12. 2018**
> entstanden sind. Die Art der Berechnung gilt auch für Beitragszeiträume
> **nach** dem 31. 12. 2018, allerdings sind **abweichende Meldungen
> zur Sozialversicherung** zu beachten: Anstatt der berichtigten
> Beitrags(grundlagen)nachweise ist die **mBGM durch Storno und
> Neumeldung** zu korrigieren.
**Sachverhalt (Auszug; Beispiel entnommen aus PVP 2017/68):**
Angestellte, 40 h/Woche, 12/2016 20 Minusstunden (Zeitschuld) — im
1. Q 2017 einzuarbeiten, sonst Lohnabzug. 1/2017 2 Überstunden mit 50 %
Zuschlag = 3 h Gegenrechnung → Rest **17 Minusstunden**. DV-Ende
20. 3. 2017 durch **unberechtigten vorzeitigen Austritt** (DN-Kündigung
ohne Frist; korrektes Ende wäre 30. 4. 2017). Gehalt 2016 € 2.340, /
2017 € 2.400,; UZ + WR je 390,00 (12/2016).
**Berechnungsschritte:**
1. **Bruttobetrag der Zeitschuld:** € 2.400, (Gehalt 2017) : 4,33 :
40 Wochenstunden × 17 Minusstunden = **€ 235,57**.
2. **„Aufrollung" Dezember 2016 (Gutschrift der SV-Beiträge):**
€ 235,57 × 18,12 % = **€ 42,69** (im Austrittsmonat
SV-gutschriftlich).
3. **Abrechnung März 2017 (Auszug):**
- Bruttogehalt 20/30 Tage: € 1.600,; UZ + WR aliquot:
(€ 2.400, : 365 × 79 KT) × 2 = € 1.038,90.
- SV-Beiträge: Gehalt € 1.600, × **17,12 %** = € 273,92;
Gutschrift Aufrollung + € 42,69; SZ € 1.038,90 × **14,12 %** =
€ 146,69 (beides inkl. **AlV-Reduzierung wegen
Niedrigverdienst**: laufend 1 %, SZ 3 %).
- Lohnsteuer laufend: Bemessungsgrundlage € 1.133,20 (nach
SV-Abzug, SV-Gutschrift und Abzug der Minusstunden-Brutto);
35 % € 13,94/tage → € 117,89.
- Lohnsteuer SZ: Bemessungsgrundlage € 272,21 (nach Abzug des
SV-Beitrags und des **Freibetrags € 620,**) × **6 %**
€ 16,33.
- **Rückverrechnung Minusstunden € 235,57** (vom
Auszahlungsbetrag; Bemessungsgrundlagen für **KommSt (3 %),
DB (4,1 %), DZ (Wien/NÖ 0,40 %)** bleiben unberührt).
4. **SV-Meldungen 2016 (Rollung Minusstunden):** D1 € 88,93,
KU € 1,18, WF € 2,36, IESG € 0,82 (Gesamt € 93,29);
**BGN 2016: Storno „alter" BGN** (laufende Bezüge € 4.680,
€ 4.444,43; BV-Beitragsgrundlage 12/12 € 3.120, → € 2.884,43),
**neuer BGN** gemeldet.
## Kernwerte & Fristen (Stand 2026-07)
| Wert | Detail |
|---|---|
| Brutto-Zeitschuld | Gehalt : 4,33 : Wochenstunden × Minusstunden (hier € 235,57) |
| SV-Gutschrift (Aufrollung) | Brutto-Zeitschuld × **18,12 %** (hier € 42,69) |
| SV-Sätze 3/2017 | laufend **17,12 %**, SZ **14,12 %** (jeweils inkl. AlV-Niedrigverdienst-Reduktion: 1 % / 3 %) |
| LSt SZ | **6 %** nach Freibetrag **€ 620,** |
| SV-Korridore 2016 | D1 37,75 %, KU 0,5 %, WF 1 %, IESG 0,35 % |
| Abgaben-Bemessung | KommSt **3 %**, DB **4,1 %**, DZ **0,4 %** (Wien/NÖ) — durch Minusstunden nicht gekürzt |
| SV-Meldung | bis 12/2018: berichtigter BGN (Storno/Neu); **ab 1/2019: mBGM-Storno + Neumeldung** |
## Rechtsgrundlagen
- Keine §-Zitate im Beispiel (Berechnungs-/Meldepraxis). Quelle des
Beispiels: **PVP 2017/68** (Pensionsversicherungsanstalt).
- Rahmen der Endabrechnung: → lb-end-08 (Zeitschulden,
Gehaltserhöhungen), lb-end-09/10 (Mehr-/Überstunden, Zeitguthaben).
## Payroll-Relevanz (Odoo)
- **Zeitschulden-Rückverrechnung** = eigener Abrechnungspfad in der
Endabrechnung: Brutto-Zeitschuld (Stundensatz aus Monatsgehalt,
4,33-Tagester, Wochenstundenzahl), SV-Aufrollung, LSt-Satz und
SV-Beitragskürzung müssen als Regelketten implementiert sein.
- **Meldedatums-Abgrenzung (2018/2019)** ist ein harter
Versionsanker: bis 2018 BGN-Korrektur, ab 2019 mBGM-Storno/Neu —
je SV-Beitragsperiode zu unterscheiden.
- **KommSt/DB/DZ-Bemessung** bleibt bei Zeitschulden-Rückrechnung
unverändert — keine Kürzung der Bemessungsgrundlagen.
## Verweise
- **KB-intern:** lb-end-08 (Endabrechnung — Zeitschulden und
Gehaltserhöhungen) · lb-end-09 (Mehr-/Überstunden ohne
Durchrechnungszeitraum) · lb-end-10 (Zeitguthaben bei
durchrechenbarer Arbeitszeit) · lb-end-32 (Gleitzeitguthaben-Beispiel)
@@ -0,0 +1,100 @@
---
id: lb-end-30
batch: 10
title: "Beispiel: Freiwillige Abfertigung „Viertel- und Zwölftelregelung""
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Mäder"
stand: 2026-07
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_freiwillige_abfertigung_viertel_und_zwolf.pdf"
text: ".lexis360/md/beispiel_freiwillige_abfertigung_viertel_und_zwolf.md"
legal_bases: ["§ 67 Abs 6 EStG", "§ 67 Z 1 und Z 2 EStG"]
tags: [freiwillige-abfertigung, viertelregelung, zwolftelregelung, sechstel, hbg-deckel, vordienstzeiten]
cross_refs: ["lb-end-13", "lb-end-12", "lb-end-15", "lb-end-31", "lb-end-35"]
---
# Beispiel: Freiwillige Abfertigung — „Viertel- und Zwölftelregelung"
*Lexis Briefings Personalrecht, Mäder, Stand Juli 2026 (lb-end-30).*
## Beispiel 1 — „Viertelregelung" (Abfertigung-Alt)
**Angaben:** Abfertigung-Alt; vertragliche freiwillige Abfertigung
brutto € 25.000,; laufende Bezüge der letzten 12 Monate € 85.000,;
kein Vordienstzeitennachweis.
| Schritt | Betrag |
|---|---|
| ¼ von € 85.000, (letzte 12 Monate) | € 21.250, |
| abzüglich vereinbarter Abfertigungsanspruch | € 25.000, |
| „Viertelregelung" übersteigender Teil | € 3.750, |
- **Begünstigt (mit 6 % abrechenbar):** € 21.250, — geringer als das
**Neunfache der HBG** (2026: € 62.370,) → **keine Deckelung**.
- **Nicht begünstigt (laufender Monatstarif, gemeinsam mit den
laufenden Bezügen des Auszahlungsmonats):** € 3.750,.
## Beispiel 2 — „Viertel- und Zwölftelregelung" (Abfertigung-Alt + Vordienstzeit)
**Angaben:** Abfertigung-Alt; Betriebszugehörigkeit **21 Jahre**;
vertragliche freiwillige Abfertigung € 60.000,; gesetzliche Abfertigung
€ 63.750,; laufende Bezüge letzte 12 Monate € 85.000,;
**Vordienstzeit: 7 Jahre** beim Vorarbeitgeber (Bestätigung vorgelegt;
dort bereits € 18.591, gesetzliche + freiwillige Abfertigung erhalten).
**a) Viertelregelung:** ¼ × € 85.000, = € 21.250,; abzüglich € 60.000,
→ übersteigender Teil € 38.750,.
**b) Zwölftelregelung:** (7 Jahre Vordienstzeit + 21 Jahre aktuelle
Dienstzeit = 28 Jahre → **12/12** von € 85.000,) = € 85.000,;
abzüglich: erhaltene Abfertigungszahlungen bei Vordienstgeber
€ 18.591,; gesetzliche Abfertigungszahlung aus aktuellem DV
€ 63.750,; **zusätzlich als begünstigte freiwillige Abfertigung
abrechenbar: + € 2.659,**.
- **Begünstigt (6 %):** € 21.250, + € 2.659, = **€ 23.909,**.
- **Nicht begünstigt (laufender Monatstarif):** € 60.000,
€ 23.909, = **€ 36.091,** (begünstigter Abfertigungsteil gem
**§ 67 Abs 6, 1. und 2. Satz EStG**).
- **Hinweis der Quelle:** Die Deckelung der Abfertigung mit einem
Vielfachen der ASVG-Höchstbeitragsgrundlage iSd **§ 67 Z 1 und
Z 2 EStG** kommt in diesem Beispiel **nicht** zur Anwendung.
## Kernwerte & Fristen (Stand 2026-07)
| Wert | Detail |
|---|---|
| Viertelregelung | ¼ der laufenden Bezüge der letzten **12 Monate** |
| Zwölftelregelung | (Vordienstzeit + aktuelle Dienstzeit) in 1/12-Schritten × 12-Monats-Bezüge; erhaltene Abfertigungen werden abgezogen |
| Begünstigter Teil | **6 %** (Sechstel, § 67 Abs 6 EStG) |
| Übersteigender Teil | **laufender Monatstarif** (gemeinsam mit den Bezügen des Auszahlungsmonats) |
| HBG-Deckel (2026) | **9 × HBG = € 62.370,** (iSd § 67 Z 1/Z 2 EStG; im Bsp. nicht erreicht) |
## Rechtsgrundlagen
- **§ 67 Abs 6 EStG** (1. und 2. Satz — begünstigter Abfertigungsteil) —
zitiert.
- **§ 67 Z 1 und Z 2 EStG** (Deckelung mit Vielfachen der
ASVG-Höchstbeitragsgrundlage) — im Hinweis zitiert.
## Payroll-Relevanz (Odoo)
- **Viertel-/Zwölftel-Berechnung** sind zwei abgrenzbare
Berechnungspfade in der Abfertigungs-Logik — die
Vordienstzeitenbestätigung (→ lb-end-35) ist der Beleg für die
Zwölftelregelung.
- **Deckel (9 × HBG, § 67 Z 1/Z 2 EStG)** ist ein harter
Versionsanker — als `hr.rule.parameter` je Jahr parametrisieren.
- **SV- und BV-Folgen** der freiwilligen Abfertigung: → lb-end-15
(Sozialversicherung), lb-end-12 (Lohnnebenkosten).
- **Voll-Übertritt in Abfertigung Neu** mit Übertragungsbetrag →
lb-end-31 (eigener Steuerpfad).
## Verweise
- **KB-intern:** lb-end-13 (Freiwillige Abfertigung — LSt,
Abfertigung-Alt) · lb-end-12 (Lohnnebenkosten) · lb-end-15
(Sozialversicherungsrecht) · lb-end-31 (Voll-Übertritt mit
Übertragungsbetrag) · lb-end-35 (Vordienstzeitenbestätigung)
@@ -0,0 +1,77 @@
---
id: lb-end-31
batch: 10
title: "Beispiel: Freiwillige Abfertigung/Voll-Übertritt mit Übertragungsbetrag"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Mäder"
stand: 2026-07
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_freiwillige_abfertigungvoll_ubertritt_mit.pdf"
text: ".lexis360/md/beispiel_freiwillige_abfertigungvoll_ubertritt_mit.md"
legal_bases: ["§ 67 Abs 6 EStG"]
tags: [freiwillige-abfertigung, voll-ubertritt, ubertragungsbetrag, jahresviertel, abfertigung-neu]
cross_refs: ["lb-end-16", "lb-end-14", "lb-end-30", "lb-end-03"]
---
# Beispiel: Freiwillige Abfertigung / Voll-Übertritt mit Übertragungsbetrag
*Lexis Briefings Personalrecht, Mäder, Stand Juli 2026 (lb-end-31).*
## Zusammenfassung
**Angaben:**
- Eintritt: 1. 6. 1995
- **Voll-Übertritt** in das System **Abfertigung Neu** per **1. 4. 2006**
- **Übertragungsbetrag** anlässlich des Übertritts (inkl. Verzugszinsen):
**€ 10.500,**
- Beendigung: einvernehmliche Auflösung
- Laufende Bezüge der letzten 12 Monate (zum Zeitpunkt der Beendigung¹):
**€ 32.400,**
- freiwillige Abfertigung anlässlich des Austritts: **€ 20.000,**
¹ **LStR 2002 Rz 1087i.**
**Lösung — Versteuerung der freiwilligen Abfertigung:**
1. **Jahresviertel** gem. **§ 67 Abs 6, 1. Satz EStG** mit **6 %**:
€ 32.400, / 4 = **€ 8.100,**
2. Der € 8.100, **übersteigende Betrag** wird wie ein laufender Bezug
nach dem **Lohnsteuertarif** veranlagt:
€ 20.000, € 8.100, = **€ 11.900,**
## Kernwerte & Fristen (Stand 2026-07)
| Wert | Detail |
|---|---|
| Begünstigter Teil | **Jahresviertel** (¼ der laufenden Bezüge der letzten 12 Monate) → **6 %** (§ 67 Abs 6, 1. Satz EStG) |
| Übersteigender Teil | **laufender Lohnsteuertarif** (gemeinsam mit den Bezügen des Auszahlungsmonats) |
| Übertragungsbetrag | € 10.500, (inkl. Verzugszinsen) — im Beispiel nur als Sachverhalt, nicht in der Berechnung |
## Rechtsgrundlagen
- **§ 67 Abs 6, 1. Satz EStG** (Jahresviertel / begünstigter Teil) —
zitiert.
- **LStR 2002 Rz 1087i** (Zeitpunkt der Bezugsfeststellung) — in
Fußnote zitiert.
## Payroll-Relevanz (Odoo)
- **Voll-Übertritt in Abfertigung Neu** ist ein eigener
Abrechnungsfall: die freiwillige Abfertigung wird über das
Jahresviertel (6 %) + laufender Tarif bemessen — **nicht** über die
Viertel-/Zwölftelregelung der Abfertigung-Alt (→ lb-end-30).
- **Übertragungsbetrag** (inkl. Verzugszinsen) ist ein eigener
Entgeltbestandteil mit eigenen LSt/SV-Folgen → als
`hr.rule.parameter` je Übertrittszeitpunkt abbilden.
- **Abfertigung-Neu-System** (→ lb-end-03) hat eigene
Verfügungsmöglichkeiten — die Abrechnungslogik muss das System
(Alt/Neu) und den Übertrittszeitpunkt als harte Parameter führen.
## Verweise
- **KB-intern:** lb-end-16 (Freiwillige Abfertigung — LSt,
Übertritt Abfertigung Neu) · lb-end-14 (Abfertigung Neu — LSt) ·
lb-end-30 (Viertel-/Zwölftelregelung, Abfertigung-Alt) · lb-end-03
(Abfertigung Neu — Verfügungsmöglichkeiten)
@@ -0,0 +1,70 @@
---
id: lb-tel-07
batch: 10
title: "Beispiel - Telearbeit Differenzwerbungskosten"
work: "Lexis Briefings Personalrecht"
chapter: "Außerhalb des Betriebsstandortes"
topic: telearbeit
author: "Sabara"
stand: 2025-01
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_telearbeit_differenzwerbungskosten.pdf"
text: ".lexis360/md/beispiel_telearbeit_differenzwerbungskosten.md"
legal_bases: ["§ 16 Abs 1 Z 7a lit b EStG"]
tags: [telearbeit, telearbeitspauschale, differenzwerbungskosten, veranlagung, lohnzettel]
cross_refs: ["lb-tel-08", "lb-tel-06", "lb-tel-11"]
---
# Beispiel: Telearbeit Differenzwerbungskosten
*Lexis Briefings Personalrecht, Sabara, Stand Jänner 2025 (lb-tel-07).*
## Zusammenfassung
- **Differenzwerbungskosten:** Zahlt der Arbeitgeber ein **niedrigeres**
Telearbeitspauschale als den höchstmöglichen Tageswert, darf der
Arbeitnehmer die **Differenz** in der Arbeitnehmerveranlagung als
Werbungskosten gem. **§ 16 Abs 1 Z 7a lit b EStG** geltend machen.
- **Beispiel 1:** 42 Telearbeitstage, AG zahlt € 2,50/Tag (€ 105); höchst
zustehendes Pauschale € 3/Tag (€ 126) → Differenz **€ 21** in der
Veranlagung.
- **Beispiel 2:** 115 Telearbeitstage im Lohnzettel, AG zahlt nur für
50 Tage (€ 150) → in der Arbeitnehmerveranlagung zusätzlich **€ 150** als
Werbungskosten (Quellenwert; rechnerisch ergäben die 65 nicht bezahlten
Tage × € 3 = € 195 — ⚠ Inkonsistenz der Quelle, nicht rekonstruieren;
vor Verlässmachung im EStG-/LStR-Zusammenhang prüfen).
- Voraussetzung in beiden Beispielen: Arbeitsleistung **ausschließlich in der
Wohnung (außerhalb eines Arbeitszimmers)** — das ist die
Telearbeitspauschale-Figur des § 16 Abs 1 Z 7a lit b EStG, nicht die
Homeoffice-Pauschale-Figur (→ lb-tel-09).
## Kernwerte & Fristen (Stand 2025-01)
| Wert | Beispiel 1 | Beispiel 2 |
|---|---|---|
| Telearbeitstage | 42 | 115 (im Lohnzettel ausgewiesen) |
| AG-Zuwendung | € 2,50/Tag = € 105 | € 3/Tag für 50 Tage = € 150 |
| Höchstpauschale | € 3/Tag = € 126 | € 3/Tag (115 Tage) |
| Differenz-Werbungskosten (Veranlagung) | **€ 21** | **€ 150** (Quellenwert, ⚠ s.o.) |
## Rechtsgrundlagen
- **§ 16 Abs 1 Z 7a lit b EStG** (Differenzwerbungskosten bei
Telearbeitspauschale) — im Beispiel 1 ausdrücklich zitiert; Beispiel 2
wendet die gleiche Figur an.
## Payroll-Relevanz (Odoo)
- Der AG-Zahlbetrag und die **Anzahl der Telearbeitstage** sind die
Abrechnungsfakten; die Differenz ist **Arbeitnehmerseite** (Veranlagung) —
in der Lohnabrechnung nur die nicht steuerbare Zuwendung und die
Tagesausweisung im Lohnzettel (Meldung!) relevant.
- **Lohnzettel-Telearbeitstage** (Beispiel 2) = Meldedaten (L16/eSV):
Abwesenheit der Tagesausweisung führt zum Verlust des
Differenzanspruchs → Tageszahlen sauber erfassen.
## Verweise
- **KB-intern:** lb-tel-08 (Telearbeit Werbungskosten, Pauschalen-
Abzugslogik) · lb-tel-06 (Telearbeit steuerliche Aspekte) · lb-tel-11
(Homeoffice vs. Telearbeit)
@@ -0,0 +1,64 @@
---
id: lb-tel-08
batch: 10
title: "Beispiel - Telearbeit Werbungskosten"
work: "Lexis Briefings Personalrecht"
chapter: "Außerhalb des Betriebsstandortes"
topic: telearbeit
author: "Sabara"
stand: 2025-01
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_telearbeit_werbungskosten.pdf"
text: ".lexis360/md/beispiel_telearbeit_werbungskosten.md"
legal_bases: []
tags: [telearbeit, telearbeitspauschale, werbungskosten, digitale-arbeitsmittel, berufsnutzung]
cross_refs: ["lb-tel-07", "lb-tel-09", "lb-tel-06"]
---
# Beispiel: Telearbeit Werbungskosten
*Lexis Briefings Personalrecht, Sabara, Stand Jänner 2025 (lb-tel-08).*
## Zusammenfassung
- **Prinzip:** Das vom Arbeitgeber **nicht steuerbar** gezahlte
Telearbeitspauschale wird vom anteiligen Anschaffungswert der digitalen
Arbeitsmittel **abgezogen**; nur der Überhang ist Werbungskosten.
- **Beispiel:** AG zahlt € 60 (€ 3 für 20 Telearbeitstage); Arbeitnehmer
kauft einen € 200-Drucker mit **60 % beruflicher Nutzung** = € 120
anrechnungsfähig; abzüglich € 60 Pauschale → **€ 60 Werbungskosten**.
- **Variante:** Drucker € 100 (60 % = € 60) ist vollständig durch die
€ 60 Pauschale gedeckt → **keine** zusätzlichen Werbungskosten.
- Die Quelle zitiert keine §-Norm; die Figuren gehören zum
Telearbeitspauschale-/Arbeitsmittel-Regime (§ 16 Abs 1 Z 7a lit b und
§ 20 Abs 1 Z 2 lit d EStG) — ⚠ §-Zuordnung vor Verlässmachung gegen
LStR verifizieren.
## Kernwerte & Fristen (Stand 2025-01)
| Posten | Beispiel | Variante |
|---|---|---|
| Telearbeitspauschale (AG, nicht steuerbar) | € 60 (20 Tage × € 3) | € 60 |
| Anschaffung (Drucker) | € 200 | € 100 |
| Berufsnutzung | 60 % = € 120 | 60 % = € 60 |
| Werbungskosten (Überhang) | **€ 60** | **€ 0** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Beispiel ohne Normenkette) — ⚠ Figuren
gehören zum EStG-Werbungskostenregime für Telearbeit (→ lb-tel-07 nennt
§ 16 Abs 1 Z 7a lit b EStG, lb-tel-09 § 20 Abs 1 Z 2 lit d EStG).
## Payroll-Relevanz (Odoo)
- AG-seitig: die **nicht steuerbare Pauschalzuwendung** und die
Telearbeitstage im Lohnzettel (Meldung) sind die Abrechnungsfakten;
die Werbungskosten-Seite liegt beim Arbeitnehmer.
- **Berufsnutzung %** (60 %) ist ein Arbeitnehmereingabewert für die
Veranlagung, kein Lohnverrechnungswert.
## Verweise
- **KB-intern:** lb-tel-07 (Differenzwerbungskosten) · lb-tel-09
(Arbeitszimmer + digitale Arbeitsmittel) · lb-tel-06 (steuerliche
Aspekte Telearbeit)
@@ -0,0 +1,90 @@
---
id: lb-end-32
batch: 10
title: "Beispiel - Vergütung von Gleitzeitguthaben bei Beendigung des Arbeitsverhältnisses"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Posch"
stand: 2026-07
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_vergutung_von_gleitzeitguthaben_bei_beend.pdf"
text: ".lexis360/md/beispiel_vergutung_von_gleitzeitguthaben_bei_beend.md"
legal_bases: ["§ 19e AZG"]
tags: [gleitzeitguthaben, zeitausgleich, normalstundenteiler, zuschlag, laufender-bezug]
cross_refs: ["lb-end-10", "lb-end-05", "lb-end-08"]
---
# Beispiel: Vergütung von Gleitzeitguthaben bei Beendigung des Arbeitsverhältnisses
*Lexis Briefings Personalrecht, Posch, Stand Juli 2026 (lb-end-32).*
## Zusammenfassung
**Angaben:** Vollzeit-Angestellter; Beginn 1. 3. 2016
(Abfertigungssystem **NEU**); Ende **31. 3. 2019** durch
Arbeitnehmerkündigung; 40 h/Woche; **Normalstundenteiler = 173**;
Resturlaubsanspruch 0; Bruttomonatsgehalt **€ 2.500,**; UZ/WR je
€ 2.500, (im Austrittsjahr keine ausgezahlt); Gleitzeitperiode
Kalenderjahr; offenes **Gleitzeitguthaben: 28,5 Stunden**.
**1. Berechnung der Beendigungsansprüche:**
- **Anteiliger UZ/WR** für 1. 1.31. 3. (90 KT):
(€ 2.500, × 90 KT / 365) = **€ 616,44 brutto** (je UZ und WR).
- **Vergütung des Zeitguthabens** (1,5-fach):
€ 2.500, × 28,5 × 1,5 / **173** = **€ 617,77**.
**2. Abrechnung (Auszug März 2019):**
- Brutto-Gesamt: Gehalt € 2.500, + UZ € 616,44 + WR € 616,44 +
Zeitguthaben € 617,77 = **€ 4.350,65**.
- SV: laufende Bezüge € 3.117,77 × **18,12 %** = € 564,94 (FN 4:
(€ 2.500, + € 617,77) × 18,12 % = € 563,38); SZ € 1.232,88 ×
**14,12 %** = € 174,08 (FN 3: (€ 616,44 + € 616,44) × 14,12 % =
€ 173,47 → **AlV-Verminderung**).
- LSt: Freibetrag € 620, (SZ); Bemessungsgrundlagen
LSt-laufend € 2.552,83 (€ 3.117,77 € 564,94); LSt-SZ € 26,33.
- **BVK-Beiträge**: laufend € 47,70, SZ € 18,86.
- **Auszahlungsbetrag: € 3.109,91**.
**Kernregel (FN 2):** „Die Abgeltung für ein im Rahmen einer
Gleitzeitvereinbarung entstandenes Zeitguthaben ist sowohl in der
Sozialversicherung als auch in der Lohnsteuer im Auszahlungsmonat als
**laufender Bezug** zu behandeln."
## Kernwerte & Fristen (Stand 2026-07)
| Wert | Detail |
|---|---|
| Normalstundenteiler | **173** (Abgeltung von Guthaben an Normalarbeitszeit, **§ 19e AZG**) |
| Guthaben-Vergütung | Bruttomonatsgehalt × Stunden × **1,5** / 173 (hier € 617,77) |
| Behandlung | **laufender Bezug** (SV + LSt) im Auszahlungsmonat |
| UZ/WR | aliquot (90/365 KT) → je € 616,44; SZ-SV 14,12 % (inkl. AlV-Verminderung), SZ-LSt 6 % |
## Rechtsgrundlagen
- **§ 19e AZG** (Normalstundenteiler 173 für die Abgeltung von
Guthaben an Normalarbeitszeit) — in Fußnote 1 zitiert.
- AlV-Verminderung (SZ) und BVK-Beiträge: ohne §-Zitat im Beispiel
(SV-Mechanik, → lb-son-03).
## Payroll-Relevanz (Odoo)
- **Gleitzeitguthaben-Abgeltung** = eigener Abrechnungspfad in der
Endabrechnung: Normalstundenteiler (173), Zuschlagsfaktor (1,5),
laufende-Bezug-Behandlung (SV + LSt) müssen als Regelkette
implementiert sein.
- **AlV-Verminderung** bei Sonderzahlungen (14,12 % vs. 17,12 %) ist
ein harter SV-Parameter — als `hr.rule.parameter` je Jahr
parametrisieren.
- **Abgrenzung** Gleitzeitguthaben (laufender Bezug) vs.
Überstundenpauschale (SZ-Bezug) ist eine zentrale
Abrechnungslogik-Entscheidung → Belegtyp je
Work-Entry-Datensatz zu kennzeichnen.
## Verweise
- **KB-intern:** lb-end-10 (Zeitguthaben bei durchrechenbarer
Arbeitszeit) · lb-end-05 (Abgeltung von Mehrleistungen bei
Beendigung — Überblick) · lb-end-08 (Zeitschulden) · lb-end-29
(Zeitschulden-Beispiel) · lb-son-03 (Sonderzahlungen —
Sozialversicherung)
@@ -0,0 +1,70 @@
---
id: lb-tel-09
batch: 10
title: "Beispiel - Werbungskosten Arbeitszimmer und digitale Arbeitsmittel"
work: "Lexis Briefings Personalrecht"
chapter: "Außerhalb des Betriebsstandortes"
topic: telearbeit
author: "Sabara"
stand: 2024-01
source:
pdf: ".lexis360/beispiele/Lexis360_beispiel_werbungskosten_arbeitszimmer_und_digitale.pdf"
text: ".lexis360/md/beispiel_werbungskosten_arbeitszimmer_und_digitale.md"
legal_bases: ["§ 20 Abs 1 Z 2 lit d EStG"]
tags: [homeoffice, arbeitszimmer, digitale-arbeitsmittel, homeoffice-pauschale, werbungskosten]
cross_refs: ["lb-tel-08", "lb-tel-07", "lb-tel-11"]
---
# Beispiel: Werbungskosten Arbeitszimmer und digitale Arbeitsmittel
*Lexis Briefings Personalrecht, Sabara, Stand Jänner 2024 (lb-tel-09).*
## Zusammenfassung
- **Zwei getrennte Werbungskosten-Töpfe:** (1) **digitale Arbeitsmittel**
hier wird die Homeoffice-Pauschale **abgezogen**; (2) **Arbeitszimmer**
(Büroeinrichtung + anteilige Raumkosten) — hier wird die Pauschale
**nicht** abgezogen.
- **Beispiel:** den Anforderungen des **§ 20 Abs 1 Z 2 lit d EStG**
entsprechendes Arbeitszimmer; 100 Arbeitstage 2023; AG zahlt € 200
Homeoffice-Pauschale; Computer € 700 mit 60 % Berufsnutzung → € 420
abzüglich € 200 Pauschale = **€ 220** Werbungskosten (digitales
Arbeitsmittel); Bürostuhl € 450 + € 140 anteilige Arbeitszimmerkosten
(Miete, Strom) = **€ 590** Arbeitszimmer-Werbungskosten.
-**Alter Stand (2024-01)** — Pauschalenhöhe und Arbeitszimmer-Regel
(§ 20 Abs 1 Z 2 lit d EStG) sind eStG-Jahreswerte; nur für den
dokumentierten Zeitraum anwenden.
## Kernwerte & Fristen (Stand 2024-01)
| Posten | Betrag |
|---|---|
| Homeoffice-Pauschale (AG) | € 200 |
| Computer (60 % von € 700) | € 420 |
| **Werbungskosten digitales Arbeitsmittel** (420 200) | **€ 220** |
| Bürostuhl | € 450 |
| anteilige Arbeitszimmerkosten (Miete, Strom) | € 140 |
| **Werbungskosten Arbeitszimmer** (450 + 140) | **€ 590** |
## Rechtsgrundlagen
- **§ 20 Abs 1 Z 2 lit d EStG** (Anforderungen an das Arbeitszimmer) —
ausdrücklich zitiert.
- Homeoffice-Pauschale und digitale-Arbeitsmittel-Figur: keine
weiteren §-Zitate in der Quelle — ⚠ §-Zuordnung (u. a. § 16 Abs 1
Z 7a EStG) vor Verlässmachung gegen LStR verifizieren.
## Payroll-Relevanz (Odoo)
- AG-seitig nur die **Zahlung der Homeoffice-Pauschale** (nicht steuerbar)
relevant; Arbeitstage (100) sind für die Lohnzettel-/Veranlagungs-
Seitenausweis relevant.
- Berufsnutzung % (60 %) und Arbeitszimmer-Kosten sind reine
Arbeitnehmer-Veranlagungswerte — kein Eingabewert in der
Lohnabrechnung.
## Verweise
- **KB-intern:** lb-tel-07 (Telearbeit Differenzwerbungskosten) ·
lb-tel-08 (Telearbeitspauschale-Abschlag) · lb-tel-11
(Homeoffice vs. Telearbeit)
@@ -0,0 +1,172 @@
---
id: lb-url-17
batch: 10
title: "Beispiele: Berechnung der Urlaubsersatzleistung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: urlaub
author: "Niederfriniger"
stand: 2026-07
source:
pdf: ".lexis360/beispiele/Lexis360_beispiele_berechnung_der_urlaubsersatzleistung.pdf"
text: ".lexis360/md/beispiele_berechnung_der_urlaubsersatzleistung.md"
legal_bases: []
tags: [urlaubsersatzleistung, aliquote, pflichtversicherungsverlaengerung, schichtzulage, mehrleistung, rueckerstattung-urlaub, alv]
cross_refs: ["lb-url-09", "lb-url-14", "lb-url-15", "lb-url-16", "lb-url-05"]
---
# Beispiele: Berechnung der Urlaubsersatzleistung
*Lexis Briefings Personalrecht, Niederfriniger, Stand Juli 2026 (lb-url-17).*
## Beispiel 1 — Anzahl auszubezahlender Urlaubstage
Arbeitnehmer tritt am 5. 2. ein, wird zum 31. 10. desselben Jahres
gekündigt; bisher 11 Urlaubstage (Arbeitstage) konsumiert.
| Schritt | Arbeitstage |
|---|---|
| 25 AT (jährl. Anspruch) / 365 KT × 269 KT | 18,42 |
| zuzüglich Resturlaub Vorjahr | 0 |
| abzüglich konsumierter Urlaub | 11 |
| **Urlaubsersatzleistung** | **7,42** |
## Beispiel 2 — Verlängerung der Pflichtversicherung
Aus 7,42 AT: **abgerundet 7 AT** + **Zusatztagen (für je 5 AT → 2
Zusatztage): +2** = **9 Kalendertage**. Die **ASVG-Pflichtversicherung**
(Ende Entgeltanspruch) endet somit am **9. 11.** (neun Tage nach dem
31. 10.).
## Beispiel 3 — Auszahlung einer UEL (Arbeiter)
**Angaben (Auszug):** Beginn 1. 12. 2015, Ende **15. 8. 2026**
(Arbeitnehmerkündigung); Urlaubsjahr = Arbeitsjahr; 25 AT (MoFr);
Resturlaub 0; 4 AT des laufenden Urlaubsjahres konsumiert;
Bruttomonatslohn € 2.880,; **Schichtzulage € 180,** (Durchschnitt der
letzten **13 voll gearbeiteten Wochen** — Drei-Monats-Schnitt);
**Mehrleistungsvergütungen € 220,** (ebenso 13-Wochen-Schnitt);
UZ/WR à € 2.880, (UZ fällig 31. 5., WR 30. 11.); KV: UZ/WR nur bei
begründeter Entlassung/unbegründetem Austritt/DN-Kündigung aliquot
rückzahlbar; **Leistungsprämie** € 280, (anteilig im Austrittsjahr).
**1. Aliquoter Anspruch:** 25 AT / 365 KT × 258 KT = 17,67; 4
konsumiert = **13,67 AT**.
**2. UEL-Bemessung (Monatsbemessung):**
| Bestandteil | Betrag |
|---|---|
| Bruttomonatslohn | € 2.880,00 |
| Schichtzulage (Ø) | € 180,00 |
| Mehrleistungsvergütung (Ø) | € 220,00 |
| anteiliger UZ (2.880 / 12) | € 240,00 |
| anteilige WR (2.880 / 12) | € 240,00 |
| anteilige Leistungsprämie (300 / 12) | € 20,00 |
| **Monatsbemessung** | **€ 3.780,00** |
**UEL für 13,67 AT: € 3.780,00 / 22 × 13,67 AT = € 2.348,97 (brutto)**
- **UEL-laufend** (Gehalt + Schichtzulage + Mehrleistung):
€ 3.280,00 / 22 × 13,67 AT = **€ 2.038,26**;
SV-Beitrag: € 346,65 (18,07 % auf € 1.918,36 für 16.31. 8. 2026) +
€ 18,13 (15,12 % auf € 119,90 für den 1. 9. 2026 — **AlV-Beitrag
2,95 % entfällt**, da BG im 9/2026 **unter € 2.225,**) =
**€ 364,78**.
- **UEL-SZ** (UZ + WR + Leistungsprämie): € 500, / 22 × 13,67 AT =
**€ 309,55**; SV-Beitrag **€ 52,84** (17,07 % — vorausgesetzt die
BG für den SZ-Anteil überschreitet zusammen mit den noch
abzurechnenden aliquoten SZ **€ 2.225,** — sonst AlV-Teil-/Voll-
entfall).
**3. Verlängerung der Pflichtversicherung:** 13,67 AT → **abgerundet
13 AT** + Zusatztagen (je 5 AT → 2) **+4** = **17 Kalendertage**;
Pflichtversicherung endet am **1. 9.** (17 Tage nach dem 15. 8.).
## Beispiel 4 — Rückverrechnung zu viel konsumierten Urlaubs (Angestellter)
**Angaben (Auszug):** Beginn 8. 3. 2019, Ende **31. 5. 2026**
(berechtigte Entlassung); 25 AT; Resturlaub 0; **10 AT** im April 2026
konsumiert; Bruttomonatsentgelt € 2.500,; UZ/WR à € 2.500, (UZ
fällig 30. 6., WR 30. 11.).
**1. Aliquoter Anspruch:** 25 AT / 365 KT × **85 KT**¹ = 5,82; 10
konsumiert = **4,18 rückzuerstattende AT**.
**2. Rückerstattungsbetrag:** Monatsentgelt Mai 2026 € 2.500,;
**€ 2.500, / 22 × 4,18 AT = € 474,78 brutto** — im Austrittsmonat als
**Rückzahlung von Arbeitslohn** abzurechnen.
**3. Netto-Berechnung (Auszug):** Gehalt 1.31. 5. € 2.500,; UZ/WR
aliquot (1. 1.31. 5. = 152 KT **abzüglich** Tage der
Rückvergütung = **148 KT**) = je € 1.013,70; SV-SZ € 2.027,40 →
€ 346,08; SV-lfd. € 2.500, → € 451,75; LSt: Freibetrag € 620,,
LSt-lfd. € 63,12, LSt-SZ € 63,68; BVK € 69,27 (Grundlage
€ 4.527,40²); **Auszahlungsbetrag: € 3.058,72**.
¹ Kalendertage im laufenden Urlaubsjahr bis zur Beendigung.
² **Bemessungsgrundlagen zu beachten:**
- (FN 2) Es ist jenes Urlaubsentgelt zurückzuzahlen, das der
Arbeitnehmer für den zu viel verbrauchten Urlaub **tatsächlich
erhalten hat** (Bruttogehalt zuzüglich etwaiger bezahlter
Ausfallsentgelte nach dem Ausfallsprinzip für Mehr-/Überstunden,
Zulagen etc.); die Sonderzahlung wird bei der Endabrechnung
berücksichtigt (zurückzuzahlende Tage werden **nicht** in der
Aliquotierung berücksichtigt); **KV unbedingt beachten**.
- (FN 3) Übersteigt der durch die Rückzahlung unbezahlt gewordene
Urlaub **nicht einen Monat**, kann **keine Beitragsrückverrechnung**
erfolgen (AN-Anteil trägt der AN durch die Brutto-Rückerstattung
selbst; AG-Anteil kann die GKK nicht wie bei unbezahlten Urlaeben
einfordern).
- (FN 4) Die **BV-Grundlage** ist grundsätzlich gleich der
SV-Grundlage.
- (FN 5) Die **LSt-Bemessungsgrundlage** wird durch den
rückzuzahlenden Bruttobetrag **reduziert**; die Bemessungsgrundlagen
für **DB, DZ und KommSt** werden durch die
Rückzahlungsverpflichtung **nicht** gekürzt.
## Kernwerte & Fristen (Stand 2026-07)
| Wert | Detail |
|---|---|
| Aliquotierung | jährl. AT / 365 KT × KT im Urlaubsjahr + Resturlaub konsumierte AT |
| UEL-Bemessung | Monatsbemessung (Gehalt + regelmäßige Zulagen/Mehrarbeit [13-Wochen-Ø] + anteilige UZ/WR + anteilige Prämien) / 22 AT × AT |
| SV-Beiträge | UEL-lfd. und UEL-SZ getrennt; AlV-Reduktion unter **€ 2.225,** BG (9/2026) |
| Pflichtversicherungsverlängerung | abgerundete AT + 2 Zusatztage je 5 AT = Kalendertage nach Beendigung |
| Rückverrechnung (zu viel konsumiert) | tatsächlich empfangenes Entgelt (brutto, inkl. Ausfallsentgelte) als Rückzahlung von Arbeitslohn; keine SZ-Aliquotierung der rückzuzahlenden Tage; KV beachten |
| Beitragsrückverrechnung | nur wenn unbezahlter Urlaub > 1 Monat |
| LSt/BV/DB/DZ/KommSt | LSt-BG reduziert; BV = SV-BG; **DB/DZ/KommSt-BG nicht gekürzt** |
## Rechtsgrundlagen
- **ASVG** (Pflichtversicherungsverlängerung durch UEL) — ohne §-Zitat
referenziert.
- **AlV-Beitrag** (2,95 %/1 % Reduktion unter € 2.225,) — ohne
§-Zitat (SV-Mechanik, → lb-son-03).
- **Ausfallsprinzip** (Mehrarbeit) — in FN 2 referenziert (→
lb-ues-01).
- Rahmen: → lb-url-09 (UEL — Arbeitsrecht), lb-url-14 (Urlaubsentgelt),
lb-url-15 (UEL — Abgaben), lb-url-16 (UEL — Arbeitsrecht).
## Payroll-Relevanz (Odoo)
- **UEL-Bemessung** ist eine eigene Abrechnungslogik:
Monatsbemessung (Gehalt + 13-Wochen-Ø für Schichtzulage/Mehrarbeit +
anteilige UZ/WR/Prämien), 22-AT-Termin, AlV-Reduktion unter € 2.225,
— als Regelkette implementieren.
- **Pflichtversicherungsverlängerung** (abgerundete AT + 2 je 5 AT)
ist ein harter SV-Parameter — in der Endabrechnung berechnen.
- **Rückverrechnung zu viel konsumierten Urlaubs** ist eine eigene
Abrechnungslogik (Rückzahlung von Arbeitslohn, keine
SZ-Aliquotierung der rückzuzahlenden Tage, KV beachten) → als
separater Abzug in der Endabrechnung.
- **DB/DZ/KommSt-Bemessung** bleibt bei UEL-Rückzahlung unverändert —
keine Kürzung der Bemessungsgrundlagen.
## Verweise
- **KB-intern:** lb-url-09 (Urlaubsersatzleistung) · lb-url-14
(Urlaubsentgelt) · lb-url-15 (UEL — Abgaben) · lb-url-16 (UEL —
Arbeitsrecht) · lb-url-05 (Urlaub — Anspruch & Ausmaß) ·
lb-ues-01 (Überstundenarbeit — Ausmaß) · lb-son-03 (Sonderzahlungen —
Sozialversicherung)
@@ -0,0 +1,93 @@
---
id: lb-bnd-46
batch: 10
title: "Checkliste - Ansprüche bei der Entlassung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_anspruche_bei_der_entlassung.pdf"
text: ".lexis360/md/checkliste_anspruche_bei_der_entlassung.md"
legal_bases: []
tags: [entlassung, ansprueche, kuendigungsschadigung, abfertigung, urlaubsersatzleistung, konventionalstrafe]
cross_refs: ["lb-bnd-31", "lb-bnd-33", "lb-end-18", "lb-end-24", "lb-url-09"]
---
# Checkliste: Ansprüche bei der Entlassung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-46).*
## Zusammenfassung
- **Matrize** nach Entlassungsart (berechtigte/verschuldete ·
berechtigte/unverschuldete · unberechtigte) × Anspruch:
- **Ansprüche des Arbeitnehmers:**
- **Laufendes Entgelt:** ja/ja/ja.
- **(Anteilige) Sonderzahlungen:**
- *verschuldete:* Angestellte ja, **Arbeiter meist nein**
(KV-Regelung; **Rückverrechnung möglich**);
- *unverschuldete:* Angestellte ja, **Arbeiter meist ja**
(KV; Rückverrechnung möglich);
- *unberechtigte:* Angestellte ja, **Arbeiter meist nein**
(KV; Rückverrechnung möglich).
- **Urlaubsersatzleistung (laufendes Urlaubsjahr):**
- *verschuldete:* ja (aliquot); **keine Rückerstattung** des
Urlaubsentgelts für über das aliquote Ausmaß hinaus
verbrauchten Jahresurlaub;
- *unverschuldete:* ja (aliquot); keine Rückerstattung;
- *unberechtigte:* ja (aliquot); keine Rückerstattung.
- **Abfertigung Alt/Neu:** ja bei *unverschuldeter* und
*unberechtigter*; **nein bei verschuldeter** Entlassung.
- **Kündigungsentschädigung:** nur bei **unberechtiger**
Entlassung — hier **SZ-Anteil und Urlaubsanteil für die
Kündigungsfrist** zu berücksichtigen.
- **Guthaben an Normalarbeitszeit:** mit **50 % Zuschlag** (in
allen Fällen; **KV kann Abweichendes vorsehen!**).
- **Dienstzeugnis:** ja/ja/ja.
- **Ansprüche des Arbeitgebers:**
- **Ausbildungskostenrückersatz:** nur bei **verschuldeter**
Entlassung.
- **Konventionalstrafe:** nur bei **verschuldeter** Entlassung.
- Keine §-Zitate in der Quelle (KV-/abgabenrechtliche Matrix).
## Kernwerte & Fristen (Stand 2026-06)
| Anspruch | verschuldete | unverschuldete | unberechtigte |
|---|---|---|---|
| Laufendes Entgelt | ja | ja | ja |
| Sonderzahlungen | Ang.: ja / Arb.: meist nein (KV, Rückverrechnung möglich) | Ang.: ja / Arb.: meist ja (KV) | Ang.: ja / Arb.: meist nein (KV) |
| Urlaubsersatzleistung | ja (aliquot), keine Rückerstattung | ja (aliquot), keine Rückerstattung | ja (aliquot), keine Rückerstattung |
| Abfertigung Alt/Neu | **nein** | ja | ja |
| Kündigungsentschädigung | nein | nein | **ja** (SZ-Anteil + Urlaubsanteil für Kündigungsfrist) |
| Guthaben Normalarbeitszeit | **50 % Zuschlag** (KV-Vorbehalt) | 50 % Zuschlag (KV-Vorbehalt) | 50 % Zuschlag (KV-Vorbehalt) |
| Dienstzeugnis | ja | ja | ja |
| AG: Ausbildungskostenrückersatz | **ja** | nein | nein |
| AG: Konventionalstrafe | **ja** | nein | nein |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Matrix berührt
Sonderzahlungen (KV/§ 87 EStG), Abfertigung (AVRAG/BMSVG),
Kündigungsentschädigung (§ 10 AngG) — ⚠ Normen nicht in der
Quelle genannt, über lb-end-18/24 und Cluster `end`/`son`
beziehen.
## Payroll-Relevanz (Odoo)
- Die **Dreier-Matrix (verschuldet/unverschuldet/unberechtigt)** ist
die Kernentscheidung der Endabrechnung bei Entlassung:
Sonderzahlungs-Aliquot, Abfertigungs-Zufluss, Kündigungs-
entschädigung (mit SZ-/Urlaubsanteil für die Kündigungsfrist).
- **50 % Zuschlag für Normalarbeitszeitguthaben** (KV-Vorbehalt) =
Zuschlagsparameter (→ lb-ues-03).
- **Ausbildungskostenrückersatz/Konventionalstrafe** als
Abzugsposition bei verschuldeter Entlassung (→ lb-end-26).
## Verweise
- **KB-intern:** lb-bnd-31 (Entlassung Folgen und Ansprüche) ·
lb-bnd-33 (Entlassungsgründe) · lb-end-18 (Prämien bei
Beendigung) · lb-end-24 (Kündigungsentschädigung
Arbeitsrecht) · lb-url-09 (Urlaubsersatzleistung)
@@ -0,0 +1,87 @@
---
id: lb-bnd-47
batch: 10
title: "Checkliste - Ansprüche beim Austritt"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_anspruche_beim_austritt.pdf"
text: ".lexis360/md/checkliste_anspruche_beim_austritt.md"
legal_bases: []
tags: [austritt, ansprueche, abfertigung, urlaubsersatzleistung, schadenersatz]
cross_refs: ["lb-bnd-09", "lb-bnd-10", "lb-bnd-46"]
---
# Checkliste: Ansprüche beim Austritt
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-47).*
## Zusammenfassung
- **Matrize** nach Austrittsart (berechtigt/AG-verschuldet ·
berechtigt/AG-unverschuldet · unberechtigter vorzeitiger Austritt) ×
Anspruch:
- **Ansprüche des Arbeitnehmers:**
- **Laufendes Entgelt:** ja/ja/ja.
- **(Anteilige) Sonderzahlungen:** ja/ja; **unberechtigt:**
Angestellte ja, **Arbeiter meist nein** (KV; auch
Rückverrechnung möglich).
- **Urlaubsersatzleistung (laufendes Urlaubsjahr):** ja/ja;
**unberechtigt: nein**.
- **Abfertigung Alt/Neu:** ja/ja; **unberechtigt: nein**.
- **Kündigungsentschädigung:** nur bei **AG-verschuldeter**
(berechtigt unverschuldeter) — ja; sonst nein.
- **Guthaben an Normalarbeitszeit:** mit **50 % Zuschlag**
(berechtigte Fälle; **KV kann Abweichendes vorsehen!**);
**unberechtigt: ohne 50 % Zuschlag**.
- **Dienstzeugnis:** ja/ja/ja.
- **Ansprüche des Arbeitgebers:**
- **Ausbildungskostenrückersatz:** nur bei **unberechtigtem
vorzeitigem Austritt** (ja).
- **Konventionalstrafe:** nur bei **unberechtigtem vorzeitigem
Austritt** (ja).
- **Schadenersatz:** nur bei **unberechtigtem vorzeitigem
Austritt** — **sofern konkreter Schaden eingetreten**.
- Keine §-Zitate in der Quelle (KV-/arbeitsrechtliche Matrix).
## Kernwerte & Fristen (Stand 2026-06)
| Anspruch | berechtigt, AG-versch. | berechtigt, AG-unversch. | unberechtigt |
|---|---|---|---|
| Laufendes Entgelt | ja | ja | ja |
| Sonderzahlungen | ja | ja | Ang.: ja / Arb.: meist nein (KV) |
| Urlaubsersatzleistung | ja | ja | **nein** |
| Abfertigung Alt/Neu | ja | ja | **nein** |
| Kündigungsentschädigung | **ja** | nein | nein |
| Guthaben Normalarbeitszeit | **50 % Zuschlag** (KV-Vorbehalt) | 50 % Zuschlag (KV-Vorbehalt) | **ohne 50 % Zuschlag** |
| Dienstzeugnis | ja | ja | ja |
| AG: Ausbildungskostenrückersatz | nein | nein | **ja** |
| AG: Konventionalstrafe | nein | nein | **ja** |
| AG: Schadenersatz | nein | nein | **ja (konkreter Schaden)** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Matrix berührt
Abfertigung (AVRAG/BMSVG), Sonderzahlungen (KV/§ 87 EStG),
Schadenersatz/Conventionalstrafe (ABGB) — ⚠ Normen nicht in der
Quelle genannt, über Cluster `end`/`bso` beziehen.
## Payroll-Relevanz (Odoo)
- **Austrittsart-Klassifikation** (berechtigt/AG-verschuldet/
unberechtigt) ist die Kernentscheidung der Endabrechnung beim
Austritt: Abfertigungs-Zufluss, Urlaubsersatzleistung,
Kündigungsentschädigung (nur AG-verschuldet), 50 %-Zuschlag
(nur berechtigt).
- **AG-Ansprüche** (Ausbildungskosten, Konventionalstrafe,
Schadenersatz) bei unberechtigtem Austritt = Abzugs-/
Regresspositionen (→ lb-end-26).
## Verweise
- **KB-intern:** lb-bnd-09 (Austritt Folgen und Ansprüche) ·
lb-bnd-10 (Austrittserklärung) · lb-bnd-46
(Ansprüche bei der Entlassung)
@@ -0,0 +1,90 @@
---
id: lb-bnd-48
batch: 10
title: "Checkliste - Befristetes Arbeitsverhältnis - worauf zu achten ist"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_befristetes_arbeitsverhaltnis_worauf_zu.pdf"
text: ".lexis360/md/checkliste_befristetes_arbeitsverhaltnis_worauf_zu.md"
legal_bases: []
tags: [befristung, kettendienstvertrag, schwangerschaft, probezeit, zeitauslauf]
cross_refs: ["lb-bnd-36", "lb-msf-02"]
---
# Checkliste: Befristetes Arbeitsverhältnis worauf zu achten ist
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-48).*
## Zusammenfassung
- **Vor/bei Vertragsabschluss (am besten schriftlich):**
- **Beginn und Ende** festlegen (datumsmäßiger Endtermin oder
bestimmtes Ereignis); Befristung kann wenige Wochen bis
mehrere Monate/Jahre betragen.
- **Probezeit + Befristung** kombinieren (**maximal ein Monat
Probezeit, dann Befristung**) oder nur befristen (falls keine
automatische KV-Probezeit).
- **Zusätzliche Kündigungsmöglichkeit** nur bei längeren
Befristungen erwägen — **ab ca. vier, zur Sicherheit besser
sechs Monaten** laut Rechtsprechung zulässig.
- **Grund der Befristung angeben**.
- **Auflösung vor Zeitablauf:** vorzeitige Kündigung **nur bei
vereinbarter Kündigungsmöglichkeit**; ansonsten jederzeit
möglich: **einvernehmliche Lösung** (am besten schriftlich),
**berechtigte Entlassung**, **berechtigter vorzeitiger Austritt**
bei wichtigem Grund.
- **Zeitablauf:** **automatisches Ende** zum vereinbarten
Endzeitpunkt ohne eigene Erklärung; **Empfehlung:** Arbeitnehmer
vorher **schriftlich auf das baldige Ende hinweisen**; darauf
achten, dass er nach dem letzten Tag **nicht wieder antritt** und
**Schlüssel etc. am letzten Arbeitstag nach Arbeitsschluss
abgibt**.
- **Neuerliche Befristung:** nur bei **anerkennungswürdigem
wirtschaftlichem oder sozialem Grund** zulässig, sonst Gefahr des
**unzulässigen Kettendienstvertrages** (automatischer Übergang in
ein unbefristetes Dienstverhältnis) — **schon bei einer
einmaligen Verlängerung** wird die sachliche Rechtfertigung
hinterfragt.
- **Schwangere Arbeitnehmerin:** bei sachlich gerechtfertigtem
Befristungsgrund bleibt der Befristungsablauf wirksam; **ohne
sachlichen Grund → Verlängerung bis zum Beginn des
Beschäftigungsverbots**.
- Keine §-Zitate in der Quelle (Rechtsprechung/KV-Praxis).
## Kernwerte & Fristen (Stand 2026-06)
| Prüfpunkt | Regel |
|---|---|
| Endpunkt | datumsmäßig oder Ereignis; Grund angeben |
| Probezeit + Befristung | **max. 1 Monat Probezeit**, dann Befristung |
| Kündigungsmöglichkeit in der Befristung | ab **ca. 46 Monaten** Befristung (Rechtsprechung) |
| Vorzeitige Beendigung | nur bei Klausel; sonst Einvernehmlichkeit/Entlassung/Austritt |
| Zeitablauf | **automatisch**; schriftlicher Hinweis + kein Wiederaantritt |
| **Neuerliche Befristung** | nur mit **sachlichem Grund**; sonst **Kettendienstvertrag → unbefristet** |
| Schwangerschaft | ohne sachlichen Grund: **Verlängerung bis Beschäftigungsverbot** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; Kettendienstvertrag-Judikatur
(OGH), Schwangerschaftsschutz (§ 10 MSchG) — ⚠ Normen nicht in
der Quelle genannt, über lb-bnd-36 und Cluster `msf` beziehen.
## Payroll-Relevanz (Odoo)
- **Befristungs-Enddatum** = automatischer Vertragsende-Stichtag im
Kalendermodell (keine Kündigung, → lb-bnd-36).
- **Neuerliche Befristung (Kette)** ist ein Risikofeld (
unbefristetes Verhältnis) → bei Vertragsverlängerung
sachlichen Grund dokumentieren.
- **Schwangerschaftsschutz** (Verlängerung bis
Beschäftigungsverbot) = Ausnahme im Beendigungs-Workflow
(→ Cluster `msf`).
## Verweise
- **KB-intern:** lb-bnd-36 (Zeitablauf bei Befristung) · lb-msf-02
(Schwangerschaft, falls vorhanden)
@@ -0,0 +1,63 @@
---
id: lb-bso-12
batch: 10
title: "Checkliste - Bewertungskriterien"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsphase - Sonstiges"
topic: beendigungsphase-sonstiges
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_bewertungskriterien.pdf"
text: ".lexis360/md/checkliste_bewertungskriterien.md"
legal_bases: []
tags: [zeugnis, qualifiziertes-zeugnis, bewertungskriterien, leistungsbeurteilung]
cross_refs: ["lb-bso-04", "lb-bso-13", "lb-bso-16"]
---
# Checkliste: Bewertungskriterien
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bso-12).*
## Zusammenfassung
- Bei **qualifizierten Zeugnissen** erfolgt eine
Leistungsbeurteilung des Dienstnehmers; die Bewertungskriterien
stehen in **engem Zusammenhang mit der Art der ausgeübten
Tätigkeit**.
- **Mögliche Kriterien (Beispielkatalog):** Qualität der Arbeit;
Arbeitsanfall/Arbeitsumfang, Erledigungsdauer/Schnelligkeit;
Arbeitsweise/Genauigkeit/Gewissenhaftigkeit/Strukturiertheit/
Organisationsfähigkeit; Selbständigkeit; Fachkenntnisse;
Teamfähigkeit, Verhalten im Umgang mit Vorgesetzten, Kollegen und
Kunden; Weiterbildungsbereitschaft; Führungsstärke/Führungsstil;
etc.
- **Grenze:** es sind **nur jene Kriterien im Zeugnis zu
berücksichtigen, die für die ausgeübte Tätigkeit relevant sind**.
## Kernwerte & Fristen (Stand 2026-06)
| Punkt | Regel |
|---|---|
| Kriteriumsauswahl | an die **ausgeübte Tätigkeit** gebunden (relevante Kriterien nur) |
| Kriterienkatalog | Qualität, Arbeitsanfall/Dauer, Arbeitsweise/Genauigkeit, Selbständigkeit, Fachkenntnisse, Teamfähigkeit/Umgang, Weiterbildung, Führung |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (zeugnisrechtliche
Leistungsbeurteilung, OGH-Rechtsprechung zum qualifizierten
Zeugnis) — ⚠ Norm/Judikatur nicht in der Quelle genannt.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; die Checkliste dient der
**Zeugnisqualität** (Haftungs-/Anfechtungsrisiko-Minderung) im
Beendigungsprozess (→ lb-bso-16).
- Im HR-Modell optional als Vorlage für die
Leistungsbeurteilungs-Felder nutzen.
## Verweise
- **KB-intern:** lb-bso-04 (Dienstzeugnis) · lb-bso-13
(notwendige Zeugnisbestandteile) · lb-bso-16
(Zeugniserstellung)
@@ -0,0 +1,77 @@
---
id: lb-bnd-49
batch: 10
title: "Checkliste - Entlassung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_entlassung.pdf"
text: ".lexis360/md/checkliste_entlassung.md"
legal_bases: []
tags: [entlassung, verfahren, betriebsrat, beweis, dienstfreistellung]
cross_refs: ["lb-bnd-32", "lb-bnd-33", "lb-bnd-12"]
---
# Checkliste: Entlassung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-49).*
## Zusammenfassung
- **Ablauf nach Kenntnis vom Vorfall (unverzüglich):**
1. **Wann** war der Vorfall?
2. Ist der **Sachverhalt klar**?
3. **Zeugen** für den Vorfall suchen, **Protokoll erstellen**.
4. Falls klar: Soll **wegen** des Vorfalls entlassen werden (falls
möglich)? → **unverzügliche Kontaktaufnahme mit dem
Rechtsvertreter**; reicht der Sachverhalt für eine Entlassung?
5. **Gleichzeitig:** ob ein **besonderer Entlassungsschutz**
besteht.
6. Falls der Sachverhalt als Entlassungsgrund ausreicht:
**unverzüglich Entlassung aussprechen** bzw. entsprechendes
Verfahren einleiten; **zur Beweissicherung auch schriftlich
aussprechen**; bei mündlicher Entlassung **Zeugen herbeirufen**.
7. **Unverzügliche Verständigung des Betriebsrates** von der
Entlassung.
8. Falls Sachverhalt **unklar**: Arbeitnehmer **dienstfrei stellen**,
**Entlassungsrecht vorbehalten** und darlegen, dass der
Sachverhalt geklärt werden muss → **unverzüglich
aufklären**, danach wie unter Punkt 3.
- Keine §-Zitate in der Quelle (Prozesscheckliste).
## Kernwerte & Fristen (Stand 2026-06)
| Schritt | Kernaufgabe |
|---|---|
| 13 | Vorfall (Wann?), Sachverhalt klar?, Zeugen + Protokoll |
| 4 | Entlassungsentscheidung + **Rechtsvertreter-Kontakt** |
| 5 | **besonderer Entlassungsschutz** prüfen |
| 6 | **unverzüglich** aussprechen; **schriftlich** (Beweissicherung); Zeugen |
| 7 | **Betriebsrat unverzüglich verständigen** |
| 8 | unklar → **dienstfrei stellen**, Entlassungsrecht vorbehalten, aufklären |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Checkliste berührt das
Entlassungsrecht (Entlassungsausspruch, § 25 AngG; BR-
Mitwirkung § 240 lit b ASchG) — ⚠ Normen nicht in der Quelle
genannt, über lb-bnd-32/33 beziehen.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; die Checkliste ist ein
**Prozessworkflow** im Beendigungs-Bereich (→ lb-bnd-32) und
sichert die **Beweissicherung** (Schriftform, Zeugen) sowie die
**BR-Verständigung** als Verfahrensvoraussetzung.
- **Dienstfreistellung mit Entlassungsrechtsvorbehalt** (Punkt 8)
ist ein Zwischenstatus im Kalendermodell (Entgeltfortzahlung
prüfen, → Cluster `bso`).
## Verweise
- **KB-intern:** lb-bnd-32 (Entlassungsausspruch) · lb-bnd-33
(Entlassungsgründe) · lb-bnd-12 (Besonderer
Entlassungsschutz)
@@ -0,0 +1,81 @@
---
id: lb-bnd-50
batch: 10
title: "Checkliste - Kündigungsanfechtung Arbeitgeber"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-07
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_kundigungsanfechtung_arbeitgeber.pdf"
text: ".lexis360/md/checkliste_kundigungsanfechtung_arbeitgeber.md"
legal_bases: []
tags: [kundigungsanfechtung, asg, rechtschutz, vergleich, betriebsrat]
cross_refs: ["lb-bnd-38", "lb-bso-14", "lb-bso-17", "lb-end-19"]
---
# Checkliste: Kündigungsanfechtung (Arbeitgeber)
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juli 2026 (lb-bnd-50).*
## Zusammenfassung
- **Unmittelbare Schritte bei Anfechtung:**
1. **Rechtsschutzversicherung** abklären (übernimmt die
Verfahrenskosten)?
2. **Unverzügliche Kontaktaufnahme mit dem Rechtsvertreter**
(Rechtsanwalt, Wirtschaftskammer).
3. **Klage genau durchlesen**, Verwendbarkeit überlegen,
Stichworte notieren.
- **⚠ Kostenhinweis der Quelle:** „In diesem Verfahren gibt es
**keinen Kostenersatz durch die Gegenseite** — auch dann nicht,
wenn man gewinnt."
- **Unterlagen für die Besprechung:**
1. alle zur **Kündigungsnotwendigkeit** (betriebliche
Rationalisierungsmaßnahmen, personenbezogene Kündigungsgründe,
Personalstruktur, Versetzungsmöglichkeit); **Zeugenliste**
(Namen/Adressen).
2. **Kopie der Klagsschrift**.
3. **Kopie der Kündigung** sowie der **Schreiben an/vom
Betriebsrat**.
4. **Intern: finanzielle Vergleichsregelung** prüfen (Gerichts-
Verfahren beilegen); mögliche Höhe der **Vergleichszahlung**
abklären, **Handlungsvollmacht** für die Verhandlung erteilen
lassen; **günstigste Verrechnungsmöglichkeit der
Vergleichszahlung durch die Lohnverrechnung** berechnen
lassen.
- Keine §-Zitate in der Quelle (ASG-Praxis).
## Kernwerte & Fristen (Stand 2026-07)
| Schritt | Kernaufgabe |
|---|---|
| 1 | Rechtsschutzversicherung (Kosten) abklären |
| 2 | **unverzüglich** Rechtsvertreter |
| 3 | Klage lesen, Stichworte |
| Unterlagen | Kündigungsnotwendigkeit + Zeugenliste; Klagsschrift; Kündigung + BR-Schreiben |
| Vergleich | Höhe abklären, **Vollmacht**, **Lohnverrechnung: günstigste Verrechnung** |
| Kosten | **kein Kostenersatz** durch Gegenseite (auch bei Sieg) |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (ASG-Klage, §§ 23/24 AngG;
Vergleichszahlungen § 67 EStG) — ⚠ Normen nicht in der Quelle
genannt, über lb-bso-10/17 und lb-end-19/21 beziehen.
## Payroll-Relevanz (Odoo)
- **Vergleichszahlung: „günstigste Verrechnungsmöglichkeit
durch die Lohnverrechnung"** ist die direkte Schnittstelle zur
PV-Abrechnung (Sechstel/Fünftel-Aufteilung, SV/LSt-Behandlung —
→ lb-end-19/20/21/22).
- **BR-Schreiben** (Kommunikation an/vom Betriebsrat) als
Verfahrensdokument im Beendigungs-Workflow (→ lb-bnd-38).
## Verweise
- **KB-intern:** lb-bnd-38 (Besonderer Kündigungsschutz) ·
lb-bso-14 (Sinnhaftigkeit Klage) · lb-bso-17
(Verfahrensvorbereitung) · lb-end-19 (Vergleich
Arbeitsrecht)
@@ -0,0 +1,102 @@
---
id: lb-end-33
batch: 10
title: "Checkliste - Kündigungsentschädigung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsansprüche & Endabrechnung"
topic: endabrechnung
author: "Haider"
stand: 2025-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_kundigungsentschadigung.pdf"
text: ".lexis360/md/checkliste_kundigungsentschadigung.md"
legal_bases: []
tags: [kundigungsentschaedigung, bemessungsgrundlage, mitverschulden, verfallsfrist, bestandsschutz, anrechnung]
cross_refs: ["lb-end-23", "lb-end-24", "lb-bnd-38"]
---
# Checkliste: Kündigungsentschädigung — Was ist zu tun?
*Lexis Briefings Personalrecht, Haider, Stand Juni 2025 ⚠ Alter Stand (lb-end-33).*
## Zusammenfassung
- **Auflösungsform prüfen:** Anspruch besteht nur bei
- **unbegründeter Entlassung**,
- **gerechtfertigtem vorzeitigem Austritt** aus Verschulden des
Arbeitgebers,
- **Auflösung in der Probezeit** — so die Auflösungserklärung
**außerhalb des Probemonats** zugeht,
- **Dienstgeberkündigung** unter Nichteinhaltung der
Kündigungsfristen bzw. Fehlen einer Kündigungsmöglichkeit (zB
während einer Befristung, **bestandgeschützte Arbeitnehmer**).
- **Zeitraum bestimmen:** Entgelt für jenen Zeitraum, der bei
ordnungsgemäßer Arbeitgeberkündigung (Frist + Termin) einzuhalten
gewesen wäre — bzw. bei befristetem DV: jener Zeitraum **bis zum
Ablauf der Befristung**.
- **Mitverschulden des Arbeitnehmers** prüfen → bei Vorliegen die
Kündigungsentschädigung **entsprechend reduzieren**.
- **Bemessungsgrundlage** (zu berücksichtigen):
- laufende Bezüge,
- Entgelt für **regelmäßig geleistete Überstunden**,
- Zulagen,
- Provisionen/Prämien,
- Sachbezüge,
- **Sonderzahlungen** für den Zeitraum der fiktiven
Restvertragsdauer,
- Erhöhung der **Urlaubsersatzleistung** für die fiktive
Restvertragsdauer,
- evtl. Erhöhung der **Abfertigungsansprüche** bei Sprung.
- **Sonderregelungen für bestandgeschützte** Arbeitsverhältnisse
berücksichtigen: **Betriebsräte, Mütter in Karenz, Lehrlinge,
Präsenz-/Zivildiener und Behinderte** (→ lb-bnd-38).
- **Verfallsfrist:** **sechs Monate** ab dem Tag der Auflösung (KV
berücksichtigen) — danach nur noch gerichtlich geltend gemacht,
sonst **verfallen**.
- **Abgaben** der Kündigungsentschädigung berechnen (allfällige
steuerliche Sonderregelungen beachten → lb-end-23).
- **Anspruch über drei Monate:** Fälligkeit des übersteigenden Teils
entsteht **wie bei fortlaufendem Dienstverhältnis**; für den
über drei Monate liegenden Zeitraum jenes Entgelt **anrechnen**, das
sich der Arbeitnehmer durch die ausgebliebene Arbeitsleistung
erspart hat bzw. durch andere Einkommen erzielen konnte (ebenfalls
anrechnen, wenn keine Anstrengungen zur Ersatzarbeitsplatzsuche
unternommen wurden).
## Kernwerte & Fristen (Stand 2025-06, ⚠ Alter Stand)
| Kriterium | Regel |
|---|---|
| Anspruchstatbestände | unbegründete Entlassung · begründeter Austritt aus AN-Verschulden · Auflösung in Probezeit (Zugang außerhalb Probemonats) · AG-Kündigung (Fristverstoß/keine Möglichkeit) |
| Zeitraum | Frist + nächster Termin (bzw. Befristungsende) |
| Mitverschulden | Reduktion der Entschädigung |
| Bemessung | laufende Bezüge + regelmäßige Überstunden + Zulagen + Provisionen/Prämien + Sachbezüge + SZ + UEL-Erhöhung + Abfertigungs-Sprung |
| Verfallsfrist | **6 Monate** ab Auflösung (KV-Abweichung prüfen) |
| Über 3 Monate | Fälligkeit wie bei Fortbestand; Anrechnung ersparter Kosten/anderer Einkommen |
| Bestandsschutz | Betriebsrat, Karenzmütter, Lehrlinge, Präsenz-/Zivildiener, Behinderte |
## Rechtsgrundlagen
- Keine §-Zitate in der Checkliste (Praxispunkte). Rechtsrahmen:
→ lb-end-24 (Arbeitsrecht), lb-end-23 (Abgabenrecht);
Besonderer Kündigungsschutz → lb-bnd-38.
## Payroll-Relevanz (Odoo)
- **Kündigungsentschädigung** ist eine eigene Beendigungsleistung mit
eigener Bemessungslogik (fiktive Restlaufzeit × Bezüge-Bestandteile)
→ als Regelkette in der Endabrechnung implementieren, nicht als
Pauschale.
- **Mitverschulden-Reduktion** ist ein manueller Korrekturfaktor
(Prozentsatz) — als `hr.rule.parameter`-Override je Fall.
- **Verfallsfrist (6 Monate)** ist ein harter Fristanker — in der
Fälligungslogik prüfen.
- **Anrechnung (über 3 Monate)** ist eine eigene
Bemessungsgrundlage-Korrektur — als separater Abzug in der
Berechnung.
## Verweise
- **KB-intern:** lb-end-23 (Kündigungsentschädigung —
Abgabenrecht) · lb-end-24 (Arbeitsrecht) · lb-bnd-38 (Besonderer
Kündigungsschutz) · lb-bnd-40/41 (Kündigungsfristen)
@@ -0,0 +1,71 @@
---
id: lb-bso-13
batch: 10
title: "Checkliste - notwendige Zeugnisbestandteile"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsphase - Sonstiges"
topic: beendigungsphase-sonstiges
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_notwendige_zeugnisbestandteile.pdf"
text: ".lexis360/md/checkliste_notwendige_zeugnisbestandteile.md"
legal_bases: []
tags: [zeugnis, dienstzeugnis, arbeitszeugnis, zwischenzeugnis, bestandteile]
cross_refs: ["lb-bso-04", "lb-bso-12", "lb-bso-15"]
---
# Checkliste: notwendige Zeugnisbestandteile
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bso-13).*
## Zusammenfassung
- **Acht Pflichtbestandteile** (für alle Zeugnissorten):
1. **Überschrift** (Dienstzeugnis bei Angestellten,
Arbeitszeugnis bei Arbeitern, Zwischenzeugnis bei aufrechtem
Arbeitsverhältnis).
2. **Personalien** des Arbeitnehmers (Name, Titel, Geburtsdatum,
Adresse).
3. **Dauer der Beschäftigung** (Eintritt bis Endzeitpunkt; bei
Zwischenzeugnis: Hinweis, dass das Arbeitsverhältnis in
ungekündigtem Zustand aufrecht ist, allenfalls Begründung der
Ausstellung, z. B. Wechsel in Leitung).
4. **Art der Beschäftigung** (branchenübliche Bezeichnung).
5. **Aufzählung der verrichteten Tätigkeiten** (Arbeiter) bzw. der
**übertragenen Aufgabengebiete** (Angestellte) — genaue
Tätigkeitsbeschreibung, **Leitungsbefugnisse,
Vertretungsbefugnisse**.
6. **Datum und Ort** der Ausstellung.
7. **Eigenhändige Unterschrift**.
8. Auszufertigen **auf dem auch sonst verwendeten Briefpapier**.
## Kernwerte & Fristen (Stand 2026-06)
| Bestandteil | Detail |
|---|---|
| 1 Überschrift | je Zeugnissorte (Dienst-/Arbeits-/Zwischenzeugnis) |
| 2 Personalien | Name, Titel, Geburtsdatum, Adresse |
| 3 Dauer | EintrittEnde; Zwischenzeugnis: ungekündigter Zustand + Begründung |
| 4 Art | branchenübliche Bezeichnung |
| 5 Tätigkeiten | Arbeiter: verrichtete Tätigkeiten; Angestellte: Aufgabengebiete, Leitung/Vertretung |
| 68 Form | Datum/Ort; eigenhändige Unterschrift; übliches Briefpapier |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (zeugnisrechtliche Mindestinhalte,
OGH-Praxis) — ⚠ Norm/Judikatur nicht in der Quelle genannt.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; **Dauer der Beschäftigung**
(EintrittEnde) ist aber eine Abgrenzungsgröße für
Abfertigungs-/Vordienstzeiten-Prüfungen (→ Cluster `end`, `bes`).
- Die Checkliste dient der **Vollständigkeit** des Zeugnisses im
Beendigungsprozess (→ lb-bso-04, lb-bso-16).
## Verweise
- **KB-intern:** lb-bso-04 (Dienstzeugnis) · lb-bso-12
(Bewertungskriterien) · lb-bso-15 (unzulässige Anmerkungen) ·
lb-bso-16 (Zeugniserstellung)
@@ -0,0 +1,70 @@
---
id: lb-bso-14
batch: 10
title: "Checkliste - Sinnhaftigkeit Klage"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsphase - Sonstiges"
topic: beendigungsphase-sonstiges
author: "Thöny-Maier"
stand: 2026-07
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_sinnhaftigkeit_klage.pdf"
text: ".lexis360/md/checkliste_sinnhaftigkeit_klage.md"
legal_bases: []
tags: [klage, asg, rechtsschutzversicherung, kostenrisiko, beweis]
cross_refs: ["lb-bso-10", "lb-bso-17"]
---
# Checkliste: Sinnhaftigkeit Klage
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juli 2026 (lb-bso-14).*
## Zusammenfassung
- **Vor Einbringung einer Klage** sind zu erwägen:
- Wurde die Forderung **bereits außergerichtlich** gestellt (am
besten **schriftlich mit Nachweis des Zugangs an die richtige
Person**)?
- Bestehen **Gegenforderungen**? Falls ja, in welcher Höhe?
- Welche **Beweise** für die Richtigkeit der Forderung sind
vorhanden? Sind diese Beweise auch **verfügbar**?
- Ist eine **Rechtsschutzversicherung** vorhanden, die ein
Kostenrisiko übernimmt? (Falls ja und die nachfolgenden Fragen
ebenfalls bejaht: **gleich Versicherungsfall melden und
Deckungsanfrage veranlassen**.)
- Steht der **allfällige Gewinn mit den Aufwendungen in einem
ökonomischen Verhältnis**?
- Ist der **Beklagte überhaupt zahlungsfähig** und in der Lage, in
absehbarer Zeit zu bezahlen? (Falls nicht: auch ein positives
Urteil wirkt faktisch nichts.)
- Keine §-Zitate in der Quelle (prozesstaktische Checkliste).
## Kernwerte & Fristen (Stand 2026-07)
| Prüfschritt | Kernaufgabe |
|---|---|
| Außergerichtliche Geltendmachung | schriftlich, Zugangsnachweis, richtige Person |
| Gegenforderungen | Höhe eruieren |
| Beweise | vorhanden + verfügbar |
| Rechtsschutzversicherung | **Versicherungsfall melden, Deckungsanfrage** (vor Klag einbringen) |
| Ökonomie | Gewinn vs. Aufwendungen |
| Zahlungsunfähigkeit | Vollstreckbarkeit prüfen |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (ASG-Prozesspraxis) — ⚠
Verfahrensrahmen (ASG, EO) nicht in der Quelle genannt.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; die Checkliste ist ein
**Entscheidungsprozess** im Beendigungs-/Streitfall-Workflow
(→ lb-bso-10, lb-bso-17) und schützt vor wirtschaftlich
sinnlosen Verfahren.
- **Zahlungsfähigkeitsprüfung** des Arbeitgebers/Arbeitnehmers als
Risiko-Input im Prozess-Modell.
## Verweise
- **KB-intern:** lb-bso-10 (Verfahren vor dem ASG) · lb-bso-17
(Verfahrensvorbereitung)
@@ -0,0 +1,76 @@
---
id: lb-bso-15
batch: 10
title: "Checkliste - Unzulässige Anmerkungen"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsphase - Sonstiges"
topic: beendigungsphase-sonstiges
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_unzulassige_anmerkungen.pdf"
text: ".lexis360/md/checkliste_unzulassige_anmerkungen.md"
legal_bases: []
tags: [zeugnis, unzulassige-anmerkungen, diskriminierung, betriebsrat, datenschutz]
cross_refs: ["lb-bso-04", "lb-bso-13", "lb-glb-01"]
---
# Checkliste: Unzulässige Anmerkungen
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bso-15).*
## Zusammenfassung
- **Nicht erwähnen dürfen im Zeugnis:**
- eine **Betriebsratstätigkeit**;
- die **Zugehörigkeit zur bzw. Tätigkeit in der
Gewerkschaft**;
- eine **Schwangerschaft**;
- **Krankheiten oder krankheitsbedingte Abwesenheiten,
Behinderteneigenschaft**;
- **außerdienstliche Angelegenheiten und
Verhaltensweisen**;
- **Straftaten**;
- die **Beendigungsart** (insbesondere bei Entlassung und
Austritt) und/oder
- **rechtliche Auseinandersetzungen** während des aufrechten
Arbeitsverhältnisses oder im Zuge der Beendigung.
- **Ausnahme für die ersten beiden Punkte** (Betriebsrat/
Gewerkschaft): Erwähnung zulässig, **wenn der Arbeitnehmer es
wünscht**.
- ⚠ Die Checkliste führt keine §-Normen (Diskriminierungsverbot,
Datenschutz, Zeugnisrecht) an — die Begründung der
Verbotstatbestände über die Cluster `glb`, `mel` (Datenschutz)
beziehen.
## Kernwerte & Fristen (Stand 2026-06)
| Verbotstatbestand | Ausnahme |
|---|---|
| Betriebsratstätigkeit | auf Wunsch des Arbeitnehmers |
| Gewerkschaftszugehörigkeit/-tätigkeit | auf Wunsch des Arbeitnehmers |
| Schwangerschaft | |
| Krankheiten/krankheitsbedingte Abwesenheiten, Behinderteneigenschaft | |
| Außerdienstliche Angelegenheiten/Verhaltensweisen | |
| Straftaten | |
| Beendigungsart (insb. Entlassung, Austritt) | |
| Rechtliche Auseinandersetzungen (aufrecht/bei Beendigung) | |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Verbotstatbestände gründen im
Diskriminierungsverbot (GlBG), im Datenschutz (DSGVO/DSB) und im
Zeugnisrecht (OGH-Praxis) — ⚠ Normen nicht in der Quelle genannt.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; die Checkliste ist eine
**Freigabe-/Prüfbarriere** im Zeugniserstellungsprozess
(→ lb-bso-16) und reduziert Diskriminierungs-/Anfechtungsrisiko
(→ Cluster `glb`).
## Verweise
- **KB-intern:** lb-bso-04 (Dienstzeugnis) · lb-bso-13
(Zeugnisbestandteile) · lb-bso-16 (Zeugniserstellung) · lb-glb-01
(Gleichbehandlung)
@@ -0,0 +1,102 @@
---
id: lb-bnd-51
batch: 10
title: "Checkliste - Vorgehensweise Kündigung (Arbeitgeber)"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-07
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_vorgehensweise_kundigung_arbeitgeber.pdf"
text: ".lexis360/md/checkliste_vorgehensweise_kundigung_arbeitgeber.md"
legal_bases: ["§ 77 GewO 1859", "§§ 1159 ff ABGB"]
tags: [kundigung, fruhwarnsystem, frist, termin, form, betriebsrat, arbeiter, angestellter]
cross_refs: ["lb-bnd-39", "lb-bnd-40", "lb-bnd-41", "lb-bnd-42", "lb-bnd-50"]
---
# Checkliste: Vorgehensweise Kündigung (Arbeitgeber)
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juli 2026 (lb-bnd-51).*
## Zusammenfassung
- **1. Kündigungsschutz prüfen:** falls vorhanden → jeweiliges
Verfahren einhalten (z. B. **vorab Zustimmung des
Gerichts**); ansonsten weiter.
- **2. Frühwarnsystem (AMS)** prüfen: falls einzuhalten →
**Mitteilung an das AMS**; **Sperrfrist bis zum Ausspruch**
beachten.
- **3. Befristungs-Prüfung:** Befristung **ohne**
Kündigungsmöglichkeit → **Schreiben: keine Verlängerung über
das Ende hinaus** senden; mit Kündigungsmöglichkeit → weiter.
- **4. Arbeiter oder Angestellter?**
- **4.1 Arbeiter** *(Anmerkung der Quelle: „noch gültig für
Kündigungsausspruch bis zum 31. 12. 2020")*: KV auf
Kündigungsfrist/-termin prüfen; **Einzelvertragliche
Besserstellung** einhalten; ohne KV → **§ 77 GewO 1859**;
ohne Gewerbebetrieb → **§§ 1159 ff ABGB** (je nach
Tätigkeitsart); Besserstellung durch Arbeitsvertrag
vorgehend.
- **4.2 Angestellter:** Dienstvertrag auf Frist/Termin; keine
Regelung → **gesetzliche Regelung**; Vertragliche Regelung
darauf prüfen, ob sie **nicht durch den KV ausgeschlossen**
ist.
- **4.3 Beide:** **Formvorschrift** (schriftlich, Einschreiben)
gegebenenfalls einhalten; ohne Formvorschrift auch mündlich
möglich, **schriftlich aus Beweisgründen empfehlenswert**;
**begründete Kündigung** im Kündigungsschreiben anführen;
**Dienstfreistellung während der Kündigungsfrist** klären
(Rücksprache Fachabteilung).
- **5. Betriebsrat:** Info an den zuständigen BR, dass gekündigt
werden soll; **Erhalt bestätigen lassen**; **Frist bzw.
Stellungnahme abwarten**; danach unverzüglich weiter.
- **6. Ausspruch:** aktuelle Adresse; **unverzüglich Post
(eingeschrieben, Postweg einkalkulieren) oder direkte Übergabe
(Erhalt bestätigen/Zeugen)**.
- **7. Information:** **Kopie an die lohnverrechnende Stelle**;
Mitteilung an den **direkten Vorgesetzten** (Kündigung erfolgt);
Mitteilung an den **BR** (Kündigung erfolgt).
- **Rechtsgrundlagen:** **§ 77 GewO 1859** und **§§ 1159 ff
ABGB** — in der Checkliste zitiert (Arbeiter-Fall);
KV/Einzelvertrag-Vorbehalt.
## Kernwerte & Fristen (Stand 2026-07)
| Schritt | Kernaufgabe |
|---|---|
| 1 | Kündigungsschutz (ggf. vorab Gerichts-Zustimmung) |
| 2 | **AMS-Frühwarnsystem** + **Sperrfrist** |
| 3 | Befristung ohne/mit Kündigungsmöglichkeit trennen |
| 4 | **Frist/Termin:** KV → Einzelvertrag → (Arbeiter: § 77 GewO 1859 / §§ 1159 ff ABGB; Angestellter: gesetzliche Regelung) |
| 4.3 | **Form** (ggf. Schrift/Einschreiben); Begründung; Dienstfreistellung klären |
| 5 | **BR: Info + Erhalt + Frist/Stellungnahme abwarten** |
| 6 | **Eingeschrieben (Postweg!) oder Übergabe mit Beweis** |
| 7 | **Kopie an Lohnverrechnung**, Vorgesetzter, BR |
## Rechtsgrundlagen
- **§ 77 GewO 1859** (Kündigungsfrist Arbeiter ohne KV) — zitiert.
- **§§ 1159 ff ABGB** (Kündigungsfristen außerhalb Gewerbebetrieb) —
zitiert.
- Frühwarnsystem (FLAG), BR-Mitwirkung (§ 240 lit b ASchG) — als
Begriffe genannt, ohne §-Zitat ⚠.
## Payroll-Relevanz (Odoo)
- **Kündigungsausspruch + Kündigungsfrist/Termin** sind die
Kernwerte des Beendigungs-Workflows (Enddatum,
Kündigungsentschädigung, SZ-Aliquot, → lb-bnd-39/40/41).
- **Kopie an die lohnverrechnende Stelle** = interner
Beendigungs-Brief; die PV nimmt daraus das
Beendigungsdatum/-art für die Endabrechnung.
- **Frühwarnsystem (AMS) + Sperrfrist** ist eine
Verfahrensvoraussetzung, die den **Ausspruchstermin** begrenzt
(→ lb-bnd-42).
## Verweise
- **KB-intern:** lb-bnd-39 (Kündigungsausspruch) · lb-bnd-40/41
(Kündigungsfristen Angestellte/Arbeiter) · lb-bnd-42
(Kündigungsfrühwarnsystem) · lb-bnd-50
(Kündigungsanfechtung)
@@ -0,0 +1,103 @@
---
id: lb-swa-06
batch: 10
title: "Checkliste - Vorliegen von Schwerarbeit"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: schwerarbeit
author: "Schreiber"
stand: 2026-07
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_vorliegen_von_schwerarbeit.pdf"
text: ".lexis360/md/checkliste_vorliegen_von_schwerarbeit.md"
legal_bases: ["Schwerarbeitsverordnung"]
tags: [schwerarbeit, meldepflicht, schichtarbeit, nachtschichten, schwere-korperliche-arbeit, leiharbeiter]
cross_refs: ["lb-swa-01", "lb-swa-02", "lb-swa-04", "lb-swa-05"]
---
# Checkliste: Vorliegen von Schwerarbeit
*Lexis Briefings Personalrecht, Schreiber, Stand Juli 2026 (lb-swa-06).*
## Zusammenfassung
- **Allgemeines:** im Betrieb beschäftigte **Männer ab 40, Frauen ab 35
Lebensjahr** herausfiltern; **Leiharbeiter** sind nicht vom
Beschäftiger, sondern vom **Überlasser** zu melden. **Praxistipp:**
der Beschäftiger gibt dem Überlasser am Jahresende bekannt, welche
Leiharbeiter (altersgerecht) im abgelaufenen Kalenderjahr
Schwerarbeit verrichtet haben, in welchen Kalendermonaten und nach
welcher **Ziffer der Schwerarbeitsverordnung**.
- **Schicht-/Wechseldienst:** Dauernde Nachtarbeit fällt **nicht**
darunter — es muss pro Monat zumindest **ein Wechsel zu einem
Tagdienst** stattfinden; Arbeitszeit **mind. 6 Stunden zwischen 22
Uhr und 6 Uhr**; **überwiegend** (mehr als die Hälfte) nicht
Arbeitsbereitschaft; **Nachtschichten-Schwelle (Staffelung):**
mind. **6 im Kalendermonat**, sonst **12 in diesem + dem
vorangegangenen Monat**, sonst **18 in diesem + den beiden
vorangegangenen Monaten**, sonst (Durchrechnungszeitraum > 3
Monate) **36 in diesem + den letzten 5 Kalendermonaten**.
- **Hitze/Kälte:** Hitze muss durch die Arbeitsvorgänge verursacht
sein; Werte: **30 °C bei 50 % Luftfeuchtigkeit bei 0,1 m/s
Luftgeschwindigkeit** oder gleichwertig/ungünstiger; Kälte:
überwiegender Aufenthalt in begehbaren Kühlräumen **unter 21 °C**
oder ständiger Wechsel zwischen solchen und anderen Räumen.
- **Chemische/physikalische Einflüsse:** Unterlagen so aufbewahren,
dass **Jahre später dem Pensionsversicherungsträger** auf Anfrage
Auskunft gegeben werden kann.
- **Schwere körperliche Arbeit:** **tägliche Arbeitszeit 8 Stunden**;
Tätigkeit in der **Liste „schwere körperliche Arbeit"** (Männer/
Frauen/ nur Frauen?); mit Großgeräten oder manuell?; primär
Planung/Aufsicht = Ausschlusskandidat. **Hinweis:** die
Tätigkeitsliste ist **nicht taxativ**; auch bei kürzeren
Arbeitszeiten vor, wenn der **Arbeitskilokalorienverbrauch pro
Arbeitstag** erreicht wird (längere Arbeitszeit/besondere Schwere) —
auch hier ist zu melden.
- **Berufsbedingte Pflege** (erkrankte/behinderte Menschen mit
besonderem Behandlungs-/Pflegebedarf): Arbeitszeit **mind. die
Hälfte der Normalarbeitszeit**; Hospiz-/Palliativmedizin;
Pflegelinge mit **Pflegebedarf ab Stufe 5**.
- **Tätigkeiten trotz Pflegegeld ab Stufe 3:** Personen im Betrieb,
die Pflegegeld ab Stufe 3 beziehen (praktisch: Rollstuhlfahrer,
hochgradig Sehbehinderte/Blinde; **Behinderteneinstellungsgesetz-
Einstufung ist irrelevant**).
## Kernwerte & Fristen (Stand 2026-07)
| Tatbestand | Schwelle |
|---|---|
| Alter (Meldepflicht-Bezug) | Männer **40**, Frauen **35** |
| Leiharbeiter | Meldung durch den **Überlasser** (Jahresende-Bekanntgabe durch Beschäftiger) |
| Schicht/Wechsel | **Wechsel zu Tagdienst pro Monat**; 226 Uhr mind. **6 Std**; keine überwiegende Arbeitsbereitschaft |
| Nachtschichten (Staffel) | **6/Monat** → 12/2 Monate → 18/3 Monate → 36/6 Monate (Durchrechnungszeitraum > 3 Monate) |
| Hitze | **30 °C, 50 % Feuchte, 0,1 m/s** (oder gleichwertig), arbeitsvorgangsbedingt |
| Kälte | **unter 21 °C** (Kühlräume, überwiegend/ständiger Wechsel) |
| Schwere körperliche Arbeit | **8 Std/Tag**; nicht-taxative Liste; Kcal-Regel |
| Pflege | mind. **½ Normalarbeitszeit**; Hospiz/Palliativ; **Pflegestufe ≥ 5** |
| Pflegegeld | Tätigkeit trotz **Pflegegeld Stufe ≥ 3** |
## Rechtsgrundlagen
- **Schwerarbeitsverordnung** (Ziffern/Tätigkeitsliste) — ausdrücklich
referenziert (ohne Ziffer).
- Pensionsversicherungsträger-Auskunft = meldepflichtige Folge — ⚠
§-Zuordnung (ASVG/Meldepflicht) über lb-swa-05 beziehen.
- Behinderteneinstellungsgesetz — als **irrelevant** für die
Einstufung genannt (ohne §-Zitat).
## Payroll-Relevanz (Odoo)
- Die **Meldekriterien (Nachtschichten-Staffel, 226-Uhr-Fenster,
8-Stunden-Schwelle)** sind Auswertungslogik auf Work-Entries/
Dienstplänen — je Mitarbeiter und Monat prüfen.
- **Leiharbeiter-Regel** (Meldung über den Überlasser) ist ein
Zuordnungspunkt im Meldewesen (→ lb-aug-01/02).
- **Dokumentationspflicht** (chem./physikalische Einflüsse) für
spätere PVA-Auskünfte = Belegarchiv, nicht Abrechnungswert.
## Verweise
- **KB-intern:** lb-swa-01 (Feststellung von
Schwerarbeitszeiten) · lb-swa-02 (Schwerarbeit —
Allgemeines) · lb-swa-04 (Schwerarbeitstatbestände) · lb-swa-05
(Meldepflicht des Arbeitgebers)
@@ -0,0 +1,75 @@
---
id: lb-bnd-52
batch: 10
title: "Checkliste - Vorüberlegungen zur einvernehmlichen Auflösung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_voruberlegungen_zur_einvernehmlichen_au.pdf"
text: ".lexis360/md/checkliste_voruberlegungen_zur_einvernehmlichen_au.md"
legal_bases: []
tags: [einvernehmliche-losung, aufloesung, abfertigung, konkurrenzklausel, dienstfreistellung]
cross_refs: ["lb-bnd-13", "lb-end-11", "lb-bso-07"]
---
# Checkliste: Vorüberlegungen zur einvernehmlichen Auflösung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-52).*
## Zusammenfassung
- **11 Prüffragen vor Abschluss der Vereinbarung:**
1. **Besondere Formerfordernisse** für die einvernehmliche
Auflösung (schriftlich; **Bescheinigung von Arbeiterkammer
oder Arbeitsgericht**; Zustimmung der gesetzlichen Vertreter)?
2. **Abfertigung Alt oder Neu****Folgekosten**!
3. Besteht eine **Konkurrenzklausel**?
4. Wurde ein **Ausbildungskostenrückersatz** vereinbart?
5. **Enddatum** genau festlegen.
6. Bis dahin noch **Urlaub oder Zeitausgleich konsumieren**?
7. **Freizeit zur Postensuche** in welchem Ausmaß?
8. **Dienstfreistellung**?
9. **Privatnutzung Firmen-Pkw** (Anspruch? Rückgabe-Wann)?
10. **Dienstwohnung**?
11. **Zusätzliche freiwillige Abfertigung** zahlen?
- Keine §-Zitate in der Quelle (Vereinbarungs-Checkliste).
## Kernwerte & Fristen (Stand 2026-06)
| Prüffrage | Kernaufgabe |
|---|---|
| 1 | Formerfordernisse (Schrift, AK/Arbeitsgericht-Bescheinigung, Zustimmung) |
| 2 | **Abfertigung Alt/Neu** (Folgekosten) |
| 34 | Konkurrenzklausel; Ausbildungskostenrückersatz |
| 5 | **Enddatum** exakt |
| 67 | Urlaub/Zeitausgleich konsumieren; Postensuche-Freizeit |
| 8 | Dienstfreistellung |
| 910 | Firmen-Pkw (Rückgabe); Dienstwohnung |
| 11 | **freiwillige Abfertigung** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Fragen berühren
Abfertigung (AVRAG/BMSVG), Konkurrenzklausel (ABGB),
Postensuche (§ 35a AngG) — ⚠ Normen nicht in der Quelle genannt,
über Cluster `end`/`bso` beziehen.
## Payroll-Relevanz (Odoo)
- Die 11 Fragen sind die **Endabstellungs-Checkliste** der
PV: Enddatum, Abfertigungs-Zufluss (Alt/Neu, freiwillige
Abfertigung), Urlaubs-/Zeitguthaben-Abbau, Pkw-/Wohnung-
Rückgabe (Sachbezüge, → Cluster `sac`), Postensuche-Freizeit
(→ lb-bso-07).
- **Folgekosten-Prüfung (Frage 2/11)** vor Unterschrift =
wirtschaftliche Entscheidung der PV (→ lb-end-11/12).
## Verweise
- **KB-intern:** lb-bnd-13 (Einvernehmliche Lösung) · lb-end-11
(Freiwillige Abfertigung arbeitsrecht) · lb-end-12
(Freiwillige Abfertigung Lohnnebenkosten) · lb-bso-07
(Postensuche)
@@ -0,0 +1,83 @@
---
id: lb-bso-16
batch: 10
title: "Checkliste - Zeugniserstellung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsphase - Sonstiges"
topic: beendigungsphase-sonstiges
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_zeugniserstellung.pdf"
text: ".lexis360/md/checkliste_zeugniserstellung.md"
legal_bases: []
tags: [zeugnis, zeugniserstellung, qualifiziertes-zeugnis, prozess, beendigung]
cross_refs: ["lb-bso-04", "lb-bso-12", "lb-bso-13", "lb-bso-15"]
---
# Checkliste: Zeugniserstellung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bso-16).*
## Zusammenfassung
- **Allgemein (alle Zeugnissorten):**
- **Bei jeder Beendigung automatisch** alle Informationen für
sofortige oder spätere Zeugniserstellung einholen.
- **Intern klären:** gesetzliches oder qualifiziertes Zeugnis;
gleich erstellt oder nur Vorvorsorge für zukünftige Anforderung.
- **Direkte(n) Vorgesetzte(n) miteinbeziehen.**
- Tätigkeit(en) eruieren — allenfalls der Arbeitnehmer beschreibt
seine Tätigkeiten selbst.
- Tätigkeit **konkret ausformulieren wie in einer
Stellenausschreibung** — eine allgemeine Bezeichnung wie
„Angestellte(r)/Arbeiter(in)" genügt **nicht**.
- **Entwicklung des Mitarbeiters nachvollziehen:** inhaltliche
Änderungen des Aufgabenbereichs mit Beginn/Ende der jeweiligen
Verwendung **datumsmäßig**.
- **Für ein qualifiziertes Zeugnis zusätzlich:**
- Aufzeichnungen zu geführten **Mitarbeitergesprächen** einholen.
- Ergebnisse von **Mitarbeiterbeurteilungen** sichten.
- Je ausgeübter Tätigkeit die **Haupteigenschaften** ermitteln, die
die Tätigkeit erfordert; **nur erforderliche Eigenschaften
beurteilen** (keine Nebensächlichkeiten/Belanglosigkeiten).
- **Nur Unternehmensangaben** mit unmittelbarem Bezug zur Tätigkeit
bzw. zur Eindrücklichkeit des Tätigkeitsbilds.
- **Nach Erstellung (beide Zeugnissorten):**
- **Länge** kritisch hinterfragen.
- **Rechtschreib-/Grammatikprüfung** gewissenhaft.
- **Äußere Form** bewusst prüfen (Briefpapier, Schriftgröße,
Abstände, Absätze, Länge, nicht falten, Sauberkeit).
- **Unverzügliche Übermittlung** veranlassen bzw. Termin zur
Abholung/Abklärungsgespräch vereinbaren.
## Kernwerte & Fristen (Stand 2026-06)
| Phase | Kernaufgabe |
|---|---|
| Beendigung (automatisch) | Informationen für (spätere) Zeugniserstellung sichern |
| Klärung | gesetzlich/qualifiziert; sofort/Vorvorsorge |
| Inhalt | Tätigkeiten konkret (Stellenanzeigen-Stil); Entwicklungen datumsmäßig |
| Qualifiziert | Gesprächs-Protokolle, Beurteilungen; nur relevante Eigenschaften; nur tertiär bezogene Unternehmensangaben |
| Nachbereitung | Länge, Rechtschreibung, äußere Form, unverzügliche Übermittlung |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (zeugnisrechtliche Praxis,
OGH-Praxis zur qualitativen Aussage) — ⚠ Norm/Judikatur nicht in
der Quelle genannt.
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; die Checkliste ist ein
**Prozessablauf** im Beendigungsworkflow (→ lb-bso-04), der die
Haftungs-/Anfechtungssicherheit des Zeugnisses erhöht.
- **Entwicklungen datumsmäßig** = Bezug auf
Entgeltversions-/Aufstiegsdaten im Personalstamm (Abgrenzung für
Vordienstzeiten, → lb-bso-13).
## Verweise
- **KB-intern:** lb-bso-04 (Dienstzeugnis) · lb-bso-12
(Bewertungskriterien) · lb-bso-13 (Zeugnisbestandteile) ·
lb-bso-15 (unzulässige Anmerkungen)
@@ -0,0 +1,74 @@
---
id: lb-bnd-53
batch: 10
title: "Checkliste - Zu beachten bei Auflösung in der Probezeit"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/uebersichten_checklisten/Lexis360_checkliste_zu_beachten_bei_auflosung_in_der_probez.pdf"
text: ".lexis360/md/checkliste_zu_beachten_bei_auflosung_in_der_probez.md"
legal_bases: []
tags: [probezeit, aufloesung, endabrechnung, gkk, l16, dienstzeugnis]
cross_refs: ["lb-bnd-37", "lb-bnd-57", "lb-bso-01"]
---
# Checkliste: Zu beachten bei Auflösung in der Probezeit
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-53).*
## Zusammenfassung
- **Prüfreihenfolge:**
- Sieht der **KV eine Probezeit vor**?
- Wenn nein: wurde eine **Probezeit vereinbart** (**Schriftlichkeit
unbedingt aus Nachweisgründen zu empfehlen**)?
- **Dauer der Probezeit**.
- **Rechtzeitige Auflösungserklärung** (letzter Tag der möglichen
Zustellung/des möglichen Ausspruchs).
- **Keine diskriminierende** Auflösungserklärung.
- **Keine weitere (stillschweigende) Entgegennahme von
Arbeitsleistung** nach der Auflösung.
- **Korrekte Endabrechnung:**
- **Abrechnung der zustehenden Entgeltansprüche**.
- **Abmeldung bei der GKK**.
- **Ausfertigung der erforderlichen Schriftstücke**
(**Dienstzeugnis auf Verlangen**, **L16**).
- Keine §-Zitate in der Quelle (KV-/PV-Praxis).
## Kernwerte & Fristen (Stand 2026-06)
| Prüfpunkt | Kernaufgabe |
|---|---|
| KV/Vertrag | Probezeit vorhanden? (Schrift = Nachweis) |
| Dauer | Probezeit-Länge |
| **Timing** | **rechtzeitig** (letzter Tag der Zustellung/des Ausspruchs) |
| Inhalt | keine Diskriminierung |
| Fortsetzung | **keine stillschweigende Arbeitsleistungsnahme** nach der Erklärung |
| Abrechnung | Entgeltansprüche, **GKK-Abmeldung**, **Dienstzeugnis (auf Verlangen), L16** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Punkte berühren
Probezeit/KV, GKK-Abmeldung (ASVG), L16 (FLAG) — ⚠ Normen
nicht in der Quelle genannt, über lb-bnd-37 und lb-bso-01
beziehen.
## Payroll-Relevanz (Odoo)
- **Stillschweigende Arbeitsleistungsnahme** nach der Erklärung
kann die Probezeit verlängern/widerlegen — im Beendigungs-
workflow als Stopp-Punkt (keine Work-Entries mehr nach
Ausspruch).
- **GKK-Abmeldung + L16** = eSV/L16-Meldepflicht (→ lb-bso-01);
**Dienstzeugnis auf Verlangen** (→ lb-bso-04/13/16).
- **Entgeltabrechnung** (laufend, aliquot) als Endabrechnung
(→ lb-bnd-46/47).
## Verweise
- **KB-intern:** lb-bnd-37 (Auflösung in Probezeit) · lb-bnd-57
(Muster Auflösung) · lb-bso-01 (Abmeldung
Sozialversicherung)
@@ -0,0 +1,71 @@
---
id: lb-ues-05
batch: 10
title: "Muster - All-in-Teilzeitvereinbarungen"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: uberstunden
author: "Schrank"
stand: 2025-12
source:
pdf: ".lexis360/muster/Lexis360_muster_all_in_teilzeitvereinbarungen.pdf"
text: ".lexis360/md/muster_all_in_teilzeitvereinbarungen.md"
legal_bases: []
tags: [all-in, teilzeit, mehrstunden, pauschale, zuschlaege]
cross_refs: ["lb-ues-06", "lb-ues-07", "lb-ues-02"]
---
# Muster: All-in-Teilzeitvereinbarungen
*Lexis Briefings Personalrecht, Schrank, Stand Dezember 2025 (lb-ues-05).*
## Zusammenfassung
- **Teilzeit-All-in-Gehalt:** Das **Teilzeit-Grundgehalt** (€ X brutto
monatlich) und das **Teilzeit-All-in-Gehalt** (€ Y brutto monatlich)
werden getrennt ausgeschrieben.
- **Pauschalabgeltung:** Der über dem Grundgehalt liegende Teil des
All-in-Gehalts **zuzüglich allfälliger weiterer Entgeltzahlungen**
dient der pauschalen Abgeltung **aller Teilzeit-Mehrstunden,
Dienstreisezeiten und Überstunden einschließlich entsprechender
Zuschläge** — **im Durchschnitt von jeweils 12 Monaten**; bei
ausreichender Deckung gebührt für solche Zeiten **kein weiteres
Entgelt**.
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeitgesetze, Kommentar* (Linde Verlag, 7. Auflage
2023).
- Keine §-Zitate in der Klausel selbst (Vertragsmechanik).
## Kernwerte & Fristen (Stand 2025-12)
| Klausel | Inhalt |
|---|---|
| Teilzeit-Grundgehalt | € X brutto/Monat |
| Teilzeit-All-in-Gehalt | € Y brutto/Monat |
| Abgeltungsumfang | alle Teilzeit-Mehrstunden, Dienstreisezeiten, Überstunden inkl. Zuschläge (+ allf. weitere Entgeltzahlungen) |
| Durchschnittsperiode | **12 Monate** |
| Deckungseffekt | bei ausreichender Deckung kein weiteres Entgelt |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Vertragsklausel); zugrunde liegt das
AZG-Überstundenregime — ⚠ §-Zuordnung über lb-ues-01/02/07 beziehen.
- Kommentierung: Schrank, *Arbeitszeitgesetze* (7. Aufl. 2023) —
Literaturhinweis der Quelle.
## Payroll-Relevanz (Odoo)
- **12-Monate-Durchschnitt** = Abrechnungszeitraum der Deckung
(Ist-Mehrstunden vs. Abgeltungsumfang) — Deckung je Periode prüfen.
- **Grundgehalt/All-in-Trennung** bei Teilzeit ist identisch zum
Vollzeitfall (→ lb-ues-06/07) — gleiche Entgeltlogik, Teilzeit-
Parameter (Stundenmaß) zusätzlich.
- **Zuschläge im Abgeltungsumfang** enthalten → Zuschlagsabrechnung
entfällt bei Deckung; die Zuschlagsraten bleiben für die
Deckungsberechnung Parameter.
## Verweise
- **KB-intern:** lb-ues-06 (All-inclusive) · lb-ues-07
(All-in-Entgelt-Varianten) · lb-ues-02 (Überstundenpauschale und
All-in)
@@ -0,0 +1,66 @@
---
id: lb-ues-06
batch: 10
title: "Muster - All-inclusive-Vereinbarung"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: uberstunden
author: "Sabara"
stand: 2025-12
source:
pdf: ".lexis360/muster/Lexis360_muster_all_inclusive_vereinbarung.pdf"
text: ".lexis360/md/muster_all_inclusive_vereinbarung.md"
legal_bases: []
tags: [all-in, all-inclusive, leitende-angestellte, azg-ausnahme, grundgehalt]
cross_refs: ["lb-ues-05", "lb-ues-07", "lb-ues-02", "lb-lei-01"]
---
# Muster: All-inclusive-Vereinbarung
*Lexis Briefings Personalrecht, Sabara, Stand Dezember 2025 (lb-ues-06).*
## Zusammenfassung
- **All-in-Klausel (Basis):** Mit dem Bruttogehalt iHv € X, **darin
enthalten das Grundgehalt iHv € Y**, sind sämtliche Leistungen, die
über die geltende Normalarbeitszeit hinaus erbracht werden, pauschal
abgegolten.
- **Variante leitende Angestellte:** zusätzliches wohlverstandenes
Überstundenleisten „bei Bedarf“; **ausdrückliche Ausnahme vom
Anwendungsbereich des Arbeitszeitgesetzes und des
Arbeitsruhegesetzes** als leitender Angestellter.
- Die **Grundgehalt-Abgrenzung** (Anteil im Bruttogehalt) ist die
zentrale Entgeltdefinition — relevant für Abfertigungs- und
Pensionsbezüge (→ lb-ues-07 Klausel 6, § 2 Abs 2 Z 9 AVRAG).
- Keine §-Zitate in der Basis-Klausel; die AZG/ARaG-Ausnahme
(leitende Angestellte) ist im Text selbst enthalten, die
Rechtsnorm ist aber nicht zitiert — ⚠ (ARaG/AZG §-Zuordnung über
lb-ues-02 beziehen).
## Kernwerte & Fristen (Stand 2025-12)
| Klausel | Inhalt |
|---|---|
| Bruttogehalt | € X (inkl. Grundgehalt € Y) |
| Pauschalabgeltung | sämtliche Mehrleistungen über der Normalarbeitszeit |
| Variante leitende Angestellte | Überstunden „bei Bedarf“ wohlverstanden; AZG/ARaG-Ausnahme |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Vertragsklausel); die
Leitende-Angestellte-Ausnahme betrifft AZG/ARaG — ⚠ Normen nicht
zitiert, über lb-ues-02/Cluster `lei` beziehen.
## Payroll-Relevanz (Odoo)
- **Grundgehalt vs. All-in-Überhang** muss im Entgeltmodell getrennt
geführt werden (Abfertigungs-/Pensionsrelevanz; → lb-ues-07).
- **AZG/ARaG-Ausnahme (leitende Angestellte)** = Konfigurationsflag am
Dienstverhältnis (keine Arbeitszeitgrenzen-Aufzeichnungspflicht) —
aber Melde-/Aufzeichnungsfolgen prüfen (→ Cluster `zer`, `azg`).
## Verweise
- **KB-intern:** lb-ues-05 (All-in-Teilzeit) · lb-ues-07
(All-in-Entgelt-Varianten) · lb-ues-02 (Überstundenpauschale und
All-in) · lb-lei-01 (Leitende Angestellte)
@@ -0,0 +1,73 @@
---
id: lb-bnd-54
batch: 10
title: "Muster: Änderungskündigung (auflösende Bedingung)"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_anderungskundigung_auflosende_bedingung.pdf"
text: ".lexis360/md/muster_anderungskundigung_auflosende_bedingung.md"
legal_bases: []
tags: [anderungskundigung, aufloesende-bedingung, zuruecknahme, betriebsorganisatorische-gruende]
cross_refs: ["lb-bnd-39", "lb-bnd-40", "lb-bnd-41", "lb-bnd-51"]
---
# Muster: Änderungskündigung (auflösende Bedingung)
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juli 2026 (lb-bnd-54).*
## Zusammenfassung
- **Kernstruktur:** Ein Schreiben, das (1) die **Kündigung** aus
wirtschaftlichen/betriebsorganisatorischen Gründen unter Einhaltung der
gesetzlichen/kollektivvertraglichen/einzelvertraglichen Kündigungsfrist
zum nächsten möglichen Endzeitpunkt ausspricht und (2) zeitgleich ein
**befristetes Änderungsangebot** (geänderte Dienstvertragsbedingungen)
unterbreitet.
- **Automatische Zurücknahme:** Zustimmt der Arbeitnehmer dem
Änderungsangebot, „führt dies zur **automatischen Zurücknahme** dieser
Kündigung"; das Arbeitsverhältnis wird zu den geänderten Bedingungen
**ununterbrochen** fortgesetzt.
- **Fristmechanik:** Zustimmung **schriftlich bis spätestens [Datum]**
mit der Zustimmung erklärt sich der Arbeitnehmer „auch mit der
Zurücknahme der Kündigung ausdrücklich einverstanden".
- **Ablehnung/Schweigen:** Bei Nichtäußerung innerhalb der Frist oder
Ablehnung „bleibt es bei der ausgesprochenen Kündigung" → das
Dienstverhältnis endet am im Kündigungsteil genannten Datum.
- **Betriebsrat:** Vorinformation der Kündigungsabsicht wird im Muster
ausdrücklich bestätigt („ordnungsgemäß vorinformiert").
## Kernwerte & Fristen (Stand 2026-07)
| Baustein | Regel im Muster |
|---|---|
| Kündigungsfrist | gesetzliche/kollektivvertragliche/einzelvertragliche Frist (Tag/Woche/Monat) — Angabe im Schreiben empfohlen |
| Änderungsangebot | befristet; Zustimmung schriftlich bis zum Stichtag |
| Wirkung der Zustimmung | automatische Zurücknahme der Kündigung, ununterbrochene Weiterführung |
| Wirkung der Ablehnung | Kündigung bleibt wirksam, Enddatum wie ausgesprochen |
## Rechtsgrundlagen
- Keine §-Zitate im Muster (Vertrags-/Kündigungsmechanik).
- Kündigungsfristen/-termine: → lb-bnd-40 (Angestellte) / lb-bnd-41
(Arbeiter); Form und Ausspruch → lb-bnd-39.
## Payroll-Relevanz (Odoo)
- Bei **Annahme des Änderungsangebots** ist das Dienstverhältnis
fortlaufend (kein Ende/Neuantritt) → in der Abrechnung: Parameterwechsel
(Entgeltgruppe, Arbeitszeit) zum Änderungsstichtag, keine
Endabrechnung; Kündigungs-/Austritts-Logik muss das
Annahme-/Ablehnungszweigtrennen (Status-Feld + Stichtag).
- **Vertragsschluss-Nachweis** (schriftliche Zustimmung) ist für die
Wirksamkeit der Zurücknahme relevant → Dokumentenbezug am
hr.employee/dem Änderungsevent.
## Verweise
- **KB-intern:** lb-bnd-39 (Kündigungsausspruch) · lb-bnd-40/41
(Kündigungsfristen Angestellte/Arbeiter) · lb-bnd-51 (Vorgehensweise
Kündigung Arbeitgeber)
@@ -0,0 +1,81 @@
---
id: lb-bes-09
batch: 10
title: "Muster - Angestelltendienstvertrag"
work: "Lexis Briefings Personalrecht"
chapter: "Bis zum Dienstantritt"
topic: beschaftigungsformen
author: "Haider"
stand: 2025-06
source:
pdf: ".lexis360/muster/Lexis360_muster_angestelltendienstvertrag.pdf"
text: ".lexis360/md/muster_angestelltendienstvertrag.md"
legal_bases: ["§ 19c Abs 2 und 3 AZG"]
tags: [dienstvertrag, angestellte, einstufung, mehrarbeit, ordnungsvorschriften, vorsorgekasse]
cross_refs: ["lb-bes-10", "lb-bes-01", "lb-ues-04"]
---
# Muster: Angestelltendienstvertrag
*Lexis Briefings Personalrecht, Haider, Stand Juni 2025 (lb-bes-09).*
## Zusammenfassung
- **Gliederung (XII Abschnitte):** I. Tätigkeitsbereich (Tätigkeit +
verwandte Tätigkeiten nach Weisungen) · II. Dienstort (Abweichende
Betriebsstätten mit Mehraufwands-Vergütung; Standortverlegung = neuer
Dienstort) · III. Einstufung (KV-Gruppe, Berufsjahr, Jahreswechsel;
Vordienstzeiten-Anrechnung; Erklärung der korrekten Einstufung) ·
IV. Entgelt (monatliches Bruttogehalt, **vierzehnmal jährlich**,
Zahlung am letzten Tag des Kalendermonats; **Urlaubszuschuss (13.) und
Weihnachtsremuneration (14.)** mit Zahlungsmonat; weitere
Entgeltbestandteile) · V. Arbeitszeit, Mehr- und Überstunden (Normal-
arbeitszeit wöchentlich/täglich; **§ 19c Abs 2 und 3 AZG: Änderung der
Lage bei objektiver Notwendigkeit mit 14-Tage-Vorankündigung**;
Mehr-/Überstunden nur bei Anordnung, nachträgliche Genehmigung durch
Vorgesetzten möglich; **nicht angeordnete/genehmigte Mehrarbeit gilt als
nicht geleistet**; Meldefrist für Mehrleistungen; Vergütung nach
Gesetzen/KV) · VI. Spesen (eigenes Kfz; Ersatz gegen Nachweis nach KV) ·
VII. Urlaub · VIII. Entgeltfortzahlung · IX. Geheimhaltung · X. Dauer ·
XI. Betriebliche Vorsorgekasse · XII. Nebentätigkeit/Konkurrenzklausel.
- **Abrechnungsrelevante Klauseln:** Anordnungs-/Genehmigungsvorbehalt für
Mehr-/Überstunden (Vergütung nur bei Anordnung), Meldefrist,
Sonderzahlungen mit festen Zahlungsmonaten, Vordienstzeiten-Anrechnung.
## Kernwerte & Fristen (Stand 2025-06)
| Klausel | Regel im Muster |
|---|---|
| Entgeltstruktur | monatliches Bruttogehalt, 14x jährlich; 13./14. Monatsgehalt mit Zahlungsmonat |
| Lageänderung Normalarbeitszeit | § 19c Abs 2/3 AZG, objektive Notwendigkeit, **14 Tage Vorankündigung** |
| Mehr-/Überstunden | nur bei **Anordnung** (nachträgliche Genehmigung möglich); nicht angeordnete Mehrarbeit = nicht geleistet |
| Meldefrist Mehrleistung | bis spätestens [Datum] schriftlich |
| Spesen | eigenes Kfz; Ersatz gegen Aufzeichnung/Belege nach KV |
| Vordienstzeiten | X Jahre/Y Monate angerechnet (Erklärung) |
## Rechtsgrundlagen
- **§ 19c Abs 2 und 3 AZG** (Lage der Normalarbeitszeit; Änderung bei
objektiver Notwendigkeit) — ausdrücklich zitiert.
- Sonstige Stellen (Sonderzahlungen, Spesen, Vorsorgekasse) verweisen auf
„gesetzliche und kollektivvertragliche Vorschriften" ohne §-Zitat — ⚠
konkrete Normen je KV.
## Payroll-Relevanz (Odoo)
- **Anordnungs-Vorbehalt** = Work-Entry-Prinzip: Mehrarbeit nur bei
dokumentierter Anordnung genehmigungsfähig → Anordnungsfeld/Workflow im
hr_work_entry (→ lb-ues-04).
- **14-Tage-Vorankündigung** bei Lageänderung = Frist im
Arbeitszeit-Änderungsprozess.
- **13./14. Monatsgehalt mit Zahlungsmonat** = Sonderzahlungs-Parameter
(→ Cluster `son`); Zahlung am letzten Tag des Monats =
Abrechnungszyklus.
- **Vordienstzeiten** sind Einstufungsfakt (KV), kein Entgeltwert — im
Vertrag dokumentieren.
## Verweise
- **KB-intern:** lb-bes-10 (Arbeiterdienstvertrag) · lb-bes-01
(echtes Arbeitsverhältnis) · lb-ues-04 (Verpflichtung zur
Überstundenarbeit) · Cluster `son` (Sonderzahlungen)
@@ -0,0 +1,82 @@
---
id: lb-bes-10
batch: 10
title: "Muster - Arbeiterdienstvertrag"
work: "Lexis Briefings Personalrecht"
chapter: "Bis zum Dienstantritt"
topic: beschaftigungsformen
author: "Haider"
stand: 2025-06
source:
pdf: ".lexis360/muster/Lexis360_muster_arbeiterdienstvertrag.pdf"
text: ".lexis360/md/muster_arbeiterdienstvertrag.md"
legal_bases: ["§ 19c Abs 3 AZG"]
tags: [dienstvertrag, arbeiter, probezeit, kuendigungsfrist, lohngruppe, nachtdienst]
cross_refs: ["lb-bes-09", "lb-bes-01"]
---
# Muster: Arbeiterdienstvertrag
*Lexis Briefings Personalrecht, Haider, Stand Juni 2025 (lb-bes-10).*
## Zusammenfassung
- **Gliederung (XII Abschnitte):** I. Vertragsdauer (bestimmt/unbestimmt)
· II. Probezeit (jederzeitige begrundungslose Auflosung wahrend der
Probezeit), Kündigungsfrist und -termin (KV bzw. gesetzliche Fristen/
Termine) · III. Gewöhnlicher Dienstort (vorübergehende/dauernde
Versetzung, regional begrenzt; Dienstreisen/Montagen In- und Ausland
mit Mehraufwands-Vergütung) · IV. Tätigkeit/Aufgaben (Zuweisung
qualifikationsentsprechender Arbeiten) · V. Einstufung und Lohnzahlung
(Lohngruppe laut KV; Stundenlohn/Monatslohn; **Sonderzahlungen nach
anwendbarem KV**; variable Entgeltbestandteile mit der Abrechnung des
Folgemonats; Erklärung der korrekten Einstufung inkl.
Vordienstzeiten) · VI. Arbeitszeit und Überstunden
(Wochenstunden; tägliche Lage; **Lageänderung bei objektiven Gründen
mit mindestens zwei Wochen Vorankündigung, Abweichung gem. § 19c
Abs 3 AZG; einseitige Änderungen mit angemessener
Berücksichtigungswürdiger Interessen**; Bereitschaft zu Nacht- und
Sonn-/Feiertagsarbeit; Meldepflicht von Veränderungen) ·
VII. Erholungsurlaub · VIII. Dienstverhinderung · IX. Nebenbeschäfti-
gung, sonstige Erwerbstätigkeit · X. Betriebs- und Geschäftsgeheimnisse
· XI. Konventionalstrafe · XII. Konkurrenzklausel.
- **Unterschiede zum Angestellten-Muster (lb-bes-09):** Vertragsdauer-
und Kündigungsfrist-Block explizit (Arbeiter), Stundenlohn/Monatslohn
statt fester Monatsbezüge, Konventionalstrafe-/Konkurrenzklausel-Abschnitt
ausgebaut.
## Kernwerte & Fristen (Stand 2025-06)
| Klausel | Regel im Muster |
|---|---|
| Probezeit | X Wochen/1 Monat, jederzeitige begrundungslose Auflosung |
| Kündigungsfristen/-termine | KV bzw. gesetzliche Fristen, Termine je Partei |
| Lohnstruktur | Lohngruppe laut KV; Stundenlohn oder Monatslohn; Sonderzahlungen nach KV; variable Bestandteile mit Folgemonat |
| Lageänderung Arbeitszeit | objektive Gründe, **mindestens 2 Wochen Vorankündigung** (Abweichung gem. § 19c Abs 3 AZG) |
| Nacht-/Sonn-/Feiertagsarbeit | einvernehmliche Bereitschaft erklärt |
| Geheimhaltung | Betriebs- und Geschäftsgeheimnisse; Konventionalstrafe-Abschnitt |
## Rechtsgrundlagen
- **§ 19c Abs 3 AZG** (Abweichung von der Vorankündigungsfrist bei
Lageänderung der Arbeitszeit) — ausdrücklich zitiert.
- Sonstige Stellen (Kündigungsfristen, Sonderzahlungen) verweisen auf
KV/gesetzliche Bestimmungen ohne §-Zitat — ⚠ Normen je KV.
## Payroll-Relevanz (Odoo)
- **Stundenlohn/Monatslohn** je nach KV = Entgeltart als
Parameter (Stundensatz-Abrechnung bei Stundenlohn).
- **Kündigungsfristen/-termine** (Arbeiter: Termine an
Monats-/Quartalsende) = Fristenlogik im Vertragsende-Modell (→ Cluster
`bnd`).
- **Lageänderung mit 2-Wochen-Frist** + **Nacht-/Feiertags-Bereitschaft**
= Work-Entry-/Planungsparameter (Zuschläge → Cluster `zus`).
- **Konventionalstrafe/Konkurrenzklausel** sind Vertragsfolgen, keine
Entgeltbestandteile der laufenden Abrechnung.
## Verweise
- **KB-intern:** lb-bes-09 (Angestelltendienstvertrag) · lb-bes-01
(echtes Arbeitsverhältnis) · Cluster `bnd` (Beendigungsarten) ·
Cluster `zus` (Zulagen/Zuschläge)
@@ -0,0 +1,73 @@
---
id: lb-bnd-55
batch: 10
title: "Muster - Arbeitgeberkündigung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_arbeitgeberkundigung.pdf"
text: ".lexis360/md/muster_arbeitgeberkundigung.md"
legal_bases: []
tags: [arbeitgeberkundigung, kundigungsfrist, betriebsrat-vorinformation, resturlaub, dienstfreistellung, erhaltsbestaetigung]
cross_refs: ["lb-bnd-39", "lb-bnd-40", "lb-bnd-41", "lb-bnd-51"]
---
# Muster: Arbeitgeberkündigung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juli 2026 (lb-bnd-55).*
## Zusammenfassung
- **Kernformel:** Kündigung „unter Einhaltung der geltenden
Kündigungsfrist von [X] Tagen/Wochen/Monaten zum **nächsten möglichen
Endzeitpunkt**"; Enddatum des Arbeitsverhältnisses wird ausgeschrieben.
- **Fristangabe (Fußnote *):** Empfehlenswert ist die Angabe der
**gesetzlichen/kollektivvertraglichen/einzelvertraglichen**
Kündigungsfrist.
- **Unklare Frist (Fußnote **):** Bleibt der Endtermin unsicher, kann er
„unmittelbar nach Einholung der notwendigen Erkundigungen" mitgeteilt
werden (Vorgabeformulierung im Muster).
- **Betriebsrat (Fußnote ***):** Vorinformation am [Datum] und
Zustimmung/Widerspruch/Schweigen dokumentieren — diese Angabe ist
**kein zwingender Bestandteil** des Schreibens.
- **Resturlaub (Fußnote ****):** Angebot, den Resturlaub während der
Kündigungsfrist in einer konkreten Zeitspanne zu verbrauchen — ein
**Angebot**, das der Arbeitnehmer **nicht annehmen muss**.
- **Dienstfreistellung (Fußnote *****):** Bezahlte Freistellung ab Ende
des Urlaubskonsums oder unabhängig davon, beginnend mit [Datum].
- **Erhaltsbestätigung (Fußnote ******):** Bei persönlicher Übergabe
unterfertigte Kopie.
## Kernwerte & Fristen (Stand 2026-07)
| Baustein | Regel im Muster |
|---|---|
| Kündigungsfrist | Tag/Woche/Monats-Angabe; gesetzliche/KV/einzelvertragliche Frist wahlweise |
| Endtermin | nächster möglicher Endzeitpunkt; bei Unklarheit nachträgliche Mitteilung zulässig |
| Betriebsrat | Vorinformation + Position optional dokumentiert |
| Resturlaub | Angebot (keine Pflicht) zum Verbrauch in der Kündigungsfrist |
| Freistellung | bezahlt; optional ab Urlaubsende oder ab Datum |
## Rechtsgrundlagen
- Keine §-Zitate im Muster. Kündigungsfristen/-termine: → lb-bnd-40
(Angestellte) / lb-bnd-41 (Arbeiter); Ausspruch/Form → lb-bnd-39.
## Payroll-Relevanz (Odoo)
- **Enddatum-Logik** (Frist + nächster möglicher Termin, z. B. Monatsende
bei Angestellten) ist die Ankerberechnung für die Abmeldung/SV-
Beitragsmonate — als Regelwerk abbilden, nicht manuell je Fall.
- **Urlaubsverbrauch in der Kündigungsfrist** vs. **bezahlte
Freistellung** sind zwei abgrenzbare Work-Entry-Typen (Urlaub vs.
Freistellung) — das Muster verlangt beides korrekt zu
kennzeichnen (Bemessungsgrundlagen unterscheiden sich).
## Verweise
- **KB-intern:** lb-bnd-39 (Kündigungsausspruch) · lb-bnd-40/41
(Kündigungsfristen Angestellte/Arbeiter) · lb-bnd-51 (Vorgehensweise
Kündigung Arbeitgeber) · lb-bnd-54 (Änderungskündigung)
@@ -0,0 +1,71 @@
---
id: lb-bnd-56
batch: 10
title: "Muster - Aufforderung Kontaktaufnahme"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_aufforderung_kontaktaufnahme.pdf"
text: ".lexis360/md/muster_aufforderung_kontaktaufnahme.md"
legal_bases: []
tags: [austritt, fernbleiben, aufforderung, frist, endabrechnung, sozialversicherung]
cross_refs: ["lb-bnd-09", "lb-bnd-10", "lb-bnd-47"]
---
# Muster: Aufforderung Kontaktaufnahme
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-56).*
## Zusammenfassung
- **Ausgangslage:** Arbeitnehmer **bleibt vom Arbeitsplatz fern**
(seit [Datum]) ohne Mitteilung über den Grund.
- **Aufforderung:** sich **bis längstens [Termin]** mit der
zuständigen Stelle in Verbindung zu setzen.
- **Folge bei unterlassener Kontaktaufnahme:** der Arbeitgeber
**nimmt einen vorzeitigen Austritt** zum [Datum] **an** und
**meldet mit diesem Datum von der Sozialversicherung ab** und
erstellt eine **Endabrechnung auf Basis eines
ungerechtfertigten vorzeitigen Austrittes**.
- **Anmerkung der Quelle (Praxis):** **nicht nur ein Datum,
sondern auch eine Uhrzeit** angeben und **unverzüglich nach
Verstreichen des Termins die Abmeldung veranlassen**; **ohne
Zeitangabe läuft die Frist bis 24:00 Uhr** des angegebenen Tages;
außerdem **Wohnadresse/Ortsabwesenheit** verifizieren.
- Keine §-Zitate in der Quelle (Aufforderungsmuster).
## Kernwerte & Fristen (Stand 2026-06)
| Element | Regel |
|---|---|
| Frist | **Datum + Uhrzeit** (sonst bis 24:00) |
| Folge | **vorzeitiger Austritt** zum [Datum]; **SV-Abmeldung** mit diesem Datum |
| Abrechnung | **ungerechtfertigter vorzeitiger Austritt** (→ lb-bnd-47) |
| Praxis | **unverzügliche Abmeldung** nach Terminablauf; Wohnadresse prüfen |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle; die Folgen berühren
Austritt/Entlassung (ABGB/AngG), SV-Abmeldung (ASVG) — ⚠
Normen nicht in der Quelle genannt, über lb-bnd-09/10/47
beziehen.
## Payroll-Relevanz (Odoo)
- **Austrittsdatum** (Annahme des vorzeitigen Austritts) ist der
**Endabrechnungsstichtag** mit dem **ungerechtfertigten
Austritt** als Art (Folgen: kein Urlaubsersatzanspruch, keine
Abfertigung, ohne 50 % Zuschlag — → lb-bnd-47).
- **SV-Abmeldung (GKK/eSV)** zum selben Datum (→ lb-bso-01);
**L16** mit Austrittsgrund.
- **Frist + Uhrzeit** und **unverzügliche Abmeldung** sind
Prozess-Fristen im Beendigungs-Workflow (Beweissicherung).
## Verweise
- **KB-intern:** lb-bnd-09 (Austritt Folgen und Ansprüche) ·
lb-bnd-10 (Austrittserklärung) · lb-bnd-47
(Ansprüche beim Austritt)
@@ -0,0 +1,68 @@
---
id: lb-bnd-57
batch: 10
title: "Muster - Auflösung in Probezeit"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_auflosung_in_probezeit.pdf"
text: ".lexis360/md/muster_auflosung_in_probezeit.md"
legal_bases: []
tags: [probezeit, aufloesung, sofortige-wirkung, arbeitsmaterialien, l16]
cross_refs: ["lb-bnd-53", "lb-bnd-37"]
---
# Muster: Auflösung in Probezeit
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-57).*
## Zusammenfassung
- **Ausspruch:** Mitteilung, dass das am [Datum] begonnene
Arbeitsverhältnis **in der Probezeit aufgelöst** wird.
- **Wirkung:** „endet daher mit **sofortiger Wirkung**" —
**Alternative:** Ende am **letzten Tag der Probezeit**
([Datum]).
- **Rückgabeforderung:** umgehende **Aushändigung aller
übergebenen Arbeitsmaterialien, Kleidung, Chip für die
Zeiterfassung** etc. (bei Sofortbeendigung; sonst Streichen/
anderes Datum).
- **Abrechnung:** „Die **Abrechnung Ihrer Entgeltansprüche** und die
**Arbeitspapiere** erhalten Sie am [Datum] zugesendet."
- **Nachweis:** **Erhalt-Unterschrift des Arbeitnehmers**
(„erhalten am: [Datum]").
- Keine §-Zitate in der Quelle (Ausspruchsmuster).
## Kernwerte & Fristen (Stand 2026-06)
| Element | Inhalt |
|---|---|
| Wirkung | **sofort** (Alt.: letzter Tag der Probezeit) |
| Rückgabe | Arbeitsmaterialien, Kleidung, Zeiterfassungs-Chip |
| Nachweis | **Erhalt-Unterschrift** des Arbeitnehmers |
| Abrechnung | Entgeltansprüche + Arbeitspapiere am [Datum] |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Probezeit-Auflösung, KV-Regelung) —
⚠ Norm/KV nicht in der Quelle genannt, über lb-bnd-37/53
beziehen.
## Payroll-Relevanz (Odoo)
- **Sofortbeendigungsdatum** = Endabrechnungsstichtag (lauffähiges
Entgelt, aliquote Sonderzahlungen — → lb-bnd-46/47).
- **Arbeitspapiere/L16** am [Datum] = Meldungs-/Dokumenten-
folge (→ lb-bso-01).
- **Rückgabe von Arbeitsmaterialien** (inkl. Zeiterfassungs-Chip)
als Abschlusspunkt im Beendigungs-Workflow (Sachbezüge,
→ Cluster `sac`).
## Verweise
- **KB-intern:** lb-bnd-53 (Zu beachten bei
Probezeit-Auflösung) · lb-bnd-37 (Auflösung in
Probezeit)
@@ -0,0 +1,58 @@
---
id: lb-bnd-58
batch: 10
title: "Muster - Einholung einer Rechtsauskunft"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_einholung_einer_rechtsauskunft.pdf"
text: ".lexis360/md/muster_einholung_einer_rechtsauskunft.md"
legal_bases: []
tags: [entlassung, rechtsauskunft, anwalt, wirtschaftskammer]
cross_refs: ["lb-bnd-49", "lb-bnd-59"]
---
# Muster: Einholung einer Rechtsauskunft
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-58).*
## Zusammenfassung
- **Dringende Anfrage an den Rechtsvertreter** (Rechtsanwalt,
Wirtschaftskammer): „Ich ersuche Sie um eine **unverzügliche
Mitteilung, ob folgender Sachverhalt einen Entlassungsgrund
darstellt**: [detaillierte Schilderung]".
- **Anmerkung der Quelle:** den **Sachverhalt detailliert
schildern**; die Anschrift des Rechtsanwalts/der
Wirtschaftskammer eintragen.
- **Funktion:** standardisierte **Beweissicherung und
Beratungsprotokollierung** vor dem Entlassungsausspruch
(→ lb-bnd-49, Punkt 4).
- Keine §-Zitate in der Quelle (Formular).
## Kernwerte & Fristen (Stand 2026-06)
| Element | Inhalt |
|---|---|
| Adressat | Rechtsanwalt / Wirtschaftskammer |
| Frage | **darstellt der Sachverhalt einen Entlassungsgrund?** |
| Dringlichkeit | **unverzüglich / ehestbaldige Kontaktierung** |
| Inhalt | **detaillierte Sachverhaltsschilderung** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Entlassungsrecht, → lb-bnd-32/33).
## Payroll-Relevanz (Odoo)
- Kein Entgelt-/Abrechnungswert; das Formular sichert die
**Beratungskette** im Beendigungs-Workflow (→ lb-bnd-49) und
ist ein Verfahrensdokument (Beweissicherung).
## Verweise
- **KB-intern:** lb-bnd-49 (Checkliste Entlassung) · lb-bnd-59
(Muster Entlassung)
@@ -0,0 +1,73 @@
---
id: lb-azm-08
batch: 10
title: "Muster-Einzelvereinbarung: Einarbeiten in Verbindung mit Feiertagen"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitmodelle
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_einzelvereinbarung_einarbeiten_in_verbindun.pdf"
text: ".lexis360/md/muster_einzelvereinbarung_einarbeiten_in_verbindun.md"
legal_bases: ["§ 4 Abs 3 AZG"]
tags: [einarbeiten, feiertage, arbeitsfreie-tage, azg, einzelvereinbarung]
cross_refs: ["lb-azm-02", "lb-azm-03", "lb-efz-01"]
---
# Muster-Einzelvereinbarung: Einarbeiten in Verbindung mit Feiertagen
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azm-08).*
## Zusammenfassung
- **Vereinbarung gem. § 4 Abs 3 AZG:** bestimmte Arbeitstage des
(Kalender-)Jahres, die vor oder/und nach Feiertagen liegen, werden
**gegen Einarbeiten arbeitsfrei** erklärt.
- **Einarbeitungsfrist:** die ausfallenden Normalarbeitsstunden werden
**jeweils innerhalb von 13 die Ausfallstage einschließenden Wochen**
vor oder/und nach den Ausfallstagen **1:1 eingearbeitet**.
- **Rahmen des Einarbeitens:** an Normalarbeitstagen der 13-Wochen-
Zeiträume werden Zeiten **außerhalb der sonstigen Normalarbeitszeit**
herangezogen, **höchstens 10 Gesamtstunden am Tag**; bei Bedarf auch
**arbeitsfreie Werktage**.
- **Betriebliche Einteilung** der Einarbeitungstage/-stunden **mindestens
zwei Wochen im Voraus**.
- Anmerkung der Quelle: neben dem Kalenderjahr ist ein abweichender
12-Monats-Zeitraum denkbar.
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeit Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Wert / Regel | Detail |
|---|---|
| Rechtsbezug | **§ 4 Abs 3 AZG** (Einarbeiten gegen Arbeitsfreistellung) |
| Einarbeitungszeitraum | **13 die Ausfallstage einschließende Wochen** (vor/nach) |
| Verhältnis | 1:1 |
| Tagesgrenze beim Einarbeiten | **max. 10 Gesamtstunden/Tag** |
| Einarbeitungstage | Normalarbeitstage (außerhalb der Normalarbeitszeit) + ggf. arbeitsfreie Werktage |
| Betriebs-Einteilung | **mindestens 2 Wochen im Voraus** |
## Rechtsgrundlagen
- **§ 4 Abs 3 AZG** (Einarbeiten) — ausdrücklich zitiert.
- 10-Stunden-Grenze und Ruhezeiten folgen dem AZG — ⚠ ohne weitere
§-Zitate in der Quelle.
## Payroll-Relevanz (Odoo)
- **Arbeitsfreie Feiertagstage gegen Einarbeitung** = Sonderfall der
Feiertags-/Einarbeitungslogik: kein Feiertagsentgelt für die
arbeitsfreien Tage, Einarbeitung als Normalarbeit (1:1, kein
Zuschlag) → Work-Entry-Typ „arbeitsfrei (Einarbeitung)" mit
Gegenbuchung.
- **13-Wochen-Frist** und **10-Gesamtstunden-Grenze** sind
Prüfparameter der Einarbeitungsplanung; **2-Wochen-Vorankündigung**
des Betriebs als Frist.
## Verweise
- **KB-intern:** lb-azm-02 (Einarbeiten in Verbindung mit
Feiertagen) · lb-azm-03 (Gleitzeit) · Cluster `efz`
(Entgeltfortzahlung an Feiertagen)
@@ -0,0 +1,64 @@
---
id: lb-bnd-59
batch: 10
title: "Muster - Entlassung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_entlassung.pdf"
text: ".lexis360/md/muster_entlassung.md"
legal_bases: []
tags: [entlassung, fristlose, arbeitsmaterialien, abrechnungspapiere, uebergabe]
cross_refs: ["lb-bnd-32", "lb-bnd-33", "lb-bnd-49"]
---
# Muster: Entlassung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-59).*
## Zusammenfassung
- **Kernformel:** „Wegen Ihres Verhaltens am/des Vorfalles vom [Datum]
sehen wir uns gezwungen, Sie entsprechend den einschlägigen gesetzlichen
Bestimmungen hiermit **fristlos zu entlassen**."
- **Materialrückgabe:** Ausgehändigte Arbeitsmaterialien,
**Zeiterfassungs-Chip**, Arbeitskleidung, Pkw etc. sind „unverzüglich"
an die benannte Person/Abteilung zu übergeben.
- **Abrechnungspapiere:** Die Abrechnungsunterlagen und Arbeitspapiere
werden „bis spätestens [Datum]" an die Adresse des Arbeitnehmers
zugesandt (keine persönliche Aushändigung).
- **Quittierung:** Unterschriftszeile für die „Bestätigung der
Übernahme" (Arbeitnehmer) — die Entlassung selbst braucht keine
Unterschrift des Arbeitnehmers zur Wirksamkeit.
## Kernwerte & Fristen (Stand 2026-06)
| Baustein | Regel im Muster |
|---|---|
| Vorfallsbezug | konkrete Datumsangabe des Vorfalls |
| Rechtliche Grundlage | „einschlägige gesetzliche Bestimmungen" (ohne §-Nennung) |
| Rückgabe | unverzüglich, an benannte Person/Abteilung |
| Papiere/Endabrechnung | postalisch bis zum Stichtag |
## Rechtsgrundlagen
- Keine §-Zitate im Muster (nur pauschale Bezugnahme auf die
gesetzlichen Bestimmungen). Entlassungsgründe/Ansprüche: → lb-bnd-33,
lb-bnd-31; Form des Ausspruchs → lb-bnd-32.
## Payroll-Relevanz (Odoo)
- **Fristlose Entlassung** = Enddatum ohne Kündigungsfrist → in der
Endabrechnung: keine Kündigungsentschädigung, aber Prüfung der
Sonderzahlungen/Urlaubsersatzleistung (→ lb-end-05, lb-url-09).
- **Zeiterfassungs-Chip-Rückgabe** ist ein Daten-Bezugspunkt für die
letzten Work-Entries (Beweissicherung bei strittigen Zeitschulden).
## Verweise
- **KB-intern:** lb-bnd-32 (Entlassungsausspruch) · lb-bnd-33
(Entlassungsgründe Arbeiter und Angestellte) · lb-bnd-49 (Checkliste
Entlassung) · lb-bnd-66 (vorübergehende Dienstfreistellung)
@@ -0,0 +1,94 @@
---
id: lb-azm-09
batch: 10
title: "Muster - Ergänzungsmodule zur Gleitzeitvereinbarung"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitmodelle
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_erganzungsmodule_zur_gleitzeitvereinbarung.pdf"
text: ".lexis360/md/muster_erganzungsmodule_zur_gleitzeitvereinbarung.md"
legal_bases: []
tags: [gleitzeit, mindestbesetzung, kappung, pauschale, zeittopf, missbrauchsklausel]
cross_refs: ["lb-azm-03", "lb-azm-10", "lb-ues-02"]
---
# Muster: Ergänzungsmodule zur Gleitzeitvereinbarung
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azm-09).*
## Zusammenfassung
- **a) Mindestbesetzungsklausel:** Über die Kernarbeitszeit hinaus hat
die Organisationseinheit zu bestimmten Zeiten Mindestbesetzungen
aufzuweisen; Verteilung durch **im Voraus zu treffende,
arbeitnehmerseitig zu dokumentierende, fairne
Teameinigung**; bei Nichteinigung/Fairnessverstößen/Verhinderung
entscheidet ausnahmsweise der Arbeitgeber (Vorgesetzte).
- **b) Öffnungsklausel:** An Tagen bestimmter Anlässe endet der
Gleitzeitrahmen erst um späterer Uhrzeit; bis dahin **entfallen
Gleitmöglichkeit und Kernarbeitszeit** (Haltbarkeit der
maximalen Normalarbeitszeit).
- **c) Gleittageklausel:** Mit Zustimmung des Vorgesetzten entfällt an
einzelnen Tagen die Kernarbeitszeit; **Anzahl beschränkt**
(X Gleittage je Y).
- **d) „Pauschalisten“-Klausel:** Bei Überstundenpauschalen/All-in-
Entgelten gelten die **zum Ende einer Gleitperiode bestehenden
Salden** an Normalarbeitszeitguthaben im Überschreitungsumfang als
Mehr-/Überstunden; zusätzlich zu bereits zwingend entstandenen
Überstunden auf die **Pauschalen/All-in-Entgelte der
Deckungsperiode anrechenbar** und wegen erfolgter Bezahlung
**gekappt**.
- **e) Vorsorge-/Kappungs-/Missbrauchsklauseln:** Die Salden an
Zeitguthaben/Zeitschulden dürfen zu keinem Zeitpunkt (oder zu
bestimmten Zeitpunkten der Gleitzeitperiode) die vereinbarten
Stunden über- bzw. unterschreiten.
- **Systematik (Abschluss):** Gleitzeit = Selbsteinteilung innerhalb
des Rahmens/der Periode, begründet **kein Recht** zur
Ausweitung/Verringerung der Normalarbeitszeit oder zur
eigenmächtigen Mehrleistung. **Übertragbarkeitssaldo überschritten**
ohne besondere Genehmigung → Übertragbarkeitsstunden **ersatzlos
gestrichen**; **Unterschreitung des Übertragbarkeitssaldos an
Zeitschulden** gilt grundsätzlich als **Pflichtverletzung**
**Entgeltkürzung bzw. Entgeltrückverrechnung** (unbeschadet
sonstiger Folgen).
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeit Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Modul | Regel |
|---|---|
| Mindestbesetzung | Team-Einigung (fair, dokumentiert); Nichteinigung → Arbeitgeber-Entscheidung |
| Öffnungsklausel | Gleitmöglichkeit + Kernarbeitszeit bis X entfallen (bestimmte Anlässe) |
| Gleittage | Kernarbeitszeit-Entfall mit Vorgesetzten-Zustimmung, **Anzahl gedeckelt** |
| Pauschalisten-Kappung | Gleitperioden-Endsaldo im Überschreitungsumfang = Überstunden → Pauschale/All-in Deckungsperiode, gekappt (bezahlte) |
| Kappung | Zeitguthaben/-schulden dürfen nicht X Stunden über/unterschreiten |
| Folge Übertretung | Guthaben: **ersatzlos gestrichen**; Schulden: **Pflichtverletzung → Entgeltkürzung/Rückverrechnung** |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Klauselwerk zum § 4b AZG-Rahmen); die
Kappungs-/Missbrauchssanktionen sind Vertragsfolgen — ⚠
Verträglichkeit mit dem AZG-Überstundenregime (Abgeltungspflicht bei
Anordnung) im Einzelfall prüfen.
## Payroll-Relevanz (Odoo)
- **Saldo-Kappung und „gekappte" Überstunden** (Modul d) sind die
kritische Schnittstelle zwischen Gleitzeit-Topf und
Pauschalen-Deckung: die Abrechnung muss Gleitperioden-Salden in die
Deckungsperiode der Pauschale überführen können.
- **Kappungsgrenzen (e)** = Konfigurationswerte des
Zeitguthaben-Modells (Warn-/Stopp-Schwellen).
- **Entgeltkürzung bei Zeitschulden-Unterschreitung** (e) ist eine
Vertragsfolge — als Sanktionsregel dokumentieren, nicht als
automatische Abzugsmasche ohne Nachweis.
## Verweise
- **KB-intern:** lb-azm-03 (Gleitzeit) · lb-azm-10
(Gleitzeit-Einzelvereinbarung) · lb-ues-02 (Überstundenpauschale und
All-in)
@@ -0,0 +1,93 @@
---
id: lb-azm-10
batch: 10
title: "Muster - Gleitzeit-Einzelvereinbarung"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitmodelle
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_gleitzeit_einzelvereinbarung.pdf"
text: ".lexis360/md/muster_gleitzeit_einzelvereinbarung.md"
legal_bases: ["§ 4b AZG", "MSchG", "VKG"]
tags: [gleitzeit, azg, kernarbeitszeit, gleitzeitperiode, zeiterfassung, eltern-gleitzeit]
cross_refs: ["lb-azm-03", "lb-azm-09", "lb-azg-03"]
---
# Muster: Gleitzeit-Einzelvereinbarung
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azm-10).*
## Zusammenfassung
- **Basismuster gem. § 4b AZG** (Einzelvereinbarung; Anmerkung: nur
für Arbeitnehmer ohne zuständigen Betriebsrat, allenfalls auch für
besondere Elterngleitzeiten).
- **Mindestinhalt laut Muster:**
1. Ausmaß der Normalarbeitszeit/Teilzeitnormalarbeit (Stunden/Woche).
2. **Gleitzeitperiode** (Dauer, Beginn), **Gleitzeitrahmen**
(Arbeitstage, frühester Beginn, spätestes Ende; **die
Normalarbeitszeitgrenze von 10 Stunden darf bei längerem
Gleitzeittagesrahmen nicht überschritten werden**); Variante
**erweiterte („große") Gleitmöglichkeit: bis 12 Stunden
Normalarbeitszeit**, Zeitguthaben auch ganztägig verbraucht
(Gleittage je Periode), Gleittage in Zusammenhang mit einer
wöchentlichen Ruhezeit nicht ausgeschlossen.
3. **Kernarbeitszeit** (feste Uhrzeiten oder Mindeststundenzahl/Tag;
Ausnahmen/Gleittage bedürfen der Absprache mit dem Vorgesetzten).
4. **Tägliche Ruhepausen:** bei über sechs Stunden Arbeit am Tag
**mindestens eine halbe Stunde**, zu nehmen im vereinbarten
Zeitfenster.
5. **Übertragbarkeitsstunden** in die nächste Periode (Guthaben X,
Schulden Y).
6. **Fiktive Normalarbeitszeit** (Arbeitstage, Uhrzeiten).
7. **Zeiterfassung** (Mittel; Eingabe auswärtiger Arbeitszeiten,
Dienstweg/Dienstreise).
8. **Vereinbarungsdauer:** unbefristet; **Arbeitgeber-Beendigungsrecht
zum Ende einer jeden Gleitzeitperiode mit mindestens
zweiwöchiger Vorankündigungsfrist** (Umstellung auf feste
Einteilungen/Dienstplan); **Außer-Kraft-Treten beim Entstehen eines
zuständigen Betriebsrats** (Ausnahme: Eltern-Gleitzeiten iSd
MSchG/VKG), jedenfalls **Ersetzung durch Gleitzeit-/
Arbeitszeit-Betriebsvereinbarung**.
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeit Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Wert / Regel | Detail |
|---|---|
| Rechtsbezug | **§ 4b AZG** (gleitende Arbeitszeit) |
| Tagesgrenze | **10 Stunden** Normalarbeitszeit (erweitert: 12, Guthaben ganztägig, Gleittage) |
| Ruhepause | > 6 Std/Tag → **mind. 30 Min.** |
| Übertragbarkeit | X Guthaben- / Y Schuldenstunden in die nächste Periode |
| Beendigung (AG) | zum Ende einer Periode, **mind. 2 Wochen Vorankündigung** |
| Betriebsrat | Einzelvereinbarung tritt beim Entstehen eines BR außer Kraft (Ausnahme Eltern-Gleitzeit MSchG/VKG); BRV ersetzt |
| Zeiterfassung | Pflicht (Mittel + auswärtige Zeiten) |
## Rechtsgrundlagen
- **§ 4b AZG** (Gleitzeit) — ausdrücklich zitiert.
- **MSchG/VKG** (Eltern-Gleitzeiten) — als Ausnahme erwähnt (ohne
§-Zitat) ⚠.
- 10/12-Stunden-Grenze, Ruhepausen: AZG-Rahmen — ⚠ §-Zitate über
lb-azg-01/02 beziehen.
## Payroll-Relevanz (Odoo)
- **Gleitzeitperiode + Übertragbarkeitsstunden** sind die Kernparameter
des Zeitguthaben-Modells (Topf pro Periode, Übertragbarkeitslimit,
Kappung — → lb-azm-09).
- **Fiktive Normalarbeitszeit** = Bezugspunkt für die
Normalarbeitsstunden-Ausweis (Melde-/Abrechnungsrelevant).
- **10- bzw. 12-Stunden-Tagesrahmen** und **30-Minuten-Pause** sind
harte AZG-Grenzen in der Work-Entry-Validierung.
- **Zeiterfassung** (inkl. auswärtige Zeiten) = Pflichtfeld im
Erfassungsprozess (→ Cluster `zer`).
## Verweise
- **KB-intern:** lb-azm-03 (Gleitzeit) · lb-azm-09
(Ergänzungsmodule) · lb-azg-03 (Normalarbeitszeit) · lb-azm-08
(Einarbeiten mit Feiertagen)
@@ -0,0 +1,80 @@
---
id: lb-azg-05
batch: 10
title: "Muster - Grundklauseln zu Ausmaß und Lage der Arbeitszeit"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitgrenzen
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_grundklauseln_zu_ausmass_und_lage_der_arbeit.pdf"
text: ".lexis360/md/muster_grundklauseln_zu_ausmass_und_lage_der_arbeit.md"
legal_bases: ["§ 4b AZG"]
tags: [normalarbeitszeit, ausmass, lage, schichtarbeit, durchrechnungszeitraum, gleitzeit, teilzeit]
cross_refs: ["lb-azg-02", "lb-azg-03", "lb-azm-10", "lb-tzb-03"]
---
# Muster: Grundklauseln zu Ausmaß und Lage der Arbeitszeit
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azg-05).*
## Zusammenfassung
- **A. Varianten bei Vollzeit:**
- **Feste Einteilung:** Ausmaß nach jeweils geltendem KV; Einteilung
(ohne BRV) im Rahmen einer **5-Tage-Woche** an festen Wochentagen
und Uhrzeiten.
- **Schichtarbeit:** Ausmaß nach KV; **Früh-/Nachmittags-/Nachtschicht**
mit Zeiten; Schichten nach betrieblichem Schichtplan.
- **Durchrechnungszeitraum:** Ausmaß nach KV; Erbringung im
Durchschnitt eines Durchrechnungszeitraumes von X Wochen nach
5-Tage-Woche-Dienstplänen.
- **Gleitzeit:** Ausmaß nach KV; Erbringung als **gleitende
Arbeitszeit iSv § 4b AZG**, Einzelheiten aus gesonderter
Gleitzeitvereinbarung (→ lb-azm-10).
- **B. Varianten bei Teilzeit:**
- fester Wochenstundenmaß + feste Tages-/Uhrzeiten;
- Durchschnitt eines **Durchrechnungszeitraumes (Wochen/Monate)** +
zeitliche Lage (Tage, Uhrzeiten);
- Durchrechnungszeitraum + **Dienstplan des Arbeitgebers,
mindestens zwei Wochen im Voraus** erstellt, unter möglichster
Berücksichtigung von Wünschen des Arbeitnehmers;
- **Gleitzeit (Teilzeit)** iSv § 4b AZG, Einzelheiten gesondert.
- Alle Varianten: KV-Ausmaß als Rahmen, Betriebsvereinbarung/Vorbehalt
(„soweit sich die Einteilung nicht aus einer BRV ergibt").
## Kernwerte & Fristen (Stand 2026-07)
| Variante | Ausmaß | Lage |
|---|---|---|
| Vollzeit fest | KV-Stunden/Woche | 5-Tage-Woche, feste Tage/Uhrzeiten |
| Vollzeit Schicht | KV-Stunden/Woche | Schichtplan (Früh/Nachmittag/Nacht) |
| Vollzeit Durchrechnung | KV-Stunden/Woche | Ø in X-Wochen-Durchrechnungszeitraum, 5-Tage-Wochen-Pläne |
| Vollzeit Gleitzeit | KV-Stunden/Woche | § 4b AZG, gesonderte Vereinbarung |
| Teilzeit fest | X Stunden/Woche | feste Tage/Uhrzeiten |
| Teilzeit Durchrechnung | X Stunden/Woche | Ø in X-Wochen/-Monaten; Dienstplan **mind. 2 Wochen im Voraus** |
| Teilzeit Gleitzeit | X Stunden/Woche | § 4b AZG, gesonderte Vereinbarung |
## Rechtsgrundlagen
- **§ 4b AZG** (gleitende Arbeitszeit) — in den Gleitzeit-Varianten
zitiert.
- KV-Ausmaß/BRV-Vorbehalt ohne §-Zitate — ⚠ je KV.
## Payroll-Relevanz (Odoo)
- Die **Auswahl der Arbeitszeitvariante** (fest/Schicht/Durchrechnung/
Gleitzeit) ist ein Stammdatenparameter des Dienstverhältnisses und
bestimmt die Abrechnungslogik (Durchschnittsberechnung, Topf,
Zeiterfassung) → Work-Entry-Setup je Variante.
- **Dienstpläne mit 2-Wochen-Vorlauf** (Teilzeit-Durchrechnung) =
Planungs- und Meldebasis.
- KV-Ausmaß als **Versionswert** (KV-Änderung) führen, nicht
hard-coden.
## Verweise
- **KB-intern:** lb-azg-02 (Arbeitszeitgrenzen allgemein) · lb-azg-03
(Normalarbeitszeit) · lb-azm-10 (Gleitzeit-Muster) · lb-tzb-03
(Teilzeitbeschäftigung Arbeitszeit)
@@ -0,0 +1,64 @@
---
id: lb-bnd-60
batch: 10
title: "Muster - Information über die Beendigung durch Fristablauf"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_information_uber_die_beendigung_durch_frist.pdf"
text: ".lexis360/md/muster_information_uber_die_beendigung_durch_frist.md"
legal_bases: []
tags: [fristablauf, befristung, information, arbeitsmaterialien, endabrechnung]
cross_refs: ["lb-bnd-36", "lb-bnd-48"]
---
# Muster: Information über die Beendigung durch Fristablauf
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-60).*
## Zusammenfassung
- **Kernformel:** „unter Bezugnahme auf den mit Ihnen am [Datum]
abgeschlossenen Arbeitsvertrag halten wir fest, dass Ihr
Arbeitsverhältnis am [Datum] **durch Fristablauf endet**."
- **Keine Verlängerung:** „Eine Verlängerung bzw die Übernahme in ein
unbefristetes Arbeitsverhältnis wird von uns **nicht angestrebt**."
- **Materialrückgabe:** Bekleidungsgegenstände, Arbeitsunterlagen,
Materialien, Zeiterfassungschip etc. am letzten Arbeitstag nach
Arbeits­schluss an die benannte Person übergeben.
- **Papiere/Endabrechnung:** per Post „bis spätestens [Datum]" übermittelt.
- **Quittierung:** „zur Kenntnis genommen am [Datum]" (Unterschrift
Arbeitnehmer) — die Kenntnisnahme ist für den Fristablauf nicht
konstitutiv.
## Kernwerte & Fristen (Stand 2026-06)
| Baustein | Regel im Muster |
|---|---|
| Beendigungsart | Fristablauf (zweckbefristetes/zeitbefristetes DV) |
| Letzter Arbeitstag | Benennung des konkreten Tages |
| Rückgabe | am letzten Arbeitstag nach Arbeits­schluss |
| Endabrechnung | postalisch, Stichtagsangabe |
## Rechtsgrundlagen
- Keine §-Zitate im Muster. Rechtsrahmen der Befristung/Zeitablauf:
→ lb-bnd-36 (Zeitablauf bei Befristung); Praxispunkte → lb-bnd-48.
## Payroll-Relevanz (Odoo)
- **Fristablauf** erzeugt kein Kündigungsereignis: das DV-Enddatum ist
der im Vertrag vereinbarte Befristungsendpunkt → die
Endabrechnung/Abmelde-Logik muss Befristungsende und Kündigung sauber
trennen (verschiedene Beendigungsarten mit unterschiedlichen
Abgabenfolgen, z. B. Sonderzahlungs-Aliquotierung,
Kündigungsentschädigung nur bei Kündigung/Auflösung).
## Verweise
- **KB-intern:** lb-bnd-36 (Zeitablauf bei Befristung) · lb-bnd-48
(Checkliste befristetes Arbeitsverhältnis) · lb-bnd-61 (Textbaustein
Befristung zwecks Erprobung) · lb-bnd-63 (neuerliche Befristung)
@@ -0,0 +1,90 @@
---
id: lb-azg-06
batch: 10
title: "Muster - Normalarbeitszeitdurchrechnungen bei Teilzeitkräften"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitgrenzen
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_normalarbeitszeitdurchrechnungen_bei_teilze.pdf"
text: ".lexis360/md/muster_normalarbeitszeitdurchrechnungen_bei_teilze.md"
legal_bases: []
tags: [teilzeit, durchrechnungszeitraum, dienstplan, mehrarbeitszuschlag, ogh]
cross_refs: ["lb-azg-05", "lb-azg-03", "lb-tzb-03", "lb-tzb-04"]
---
# Muster: Normalarbeitszeitdurchrechnungen bei Teilzeitkräften
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azg-06).*
## Zusammenfassung
- **Dienstplan-Durchrechnungsmodell (Teilzeit):** (1) Ausmaß der
Teilzeit (X Stunden/Woche); (2) Erbringung im Rahmen eines
**Durchrechnungszeitraumes von jeweils X Wochen** (ab Y); (3)
Normalarbeit **mindestens zwei Wochen im Vorhinein** durch
betriebsseitige Dienstpläne festgelegt, Wünsche des Arbeitnehmers
nach Möglichkeit berücksichtigt; (4) einvernehmliche
**Einteilungsschwerpunkte** im Durchrechnungszeitraum (müssen so
präzisiert sein, dass sich der Arbeitnehmer darauf einstellen und
verlassen kann; auch ob Tagesausmaß oder nur Tagzahl schwankt).
- **Anmerkung 1 (Wirkung ohne/ mit Durchrechnungsvereinbarung):**
ohne Durchrechnungsvereinbarung kann ein 1:1-Ausgleich von Stunden
**nur im jeweiligen Kalendervierteljahr** erfolgen; die
Durchrechnungsvereinbarung **bedarf keiner kollektivvertraglichen
Ermächtigung**, solange die Arbeitszeit in den für
Vollzeitbeschäftigte geltenden **Einzelwochen- und
Einzeltagesgrenzen** bleibt; bei bestehender
kollektivvertraglicher Durchrechnungsbestimmung ist diese auch auf
Teilzeitbeschäftigte grundsätzlich anwendbar (Überschreitung der
direktgesetzlichen Grenzen bis zu den KV-geöffneten Grenzen, unter
KV-Bedingungen).
- **Anmerkung 2 (Fristen/Deckung):** Durchrechnungszeitraum als
Mehr-/Vielfaches von Wochen wählen; bei Grenzüberschreitung KV-
Grenzen beachten; **bei Fehlen einer längeren KV-Zulassung: für
Plussalden jeweils zum Ende von jeweils drei Monaten gem. OGH
dennoch die gesetzlichen Mehrarbeitszuschläge von 25 % anfallen und
fällig** (die Grundstundenlöhne bleiben im Durchrechnungssystem).
- **Anmerkung 3 (Inhaltspräzision):** Einteilungsschwerpunkte
verbindlich fassen (Schulferien-Wunsch, AG-Quantitätsbedarfe mit
Grund).
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeitgesetze, Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Wert / Regel | Detail |
|---|---|
| Ausgleich ohne Durchrechnungsvereinbarung | nur im **Kalendervierteljahr** (1:1) |
| KV-Ermächtigung | nicht nötig, solange **Einzelwochen-/Einzeltagesgrenzen** (Vollzeitmaße) nicht überschritten |
| KV-Durchrechnungsbestimmung | gilt auch für Teilzeit (bis zu KV-geöffneten Grenzen, unter KV-Bedingungen) |
| **Fälligkeit (OGH)** | Plussalden zum Ende je **3 Monate**: **gesetzliche Mehrarbeitszuschläge 25 % fällig** (Grundstundenlöhne bleiben im System) |
| Dienstplan | mind. **2 Wochen im Voraus** |
## Rechtsgrundlagen
- **OGH-Judikatur** (3-Monats-Fälligkeit der 25-%-Zuschläge bei
Plussalden ohne längere KV-Zulassung) — als „gem OGH" referenziert,
ohne Aktenzahl ⚠.
- 25 % Mehrarbeitszuschlag = **§ 15 AZG** — ⚠ in der Quelle nicht
zitiert, Normzuordnung über lb-ues-01/03 beziehen.
- Einzelwochen-/Einzeltagesgrenzen = **§§ 79 AZG** — ⚠ nicht zitiert.
## Payroll-Relevanz (Odoo)
- **Deckungslogik:** Ist-Arbeitszeit vs. Teilzeit-Normalarbeitszeit im
Durchrechnungszeitraum; der **3-Monats-Fälligkeit (OGH)** muss die
Abrechnung Rechnung tragen (automatische Zuschlagsverrechnung bei
Plussaldo zu Quartalsende, wenn keine längere KV-Zulassung).
- **25 % Zuschlag** als gesetzlicher Wert (Versionsparameter, nicht
hard-coden); Grundstundenlöhne bleiben im Durchschnittssystem.
- **2-Wochen-Dienstplan-Vorlauf** als Planungsfrist; Einteilungs-
schwergewichte als dokumentierte Erwartungsgrundlage (Anmerkung 3).
## Verweise
- **KB-intern:** lb-azg-05 (Grundklauseln) · lb-azg-03
(Normalarbeitszeit) · lb-tzb-03 (Teilzeit Arbeitszeit) · lb-tzb-04
(Teilzeit Mehrarbeit/Überstunden) · lb-ues-01 (Überstunden)
@@ -0,0 +1,71 @@
---
id: lb-azg-07
batch: 10
title: "Muster - Teilzeitkräfte - Änderungen (Erhöhungen, Senkungen) des Teilzeitausmaßes"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitgrenzen
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_teilzeitkrafte_anderungen_erhohungen_senkun.pdf"
text: ".lexis360/md/muster_teilzeitkrafte_anderungen_erhohungen_senkun.md"
legal_bases: []
tags: [teilzeit, ausmassaenderung, gehaltsanpassung, sonderzahlungen, mischberechnung]
cross_refs: ["lb-azg-08", "lb-azg-05", "lb-tzb-06", "lb-son-01"]
---
# Muster: Teilzeitkräfte Änderungen (Erhöhungen, Senkungen) des Teilzeitausmaßes
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azg-07).*
## Zusammenfassung
- **Ausmaßänderungsvereinbarung:** (1) bisheriges Ausmaß (X Std/Woche);
(2) **Mit Wirkung ab [Stichtag] Erhöhung/Senkung** auf Y Std/Woche;
damit verbunden **entsprechende Anpassung des Gehalts/Lohnes** und —
**bei Änderung während der
Sonderzahlungsanspruchsperiode** (insbesondere während des
Kalenderjahres) — eine **Mischberechnung der
Sonderzahlungen**; (3) zeitliche Lage der neuen Normalarbeitszeit
(neu festgelegt bzw. im Rahmen der bisherigen
Durchrechnungs-/Gleitzeitvereinbarung); (4) **Dauer der
Ausmaßänderung:** unbefristet / befristet bis [Datum] / befristet auf
Dauer der **mutterschafts- und karenzbedingten Abwesenheit** /
befristet auf Dauer der derzeitigen **Elternteilzeit**.
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeitgesetze, Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Element | Regel |
|---|---|
| Stichtag | Erhöhung/Senkung mit Wirkung ab [Datum] |
| Entgelt | **korrespondierende Anpassung** des Gehalts/Lohnes |
| Sonderzahlungen | **Mischberechnung** bei Änderung während der Anspruchsperiode (insb. Kalenderjahr) |
| Lage | neu bzw. im bisherigen Durchrechnungs-/Gleitzeitrahmen |
| Dauer | unbefristet / befristet / auf Dauer von Mutterschutz-Karenz / Elternteilzeit |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Vertragsklausel); die
Sonderzahlungen-Mischberechnung folgt dem **§ 87 EStG**-Regime —
⚠ in der Quelle nicht zitiert, über lb-son-01/04 beziehen.
## Payroll-Relevanz (Odoo)
- **Stichtags-Logik:** Ausmaß + Gehalt + (ggf.) Lageänderung treten
gleichzeitig in Kraft — Versionswechsel im Entgeltmodell, kein
Ad-hoc-Abzug.
- **Mischberechnung der Sonderzahlungen** (Anteil
altes/neues Ausmaß je Kalendermonat) ist die zentrale Abrechnungs-
folge → Sonderzahlungs-Parameter (→ lb-son-01/05).
- **Befristung auf Karenz/Elternteilzeit** = automatischer
Rückkehr-Stichtag im Kalendermodell (→ Cluster `kar`, `elt`).
## Verweise
- **KB-intern:** lb-azg-08 (unterschiedliche Teilzeitausmaße) ·
lb-azg-05 (Grundklauseln) · lb-tzb-06 (Wechsel
Vollzeit/Teilzeit) · lb-son-01 (Aliquotierung von
Sonderzahlungen)
@@ -0,0 +1,65 @@
---
id: lb-azg-08
batch: 10
title: "Muster - Teilzeitkräfte - Vereinbarung unterschiedlicher Teilzeitausmaße"
work: "Lexis Briefings Personalrecht"
chapter: "Arbeitszeit"
topic: arbeitszeitgrenzen
author: "Lexis Redaktion"
stand: 2026-07
source:
pdf: ".lexis360/muster/Lexis360_muster_teilzeitkrafte_vereinbarung_unterschiedlich.pdf"
text: ".lexis360/md/muster_teilzeitkrafte_vereinbarung_unterschiedlich.md"
legal_bases: []
tags: [teilzeit, jahresverlauf, saisonal, sonderzahlungen, mischberechnung]
cross_refs: ["lb-azg-07", "lb-azg-05", "lb-tzb-03"]
---
# Muster: Teilzeitkräfte Vereinbarung unterschiedlicher Teilzeitausmaße
*Lexis Briefings Personalrecht, Lexis Redaktion, Stand Juli 2026 (lb-azg-08).*
## Zusammenfassung
- **Vereinbarung unterschiedlicher Teilzeitausmaße im
Kalenderjahresverlauf:** (1) das Ausmaß der
Teilzeitnormalarbeitszeit wird für **bestimmte Zeiträume (Monate)
des Kalenderjahres unterschiedlich** festgelegt (Variante a/b/c:
X Stunden/Woche in den Monaten …); (2) das **Gehalt/der Lohn
entspricht dem jeweiligen Arbeitszeitausmaß der einzelnen
Perioden**, wobei die **Jahressonderzahlungen gemischt
berechnet** werden; (3) zeitliche Lage der Normalarbeitszeiten je
Periode.
- Typische Anwendung: saisonal schwankende Teilzeit (z. B. Tourismusspitzen)
mit jahresbezogenem Entgelt- und Sonderzahlungs-Regelwerk.
- **Herkunft:** Muster von o. Univ.-Prof. Dr. Franz Schrank, auch in
Schrank, *Arbeitszeitgesetze, Kommentar* (7. Aufl. 2023).
## Kernwerte & Fristen (Stand 2026-07)
| Element | Regel |
|---|---|
| Ausmaße | je Periode (Monatsgruppen) unterschiedlich: a) X, b) Y, c) Z Std/Woche |
| Entgelt | korrespondiert zum Ausmaß der jeweiligen Periode |
| Jahressonderzahlungen | **gemischt berechnet** (Anteile der Periode-Ausmaße) |
| Lage | je Periode festgelegt |
## Rechtsgrundlagen
- Keine §-Zitate in der Quelle (Vertragsklausel); die
Mischberechnung der Sonderzahlungen folgt dem **§ 87 EStG**-Regime —
⚠ in der Quelle nicht zitiert, über lb-son-01/04 beziehen.
## Payroll-Relevanz (Odoo)
- **Periodenbezogene Ausmaß-/Gehaltstabellen** sind ein
Entgeltversions-Modell: Stichtag, Ausmaß, Gehalt je Periode.
- **Gemischte Sonderzahlungen** über die Periode-Ausmaße =
Sonderzahlungs-Abrechnungslogik (→ lb-son-01/05), identisch mit der
Mischberechnung bei Ausmaßänderung (→ lb-azg-07).
## Verweise
- **KB-intern:** lb-azg-07 (Ausmaßänderungen) · lb-azg-05
(Grundklauseln) · lb-tzb-03 (Teilzeit Arbeitszeit) · lb-son-01
(Aliquotierung Sonderzahlungen)
@@ -0,0 +1,68 @@
---
id: lb-bnd-61
batch: 10
title: "Muster - Textbaustein Dienstvertrag Befristung zwecks Erprobung"
work: "Lexis Briefings Personalrecht"
chapter: "Beendigungsarten"
topic: beendigungsarten
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_textbaustein_dienstvertrag_befristung_zweck.pdf"
text: ".lexis360/md/muster_textbaustein_dienstvertrag_befristung_zweck.md"
legal_bases: ["§ 10a MSchG", "§ 19 Abs 2 AngG", "§ 1158 Abs 2 ABGB"]
tags: [zweckbefristung, erprobung, probezeit, probezeitvertrag, msch-g]
cross_refs: ["lb-bnd-36", "lb-bnd-48", "lb-bnd-37", "lb-bnd-53"]
---
# Muster: Textbaustein Dienstvertrag — Befristung zwecks Erprobung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-bnd-61).*
## Zusammenfassung
- **Klausel:** „Aufgrund der spezifischen Qualifikation, die für die
Erfüllung der vereinbarten Aufgaben des Dienstnehmers und seiner im
gegenständlichen Vertrag vorgesehenen Verwendung erforderlich ist, wird
zur **Erprobung** des Dienstnehmers das Dienstverhältnis auf [X]
Monate/bis zum [Datum] befristet."
- **Doppelte Angabe (Fußnote *):** entweder die **Zahl der
Befristungsmonate** oder ein **konkretes Enddatum** einfügen und das
Nichtzutreffende streichen.
- **Frauen:** Bei Frauen ist **§ 10a MSchG** zu beachten (Fußnote *).
- **Probemonat (Fußnote **):** „Der erste Monat gilt als Probemonat im
Sinne des [ ]" — bei Angestellten: **§ 19 Abs 2 AngG**, bei
Arbeitern: **§ 1158 Abs 2 ABGB**.
## Kernwerte & Fristen (Stand 2026-06)
| Baustein | Regel im Muster |
|---|---|
| Befristungsform | Zweckbefristung zur Erprobung (spezifische Qualifikation + Verwendung) |
| Dauer | Monatszahl ODER konkretes Enddatum (Nichtzutreffendes streichen) |
| Probemonat | 1. Monat = Probemonat (§ 19 Abs 2 AngG / § 1158 Abs 2 ABGB) |
| Schwangerschutz | bei Frauen § 10a MSchG beachten |
## Rechtsgrundlagen
- **§ 10a MSchG** (Schwangerschafts-/Mutterschutz-Befristungsschutz) —
in Fußnote genannt.
- **§ 19 Abs 2 AngG** (Probemonat, Angestellte) — in Fußnote genannt.
- **§ 1158 Abs 2 ABGB** (Probemonat, Arbeiter) — in Fußnote genannt.
## Payroll-Relevanz (Odoo)
- **Zweckbefristung vs. Zeitbefristung** ist eine eigene
Beendigungsart im End-of-employment-Modell: der Erprobungszweck muss
als Vertragsklausel dokumentiert sein (Nachweislast bei Anfechtung) →
Vertragsdatenfeld „Befristungsart" + Klauselbezug.
- **Probemonat** beeinflusst Auflösungsschutz (→ lb-bnd-37) und die
Berechtigung von Abfertigungs-/Sonderzahlungsansprüchen — in der
Endabrechnung je Beendigungsart abgrenzen.
## Verweise
- **KB-intern:** lb-bnd-36 (Zeitablauf bei Befristung) · lb-bnd-48
(Checkliste befristetes Arbeitsverhältnis) · lb-bnd-37 (Auflösung in
Probezeit) · lb-bnd-53 (Checkliste Auflösung in Probezeit) ·
lb-bnd-60 (Fristablauf) · lb-bnd-63 (neuerliche Befristung)
@@ -0,0 +1,74 @@
---
id: lb-aug-03
batch: 10
title: "Muster - Überlassungsmitteilung"
work: "Lexis Briefings Personalrecht"
chapter: "Außerhalb des Betriebsstandortes"
topic: arbeitskrafteuberlassung
author: "Thöny-Maier"
stand: 2026-06
source:
pdf: ".lexis360/muster/Lexis360_muster_uberlassungsmitteilung.pdf"
text: ".lexis360/md/muster_uberlassungsmitteilung.md"
legal_bases: ["§ 12 AÜG"]
tags: [arbeitkraefteuberlassung, aug, ueberlassungsmitteilung, beschaefziger, entgelt]
cross_refs: ["lb-aug-01", "lb-aug-02"]
---
# Muster: Überlassungsmitteilung
*Lexis Briefings Personalrecht, Thöny-Maier, Stand Juni 2026 (lb-aug-03).*
## Zusammenfassung
- **Formstück gem. § 12 AÜG:** Mitteilung des Überlassers an den
überlassenen Arbeitnehmer mit den wesentlichen Eckdaten der
Überlassung; der Arbeitnehmer bestätigt den Erhalt durch
Unterschrift (Ausfertigung).
- **Pflichtinhalte laut Muster:** genauer Arbeitsantritt und
voraussichtliche Dauer; **Beschäftiger** (Unternehmensbezeichnung);
**Dienstort** (inkl. Angabe, falls auch Arbeiten außerhalb der
Betriebsstätte zu verrichten sind); Aufgabengebiet; **wöchentliche
Normalarbeitszeit** und deren uhrzeitmäßige Aufteilung auf die
Arbeitstage; **Kollektivvertrag des Beschäftigers** und Einstufung
(Beschäftigungsgruppe, Berufsjahr); **Entgelt für die Dauer der
Überlassung**: monatliches Bruttogehalt **und** getrennt auszuweisende
Zulagen, Zuschläge, Sonderzahlungen und Aufwandsentschädigungen
(Muster-Fußnote ***).
- Die Muster-Fußnoten konkretisieren: genauer Antrittszeitpunkt;
Betriebsbezeichnung mit Anschrift; getrennte Ausweisung der
Entgeltbestandteile.
## Kernwerte & Fristen (Stand 2026-06)
| Inhalt der Mitteilung | Detail |
|---|---|
| Rechtsbezug | **§ 12 AÜG** (Überlassungsmitteilung) |
| Antritt/Dauer | genauer Zeitpunkt + voraussichtliche Dauer |
| Beschäftiger/Dienstort | Unternehmensbezeichnung; Ort inkl. außerbetriebliche Arbeit |
| Arbeitszeit | wöchentliche Normalarbeitszeit + uhrzeitmäßige Aufteilung |
| KV/Einstufung | KV des Beschäftigers; Beschäftigungsgruppe, Berufsjahr |
| Entgelt | Bruttogehalt + getrennt: Zulagen, Zuschläge, Sonderzahlungen, Aufwandsentschädigungen |
| Nachweis | Unterschrift des Arbeitnehmers (Erhalt) |
## Rechtsgrundlagen
- **§ 12 AÜG** (Inhalt/Pflicht der Überlassungsmitteilung) — ausdrücklich
zitiert.
- Kein KV-/§-Zitat jenseits des AÜG in der Quelle.
## Payroll-Relevanz (Odoo)
- Die **getrennte Entgeltstruktur** (Grundgehalt, Zulagen, Zuschläge,
Sonderzahlungen, Aufwandsentschädigungen) ist das Datenfundament für die
Abrechnung bei AÜ (Verrechnung über den Überlasser, → lb-aug-01/02).
- **Beschäftiger-KV und Einstufung** sind Abrechnungsfakten je
Überlassung — im Odoo-Modell als Parameter der Überlassung, nicht als
Stammdaten des Arbeitnehmers, abbilden.
- **Erhalt-Nachweis** (Unterschrift) = Dokumentationspflicht,
digitalisierbar als Beleg.
## Verweise
- **KB-intern:** lb-aug-01 (Aufgaben Überlasser/Beschäftiger) · lb-aug-02
(AÜG-Grundlagen)

Some files were not shown because too many files have changed in this diff Show More