mirror of
http://100.103.83.12:3003/fegger/odoo-at-payroll.git
synced 2026-09-17 08:52:45 +00:00
[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)
This commit is contained in:
@@ -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,37 @@ 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),
|
||||
],
|
||||
_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'], 720.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)
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user