mirror of
http://100.103.83.12:3003/fegger/odoo-at-payroll.git
synced 2026-09-17 08:52:45 +00:00
[IMP] l10n_at_hr_payroll_private: mBGM liest TASY-Katalog (BSGR/ERGB), AT-Abwesenheiten mit hr_holidays (AP0+AP1+AP5)
AP0 — mBGM-Tarifierung aus dem TASY-Katalog: - Katalog vor Hand-Parameter at_mbgm_tarif (quelle katalog/parameter); Company-Feld l10n_at_dienstgebergruppe (Default NBALG), Vertrags-m2m l10n_at_ergaenzung_ids; ERGB wird im T1 real belegt - BSGR-Korrektur nach TASY-Bezeichnern: Lehrlinge Arbeiter->B045 / Angestellte->B044 (invertiert bisher), geringfuegig/fallweise B010/B030 je Personalgruppe - NSchAB-Feld: Falschbezeichnung Schlechtwetter -> Nachtschwerarbeit (3,80 % = NB-Zweig DG ab 2020); Flag nur noch Parameter-Fallback - Tests: Katalog schlaegt manipulierten Parameter, ERGB-Emission, BSGR-Mapping AP1 — M4-Test auf explizit ungemappte Abgangsursache (AGRD 00-Fallback) AP5 — hr_holidays/hr_work_entry_holidays als Pflicht-Dependence: - AT-WETs ATP_URLAUB/ATP_KRANK/ATP_KARENZ (is_leave) + AT-Urlaubsarten (UrlG, Krankenstand mit Krankmeldungspflicht, unbezahlte Karenz) nach Odoo-Lokalisierungsmuster; ATP_AU (Arbeitsunfall) folgt mit AP4 - Test: validierter Krankenstand erzeugt Work Entries mit AT-WET
This commit is contained in:
@@ -9,11 +9,21 @@ Hierarchie: Paket (SART ``PS`` Selbstabrechner, Länge 305) → mBGM
|
||||
|
||||
Fachliche Grundlagen:
|
||||
- **KEIN DN/DG- oder Zweig-Split**: die Standardposition ``T01``
|
||||
trägt den GESAMT-Prozentsatz des Tarifsystems (Parameter
|
||||
``at_mbgm_tarif`` — BSGR-spezifisch; Werte aus dem ÖGK-
|
||||
Beitragstarifsystem, `.additional_docs/oegk/`, jeweils
|
||||
parametrisiert zu pflegen). Fehlende BSGR-Sätze brechen den Lauf
|
||||
trägt den GESAMT-Prozentsatz des Tarifsystems. Quelle ist der
|
||||
TASY-Katalog (AP0, Variante b): Beschäftigtengruppe + Ergänzungen
|
||||
(ERGB am Vertrag) + Dienstgebergruppe (Company) → Tarifgruppe →
|
||||
Tarifset; fehlt der Katalog, greift der Hand-Parameter
|
||||
``at_mbgm_tarif`` als Fallback (Werte aus dem ÖGK-Handbuch,
|
||||
`.additional_docs/oegk/`). Fehlende Sätze brechen den Lauf
|
||||
listenweise ab (keine Erfindung von Tarifen).
|
||||
- **BSGR** (DM-ORG D.48/TASY): B001 Arbeiter, B002 Angestellte,
|
||||
B045 Arbeiterlehrlinge, B044 Angestelltenlehrlinge, B010 gering-
|
||||
fällige Arbeiter, B030 geringfügige Angestellte — TASY-Bezeichner
|
||||
verifiziert (B044 = „Ang. Lg.“, B045 = „Arb. Lg.“).
|
||||
- **ERGB** (D.49): Ergänzungen am Vertrag (z. B. E01 Nachtschwer-
|
||||
arbeit, E02 Schlechtwetterentschädigung) werden im Tarifblock
|
||||
belegt und steuern die Tarifgruppen-Auflösung im Katalog; das
|
||||
Company-Flag ``l10n_at_nschab`` bleibt Fallback ohne Katalog.
|
||||
- **Abschläge als eigene Verrechnungspositionen** (D.60, verifiziert):
|
||||
A01/A02/A03 = Minderung AV auf 2/1/0 % (§ 2a AMPFG, DN-seitig —
|
||||
Abschlag = AB × (2,95 − Zielsatz) %), A09 = UV-Entfall ab 60
|
||||
@@ -171,27 +181,54 @@ class L10nAtPayrollMbgm(models.Model):
|
||||
('state', 'in', ('validated', 'paid'))], limit=1)
|
||||
|
||||
def _l10n_at_bsgr(self, version, slip):
|
||||
"""Beschäftigtengruppe (SV-Tarifsystem): B001 Arbeiter, B002
|
||||
Angestellte; Lehrlinge B044/B045 und geringfügig/fallweise
|
||||
(B010/B030) ohne Default-Parameter → Lauf bricht ab, bis
|
||||
`at_mbgm_tarif` gepflegt ist (Tarifsystem-Werte, keine
|
||||
Erfindung)."""
|
||||
"""Beschäftigtengruppe (SV-Tarifsystem, TASY-Bezeichner):
|
||||
B001 Arbeiter, B002 Angestellte; Lehrlinge B045
|
||||
(Arbeiterlehrlinge) / B044 (Angestelltenlehrlinge);
|
||||
geringfügig/fallweise B010 (Arbeiter) / B030 (Angestellte).
|
||||
Ohne Default-Parameter → Lauf bricht ab, bis der Katalog
|
||||
importiert oder ``at_mbgm_tarif`` gepflegt ist (Tarifsystem-
|
||||
Werte, keine Erfindung)."""
|
||||
personalgruppe = getattr(
|
||||
version, 'l10n_at_personalgruppe', '')
|
||||
if version.l10n_at_lehrling:
|
||||
return 'B044' if getattr(
|
||||
version, 'l10n_at_personalgruppe', '') == 'arbeiter' \
|
||||
else 'B045'
|
||||
return 'B045' if personalgruppe == 'arbeiter' else 'B044'
|
||||
if slip.l10n_at_geringfuegig or version.l10n_at_fallweise:
|
||||
return 'B030'
|
||||
return 'B001' if getattr(
|
||||
version, 'l10n_at_personalgruppe', '') == 'arbeiter' \
|
||||
else 'B002'
|
||||
return 'B010' if personalgruppe == 'arbeiter' else 'B030'
|
||||
return 'B001' if personalgruppe == 'arbeiter' else 'B002'
|
||||
|
||||
def _l10n_at_tarif(self, bsgr):
|
||||
def _l10n_at_tarif(self, bsgr, version=None):
|
||||
"""T01/T02-Gesamtsätze je BSGR — Katalog vor Hand-Parameter.
|
||||
|
||||
1. TASY-Katalog: Tarifgruppe aus BSGR + ERGB am Vertrag +
|
||||
Dienstgebergruppe der Company am Stichtag; Sätze = Summe
|
||||
der Tarifset-Komponenten je Verrechnungsbasis (AB/SZ).
|
||||
2. Fallback: ``at_mbgm_tarif``-Parameter (BSGR-Schlüssel).
|
||||
|
||||
Rückgabe ``{'laufend', 'sz', 'quelle'}`` oder None → Lauf
|
||||
bricht listenweise ab.
|
||||
"""
|
||||
self.ensure_one()
|
||||
ergaenzungen = version.l10n_at_ergaenzung_ids.mapped('code') \
|
||||
if version is not None else []
|
||||
dgg = self.company_id.l10n_at_dienstgebergruppe or 'NBALG'
|
||||
tarifgruppe = self.env[
|
||||
'l10n.at.payroll.tasy.tarifgruppe']._l10n_at_find(
|
||||
bsgr, ergaenzungen, dgg, self.beitragsmonat)
|
||||
if tarifgruppe:
|
||||
ab = tarifgruppe._l10n_at_saetze('AB', self.beitragsmonat)
|
||||
sz = tarifgruppe._l10n_at_saetze('SZ', self.beitragsmonat)
|
||||
if ab is None or sz is None:
|
||||
return None
|
||||
return {'laufend': ab['gesamt'], 'sz': sz['gesamt'],
|
||||
'quelle': 'katalog'}
|
||||
tarif = self.env['hr.rule.parameter']._get_parameter_from_code(
|
||||
'at_mbgm_tarif', self.beitragsmonat,
|
||||
raise_if_not_found=False) or {}
|
||||
return tarif.get(bsgr)
|
||||
eintrag = tarif.get(bsgr)
|
||||
if eintrag:
|
||||
return {'laufend': eintrag['laufend'], 'sz': eintrag['sz'],
|
||||
'quelle': 'parameter'}
|
||||
return None
|
||||
|
||||
def _l10n_at_positionen(self, slip, tarif):
|
||||
"""Verrechnungspositionen je Tarifblock: T01 (Gesamtsatz,
|
||||
@@ -202,7 +239,11 @@ class L10nAtPayrollMbgm(models.Model):
|
||||
version = slip.version_id
|
||||
ab = sum(basis for _m, basis
|
||||
in slip._l10n_at_sv_basis_laufen_monate())
|
||||
# NSchAB über das Company-Flag nur im Parameter-Fallback —
|
||||
# im Katalog-Pfad steckt der NB-Zweig über die ERGB-E01-
|
||||
# Tarifgruppe (Dienstgebergruppe NBNSA) bereits im T01.
|
||||
nschab = 3.80 if (self.company_id.l10n_at_nschab
|
||||
and tarif.get('quelle') != 'katalog'
|
||||
and not version.l10n_at_lehrling
|
||||
and getattr(version, 'l10n_at_personalgruppe',
|
||||
'') == 'arbeiter') else 0.0
|
||||
@@ -329,12 +370,12 @@ class L10nAtPayrollMbgm(models.Model):
|
||||
anzahl += 1
|
||||
continue
|
||||
bsgr = deklaration._l10n_at_bsgr(version, slip)
|
||||
tarif = deklaration._l10n_at_tarif(bsgr)
|
||||
tarif = deklaration._l10n_at_tarif(bsgr, version)
|
||||
if not tarif:
|
||||
fehler.append(
|
||||
'Mitarbeiter %s: kein Tarifsatz für BSGR '
|
||||
'%s parametrisiert (at_mbgm_tarif, Werte '
|
||||
'aus dem SV-Tarifsystem pflegen).'
|
||||
'%s (weder TASY-Katalog noch Parameter '
|
||||
'at_mbgm_tarif am Beitragsmonat).'
|
||||
% (employee.name, bsgr))
|
||||
continue
|
||||
if slip.l10n_at_geringfuegig \
|
||||
@@ -442,6 +483,12 @@ class L10nAtPayrollMbgm(models.Model):
|
||||
bezeichnung='Tarifblock %s' % employee.name)
|
||||
tarifblock.setze('SART', 'T1')
|
||||
tarifblock.setze('BSGR', bsgr)
|
||||
# ERGB (DM-ORG D.49): bis zu 5 Ergänzungen à 3 Stellen —
|
||||
# Grundstellung blank, wenn keine gepflegt (Katalog-
|
||||
# Normalfall ohne Ergänzung).
|
||||
ergaenzungen = version.l10n_at_ergaenzung_ids.mapped('code')[:5]
|
||||
if ergaenzungen:
|
||||
tarifblock.setze('ERGB', ''.join(ergaenzungen))
|
||||
tarifblock.setze('VVON', '1')
|
||||
saetze = [mbgm_satz, tarifblock]
|
||||
for code, satz_prozent, rsum, basis_typ in positionen:
|
||||
@@ -479,12 +526,39 @@ class ResCompany(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
l10n_at_nschab = fields.Boolean(
|
||||
string='AT Schlechtwetterentschädigungsbeitrag-Branche',
|
||||
help='Betrieb mit Schlechtwetterentschädigung (ÖGK-'
|
||||
'Tarifsystem „Normalbetriebe mit '
|
||||
'Schlechtwetterentschädigung“): Arbeiter (BSGR B001) '
|
||||
'erhalten im mBGM-T01 den um NSchAB 3,80 % erhöhten '
|
||||
'Gesamtsatz.')
|
||||
string='AT Nachtschwerarbeitsbeitrags-Betrieb (mBGM-Fallback)',
|
||||
help='Betrieb mit Nachtschwerarbeit (ÖGK-Tarifsystem '
|
||||
'„Normalbetriebe mit Nachtschwerarbeit“, Dienstgebergruppe '
|
||||
'NBNSA): ohne TASY-Katalog erhalten Arbeiter (BSGR B001) '
|
||||
'im mBGM-T01 den um NSchAB 3,80 % erhöhten Gesamtsatz. '
|
||||
'Mit Katalog stattdessen die Ergänzung E01 am Vertrag '
|
||||
'setzen — der NB-Zweig ist dann Teil der E01-Tarifgruppe.')
|
||||
l10n_at_dienstgebergruppe = fields.Char(
|
||||
string='AT Dienstgebergruppe (SV-Tarifsystem)',
|
||||
default='NBALG',
|
||||
help='Code der Dienstgebergruppe des TASY-Tarifsystems, z. B. '
|
||||
'NBALG „Normalbetriebe — Allgemeiner Teil“, NBNSA '
|
||||
'(Nachtschwerarbeit), NBBAU (Schlechtwetter), HAUSH '
|
||||
'(Haushalte), DGONO (ohne Niederlassung). Bestimmt mit '
|
||||
'BSGR + Ergänzungen die Tarifgruppe der mBGM-Tarifierung '
|
||||
'(AP0). Vollständige Liste: Tarifsystem-Katalog-Menü '
|
||||
'nach dem TASY-Import.')
|
||||
|
||||
|
||||
class HrVersion(models.Model):
|
||||
_inherit = 'hr.version'
|
||||
|
||||
l10n_at_ergaenzung_ids = fields.Many2many(
|
||||
'l10n.at.payroll.tasy.ergaenzung',
|
||||
'l10n_at_hr_payroll_version_ergaenzung_rel',
|
||||
'version_id', 'ergaenzung_id',
|
||||
string='AT Ergänzungen (ERGB, SV-Tarifsystem)',
|
||||
groups="hr_payroll.group_hr_payroll_user",
|
||||
help='Ergänzungen zur Beschäftigtengruppe (DM-ORG D.49) für die '
|
||||
'mBGM-Tarifierung — gemeinsam mit BSGR und Dienstgebergruppe '
|
||||
'bilden sie die Tarifgruppe. Z. B. E01 Nachtschwerarbeit, '
|
||||
'E02 Schlechtwetterentschädigung. Katalog nach dem TASY-'
|
||||
'Import; ohne Eintrag gilt der Normalfall ohne Ergänzung.')
|
||||
|
||||
|
||||
class L10nAtPayrollMbgmLine(models.Model):
|
||||
|
||||
Reference in New Issue
Block a user