[IMP] l10n_at_hr_payroll: TASY-Tarifsystem-Katalog, AGRD-Auswahl, DG-Kosten-/Lohnkonten-Reports, Wr.-DAG-Grundlagen (AP0-AP3)

AP0 Variante b — TASY-Tarifsystem-Katalog:
- Neue Katalogmodelle (BSGR/ERGB/Dienstgebergruppen/Tarifgruppen/
  Tarifsets/Tarife/Zuordnungen/Zu-Abschläge inkl. Steuerung),
  models/tasy_katalog.py — Auflösung Tarifgruppe (BSGR+ERGB+DGG)
  -> Sätze je Verrechnungsbasis
- Import-Wizard l10n.at.payroll.tasy.katalog.wizard (alle Träger,
  sektionsscharf, idempotent), Views/Menüs, Security
- Realexport-Test gegen TASY-LSWH-Export (B001/B002 = 39,05/37,55 %)

AP1 — eSV-Abmeldegründe (DM-ORG D.22):
- l10n_at_agrd Char -> vollständige Selection (33 Codes),
  Seed der Standard-Abgangsursachen (noupdate, hr-Defaults vorverbunden),
  Form-/Listen-Erbe

AP2a-c — Auswertungen:
- Monatsjournal: eigener Dienstgeberanteile-Block (ATP_DG vorher
  still ausgefiltert); Fix: models/monatsreports.py war nie in
  models/__init__.py importiert (GP7-Reports waren toter Code)
- Neuer Report Dienstgeber-Gesamtkosten (Brutto + LNK aufgeschlüsselt/
  kumuliert je AN + Laufsummen, Spalten FLAF/KommSt/DZ/BV/Wr. DAG)
- Jahreslohnkonto je DN + Betriebsjahreslohnkonto (Jahresbericht-
  Wizard, Monatsmatrix je Lohnart), report/jahresreports.xml

AP3 — Wr. Dienstgeberabgabe (RIS LrW GesNr 20000133 verifiziert):
- Company-Flag l10n_at_wien_dag (Kern), Fristenarten wien_dag/
  wien_dag_jahres (cron-geflaggt, 15./31. 3.), Company-View-Feld,
  Wr.-DAG-Spalte im DG-Kosten-Report
