[IMP] l10n_at_hr_payroll_private: GP9 Mitarbeiter-UI, NSchAB-Company-View, Multi-Company-Rules, Demo-Datensatz, Benutzerhandbuch (AP9)

Mitarbeiter-UI (views/mitarbeiter_views.xml): All-in-Felder (l10n_at_ue_pauschale_monatlich, l10n_at_grundlohn_ausweis, § 2g AVRAG) als Gruppe am Mitarbeiterformular; NSchAB-Company-Flag am Lohnverrechnungs-Reiter (l10n_at_nschab — Feld nur im Privatmodul).

Multi-Company-Record-Rules (security/security_rules.xml): ir.rule für l10n.at.payroll.mbgm, .mbgm.line, .vr, .vr.event.

Demo-Datensatz (data/demo.xml, noupdate): 3 AN (Angestellte Vollzeit, Arbeiter Teilzeit, Lehrling) mit Verträgen, KV-Einstufung, VSNR, BMSVG-Flag; Demo-Company mit BKNR/Lohnsteuernummer/Bundesland; nur im Demo-Modus aktiv.

Benutzerhandbuch (docs/benutzerhandbuch.md): Quick-Start deutsch — Stammdaten, Monatsabrechnung, Meldewesen (mBGM/Versichertenmeldung/L16), Belege drucken, Fristenkalender, Jahreswechsel, BV-Endabrechnung.

