[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)
This commit is contained in:
2026-09-15 12:38:19 +02:00
parent 4b86bcb790
commit 472b19a4b2
12 changed files with 660 additions and 15 deletions
@@ -70,6 +70,7 @@ L10N_AT_BUCHUNGSMATRIX = {
'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.
@@ -78,6 +79,10 @@ L10N_AT_BUCHUNGSMATRIX = {
# 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',)},
# Nettoauszahlung (reconcilable, s. o.)
'rule_netto': {'credit': ('3850',)},
# DG-Beiträge (650655 SV Arbeiter · 656659 SV Angestellte)
@@ -2,6 +2,7 @@
"""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
@@ -25,6 +26,21 @@ Am Originalwortlaut verifiziert (.ris/, Stand 2026-09-14):
- § 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
@@ -53,6 +69,13 @@ class HrSalaryRule(models.Model):
'(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 '
@@ -115,6 +138,13 @@ class HrPayslip(models.Model):
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).')
# ------------------------------------------------------------------
# SV-Tage-Umrechnung und Verlängerungsmonate (§ 11 Abs 2 ASVG)
@@ -401,6 +431,9 @@ class HrPayslip(models.Model):
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):
@@ -425,6 +458,77 @@ class HrPayslip(models.Model):
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
# ------------------------------------------------------------------
@@ -438,11 +542,12 @@ class HrPayslip(models.Model):
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
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) —
sie sind VOR der Freibetragsstaffel in die LNK-Basis
aufzunehmen."""
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)
@@ -457,6 +562,10 @@ class HrPayslip(models.Model):
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