This commit is contained in:
2026-09-12 23:17:00 +02:00
parent 3c5cc3aded
commit 3c85cc6790
16 changed files with 1999 additions and 35 deletions
@@ -1,5 +1,6 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import test_tasy_import
from . import test_tasy_katalog
from . import test_lohnsteuer
from . import test_sozialversicherung
from . import test_elda_l16
@@ -0,0 +1,422 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
"""AP0 (Variante b): TASY-Katalog-Import und Tarifgruppen-Auflösung.
Fixture-Slice mit den normativen Normalbetriebe-Werten 2026 (AB 39,05 %,
SZ 37,55 % — verifiziert gegen den echten TASY-LSWH-Export 2026-07-01)
plus E01-Ergänzung (NB-Zweig 3,80 % DG, Dienstgebergruppe NBNSA).
"""
import base64
from datetime import date
from odoo.tests import TransactionCase, tagged
TASY_KATALOG_FIXTURE = """<?xml version="1.0" encoding="UTF-8"?>
<tarifssystemlsh>
<gueltigkeitstichtag>2026-07-01</gueltigkeitstichtag>
<beschaeftigtengruppen>
<beschaeftigtengruppe xmlId="G001">
<code>B001</code>
<bezeichnung>Arbeiter</bezeichnung>
<kurzbezeichnung>Arb.</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</beschaeftigtengruppe>
<beschaeftigtengruppe xmlId="G002">
<code>B002</code>
<bezeichnung>Angestellte</bezeichnung>
<kurzbezeichnung>Ang.</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</beschaeftigtengruppe>
<beschaeftigtengruppe xmlId="G044">
<code>B044</code>
<bezeichnung>Angestelltenlehrlinge</bezeichnung>
<kurzbezeichnung>Ang. Lg.</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</beschaeftigtengruppe>
<beschaeftigtengruppe xmlId="G045">
<code>B045</code>
<bezeichnung>Arbeiterlehrlinge</bezeichnung>
<kurzbezeichnung>Arb. Lg.</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</beschaeftigtengruppe>
<beschaeftigtengruppe xmlId="G010">
<code>B010</code>
<bezeichnung>Geringfügig beschäftigte Arbeiter</bezeichnung>
<kurzbezeichnung>Gfg. Arb.</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</beschaeftigtengruppe>
</beschaeftigtengruppen>
<ergaenzungen>
<ergaenzung xmlId="E01X">
<code>E01</code>
<bezeichnung>Nachtschwerarbeitsbeitrag</bezeichnung>
<kurzbezeichnung>NSchAB</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</ergaenzung>
</ergaenzungen>
<dienstgebergruppen>
<dienstgebergruppe xmlId="NBAL">
<code>NBALG</code>
<bezeichnung>Normalbetriebe - Allgemeiner Teil</bezeichnung>
<kurzbezeichnung>NBALG</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</dienstgebergruppe>
<dienstgebergruppe xmlId="NBNS">
<code>NBNSA</code>
<bezeichnung>Normalbetriebe mit Nachtschwerarbeit</bezeichnung>
<kurzbezeichnung>NBNSA</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</dienstgebergruppe>
</dienstgebergruppen>
<tarifgruppen>
<tarifgruppe xmlId="T001">
<beschaeftigtengruppen>G001</beschaeftigtengruppen>
<dienstgeberGruppen>NBAL</dienstgeberGruppen>
<code>B001</code>
<bezeichnung>Arbeiter</bezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<fallweiseBeschaeftigungZulaessig>true</fallweiseBeschaeftigungZulaessig>
<betrieblicheVorsorgeZulaessig>true</betrieblicheVorsorgeZulaessig>
</tarifgruppe>
<tarifgruppe xmlId="T002">
<beschaeftigtengruppen>G002</beschaeftigtengruppen>
<dienstgeberGruppen>NBAL</dienstgeberGruppen>
<code>B002</code>
<bezeichnung>Angestellte</bezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<fallweiseBeschaeftigungZulaessig>false</fallweiseBeschaeftigungZulaessig>
<betrieblicheVorsorgeZulaessig>true</betrieblicheVorsorgeZulaessig>
</tarifgruppe>
<tarifgruppe xmlId="T002E01">
<beschaeftigtengruppen>G002</beschaeftigtengruppen>
<ergaenzungen>E01X</ergaenzungen>
<dienstgeberGruppen>NBNS</dienstgeberGruppen>
<code>B002E01</code>
<bezeichnung>Angestellte/Nachtschwerarbeitsbeitrag</bezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<betrieblicheVorsorgeZulaessig>true</betrieblicheVorsorgeZulaessig>
</tarifgruppe>
<tarifgruppe xmlId="T045">
<beschaeftigtengruppen>G045</beschaeftigtengruppen>
<dienstgeberGruppen>NBAL</dienstgeberGruppen>
<code>B045</code>
<bezeichnung>Arbeiterlehrlinge</bezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarifgruppe>
</tarifgruppen>
<tarife>
<tarif xmlId="R001">
<tarifZweig>KV</tarifZweig>
<dienstnehmerAnteil>3.87</dienstnehmerAnteil>
<dienstgeberAnteil>3.78</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R002">
<tarifZweig>PV</tarifZweig>
<dienstnehmerAnteil>10.25</dienstnehmerAnteil>
<dienstgeberAnteil>12.55</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R003">
<tarifZweig>AV</tarifZweig>
<dienstnehmerAnteil>2.95</dienstnehmerAnteil>
<dienstgeberAnteil>2.95</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R004">
<tarifZweig>UV</tarifZweig>
<dienstnehmerAnteil>0</dienstnehmerAnteil>
<dienstgeberAnteil>1.1</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R005">
<tarifZweig>WF</tarifZweig>
<dienstnehmerAnteil>0.5</dienstnehmerAnteil>
<dienstgeberAnteil>0.5</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R006">
<tarifZweig>AK</tarifZweig>
<dienstnehmerAnteil>0.5</dienstnehmerAnteil>
<dienstgeberAnteil>0</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R007">
<tarifZweig>IE</tarifZweig>
<dienstnehmerAnteil>0</dienstnehmerAnteil>
<dienstgeberAnteil>0.1</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
<tarif xmlId="R008">
<tarifZweig>NB</tarifZweig>
<dienstnehmerAnteil>0</dienstnehmerAnteil>
<dienstgeberAnteil>3.8</dienstgeberAnteil>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2020-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</tarif>
</tarife>
<tarifsets>
<tarifset xmlId="S001">
<bezeichnung>40/AK/AV/IE/KV/PV/UV/WF</bezeichnung>
<kurzbezeichnung>40/AK/AV/IE/KV/PV/UV/WF</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<tarife>R001</tarife>
<tarife>R002</tarife>
<tarife>R003</tarife>
<tarife>R004</tarife>
<tarife>R005</tarife>
<tarife>R006</tarife>
<tarife>R007</tarife>
</tarifset>
<tarifset xmlId="S002">
<bezeichnung>47/AV/IE/KV/PV/UV</bezeichnung>
<kurzbezeichnung>47/AV/IE/KV/PV/UV</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<tarife>R001</tarife>
<tarife>R002</tarife>
<tarife>R003</tarife>
<tarife>R004</tarife>
<tarife>R007</tarife>
</tarifset>
<tarifset xmlId="S003">
<bezeichnung>40/AK/AV/IE/KV/PV/UV/WF/NB</bezeichnung>
<kurzbezeichnung>40/AK/AV/IE/KV/PV/UV/WF/NB</kurzbezeichnung>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
<tarife>R001</tarife>
<tarife>R002</tarife>
<tarife>R003</tarife>
<tarife>R004</tarife>
<tarife>R005</tarife>
<tarife>R006</tarife>
<tarife>R007</tarife>
<tarife>R008</tarife>
</tarifset>
</tarifsets>
<verrechBasisTypen>
<verrechBasisTyp xmlId="VBTAB"><code>AB</code><bezeichnung>Arbeitsbezug</bezeichnung><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechBasisTyp>
<verrechBasisTyp xmlId="VBTSZ"><code>SZ</code><bezeichnung>Sonderzahlung</bezeichnung><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechBasisTyp>
</verrechBasisTypen>
<verrechPosTypen>
<verrechPosTyp xmlId="VPT01"><code>T01</code><bezeichnung>Gesamtsatz laufend</bezeichnung><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechPosTyp>
<verrechPosTyp xmlId="VPT02"><code>T02</code><bezeichnung>Gesamtsatz Sonderzahlung</bezeichnung><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechPosTyp>
</verrechPosTypen>
<verrechBasisPositionKombinationen>
<verrechBasisPositionKombination xmlId="K01"><verrechnungBasisTyp>VBTAB</verrechnungBasisTyp><verrechnungPosTyp>VPT01</verrechnungPosTyp><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechBasisPositionKombination>
<verrechBasisPositionKombination xmlId="K02"><verrechnungBasisTyp>VBTSZ</verrechnungBasisTyp><verrechnungPosTyp>VPT02</verrechnungPosTyp><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></verrechBasisPositionKombination>
</verrechBasisPositionKombinationen>
<tarifgruppeSetZuordnungen>
<tarifgruppeSetZuord xmlId="Z001"><tarifgruppe>T001</tarifgruppe><tarifset>S001</tarifset><verrechBasPosKombination>K01</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z002"><tarifgruppe>T001</tarifgruppe><tarifset>S002</tarifset><verrechBasPosKombination>K02</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z003"><tarifgruppe>T002</tarifgruppe><tarifset>S001</tarifset><verrechBasPosKombination>K01</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z004"><tarifgruppe>T002</tarifgruppe><tarifset>S002</tarifset><verrechBasPosKombination>K02</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z005"><tarifgruppe>T002E01</tarifgruppe><tarifset>S003</tarifset><verrechBasPosKombination>K01</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z006"><tarifgruppe>T002E01</tarifgruppe><tarifset>S002</tarifset><verrechBasPosKombination>K02</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z007"><tarifgruppe>T045</tarifgruppe><tarifset>S001</tarifset><verrechBasPosKombination>K01</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
<tarifgruppeSetZuord xmlId="Z008"><tarifgruppe>T045</tarifgruppe><tarifset>S002</tarifset><verrechBasPosKombination>K02</verrechBasPosKombination><traegergruppe>OEGK</traegergruppe><vonDatum>2019-01-01</vonDatum><bisDatum>2999-12-31</bisDatum></tarifgruppeSetZuord>
</tarifgruppeSetZuordnungen>
<zuAbschlaege>
<zuAbschlag xmlId="A09X">
<code>A09</code>
<bezeichnung>Entfall UV 60. Lj</bezeichnung>
<kurzbezeichnung>UV 60</kurzbezeichnung>
<zuabschlagkz>A</zuabschlagkz>
<versicherungsRelevant>false</versicherungsRelevant>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</zuAbschlag>
</zuAbschlaege>
<zuAbschlaegeSteuerung>
<zuAbschlagSteuerung xmlId="A09S1">
<zuAbschlag>A09X</zuAbschlag>
<altersgrenzeMinJahr>60</altersgrenzeMinJahr>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</zuAbschlagSteuerung>
</zuAbschlaegeSteuerung>
<zuAbschlagTarifsetZuordnungen>
<zuAbschlagTarifsetZuord xmlId="AZ01">
<zuAbschlag>A09X</zuAbschlag>
<tarifsetByTarifsetId>S001</tarifsetByTarifsetId>
<tarifgruppe>T001</tarifgruppe>
<tarifgruppe>T002</tarifgruppe>
<traegergruppe>OEGK</traegergruppe>
<vonDatum>2019-01-01</vonDatum>
<bisDatum>2999-12-31</bisDatum>
</zuAbschlagTarifsetZuord>
</zuAbschlagTarifsetZuordnungen>
</tarifssystemlsh>
"""
@tagged('post_install', '-at_install')
class TasyKatalogTest(TransactionCase):
"""Katalog-Import (Fixture + Realexport) und Tarifgruppen-Auflösung."""
def _import(self, raw=None):
import os
if raw is None:
path = os.path.join(os.path.dirname(__file__), *[
'..', '..', '..', 'personalverrechnung', 'quellen',
'TASY-LSWH-Export-20260324.xml'])
if not os.path.exists(path):
self.skipTest('TASY-Quelldatei nicht im Workingtree')
with open(path, 'rb') as fh:
raw = fh.read()
wizard = self.env['l10n.at.payroll.tasy.katalog.wizard'].create({
'file': base64.b64encode(raw).decode(),
'filename': 'fixture.xml',
})
wizard.action_import()
return wizard
def test_01_import_fixture_und_aufloesung(self):
"""Import erzeugt den Katalog; B001/B002 lösen zu den
normativen Normalbetriebe-Sätzen auf (AB 39,05, SZ 37,55)."""
self._import(TASY_KATALOG_FIXTURE.encode())
self.assertEqual(
self.env['l10n.at.payroll.tasy.bsgr'].search_count([]), 5)
self.assertEqual(
self.env['l10n.at.payroll.tasy.ergaenzung'].search_count([]),
1)
self.assertEqual(
self.env['l10n.at.payroll.tasy.dienstgebergruppe']
.search_count([]), 2)
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarifgruppe'].search_count([]),
4)
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarifset'].search_count([]), 3)
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarifset.zuord']
.search_count([]), 8)
stichtag = date(2026, 7, 1)
for code in ('B001', 'B002'):
tarifgruppe = self.env[
'l10n.at.payroll.tasy.tarifgruppe']._l10n_at_find(
code, [], 'NBALG', stichtag)
self.assertTrue(tarifgruppe, code)
ab = tarifgruppe._l10n_at_saetze('AB', stichtag)
sz = tarifgruppe._l10n_at_saetze('SZ', stichtag)
self.assertAlmostEqual(ab['gesamt'], 39.05, places=2)
self.assertAlmostEqual(ab['dn'], 18.07, places=2)
self.assertAlmostEqual(ab['dg'], 20.98, places=2)
self.assertAlmostEqual(sz['gesamt'], 37.55, places=2)
def test_02_import_idempotent(self):
"""Erneuter Import derselben Datei dupliziert nichts."""
self._import(TASY_KATALOG_FIXTURE.encode())
self._import(TASY_KATALOG_FIXTURE.encode())
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarifgruppe'].search_count([]),
4)
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarif'].search_count([]), 8)
self.assertEqual(
self.env['l10n.at.payroll.tasy.tarifset.zuord']
.search_count([]), 8)
def test_03_ergaenzung_e01(self):
"""B002 + E01 + NBNSA → T01 inkl. NB-Zweig 3,80 % DG
(42,85 %); ohne Ergänzung unter NBNSA keine Tarifgruppe."""
self._import(TASY_KATALOG_FIXTURE.encode())
stichtag = date(2026, 7, 1)
find = self.env['l10n.at.payroll.tasy.tarifgruppe']._l10n_at_find
# B002 + E01 unter NBALG existiert nicht (E01 gehört zu NBNSA)
self.assertFalse(find('B002', ['E01'], 'NBALG', stichtag))
tarifgruppe = find('B002', ['E01'], 'NBNSA', stichtag)
self.assertTrue(tarifgruppe)
ab = tarifgruppe._l10n_at_saetze('AB', stichtag)
self.assertAlmostEqual(ab['gesamt'], 42.85, places=2)
zweige = {t.zweig for t in ab['komponenten']}
self.assertIn('NB', zweige)
# SZ ohne NB (Sonderzahlungen tragen keinen NSchAB)
sz = tarifgruppe._l10n_at_saetze('SZ', stichtag)
self.assertAlmostEqual(sz['gesamt'], 37.55, places=2)
def test_04_lehrlings_bsg(self):
"""B045 (Arbeiterlehrlinge) ist auflösbar — die
Lehrlings-BSGR-Korrektur beruht auf diesen Bezeichnern."""
self._import(TASY_KATALOG_FIXTURE.encode())
stichtag = date(2026, 7, 1)
b044 = self.env['l10n.at.payroll.tasy.bsgr'].search([
('code', '=', 'B044')])
b045 = self.env['l10n.at.payroll.tasy.bsgr'].search([
('code', '=', 'B045')])
self.assertEqual(b044.bezeichnung, 'Angestelltenlehrlinge')
self.assertEqual(b045.bezeichnung, 'Arbeiterlehrlinge')
tarifgruppe = self.env[
'l10n.at.payroll.tasy.tarifgruppe']._l10n_at_find(
'B045', [], 'NBALG', stichtag)
self.assertTrue(tarifgruppe)
def test_05_real_export(self):
"""Echter TASY-LSWH-Export: Katalog-Volumen und die
normativen 2026er Sätze aus der Katalogauflösung."""
self._import()
stichtag = date(2026, 7, 1)
find = self.env['l10n.at.payroll.tasy.tarifgruppe']._l10n_at_find
for code in ('B001', 'B002'):
tarifgruppe = find(code, [], 'NBALG', stichtag)
self.assertTrue(tarifgruppe, code)
ab = tarifgruppe._l10n_at_saetze('AB', stichtag)
sz = tarifgruppe._l10n_at_saetze('SZ', stichtag)
self.assertAlmostEqual(ab['gesamt'], 39.05, places=2)
self.assertAlmostEqual(sz['gesamt'], 37.55, places=2)
# Lehrlings-BSGR-Bezeichner (Korrektur-Grundlage)
self.assertEqual(self.env['l10n.at.payroll.tasy.bsgr'].search([
('code', '=', 'B044')]).bezeichnung, 'Angestelltenlehrlinge')
self.assertEqual(self.env['l10n.at.payroll.tasy.bsgr'].search([
('code', '=', 'B045')]).bezeichnung, 'Arbeiterlehrlinge')
# Geringfügige je Personalgruppe
self.assertEqual(self.env['l10n.at.payroll.tasy.bsgr'].search([
('code', '=', 'B010')]).bezeichnung,
'Geringfügig beschäftigte Arbeiter')
# Ergänzungen sind im Katalog
self.assertTrue(self.env['l10n.at.payroll.tasy.ergaenzung'].search([
('code', '=', 'E01')]))