[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)
This commit is contained in:
@@ -2,6 +2,44 @@
|
|||||||
|
|
||||||
## Current focus
|
## Current focus
|
||||||
|
|
||||||
|
**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**
|
**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**):
|
(2026-09-15, uncommittet bis Nutzerfreigabe; Privat **19.0.15.0.0**):
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Part of the odoo-at-payroll project. License: LGPL-3.
|
# Part of the odoo-at-payroll project. License: LGPL-3.
|
||||||
{
|
{
|
||||||
'name': 'Österreich - Privatwirtschaft Personalverrechnung (General-AT)',
|
'name': 'Österreich - Privatwirtschaft Personalverrechnung (General-AT)',
|
||||||
'version': '19.0.15.0.0',
|
'version': '19.0.16.0.0',
|
||||||
'author': 'Florian Egger',
|
'author': 'Florian Egger',
|
||||||
'website': 'https://gem360.at',
|
'website': 'https://gem360.at',
|
||||||
'category': 'Human Resources/Payroll',
|
'category': 'Human Resources/Payroll',
|
||||||
|
|||||||
@@ -47,4 +47,12 @@
|
|||||||
<field name="name">Vergleichssumme — BV-Anwartschafts-Teil (Brutto)</field>
|
<field name="name">Vergleichssumme — BV-Anwartschafts-Teil (Brutto)</field>
|
||||||
<field name="code">ATP_VERGLEICH_BV</field>
|
<field name="code">ATP_VERGLEICH_BV</field>
|
||||||
</record>
|
</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>
|
</odoo>
|
||||||
@@ -15,6 +15,11 @@
|
|||||||
<!-- Override, BV-Anwartschafts-Teil bis 7.500 € mit 6 %; beide -->
|
<!-- Override, BV-Anwartschafts-Teil bis 7.500 € mit 6 %; beide -->
|
||||||
<!-- SV-pflichtig (Zuflussmonat; Aufrollung je Beitragsmonat bzw. -->
|
<!-- SV-pflichtig (Zuflussmonat; Aufrollung je Beitragsmonat bzw. -->
|
||||||
<!-- PV-Verlängerung siehe lb-end-22) und LNK-pflichtig. -->
|
<!-- 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). -->
|
<!-- Urlaubsersatzleistung — laufender Anteil (§ 67 Abs 8 lit d). -->
|
||||||
@@ -173,6 +178,48 @@ result = inputs['ATP_VERGLEICH_BV'].amount
|
|||||||
]]></field>
|
]]></field>
|
||||||
</record>
|
</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 %). -->
|
<!-- Zeitguthaben an Normalarbeitszeit (§ 19e Abs 2 AZG: + 50 %). -->
|
||||||
<record id="rule_zeit_guthaben" model="hr.salary.rule">
|
<record id="rule_zeit_guthaben" model="hr.salary.rule">
|
||||||
<field name="name">Zeitguthaben Normalarbeitszeit + 50 % (§ 19e Abs 2 AZG)</field>
|
<field name="name">Zeitguthaben Normalarbeitszeit + 50 % (§ 19e Abs 2 AZG)</field>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Endabrechnungs-Zyklus — Rechenfälle AP14-A / AP15-A / AP15-C
|
# Endabrechnungs-Zyklus — Rechenfälle AP14-A / AP14-B / AP15-A / AP15-C
|
||||||
|
|
||||||
Stand: 2026-09. AP14-A bildet die Beendigungs-Abrechnung auf der
|
Stand: 2026-09. AP14-A bildet die Beendigungs-Abrechnung auf der
|
||||||
privaten Structure ab: Urlaubsersatzleistung (UEL), Abgangsentschädigung,
|
privaten Structure ab: Urlaubsersatzleistung (UEL), Abgangsentschädigung,
|
||||||
@@ -236,6 +236,53 @@ BV-Kassen-Anwartschaft (lb-end-21 Beispiel 2):
|
|||||||
Fünftel-Tarifteil ist über die laufende Bemessung pfändbar, seine
|
Fünftel-Tarifteil ist über die laufende Bemessung pfändbar, seine
|
||||||
Lohnsteuer steckt in `LST_LFD`.
|
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)
|
## Offene Punkte (Verifikationsreste)
|
||||||
|
|
||||||
- KZ-Positionierung der Abs-6-Bezüge (außerhalb KZ 210/220, LSt in
|
- KZ-Positionierung der Abs-6-Bezüge (außerhalb KZ 210/220, LSt in
|
||||||
@@ -248,8 +295,12 @@ BV-Kassen-Anwartschaft (lb-end-21 Beispiel 2):
|
|||||||
praxis (zwölf Monate voller Bezüge) widerspricht dem VwGH
|
praxis (zwölf Monate voller Bezüge) widerspricht dem VwGH
|
||||||
(Krankengeld 6/7 einbeziehen) — bewusst ohne Automatik, Basis ist
|
(Krankengeld 6/7 einbeziehen) — bewusst ohne Automatik, Basis ist
|
||||||
bestätigbar (lb-end-13 ⚠).
|
bestätigbar (lb-end-13 ⚠).
|
||||||
- Prämien-Beendigung (§ 16 AngG-Aliquotierung, Rollung) — PRAM/SZ-Regeln
|
- Prämien-Beendigung (§ 16 AngG-Aliquotierung, Rollung) — mit AP14-B
|
||||||
vorhanden; Feinschliff 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/
|
- Meldewesen-Schnittstellen: „Ende des Entgeltanspruches" in mBGM/
|
||||||
Abmeldung (GP7), gesonderter Lohnzettel bei Zahlung außerhalb des
|
Abmeldung (GP7), gesonderter Lohnzettel bei Zahlung außerhalb des
|
||||||
Beendigungsmonats (LStR 2002 Rz 911a).
|
Beendigungsmonats (LStR 2002 Rz 911a).
|
||||||
|
|||||||
@@ -83,6 +83,10 @@ L10N_AT_BUCHUNGSMATRIX = {
|
|||||||
# Teil — gleiche vorläufige Aufwandskonten wie die Abfertigungen.
|
# Teil — gleiche vorläufige Aufwandskonten wie die Abfertigungen.
|
||||||
'rule_vergleich': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
|
'rule_vergleich': {'debit': ('6200',), 'debit_arbeiter': ('6000',)},
|
||||||
'rule_vergleich_bv': {'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.)
|
# Nettoauszahlung (reconcilable, s. o.)
|
||||||
'rule_netto': {'credit': ('3850',)},
|
'rule_netto': {'credit': ('3850',)},
|
||||||
# DG-Beiträge (650–655 SV Arbeiter · 656–659 SV Angestellte)
|
# DG-Beiträge (650–655 SV Arbeiter · 656–659 SV Angestellte)
|
||||||
|
|||||||
@@ -145,6 +145,19 @@ class HrPayslip(models.Model):
|
|||||||
'BV-Anwartschafts-Zeiträume; beim Pauschalvergleich der '
|
'BV-Anwartschafts-Zeiträume; beim Pauschalvergleich der '
|
||||||
'Verhältnisfaktor Forderungsbetrag : Vergleichssumme '
|
'Verhältnisfaktor Forderungsbetrag : Vergleichssumme '
|
||||||
'(E-MVB 011-02-00-001).')
|
'(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)
|
# SV-Tage-Umrechnung und Verlängerungsmonate (§ 11 Abs 2 ASVG)
|
||||||
@@ -590,7 +603,11 @@ class HrPayslip(models.Model):
|
|||||||
gelegt. Der Standardanteil jedes Monats bleibt auf die volle
|
gelegt. Der Standardanteil jedes Monats bleibt auf die volle
|
||||||
monatliche HBG gedeckelt, der Verlängerungsanteil auf den
|
monatliche HBG gedeckelt, der Verlängerungsanteil auf den
|
||||||
Tageswert (monatliche HBG × Verlängerungstage/30, lb-url-15);
|
Tageswert (monatliche HBG × Verlängerungstage/30, lb-url-15);
|
||||||
die Fenster laufen sequenziell (Abgang zuerst, UEL danach)."""
|
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()
|
self.ensure_one()
|
||||||
gruppen = {}
|
gruppen = {}
|
||||||
verlaengerung = {}
|
verlaengerung = {}
|
||||||
@@ -617,8 +634,12 @@ class HrPayslip(models.Model):
|
|||||||
tage_pro_monat[monat] = \
|
tage_pro_monat[monat] = \
|
||||||
tage_pro_monat.get(monat, 0) + tage
|
tage_pro_monat.get(monat, 0) + tage
|
||||||
continue
|
continue
|
||||||
monat = (rule.l10n_at_beitragsmonat or self.date_from) \
|
if rule.code == 'PRAM_END_TARIF' \
|
||||||
.replace(day=1)
|
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']
|
gruppen[monat] = gruppen.get(monat, 0.0) + werte['total']
|
||||||
standard = self.date_from.replace(day=1)
|
standard = self.date_from.replace(day=1)
|
||||||
if standard in gruppen:
|
if standard in gruppen:
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ lit d), SV-Verlängerung (§ 11 Abs 2 ASVG, sequentielle Fenster),
|
|||||||
Abgangsentschädigung (§ 67 Abs 8 lit b Fünftel), Aufrechnung offener
|
Abgangsentschädigung (§ 67 Abs 8 lit b Fünftel), Aufrechnung offener
|
||||||
Vorschüsse (§ 293 Abs 3 EO) und Zeitguthaben (§ 19e Abs 2 AZG).
|
Vorschüsse (§ 293 Abs 3 EO) und Zeitguthaben (§ 19e Abs 2 AZG).
|
||||||
AP15-C: Vergleichssummen (§ 67 Abs 8 lit a) — Rest-Fünftel,
|
AP15-C: Vergleichssummen (§ 67 Abs 8 lit a) — Rest-Fünftel,
|
||||||
BV-Anwartschafts-Teil mit 6 %/7.500-€-Deckel, Wizard."""
|
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 datetime import date, timedelta
|
||||||
|
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
@@ -798,3 +800,153 @@ class EndabrechnungPrivateTest(TransactionCase):
|
|||||||
self.assertAlmostEqual(
|
self.assertAlmostEqual(
|
||||||
self._total(slip, 'LST_VERGLEICH_BV'),
|
self._total(slip, 'LST_VERGLEICH_BV'),
|
||||||
7500.0 * (1.0 - satz / 100.0) * steuersatz / 100.0, places=2)
|
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)
|
||||||
|
|||||||
@@ -81,6 +81,21 @@
|
|||||||
<field name="vergleich_bv_lst_vorschau"/>
|
<field name="vergleich_bv_lst_vorschau"/>
|
||||||
</group>
|
</group>
|
||||||
</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 string="Vorschau (§ 10 UrlG, § 11 Abs 2 ASVG)">
|
||||||
<group>
|
<group>
|
||||||
<field name="uel_lfd_vorschau"/>
|
<field name="uel_lfd_vorschau"/>
|
||||||
@@ -169,6 +184,24 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</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">
|
<record id="action_endabrechnung_wizard" model="ir.actions.act_window">
|
||||||
<field name="name">Endabrechnung (Beendigung)</field>
|
<field name="name">Endabrechnung (Beendigung)</field>
|
||||||
<field name="res_model">l10n.at.payroll.endabrechnung.wizard</field>
|
<field name="res_model">l10n.at.payroll.endabrechnung.wizard</field>
|
||||||
|
|||||||
@@ -183,6 +183,62 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
help='Vergleichstext, strittige Ansprüche, erkennbare '
|
help='Vergleichstext, strittige Ansprüche, erkennbare '
|
||||||
'Abfertigungsanteile, BV-Zeiträume und allfälliger '
|
'Abfertigungsanteile, BV-Zeiträume und allfälliger '
|
||||||
'Verhältnisfaktor dokumentieren.')
|
'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(
|
currency_id = fields.Many2one(
|
||||||
'res.currency', default=lambda self: self.env.company.currency_id)
|
'res.currency', default=lambda self: self.env.company.currency_id)
|
||||||
|
|
||||||
@@ -240,6 +296,9 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
vergleich_bv_lst_vorschau = fields.Monetary(
|
vergleich_bv_lst_vorschau = fields.Monetary(
|
||||||
string='LSt 6 % BV-Teil (Vorschau)', currency_field='currency_id',
|
string='LSt 6 % BV-Teil (Vorschau)', currency_field='currency_id',
|
||||||
compute='_compute_vorschau')
|
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')
|
@api.onchange('employee_id')
|
||||||
def _onchange_employee(self):
|
def _onchange_employee(self):
|
||||||
@@ -253,6 +312,31 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
wizard._at_abf_alt_vorschlag_setzen()
|
wizard._at_abf_alt_vorschlag_setzen()
|
||||||
wizard._at_abf_frei_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',
|
@api.onchange('austrittsdatum', 'abf_alt_anspruchsart',
|
||||||
'abf_alt_dienstzeit_monate', 'abf_alt_aktiv',
|
'abf_alt_dienstzeit_monate', 'abf_alt_aktiv',
|
||||||
'abf_alt_monatsentgelt', 'abf_alt_mehrfach',
|
'abf_alt_monatsentgelt', 'abf_alt_mehrfach',
|
||||||
@@ -306,7 +390,10 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
'abf_frei_erhaltene_abfertigungen',
|
'abf_frei_erhaltene_abfertigungen',
|
||||||
'abf_frei_gesetzlicher_anspruch',
|
'abf_frei_gesetzlicher_anspruch',
|
||||||
'vergleich_aktiv', 'vergleich_rest_betrag',
|
'vergleich_aktiv', 'vergleich_rest_betrag',
|
||||||
'vergleich_bv_betrag')
|
'vergleich_bv_betrag',
|
||||||
|
'pram_aktiv', 'pram_voller_betrag',
|
||||||
|
'pram_dienstzeit_monate',
|
||||||
|
'pram_anspruchszeitraum_monate')
|
||||||
def _compute_vorschau(self):
|
def _compute_vorschau(self):
|
||||||
for wizard in self:
|
for wizard in self:
|
||||||
wizard.uel_lfd_vorschau = 0.0
|
wizard.uel_lfd_vorschau = 0.0
|
||||||
@@ -327,6 +414,7 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
wizard.vergleich_fuenftel_frei_vorschau = 0.0
|
wizard.vergleich_fuenftel_frei_vorschau = 0.0
|
||||||
wizard.vergleich_tarif_basis_vorschau = 0.0
|
wizard.vergleich_tarif_basis_vorschau = 0.0
|
||||||
wizard.vergleich_bv_lst_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:
|
if not wizard.employee_id or not wizard.austrittsdatum:
|
||||||
continue
|
continue
|
||||||
slip = wizard._vorschau_payslip()
|
slip = wizard._vorschau_payslip()
|
||||||
@@ -369,6 +457,7 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
slip._at_fuenftel_tarif_basis()
|
slip._at_fuenftel_tarif_basis()
|
||||||
wizard.vergleich_bv_lst_vorschau = \
|
wizard.vergleich_bv_lst_vorschau = \
|
||||||
slip._at_vergleich_bv_lst_6()
|
slip._at_vergleich_bv_lst_6()
|
||||||
|
wizard.pram_aliquot_vorschau = wizard._at_pram_aliquot()
|
||||||
|
|
||||||
def _vorschau_payslip(self):
|
def _vorschau_payslip(self):
|
||||||
"""Flüchtiger Payslip-Kontext für die Vorschau-Berechnung (kein
|
"""Flüchtiger Payslip-Kontext für die Vorschau-Berechnung (kein
|
||||||
@@ -405,6 +494,7 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
self.abf_frei_gesetzlicher_anspruch,
|
self.abf_frei_gesetzlicher_anspruch,
|
||||||
'l10n_at_abf_frei_nachweis': self.abf_frei_nachweis,
|
'l10n_at_abf_frei_nachweis': self.abf_frei_nachweis,
|
||||||
'l10n_at_vergleich_nachweis': self.vergleich_nachweis,
|
'l10n_at_vergleich_nachweis': self.vergleich_nachweis,
|
||||||
|
'l10n_at_pram_nachweis': self.pram_nachweis,
|
||||||
})
|
})
|
||||||
eingaben = [
|
eingaben = [
|
||||||
('ATP_UEL_TAGE', self.uel_tage),
|
('ATP_UEL_TAGE', self.uel_tage),
|
||||||
@@ -416,6 +506,12 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
if self.vergleich_aktiv else 0.0),
|
if self.vergleich_aktiv else 0.0),
|
||||||
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
|
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
|
||||||
if self.vergleich_aktiv else 0.0),
|
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 = [
|
slip.input_line_ids = [
|
||||||
(0, 0, {
|
(0, 0, {
|
||||||
@@ -444,6 +540,12 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
if self.vergleich_aktiv else 0.0),
|
if self.vergleich_aktiv else 0.0),
|
||||||
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
|
('ATP_VERGLEICH_BV', self.vergleich_bv_betrag
|
||||||
if self.vergleich_aktiv else 0.0),
|
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):
|
def _abf_alt_validieren(self):
|
||||||
@@ -535,6 +637,34 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
'Zeiträume voraus (§ 67 Abs 8 lit a letzter '
|
'Zeiträume voraus (§ 67 Abs 8 lit a letzter '
|
||||||
'Satz).'))
|
'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):
|
def action_payslip(self):
|
||||||
"""Endabrechnungs-Lauf im Austrittsmonat anlegen und die
|
"""Endabrechnungs-Lauf im Austrittsmonat anlegen und die
|
||||||
gesammelten offenen Posten als Eingaben vorbefüllen."""
|
gesammelten offenen Posten als Eingaben vorbefüllen."""
|
||||||
@@ -542,6 +672,7 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
self._abf_alt_validieren()
|
self._abf_alt_validieren()
|
||||||
self._abf_frei_validieren()
|
self._abf_frei_validieren()
|
||||||
self._vergleich_validieren()
|
self._vergleich_validieren()
|
||||||
|
self._pram_validieren()
|
||||||
erster = self.austrittsdatum.replace(day=1)
|
erster = self.austrittsdatum.replace(day=1)
|
||||||
letzter = (erster + timedelta(days=32)).replace(day=1) \
|
letzter = (erster + timedelta(days=32)).replace(day=1) \
|
||||||
- timedelta(days=1)
|
- timedelta(days=1)
|
||||||
@@ -587,6 +718,11 @@ class L10nAtEndabrechnungWizard(models.TransientModel):
|
|||||||
self.abf_frei_nachweis if self.abf_frei_aktiv else False,
|
self.abf_frei_nachweis if self.abf_frei_aktiv else False,
|
||||||
'l10n_at_vergleich_nachweis':
|
'l10n_at_vergleich_nachweis':
|
||||||
self.vergleich_nachweis if self.vergleich_aktiv else False,
|
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(
|
typen = {code: self.env['hr.payslip.input.type'].search(
|
||||||
[('code', '=', code)], limit=1)
|
[('code', '=', code)], limit=1)
|
||||||
|
|||||||
Reference in New Issue
Block a user