[MOV] l10n_at_gemeinde_payroll: extract SV/TASY core into l10n_at_hr_payroll

This commit is contained in:
2026-09-09 13:42:58 +02:00
parent 64197a167e
commit 85b9536d1a
14 changed files with 128 additions and 84 deletions
+27 -34
View File
@@ -1,7 +1,7 @@
# Part of the gem360 onboarding. See LICENSE / project docs for details. # Part of the odoo-at-payroll project. License: LGPL-3.
{ {
'name': 'Österreich - Gemeinde-Personalverrechnung (Bgld. GemBG)', 'name': 'Österreich - Gemeinde-Personalverrechnung (Bgld. GemBG)',
'version': '19.0.1.3.0', 'version': '19.0.1.4.0',
'author': 'ixsol / gem360', 'author': 'ixsol / gem360',
'website': 'https://gem360.at', 'website': 'https://gem360.at',
'category': 'Human Resources/Payroll', 'category': 'Human Resources/Payroll',
@@ -11,54 +11,47 @@ Gemeinde-Personalverrechnung für österreichische Gemeinden
Monatsverrechnung für Bedienstete burgenländischer Gemeinden auf der Monatsverrechnung für Bedienstete burgenländischer Gemeinden auf der
Odoo-19 ``hr_payroll``-Engine gemäß **Burgenländischem Odoo-19 ``hr_payroll``-Engine gemäß **Burgenländischem
Gemeindebedienstetengesetz 2014** (LGBl. Nr. 42/2014): Gemeindebedienstetengesetz 2014** (LGBl. Nr. 42/2014).
- privatrechtliche Dienstverhältnisse (keine Beamten, kein Der sektor-neutrale Bundes-Kern (SV-Werte, später Lohnsteuer und
Kollektivvertrag) — Entlohnungsgruppen/-stufen, Besoldungsdienstalter Meldewesen) liegt im Modul ``l10n_at_hr_payroll`` und wird hier
konsumiert. Dieses Modul enthält die GemBG-Fachlogik:
- **AP1 Katalogmodell:** Entlohnungsgruppen/-stufen, Besoldungsdienstalter
und Vorrückungen nach dem IVa. Hauptstück (§§ 132 ff, ab 1. 1. 2021), und Vorrückungen nach dem IVa. Hauptstück (§§ 132 ff, ab 1. 1. 2021),
Werte aus den jährlichen Bgld. Bezügeanpassungs-Sammelgesetzen; Werte aus den jährlichen Bgld. Bezügeanpassungs-Sammelgesetzen (Seed
- quartalsweise Sonderzahlung (50 % je Kalendervierteljahr), Zulagen 2026: 35 Gruppen, 433 Werte), Vorrückungs-Wizard (§ 66 Abs 2);
(u. a. Kinderzulage, Funktions-, Erschwernis-, Journaldienst-), - **AP2 Entgelt-Engine:** Structure „Gemeindebedienstete (Bgld. GemBG
Über-/Mehrdienstleistung, Jubiläumszuwendung, Teilzeit; 2014)" mit Regeln für Monatsentgelt (inkl. Ausbildungsphase/Teilzeit),
- Lohnsteuer (§ 33/§ 68 EStG), SV-Beiträge und öffentlicher Kinderzulage (§ 61, bei Teilzeit ungekürzt), Funktionszulage (§ 62),
FLAF-Dienstgeberbeitrag (ASVG), Geringfügigkeit; Über-/Mehrdienstleistung (§ 76, Tag/Nacht), Journaldienst (§ 79),
- Melde-Dateien L16 (FinanzOnline) und eSV/ELDA-XML (Übertragung beim Sonn-/Feiertag (§ 78), Bereitschaft (§ 80), Erschwernis (§ 83),
Kunden/Steuerberater); Jubiläum (§ 89), Fahrtkosten (§ 88), quartalsweise Sonderzahlung
- FI-Buchung auf den VRV-2015-Kontenplan (Anlage 3b) mit Ansatz-/MVAG- (§ 133n) und Netto-Summe.
Attribution über ``l10n_at_vrv2015``.
Lohnsteuer (AP3), SV-Abzüge/DG-Beiträge als Regeln (AP4), Meldewesen
(AP5), Belege (AP6) folgen dem freigegebenen Implementierungsplan; die
FI-Buchung auf den VRV-2015-Kontenplan (Anlage 3b) mit Ansatz-/MVAG-
Attribution läuft über die Brücke ``l10n_at_gemeinde_payroll_vrv`` im
gem360-Repo (AP7).
Mehr-Bundesland-Architektur: Landes-Kataloge und landesspezifische Mehr-Bundesland-Architektur: Landes-Kataloge und landesspezifische
Regeln sind von Anfang an getrennt (Burgenland zuerst). Regeln sind von Anfang an getrennt (Burgenland zuerst).
**Status:** AP1 (Katalogmodell) und SV-Wertelayer (AP4-Basis, TASY) implementiert: Grundlagen: ``personalverrechnung/`` (PLAN-payroll-bgld.md,
Entlohnungsgruppen/-stufen mit Jahresversionierung aus den Bezüge- RECHTSQUELLEN-Bgld.md, IMPLEMENTIERUNGSPLAN-Bgld.md,
anpassungs-Tabellen (Seed 2026: 35 Gruppen, 433 Werte), GemBG-Felder auf PLAN-repo-split.md) und der ``payroll``-Agent-Skill.
der Payroll-Version (Entlohnungsgruppe, Stufe, Besoldungsdienstalter,
Vorrückungstermin nach § 66 Abs 2) mit Vorrückungs-Wizard; SV-Werte 2026
als ``hr.rule.parameter``-Seed (aus ÖGK TASY-LSWH-Export generiert und
gegen den offiziellen SV-Werte-Report gespiegelt) inkl. deklarativer
TASY-Mapping-Tabelle und Import-Wizard (Preview, Sprungwarnung,
explizite Bestätigung, versionierte Werte). Strukturen, Regeln,
Meldewesen und VRV-Buchung folgen dem freigegebenen Implementierungsplan —
Grundlagen: ``personalverrechnung/PLAN-payroll-bgld.md``,
``personalverrechnung/RECHTSQUELLEN-Bgld.md``,
``personalverrechnung/IMPLEMENTIERUNGSPLAN-Bgld.md``,
``personalverrechnung/PLAN-TASY-SV-Import.md`` und der
``payroll``-Agent-Skill.
""", """,
'depends': ['hr_payroll', 'hr_payroll_account', 'l10n_at_vrv2015'], 'depends': ['l10n_at_hr_payroll', 'hr_payroll', 'hr_payroll_account'],
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'data/gemeinde.payroll.entlohnungsgruppe.csv', 'data/gemeinde.payroll.entlohnungsgruppe.csv',
'data/gemeinde.payroll.entlohnungsstufe.csv', 'data/gemeinde.payroll.entlohnungsstufe.csv',
'data/rule_parameters_2026.xml',
'data/rule_parameters_entgelt.xml', 'data/rule_parameters_entgelt.xml',
'data/tasy_mapping.xml',
'data/payroll_structure_bgld.xml', 'data/payroll_structure_bgld.xml',
'data/salary_rules_bgld_entgelt.xml', 'data/salary_rules_bgld_entgelt.xml',
'views/entlohnung_views.xml', 'views/entlohnung_views.xml',
'views/hr_version_bgld_views.xml', 'views/hr_version_bgld_views.xml',
'views/tasy_views.xml',
], ],
'countries': ['at'], 'countries': ['at'],
'license': 'LGPL-3', 'license': 'LGPL-3',
@@ -2,4 +2,3 @@
from . import entlohnung from . import entlohnung
from . import hr_version_bgld from . import hr_version_bgld
from . import hr_version_entgelt from . import hr_version_entgelt
from . import tasy
@@ -3,7 +3,3 @@ access_gemeinde_payroll_entlohnungsgruppe_user,Gemeinde Payroll Entlohnungsgrupp
access_gemeinde_payroll_entlohnungsgruppe_manager,Gemeinde Payroll Entlohnungsgruppe Manager,model_gemeinde_payroll_entlohnungsgruppe,hr_payroll.group_hr_payroll_manager,1,1,1,1 access_gemeinde_payroll_entlohnungsgruppe_manager,Gemeinde Payroll Entlohnungsgruppe Manager,model_gemeinde_payroll_entlohnungsgruppe,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_gemeinde_payroll_entlohnungsstufe_user,Gemeinde Payroll Entlohnungsstufe User,model_gemeinde_payroll_entlohnungsstufe,hr_payroll.group_hr_payroll_user,1,0,0,0 access_gemeinde_payroll_entlohnungsstufe_user,Gemeinde Payroll Entlohnungsstufe User,model_gemeinde_payroll_entlohnungsstufe,hr_payroll.group_hr_payroll_user,1,0,0,0
access_gemeinde_payroll_entlohnungsstufe_manager,Gemeinde Payroll Entlohnungsstufe Manager,model_gemeinde_payroll_entlohnungsstufe,hr_payroll.group_hr_payroll_manager,1,1,1,1 access_gemeinde_payroll_entlohnungsstufe_manager,Gemeinde Payroll Entlohnungsstufe Manager,model_gemeinde_payroll_entlohnungsstufe,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_gemeinde_payroll_tasy_mapping_user,Gemeinde Payroll TASY-Mapping User,model_gemeinde_payroll_tasy_mapping,hr_payroll.group_hr_payroll_user,1,0,0,0
access_gemeinde_payroll_tasy_mapping_manager,Gemeinde Payroll TASY-Mapping Manager,model_gemeinde_payroll_tasy_mapping,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_gemeinde_payroll_tasy_import_wizard,Gemeinde Payroll TASY-Import Wizard,model_gemeinde_payroll_tasy_import_wizard,hr_payroll.group_hr_payroll_user,1,1,1,1
access_gemeinde_payroll_tasy_import_line,Gemeinde Payroll TASY-Import Line,model_gemeinde_payroll_tasy_import_line,hr_payroll.group_hr_payroll_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
3 access_gemeinde_payroll_entlohnungsgruppe_manager Gemeinde Payroll Entlohnungsgruppe Manager model_gemeinde_payroll_entlohnungsgruppe hr_payroll.group_hr_payroll_manager 1 1 1 1
4 access_gemeinde_payroll_entlohnungsstufe_user Gemeinde Payroll Entlohnungsstufe User model_gemeinde_payroll_entlohnungsstufe hr_payroll.group_hr_payroll_user 1 0 0 0
5 access_gemeinde_payroll_entlohnungsstufe_manager Gemeinde Payroll Entlohnungsstufe Manager model_gemeinde_payroll_entlohnungsstufe hr_payroll.group_hr_payroll_manager 1 1 1 1
access_gemeinde_payroll_tasy_mapping_user Gemeinde Payroll TASY-Mapping User model_gemeinde_payroll_tasy_mapping hr_payroll.group_hr_payroll_user 1 0 0 0
access_gemeinde_payroll_tasy_mapping_manager Gemeinde Payroll TASY-Mapping Manager model_gemeinde_payroll_tasy_mapping hr_payroll.group_hr_payroll_manager 1 1 1 1
access_gemeinde_payroll_tasy_import_wizard Gemeinde Payroll TASY-Import Wizard model_gemeinde_payroll_tasy_import_wizard hr_payroll.group_hr_payroll_user 1 1 1 1
access_gemeinde_payroll_tasy_import_line Gemeinde Payroll TASY-Import Line model_gemeinde_payroll_tasy_import_line hr_payroll.group_hr_payroll_user 1 1 1 1
@@ -1,4 +1,3 @@
# Part of the gem360 onboarding. See LICENSE / project docs for details. # Part of the gem360 onboarding. See LICENSE / project docs for details.
from . import test_katalog from . import test_katalog
from . import test_tasy_import
from . import test_entgelt from . import test_entgelt
+2
View File
@@ -0,0 +1,2 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import models
+41
View File
@@ -0,0 +1,41 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
{
'name': 'Österreich - Personalverrechnung Kern (AT Payroll Core)',
'version': '19.0.1.0.0',
'author': 'ixsol',
'website': 'https://gem360.at',
'category': 'Human Resources/Payroll',
'description': """
Österreichischer Personalverrechnungs-Kern
==========================================
Sektor-neutraler Bundes-Kern der österreichischen Personalverrechnung
auf der Odoo-19 ``hr_payroll``-Engine. Wird konsumiert von
``l10n_at_gemeinde_payroll`` (Bgld. GemBG) und später vom General-AT-
Produkt (``l10n_at_hr_payroll_private``). Grundlagen: ``personalverrechnung/``
(PLAN-payroll-bgld.md, RECHTSQUELLEN-Bgld.md, PLAN-repo-split.md).
- SV-Werte 2026 als ``hr.rule.parameter``-Seed (aus ÖGK TASY-LSWH-Export
generiert und gegen den offiziellen SV-Werte-Report gespiegelt):
KV/PV/UV/AV/AK/WF/BV/IESG-Beitragssätze, Geringfügigkeitsgrenze,
Höchstbeitragsgrundlagen (monatlich/SZ), AV-Staffel § 2a AMPFG;
- deklarative TASY-Mapping-Tabelle und Import-Wizard (Preview,
Sprungwarnung > 10 %, explizite Bestätigung, versionierte Werte);
- folgen nach Freigabe der Bgld.-APs: Lohnsteuer (§ 33/§ 68 EStG, AP3),
Meldewesen (L16/FinanzOnline, eSV/ELDA, AP5), Belege (AP6).
Kein VRV-Bezug: die Gemeinde-Buchhaltung (Anlage 3b, Ansatz/MVAG) läuft
über die Brücke ``l10n_at_gemeinde_payroll_vrv`` im gem360-Repo (AP7).
""",
'depends': ['hr_payroll'],
'data': [
'security/ir.model.access.csv',
'data/rule_parameters_2026.xml',
'data/tasy_mapping.xml',
'views/tasy_views.xml',
],
'countries': ['at'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
}
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<!-- Beitragsbemessungsbeträge (Cent-Werte, TASY-LSWH) --> <!-- Beitragsbemessungsbeträge (Cent-Werte, TASY-LSWH) -->
<record id="tasy_mapping_gfg" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_gfg" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">bbb</field> <field name="tasy_art">bbb</field>
<field name="tasy_code">GFGBTG</field> <field name="tasy_code">GFGBTG</field>
<field name="parameter_code">at_sv_gfg_monatlich</field> <field name="parameter_code">at_sv_gfg_monatlich</field>
<field name="cent_werte" eval="True"/> <field name="cent_werte" eval="True"/>
<field name="faktor">1.0</field> <field name="faktor">1.0</field>
</record> </record>
<record id="tasy_mapping_hbg_mon" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_hbg_mon" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">bbb</field> <field name="tasy_art">bbb</field>
<field name="tasy_code">HBGALLG</field> <field name="tasy_code">HBGALLG</field>
<field name="parameter_code">at_sv_hbg_monatlich</field> <field name="parameter_code">at_sv_hbg_monatlich</field>
<field name="cent_werte" eval="True"/> <field name="cent_werte" eval="True"/>
<field name="faktor">30</field> <field name="faktor">30</field>
</record> </record>
<record id="tasy_mapping_hbg_sz" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_hbg_sz" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">bbb</field> <field name="tasy_art">bbb</field>
<field name="tasy_code">HBGSZ</field> <field name="tasy_code">HBGSZ</field>
<field name="parameter_code">at_sv_hbg_sz_jaehrlich</field> <field name="parameter_code">at_sv_hbg_sz_jaehrlich</field>
@@ -24,42 +24,42 @@
</record> </record>
<!-- Tarifzweige (Beitragssätze; _dn/_dg wird angehängt) --> <!-- Tarifzweige (Beitragssätze; _dn/_dg wird angehängt) -->
<record id="tasy_mapping_kv" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_kv" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">KV</field> <field name="tasy_code">KV</field>
<field name="parameter_code">at_sv_kv</field> <field name="parameter_code">at_sv_kv</field>
</record> </record>
<record id="tasy_mapping_pv" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_pv" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">PV</field> <field name="tasy_code">PV</field>
<field name="parameter_code">at_sv_pv</field> <field name="parameter_code">at_sv_pv</field>
</record> </record>
<record id="tasy_mapping_av" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_av" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">AV</field> <field name="tasy_code">AV</field>
<field name="parameter_code">at_sv_av</field> <field name="parameter_code">at_sv_av</field>
</record> </record>
<record id="tasy_mapping_uv" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_uv" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">UV</field> <field name="tasy_code">UV</field>
<field name="parameter_code">at_sv_uv</field> <field name="parameter_code">at_sv_uv</field>
</record> </record>
<record id="tasy_mapping_iesg" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_iesg" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">IE</field> <field name="tasy_code">IE</field>
<field name="parameter_code">at_sv_iesg</field> <field name="parameter_code">at_sv_iesg</field>
</record> </record>
<record id="tasy_mapping_bv" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_bv" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">BV</field> <field name="tasy_code">BV</field>
<field name="parameter_code">at_sv_bv</field> <field name="parameter_code">at_sv_bv</field>
</record> </record>
<record id="tasy_mapping_ak" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_ak" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">AK</field> <field name="tasy_code">AK</field>
<field name="parameter_code">at_sv_ak</field> <field name="parameter_code">at_sv_ak</field>
</record> </record>
<record id="tasy_mapping_wf" model="gemeinde.payroll.tasy.mapping"> <record id="tasy_mapping_wf" model="l10n.at.payroll.tasy.mapping">
<field name="tasy_art">zweig</field> <field name="tasy_art">zweig</field>
<field name="tasy_code">WF</field> <field name="tasy_code">WF</field>
<field name="parameter_code">at_sv_wf</field> <field name="parameter_code">at_sv_wf</field>
@@ -0,0 +1,2 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import tasy
@@ -1,11 +1,11 @@
# Part of the gem360 onboarding. See LICENSE / project docs for details. # Part of the odoo-at-payroll project. License: LGPL-3.
from lxml import etree from lxml import etree
from odoo import _, api, fields, models from odoo import _, api, fields, models
from odoo.exceptions import UserError from odoo.exceptions import UserError
class GemeindePayrollTasyMapping(models.Model): class L10nAtPayrollTasyMapping(models.Model):
"""Mapping TASY-Code/-Zweig -> SV-Regelparameter (hr.rule.parameter). """Mapping TASY-Code/-Zweig -> SV-Regelparameter (hr.rule.parameter).
Hält die Zuordnung deklarativ (data XML), damit der TASY-Import ohne Hält die Zuordnung deklarativ (data XML), damit der TASY-Import ohne
@@ -13,7 +13,7 @@ class GemeindePayrollTasyMapping(models.Model):
(z. B. BVAEB) erweiterbar bleibt. Für Tarifzweige wird an den (z. B. BVAEB) erweiterbar bleibt. Für Tarifzweige wird an den
Parameter-Code ``_dn``/``_dg`` angehängt. Parameter-Code ``_dn``/``_dg`` angehängt.
""" """
_name = 'gemeinde.payroll.tasy.mapping' _name = 'l10n.at.payroll.tasy.mapping'
_description = 'TASY-Mapping (SV-Regelparameter)' _description = 'TASY-Mapping (SV-Regelparameter)'
_order = 'tasy_art, tasy_code' _order = 'tasy_art, tasy_code'
@@ -49,12 +49,12 @@ class GemeindePayrollTasyMapping(models.Model):
f" ({art})" if art else mapping.tasy_code) f" ({art})" if art else mapping.tasy_code)
class GemeindePayrollTasyImportLine(models.TransientModel): class L10nAtPayrollTasyImportLine(models.TransientModel):
_name = 'gemeinde.payroll.tasy.import.line' _name = 'l10n.at.payroll.tasy.import.line'
_description = 'TASY-Import: Vorschauzeile' _description = 'TASY-Import: Vorschauzeile'
wizard_id = fields.Many2one( wizard_id = fields.Many2one(
'gemeinde.payroll.tasy.import.wizard', required=True, ondelete='cascade') 'l10n.at.payroll.tasy.import.wizard', required=True, ondelete='cascade')
parameter_code = fields.Char(required=True) parameter_code = fields.Char(required=True)
name = fields.Char() name = fields.Char()
alter_wert = fields.Char(string='Alter Wert', readonly=True) alter_wert = fields.Char(string='Alter Wert', readonly=True)
@@ -66,7 +66,7 @@ class GemeindePayrollTasyImportLine(models.TransientModel):
"Warnzeilen werden nie automatisch übernommen.") "Warnzeilen werden nie automatisch übernommen.")
class GemeindePayrollTasyImportWizard(models.TransientModel): class L10nAtPayrollTasyImportWizard(models.TransientModel):
"""Lädt einen jährlichen ÖGK TASY-LSWH-Export und schreibt nach """Lädt einen jährlichen ÖGK TASY-LSWH-Export und schreibt nach
expliziter Bestätigung SV-Werte als hr.rule.parameter-Werte expliziter Bestätigung SV-Werte als hr.rule.parameter-Werte
(Versionierung über date_from, historische Werte bleiben erhalten). (Versionierung über date_from, historische Werte bleiben erhalten).
@@ -79,7 +79,7 @@ class GemeindePayrollTasyImportWizard(models.TransientModel):
freie-Dienstnehmer-Varianten (nur DN) verlieren. Mehrdeutige freie-Dienstnehmer-Varianten (nur DN) verlieren. Mehrdeutige
Auflösungen erzeugen Warnzeilen ohne automatische Übernahme. Auflösungen erzeugen Warnzeilen ohne automatische Übernahme.
""" """
_name = 'gemeinde.payroll.tasy.import.wizard' _name = 'l10n.at.payroll.tasy.import.wizard'
_description = 'SV-Werte aus TASY-LSWH-Export importieren' _description = 'SV-Werte aus TASY-LSWH-Export importieren'
file = fields.Binary(required=True, string='TASY-Export (XML)') file = fields.Binary(required=True, string='TASY-Export (XML)')
@@ -90,7 +90,7 @@ class GemeindePayrollTasyImportWizard(models.TransientModel):
default='B002', required=True, default='B002', required=True,
help="TASY-Code der Beschäftigtengruppe (B002 = Angestellte).") help="TASY-Code der Beschäftigtengruppe (B002 = Angestellte).")
line_ids = fields.One2many( line_ids = fields.One2many(
'gemeinde.payroll.tasy.import.line', 'wizard_id', 'l10n.at.payroll.tasy.import.line', 'wizard_id',
string='Vorschau') string='Vorschau')
protocol = fields.Text(readonly=True) protocol = fields.Text(readonly=True)
@@ -179,7 +179,7 @@ class GemeindePayrollTasyImportWizard(models.TransientModel):
parameter_obj = self.env['hr.rule.parameter'] parameter_obj = self.env['hr.rule.parameter']
bbbwerte = self._parse_bbbwerte(root) bbbwerte = self._parse_bbbwerte(root)
for mapping in self.env['gemeinde.payroll.tasy.mapping'].search( for mapping in self.env['l10n.at.payroll.tasy.mapping'].search(
[('tasy_art', '=', 'bbb')]): [('tasy_art', '=', 'bbb')]):
candidates = [w for w in bbbwerte if w['code'] == mapping.tasy_code candidates = [w for w in bbbwerte if w['code'] == mapping.tasy_code
and w['von'] <= stichtag <= w['bis']] and w['von'] <= stichtag <= w['bis']]
@@ -197,7 +197,7 @@ class GemeindePayrollTasyImportWizard(models.TransientModel):
parameter_obj, protocol)) parameter_obj, protocol))
pairs = self._resolve_zweig_pairs(root, stichtag) pairs = self._resolve_zweig_pairs(root, stichtag)
for mapping in self.env['gemeinde.payroll.tasy.mapping'].search( for mapping in self.env['l10n.at.payroll.tasy.mapping'].search(
[('tasy_art', '=', 'zweig')]): [('tasy_art', '=', 'zweig')]):
variants = pairs.get(mapping.tasy_code, {}) variants = pairs.get(mapping.tasy_code, {})
chosen = None chosen = None
@@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_l10n_at_payroll_tasy_mapping_user,L10n AT Payroll TASY-Mapping User,model_l10n_at_payroll_tasy_mapping,hr_payroll.group_hr_payroll_user,1,0,0,0
access_l10n_at_payroll_tasy_mapping_manager,L10n AT Payroll TASY-Mapping Manager,model_l10n_at_payroll_tasy_mapping,hr_payroll.group_hr_payroll_manager,1,1,1,1
access_l10n_at_payroll_tasy_import_wizard,L10n AT Payroll TASY-Import Wizard,model_l10n_at_payroll_tasy_import_wizard,hr_payroll.group_hr_payroll_user,1,1,1,1
access_l10n_at_payroll_tasy_import_line,L10n AT Payroll TASY-Import Line,model_l10n_at_payroll_tasy_import_line,hr_payroll.group_hr_payroll_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_l10n_at_payroll_tasy_mapping_user L10n AT Payroll TASY-Mapping User model_l10n_at_payroll_tasy_mapping hr_payroll.group_hr_payroll_user 1 0 0 0
3 access_l10n_at_payroll_tasy_mapping_manager L10n AT Payroll TASY-Mapping Manager model_l10n_at_payroll_tasy_mapping hr_payroll.group_hr_payroll_manager 1 1 1 1
4 access_l10n_at_payroll_tasy_import_wizard L10n AT Payroll TASY-Import Wizard model_l10n_at_payroll_tasy_import_wizard hr_payroll.group_hr_payroll_user 1 1 1 1
5 access_l10n_at_payroll_tasy_import_line L10n AT Payroll TASY-Import Line model_l10n_at_payroll_tasy_import_line hr_payroll.group_hr_payroll_user 1 1 1 1
@@ -0,0 +1,2 @@
# Part of the odoo-at-payroll project. License: LGPL-3.
from . import test_tasy_import
@@ -1,4 +1,4 @@
# Part of the gem360 onboarding. See LICENSE / project docs for details. # Part of the odoo-at-payroll project. License: LGPL-3.
import base64 import base64
from datetime import date from datetime import date
@@ -126,7 +126,7 @@ class TasyImportTest(TransactionCase):
def test_02_wizard_parse_fixture(self): def test_02_wizard_parse_fixture(self):
"""Fixture: bbb Cent-Werte + Split-Variante gewinnt über freie DN.""" """Fixture: bbb Cent-Werte + Split-Variante gewinnt über freie DN."""
wizard = self.env['gemeinde.payroll.tasy.import.wizard'].create({ wizard = self.env['l10n.at.payroll.tasy.import.wizard'].create({
'file': base64.b64encode(TASY_FIXTURE.encode()).decode(), 'file': base64.b64encode(TASY_FIXTURE.encode()).decode(),
'filename': 'fixture.xml', 'filename': 'fixture.xml',
}) })
@@ -146,7 +146,7 @@ class TasyImportTest(TransactionCase):
def test_03_wizard_apply_versions(self): def test_03_wizard_apply_versions(self):
"""Übernehmen schreibt versionierte Werte; Update am Stichtag.""" """Übernehmen schreibt versionierte Werte; Update am Stichtag."""
wizard = self.env['gemeinde.payroll.tasy.import.wizard'].create({ wizard = self.env['l10n.at.payroll.tasy.import.wizard'].create({
'file': base64.b64encode(TASY_FIXTURE.encode()).decode(), 'file': base64.b64encode(TASY_FIXTURE.encode()).decode(),
'filename': 'fixture.xml', 'filename': 'fixture.xml',
}) })
@@ -158,7 +158,7 @@ class TasyImportTest(TransactionCase):
self.assertTrue(value) self.assertTrue(value)
self.assertEqual(float(value.parameter_value), 551.10) self.assertEqual(float(value.parameter_value), 551.10)
# erneuter Import am selben Stichtag aktualisiert statt zu duplizieren # erneuter Import am selben Stichtag aktualisiert statt zu duplizieren
wizard2 = self.env['gemeinde.payroll.tasy.import.wizard'].create({ wizard2 = self.env['l10n.at.payroll.tasy.import.wizard'].create({
'file': base64.b64encode(TASY_FIXTURE.encode()).decode(), 'file': base64.b64encode(TASY_FIXTURE.encode()).decode(),
'filename': 'fixture.xml', 'filename': 'fixture.xml',
}) })
@@ -179,7 +179,7 @@ class TasyImportTest(TransactionCase):
if not os.path.exists(path): if not os.path.exists(path):
self.skipTest('TASY-Quelldatei nicht im Workingtree') self.skipTest('TASY-Quelldatei nicht im Workingtree')
with open(path, 'rb') as fh: with open(path, 'rb') as fh:
wizard = self.env['gemeinde.payroll.tasy.import.wizard'].create({ wizard = self.env['l10n.at.payroll.tasy.import.wizard'].create({
'file': base64.b64encode(fh.read()).decode(), 'file': base64.b64encode(fh.read()).decode(),
'filename': 'TASY-LSWH-Export-20260324.xml', 'filename': 'TASY-LSWH-Export-20260324.xml',
}) })
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<record id="tasy_mapping_list_view" model="ir.ui.view"> <record id="tasy_mapping_list_view" model="ir.ui.view">
<field name="name">gemeinde.payroll.tasy.mapping.list</field> <field name="name">l10n.at.payroll.tasy.mapping.list</field>
<field name="model">gemeinde.payroll.tasy.mapping</field> <field name="model">l10n.at.payroll.tasy.mapping</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<list string="TASY-Mappings"> <list string="TASY-Mappings">
<field name="tasy_art"/> <field name="tasy_art"/>
@@ -16,8 +16,8 @@
</record> </record>
<record id="tasy_mapping_form_view" model="ir.ui.view"> <record id="tasy_mapping_form_view" model="ir.ui.view">
<field name="name">gemeinde.payroll.tasy.mapping.form</field> <field name="name">l10n.at.payroll.tasy.mapping.form</field>
<field name="model">gemeinde.payroll.tasy.mapping</field> <field name="model">l10n.at.payroll.tasy.mapping</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="TASY-Mapping"> <form string="TASY-Mapping">
<sheet> <sheet>
@@ -40,13 +40,13 @@
<record id="action_tasy_mapping" model="ir.actions.act_window"> <record id="action_tasy_mapping" model="ir.actions.act_window">
<field name="name">TASY-Mappings (SV-Werte)</field> <field name="name">TASY-Mappings (SV-Werte)</field>
<field name="res_model">gemeinde.payroll.tasy.mapping</field> <field name="res_model">l10n.at.payroll.tasy.mapping</field>
<field name="view_mode">list,form</field> <field name="view_mode">list,form</field>
</record> </record>
<record id="tasy_import_wizard_form_view" model="ir.ui.view"> <record id="tasy_import_wizard_form_view" model="ir.ui.view">
<field name="name">gemeinde.payroll.tasy.import.wizard.form</field> <field name="name">l10n.at.payroll.tasy.import.wizard.form</field>
<field name="model">gemeinde.payroll.tasy.import.wizard</field> <field name="model">l10n.at.payroll.tasy.import.wizard</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="SV-Werte aus TASY-LSWH-Export importieren"> <form string="SV-Werte aus TASY-LSWH-Export importieren">
<group> <group>
@@ -89,18 +89,23 @@
<record id="action_tasy_import_wizard" model="ir.actions.act_window"> <record id="action_tasy_import_wizard" model="ir.actions.act_window">
<field name="name">SV-Werte importieren (TASY)</field> <field name="name">SV-Werte importieren (TASY)</field>
<field name="res_model">gemeinde.payroll.tasy.import.wizard</field> <field name="res_model">l10n.at.payroll.tasy.import.wizard</field>
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="target">new</field> <field name="target">new</field>
</record> </record>
<menuitem id="menu_gemeinde_payroll_tasy_mapping" <menuitem id="menu_l10n_at_payroll_root"
name="TASY-Mappings (SV-Werte)" name="AT-Payroll (Kern)"
parent="menu_gemeinde_payroll_root" parent="hr_work_entry_enterprise.menu_hr_payroll_root"
action="action_tasy_mapping" sequence="40"/> sequence="80"/>
<menuitem id="menu_gemeinde_payroll_tasy_import" <menuitem id="menu_l10n_at_payroll_tasy_mapping"
name="TASY-Mappings (SV-Werte)"
parent="menu_l10n_at_payroll_root"
action="action_tasy_mapping" sequence="10"/>
<menuitem id="menu_l10n_at_payroll_tasy_import"
name="SV-Werte importieren (TASY)" name="SV-Werte importieren (TASY)"
parent="menu_gemeinde_payroll_root" parent="menu_l10n_at_payroll_root"
action="action_tasy_import_wizard" sequence="50"/> action="action_tasy_import_wizard" sequence="20"/>
</odoo> </odoo>