[IMP] l10n_at_hr_payroll(_private): Meldewesen-Reste (AP17) und Status-Sonderfälle (AP18/AP19)

AP17 — Lohnnachweis L17, Finanz-Mitteilungen § 109a/§ 109b, GfB-Jahreszahlung:
- L17 (DM-ORG E.24, BEST LF, SART A1/1100, Version 28): je
  Lohnzahlungszeitraum je DN aus den GP3-Kennzahlen-Flags; Prüfkatalog-
  Semantik (KZ 350 = Brutto gesamt, 351/352/354 Teilbeträge) und formale
  Prüfungen (350-Formel, 357/347-Caps, aliquotierte 354/HOPA-Caps);
  ODL-PDF-Extraktion der Kapitel E.24/E.16/E.26 (txt feldversetzt)
- Finanz-Mitteilungen § 109a (W1, E.16) und § 109b (B1, E.26): Modelle
  je Leistungserbringer/Auftragnehmer, Schwellen als hr.rule.parameter
  (450/900 — § 109a-VO; 100.000 — § 109b Abs 4 lit a, RIS NOR40263383),
  AL31/32/33, LKZ1-7, UID, bis 3 maßgebliche natürliche Personen,
  KORR K/S; Unter-Schwellen-Zeilen entfallen mit Protokollhinweis
- mBGM: geringfügig Beschäftigte (BSGR B010/B030) — T01 § 53a-UV-
  Pauschale + V01 BMSVG 1,53 %, kein T02 (GfB-SZ beitragsfrei,
  § 49 Abs 3); JAGB-Pakettrennung für die jährliche Abrechnung
  (§ 58 Abs 8 ASVG iVm § 6 Abs 2a BMSVG, DM-ORG D.52) mit
  2,5 vH-Zuschlag (Z04) in der GfB-Jahresabrechnung (Fälligkeit
  15. 1. Folgejahr)
- Fristenkalender: L17- und § 109b-Fristarten (Ende Februar;
  § 109a/§ 109b EStG und § 58 Abs 8 ASVG RIS-verifiziert)

AP18 — Schwerarbeit/NSchG (Beschaffungsgate erledigt, RIS):
- NSchG (RIS 10008502, BGBl 1981/354) Art XI Abs 3 (2 vH Stammnorm,
  3,80 % via Sistierung) und Abs 6 (Nachtschwerarbeitsmonat: 6-Tage-
  Kriterium, Rückblick-Fenster 12/18, Randmonat); ASchV (20004642)
  § 1/§ 4/§ 5; DM-ORG E.22.2-Erstellvorschriften (Z 1 analog NSchG,
  Z 2/4/5 ≥ 15 Tage, Z 3/GfB nicht melden)
- Kern: Schwerarbeitsmeldung (BEST SM, SART 65/66, Länge 800,
  Tätigkeitsblöcke 26 × 10) mit Altersfilter- und Erstellvorschrift-
  Prüfungen
- Privat: Nachtschwerarbeitsmonat-Zähler (WET ATP_NACHTSCHWER,
  Art-XI-Abs-6-Fenster inkl. Randmonat-Proxy) als stored Flag am Lauf

AP19 — Status- und Verhinderungs-Sonderfälle:
- hr.version-Status (Organ ≤/≥ 25 %, lb-vst-03): Organ ≥ 25 % — kein
  SV-Verhältnis (SVDN/SVDG 0 via SV-Satz-Override, mBGM-Ausschluss,
  LSt läuft weiter); Ferialpraktikanten-Flag (dokumentativ — BMSVG § 6
  nennt keinen Ausschluss, Entgelt-/SV-Logik bleibt normal)
- Präsenz-/Ausbildungs-/Zivildienst-Fiktion (§ 7 Abs 1/2 BMSVG):
  fiktive BV-Bemessungsgrundlage 435,90 € (KBGG § 3 Abs 1 idF vor
  BGBl I 53/2016, lb-vor-04) aliquotiert auf ATP_PRD_TAGE
- Dienstverhinderungs-Sonderfälle bleiben dokumentiert offen
  (lb-dvh-01/04, KB-); Feiertags-EFZ ist durch das AP4-WET-Modell
  abgedeckt