19.0.8.1.0. 100/100 grün (Wegwerf-DB); odoo_dev auf GP9 aktualisiert.
This commit is contained in:
2026-09-12 20:43:55 +02:00
parent 447a880063
commit 8b9dbf7612
5 changed files with 366 additions and 2 deletions
@@ -1,7 +1,7 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'Österreich - Privatwirtschaft Personalverrechnung (General-AT)',
'version': '19.0.8.0.0',
'version': '19.0.8.1.0',
'author': 'ixsol / gem360',
'website': 'https://gem360.at',
'category': 'Human Resources/Payroll',
@@ -94,6 +94,7 @@ gem360-Brücke).
'l10n_at', 'hr_payroll_account_iso20022'],
'data': [
'security/ir.model.access.csv',
'security/security_rules.xml',
'data/kv_seed.xml',
'data/l10n.at.payroll.kv.gruppe.csv',
'data/l10n.at.payroll.kv.gruppe.stufe.csv',
@@ -112,10 +113,12 @@ gem360-Brücke).
'views/bv_views.xml',
'views/meldewesen_views.xml',
'views/vertragsfelder_views.xml',
'views/mitarbeiter_views.xml',
'report/gp8_reports.xml',
'report/bv_report.xml',
],
'countries': ['at'],
'demo': ['data/demo.xml'],
'countries': ['at'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- GP9/AP9: Demo-Datensatz für Schulungszwecke. -->
<!-- 3 AN: Angestellte Vollzeit, Arbeiter Teilzeit, Lehrling. -->
<!-- 3 Monats-Läufe (Nov 2026 mit B13, Dez mit B14, Jän 2027). -->
<!-- Noupdate: Demo-Daten überschreiben keine echten Daten. -->
<!-- Load with: odoo -i l10n_at_hr_payroll_private (Demo-Modus) -->
<!-- ============================================================ -->
<data noupdate="1">
<!-- Company-Stammdaten für Demo -->
<record id="demo_company_at" model="res.company">
<field name="name">AT Demo GmbH</field>
<field name="l10n_at_beitragskontonummer">1412345678</field>
<field name="l10n_at_lohnsteuernummer">123456789</field>
<field name="l10n_at_bundesland">niederoesterreich</field>
</record>
<!-- Kalender -->
<record id="demo_calendar" model="resource.calendar">
<field name="name">Demo 40h Mo-Fr</field>
<field name="tz">Europe/Vienna</field>
<field name="hours_per_day">8</field>
<field name="attendance_ids"
eval="[(0, 0, {'name': 'Tag %d' % wd, 'dayofweek': str(wd),
'hour_from': 8.0, 'hour_to': 16.0}) for wd in range(5)]"/>
</record>
<!-- AN 1: Angestellte Vollzeit (KV Handwerk und Gewerbe) -->
<record id="demo_employee_angestellte" model="hr.employee">
<field name="name">Anna Angestellte</field>
<field name="birthday">1990-05-15</field>
<field name="gender">female</field>
</record>
<record id="demo_version_angestellte" model="hr.version">
<field name="employee_id" ref="demo_employee_angestellte"/>
<field name="date_version">2026-01-01</field>
<field name="contract_date_start">2026-01-01</field>
<field name="ssnid">1234150590</field>
<field name="sex">female</field>
<field name="kv_id" ref="l10n_at_hr_payroll_private.kv_si_2203"/>
<field name="kv_gruppe_id" ref="l10n_at_hr_payroll_private.kv2203_grp_ii"/>
<field name="erfahrungsstufe">1</field>
<field name="resource_calendar_id" ref="demo_calendar"/>
<field name="l10n_at_abfertigung_neu" eval="True"/>
</record>
<!-- AN 2: Arbeiter Teilzeit -->
<record id="demo_employee_arbeiter" model="hr.employee">
<field name="name">Max Arbeiter</field>
<field name="birthday">1985-03-20</field>
<field name="gender">male</field>
</record>
<record id="demo_version_arbeiter" model="hr.version">
<field name="employee_id" ref="demo_employee_arbeiter"/>
<field name="date_version">2026-01-01</field>
<field name="contract_date_start">2026-01-01</field>
<field name="ssnid">5678203857</field>
<field name="sex">male</field>
<field name="kv_id" ref="l10n_at_hr_payroll_private.kv_si_2203"/>
<field name="kv_gruppe_id" ref="l10n_at_hr_payroll_private.kv2203_grp_ii"/>
<field name="erfahrungsstufe">1</field>
<field name="ueberzahlung">1800.0</field>
<field name="resource_calendar_id" ref="demo_calendar"/>
<field name="l10n_at_personalgruppe">arbeiter</field>
<field name="l10n_at_abfertigung_neu" eval="True"/>
</record>
<!-- AN 3: Lehrling -->
<record id="demo_employee_lehrling" model="hr.employee">
<field name="name">Lena Lehrling</field>
<field name="birthday">2008-09-10</field>
<field name="gender">female</field>
</record>
<record id="demo_version_lehrling" model="hr.version">
<field name="employee_id" ref="demo_employee_lehrling"/>
<field name="date_version">2026-01-01</field>
<field name="contract_date_start">2026-01-01</field>
<field name="ssnid">9010091057</field>
<field name="sex">female</field>
<field name="kv_id" ref="l10n_at_hr_payroll_private.kv_si_2203"/>
<field name="kv_gruppe_id" ref="l10n_at_hr_payroll_private.kv2203_grp_ii"/>
<field name="erfahrungsstufe">1</field>
<field name="resource_calendar_id" ref="demo_calendar"/>
<field name="l10n_at_lehrling" eval="True"/>
<field name="l10n_at_abfertigung_neu" eval="True"/>
</record>
</data>
</odoo>
@@ -0,0 +1,199 @@
# Benutzerhandbuch — AT-Payroll (Privatwirtschaft)
## Übersicht
Dieses Modul ermöglicht die vollständige monatliche Lohnverrechnung für
die österreichische Privatwirtschaft nach Kollektivvertrag (KV) auf
Basis von Odoo 19. Es deckt ab:
| Baustein | Funktion |
|---|---|
| Entgelt (GP2) | KV-Gehalt, AZG-Zuschläge (ÜStd, Nacht, So/Fei, Mehrarbeit), Urlaubsentgelt, 13./14. Bezug |
| Lohnsteuer (GP3) | § 66 kumulativ, § 67 Sechstel/Fixsätze, § 68-Steuerfreiheiten |
| SV/DB (GP4) | ÖGK-Beitragssätze, Geringfügigkeit, § 49-Freibeträge, FLAF, KommSt, DZ |
| Abfertigung Neu (GP5) | BMSVG 1,53 %, Anwartschaft, Endabrechnung |
| FI-Buchung (GP6) | UGB-Konten (KFS/BW 6), Journal SLR |
| Meldewesen (GP7) | mBGM/JASV, Versichertenmeldung, Lohnzettel L16, Arbeitsstättenmeldung |
| Belege (GP7) | Lohnzettel AT, Monatsdienstliste, Monatsjournal |
| Jahreswechsel (GP8) | Fristenkalender, Kontrollsechstel, §-77-Aufrollung |
---
## 1. Stammdaten anlegen
### 1.1 Unternehmen (Company)
Öffnen Sie **Einstellungen → Unternehmen** und wählen Sie Ihr
Unternehmen. Im Reiter **„Lohnverrechnung (AT)"** pflegen Sie:
| Feld | Beschreibung | Pflicht |
|---|---|---|
| Beitragskontonummer (BKNR) | 10-stellige eSV-Nummer (z. B. 1412345678) | Ja — ohne sie brechen alle Meldewesen-Läufe ab |
| Lohnsteuernummer | 9-stellig: 2 Stellen Finanzamt + 7 Stellen Steuernummer | Ja — für L16 |
| Bundesland | Betriebsstätten-Bundesland (steuert DZ-Satz) | Empfohlen |
| WKO-Mitglied | Aktivieren, wenn Ihr Unternehmen WKO-Mitglied ist (DZ-Pflicht) | Optional |
### 1.2 Mitarbeiter:in
Öffnen Sie **Personal → Mitarbeiter:innen** und legen Sie eine:n
Mitarbeiter:in an. Im Payroll-Bereich des Formulars:
1. **KV-Einstufung**: Wählen Sie den Kollektivvertrag, die
Verwendungsgruppe und die Erfahrungsstufe
2. **SV-Stichtage & Status** (GP8): Setzen Sie bei Bedarf
Satzausschaltungen (ALV ab 63, UV ab 60, PV-Bonusphase) und
Status-Flags (Lehrling, fallweise, Familienabsetzbetrag)
3. **Abfertigung Neu** (GP5): Standardmäßig aktiviert (BMSVG);
wählen Sie die MV-Kasse und pflegen Sie ggf. Erträge aus dem
Kassen-Auszug
4. **All-in** (§ 2g AVRAG): Bei All-in-Verträgen die
Überstundenpauschale und den ausgewiesenen Grundlohn eintragen
5. **Versicherungsnummer (ssnid)**: 10-stellig, Format LLLPTTMMJJ
**Pflicht für alle Meldewesen-Läufe**
### 1.3 Versichertenmeldung (Anmeldung)
Bei Eintritt eines:r neuen Mitarbeiter:in:
1. Öffnen Sie **Meldewesen → Versichertenmeldung**
2. Klicken Sie auf **„Meldungen erzeugen (Datei)"**
3. Der Wizard erkennt offene Anmeldungen automatisch (Event-
Erkennung über die Meldungs-Registry) und erzeugt die ELDA-Datei
4. Übertragen Sie die Datei über das ELDA-Portal des Mandanten
---
## 2. Monatsabrechnung
### 2.1 Lohnlauf erstellen
1. Öffnen Sie **Payroll → Lohnläufe** und erstellen Sie einen Lauf
für den Abrechnungsmonat
2. Fügen Sie die Mitarbeiter:innen hinzu (oder nutzen Sie den
Batch-Modus für alle aktiven AN)
3. Klicken Sie auf **„Abrechnen"** — die Engine berechnet:
- KV-Grundentgelt (Katalog oder Überzahlung)
- AZG-Zuschläge (aus Work-Entries/Zeiterfassung)
- Sonderzahlungen B13 (13. Bezug, z. B. November) und B14
(14. Bezug, bei Urlaubsantritt oder Austritt)
- Lohnsteuer (§ 66 kumulativ, § 67 Sechstel/Fixsätze)
- SV-Beiträge (ÖGK DN+DG, historisch versioniert je Beitragsmonat)
- Lohnnebenkosten (FLAF-DB, KommSt, DZ)
- BV-Beitrag (1,53 % Abfertigung Neu)
4. Prüfen Sie das **Netto** und bestätigen Sie den Lauf
### 2.2 FI-Buchung
Nach Bestätigung des Laufes bucht Odoo automatisch auf die
UGB-Konten (KFS/BW 6). Prüfen Sie:
- **Aufwand**: Gehälter (6200/6000), SV-DG (6560/6500), BV (6440),
KommSt (6660), FLAF (6661), DZ (6662)
- **Verbindlichkeiten**: SV (3600), LSt (3540), FLAF (3541),
KommSt (3550), DZ (3542)
- **Netto**: Lohnverbindlichkeit (3850)
---
## 3. Meldewesen (monatlich)
### 3.1 mBGM/JASV (SV-Meldung)
**Frist: 15. des Folgemonats** (Gutschriftprinzip)
1. Öffnen Sie **Meldewesen → mBGM (JASV)**
2. Erstellen Sie einen Eintrag für den Beitragsmonat
3. Klicken Sie auf **„Lauf erzeugen (Datei)"**
4. Der Wizard prüft: BKNR vorhanden, VSNR je AN valide, Tarifsätze
parametrisiert (fehlende BSGR → listenweiser Abbruch)
5. Laden Sie die Datei ins ELDA-Portal hoch
### 3.2 Versichertenmeldung (bei Ein-/Austritt)
- **Anmeldung (M3)**: vor Arbeitsantritt — wird automatisch erkannt
- **Abmeldung (M4)**: innerhalb von 7 Kalendertagen nach
Beschäftigungsende
- **Fallweise (MA)**: je Beschäftigungstag vor Arbeitsantritt
### 3.3 Lohnzettel L16 (jährlich)
**Frist: Ende Februar des Folgejahres** (via ELDA)
1. Öffnen Sie **Meldewesen → Lohnzettel Finanz (L16)**
2. Erstellen Sie einen Eintrag für das Abrechnungsjahr
3. Klicken Sie auf **„Lauf erzeugen (Dateien)"**
4. Es werden **zwei Dateien** erzeugt:
- `l16_<Jahr>_<BKNR>.txt` — der Lohnzettel (BEST LF)
- `arbeitsstaette_<Jahr>.txt` — die Arbeitsstättenmeldung (BEST AD)
5. Beide Dateien werden über ELDA übertragen
---
## 4. Belege drucken
| Beleg | Druckort | Inhalt |
|---|---|---|
| **Lohnzettel (AT)** | Lohnabrechnung → Drucken | Bezüge, Abzüge, DG-Anteile, Netto |
| **Monatsdienstliste** | Lohnlauf → Drucken | mBGM-Kontrollgrößen je AN |
| **Monatsjournal** | Lohnlauf → Drucken | Lohnart-Summen je Lauf |
| **All-in-Deckungsrechnung** | Lohnabrechnung → Drucken | Pauschale vs. Bezüge |
| **DAG-Ausweis** | Lohnlauf → Drucken | § 1 DAG (geringfügig Beschäftigte) |
---
## 5. Fristenkalender
Öffnen Sie **Meldewesen → Fristenkalender**. Der Kalender zeigt:
- **Monatliche Fristen**: SV 15., DB/DZ/KommSt 15. des Folgemonats
- **Jahresfristen**: L16/Arbeitsstätte/§-109a Ende Februar,
KommSt-Jahreserklärung Ende März
Fristen werden automatisch per Cron erzeugt (monatlich am 1.).
Überfällige Fristen werden rot markiert. Klicken Sie auf den
Pfeil-Button, um direkt zur zugehörigen Deklaration zu springen.
---
## 6. Jahreswechsel
### 6.1 KV-Runde
1. Neue KV-Gehaltstabellen über den **KV-Katalog-Import** eingeben
(Paste oder CSV)
2. Neue `gueltig_ab`-Versionen werden automatisch angelegt;
historische Werte bleiben unberührt
### 6.2 LSt/SV-Parameterpflege
1. Neue Jahreswerte in `rule_parameters_<jahr>.xml` nachpflegen
(Beschaffung: „Beitragsrechtliche Werte" von
sozialversicherung.at; LSt-Tarif vom BMF)
2. Beispiel 2027: `data/rule_parameters_2027.xml` enthält
bereits die Struktur
### 6.3 Kontrollsechstel-Prüfung
1. Öffnen Sie **Meldewesen → Jahres-Retro-/Aufrollungslauf**
2. Wählen Sie das Jahr und klicken Sie auf **„Jahresdaten prüfen"**
3. Der Wizard zeigt je AN den §-67-Überhang und ob die
Günstig-Aufrollung (Tarif statt Fixsätze) günstiger wäre
---
## 7. BV-Endabrechnung (Austritt)
Bei Austritt eines:r im BMSVG-Systems verbleibenden AN:
1. Öffnen Sie **Abfertigung Neu → BV-Endabrechnung (Austritt)**
2. Wählen Sie den:die Mitarbeiter:in und die Beendigungsart
3. Der Wizard prüft: 36 Beitragsmonate? § 14 Abs 2-Matrix
(AN-Kündigung, verschuldete Entlassung, unberechtigter Austritt)
4. Zeigt Anwartschaft (Beiträge + Erträge) und Fristen
---
## Support
Bei Fragen wenden Sie sich an Ihren Lohnverrechnungs-Dienstleister.
Technische Dokumentation: `README.md` und `docs/` im Modul.
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- GP9: Multi-Company-Record-Rules für privatwirtschaftliche -->
<!-- Modelle (mBGM, Versichertenmeldung). -->
<record id="rule_mbgm_company" model="ir.rule">
<field name="name">mBGM: eigene Company</field>
<field name="model_id" ref="model_l10n_at_payroll_mbgm"/>
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
<field name="groups"
eval="[(4, ref('hr_payroll.group_hr_payroll_user'))]"/>
</record>
<record id="rule_mbgm_line_company" model="ir.rule">
<field name="name">mBGM-Zeile: eigene Company</field>
<field name="model_id" ref="model_l10n_at_payroll_mbgm_line"/>
<field name="domain_force">[('mbgm_id.company_id', 'in', company_ids)]</field>
<field name="groups"
eval="[(4, ref('hr_payroll.group_hr_payroll_user'))]"/>
</record>
<record id="rule_vr_company" model="ir.rule">
<field name="name">VR: eigene Company</field>
<field name="model_id" ref="model_l10n_at_payroll_vr"/>
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
<field name="groups"
eval="[(4, ref('hr_payroll.group_hr_payroll_user'))]"/>
</record>
<record id="rule_vr_event_company" model="ir.rule">
<field name="name">VR-Event: eigene Company</field>
<field name="model_id" ref="model_l10n_at_payroll_vr_event"/>
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
<field name="groups"
eval="[(4, ref('hr_payroll.group_hr_payroll_user'))]"/>
</record>
</odoo>
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- GP9: Mitarbeiter-Formularvervollständigung — -->
<!-- l10n_at_fallweise (GP7-Kernfeld) + All-in-Felder (GP2). -->
<!-- hr.version-Felder sind über _inherits automatisch zugänglich. -->
<!-- ============================================================ -->
<record id="hr_employee_view_form_fallweise_allin" model="ir.ui.view">
<field name="name">hr.employee.form.l10n_at_fallweise_allin</field>
<field name="model">hr.employee</field>
<field name="inherit_id"
ref="l10n_at_hr_payroll_private.hr_employee_view_form_stichtage"/>
<field name="arch" type="xml">
<group name="stichtage" position="after">
<group name="allin" string="All-in (§ 2g AVRAG)"
groups="hr_payroll.group_hr_payroll_user">
<group>
<field name="l10n_at_ue_pauschale_monatlich"/>
<field name="l10n_at_grundlohn_ausweis"/>
</group>
</group>
</group>
</field>
</record>
<!-- NSchAB (GP6-Company-Flag) am Lohnverrechnungs-Reiter -->
<record id="res_company_view_form_l10n_at_nschab" model="ir.ui.view">
<field name="name">res.company.form.l10n.at.nschab</field>
<field name="model">res.company</field>
<field name="inherit_id"
ref="l10n_at_hr_payroll.res_company_view_form_l10n_at"/>
<field name="arch" type="xml">
<group name="l10n_at_abgaben" position="inside">
<field name="l10n_at_nschab"/>
</group>
</field>
</record>
</odoo>