Tests: 21 neue (L17-Positionen/Prüfkatalog, W1/B1-Schwellen, GfB-mBGM/
JAGB/Jahresabrechnung, NSchM-Fenster/Randmonat, SM-Fixsatz, Organ-Sperre,
PRD-Fiktion); Suite 252/252 grün auf frischer -i-DB (85 Kern, 18 GemBG,
213 Privat, 10 Dokumente). Dokumentierte Reste: DZR-36-Fenster,
Randmonat-Proxy und UV-Pauschale-vs-mBGM im Parallellauf (GP8),
fallweise mBGM (G3/G4), 2027er-Schwellen (C7).
This commit is contained in:
2026-09-16 19:12:08 +02:00
parent 1df5fb19c4
commit ec33dfacf2
27 changed files with 2736 additions and 64 deletions
@@ -0,0 +1,227 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP17: Lohnnachweis/Lohnbescheinigung L17 (A1) und Finanz- -->
<!-- Mitteilungen § 109a (W1)/§ 109b (B1). Menü unter dem -->
<!-- Meldewesen (ELDA/FinOnl). -->
<!-- ============================================================ -->
<record id="l17_list_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.l17.list</field>
<field name="model">l10n.at.payroll.l17</field>
<field name="arch" type="xml">
<list string="Lohnnachweis/Lohnbescheinigung (L17)">
<field name="jahr"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state" widget="badge"
decoration-success="state == 'done'"
decoration-info="state == 'draft'"/>
</list>
</field>
</record>
<record id="l17_form_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.l17.form</field>
<field name="model">l10n.at.payroll.l17</field>
<field name="arch" type="xml">
<form string="L17 — Lohnnachweis/Lohnbescheinigung">
<header>
<button name="action_erzeugen" type="object"
string="Lauf erzeugen (A1 je LZP)"
class="btn-primary"
invisible="state == 'done'"/>
<field name="state" widget="statusbar"
statusbar_visible="draft,done"/>
</header>
<sheet>
<group>
<group>
<field name="jahr"/>
</group>
<group>
<field name="company_id"
groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page string="A1-Sätze (je LZP)" name="linien">
<field name="line_ids">
<list editable="bottom">
<field name="employee_name"/>
<field name="date_from"/>
<field name="date_to"/>
<field name="versicherungsnummer"/>
<field name="kz350"/>
<field name="kz351" optional="show"/>
<field name="kz352" optional="show"/>
<field name="kz354" optional="hide"/>
<field name="kz357" optional="show"/>
<field name="kz347" optional="hide"/>
<field name="hota" optional="hide"/>
<field name="hopa" optional="hide"/>
</list>
</field>
</page>
<page string="Datei" name="datei">
<group>
<field name="datei" filename="datei_name"/>
<field name="datei_name" invisible="1"/>
</group>
</page>
<page string="Prüfprotokoll" name="protokoll">
<field name="protokoll"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_l17" model="ir.actions.act_window">
<field name="name">Lohnnachweis L17</field>
<field name="res_model">l10n.at.payroll.l17</field>
<field name="view_mode">list,form</field>
</record>
<menuitem id="menu_l10n_at_payroll_l17"
name="Lohnnachweis L17 (A1)"
parent="menu_l10n_at_payroll_meldewesen"
action="action_l17" sequence="12"/>
<record id="mitteilung109_list_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.mitteilung109.list</field>
<field name="model">l10n.at.payroll.mitteilung109</field>
<field name="arch" type="xml">
<list string="Finanz-Mitteilungen § 109a/§ 109b">
<field name="jahr"/>
<field name="art"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state" widget="badge"
decoration-success="state == 'done'"
decoration-info="state == 'draft'"/>
</list>
</field>
</record>
<record id="mitteilung109_form_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.mitteilung109.form</field>
<field name="model">l10n.at.payroll.mitteilung109</field>
<field name="arch" type="xml">
<form string="Finanz-Mitteilungen § 109a/§ 109b">
<header>
<button name="action_erzeugen" type="object"
string="Lauf erzeugen (Schwellen, Datei)"
class="btn-primary"
invisible="state == 'done'"/>
<field name="state" widget="statusbar"
statusbar_visible="draft,done"/>
</header>
<sheet>
<group>
<group>
<field name="jahr"/>
<field name="art"/>
</group>
<group>
<field name="company_id"
groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page string="Mitteilungssätze" name="linien">
<field name="line_ids" context="{'default_art': art}">
<list editable="bottom"
open_form_view="1">
<field name="name_partner"/>
<field name="name"/>
<field name="versicherungsnummer"/>
<field name="steuernummer"
optional="show"/>
<field name="entgelt"/>
<field name="umsatzsteuer"
optional="show"/>
<field name="gemeldet"/>
</list>
</field>
</page>
<page string="Datei" name="datei">
<group>
<field name="datei" filename="datei_name"/>
<field name="datei_name" invisible="1"/>
</group>
</page>
<page string="Prüfprotokoll" name="protokoll">
<field name="protokoll"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mitteilung109_line_form_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.mitteilung109.line.form</field>
<field name="model">l10n.at.payroll.mitteilung109.line</field>
<field name="arch" type="xml">
<form string="Finanz-Mitteilung (§ 109a/§ 109b)">
<sheet>
<group>
<group>
<field name="name_partner"/>
<field name="name"/>
<field name="versicherungsnummer"/>
<field name="steuernummer"/>
<field name="uid"/>
</group>
<group>
<field name="adresse"/>
<field name="landeskennung"/>
<field name="plz"/>
<field name="ort"/>
</group>
</group>
<group>
<group>
<field name="entgelt"/>
<field name="umsatzsteuer"/>
<field name="dn_sv_anteil"/>
<field name="bmv_beitrag"/>
</group>
<group>
<field name="art_leistung"/>
<field name="al31"/>
<field name="al32"/>
<field name="al33"/>
<field name="ziellaender"/>
<field name="ausnahme_grund"/>
<field name="korr"/>
<field name="gemeldet"/>
</group>
</group>
<group string="Maßgeblich auftretende natürliche Personen (max. 3)">
<field name="np_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="versicherungsnummer"/>
<field name="steuernummer"/>
<field name="uid" optional="hide"/>
</list>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_mitteilung109" model="ir.actions.act_window">
<field name="name">Finanz-Mitteilungen § 109a/§ 109b</field>
<field name="res_model">l10n.at.payroll.mitteilung109</field>
<field name="view_mode">list,form</field>
</record>
<menuitem id="menu_l10n_at_payroll_m109"
name="Mitteilungen § 109a/§ 109b"
parent="menu_l10n_at_payroll_meldewesen"
action="action_mitteilung109" sequence="14"/>
</odoo>