[IMP] l10n_at_hr_payroll_private: Lohnpfändung — Existenzminimum § 291a EO, DN-Abzug, Kostenersatz, DSE (AP11)

Pfändungs-/Exekutionsmaschinerie nach EO §§ 291/291a/292/301/302/
292h für den Privatwirtschafts-DN (Plan:
personalverrechnung/PLAN-Restluecken-AP11.md §AP11, MVP + Kostenersatz):

- Neues Modell l10n.at.payroll.pfaendung (models/pfaendung.py):
  Gläubiger, Vollstreckungsträger, Pfändungsart, Zustellungsdatum,
  Forderungshöhe, Status aktiv/gesetzt/geloest, Verwalter
  (§ 301 Abs 1 Z 6), 4-Wochen-Zahlungssperre (§ 304),
  Kostenersatz-Variante (§ 292h), DSE-/Auszahlungsfristen (computed),
  Rang nach Einlangedatum, Constraint Löse-/Zustellungsdatum;
  hr.version: l10n_at_unterhaltspflichten (0–5) und
  l10n_at_sz_anspruch (§ 291a Abs 2 Z 1/Z 2); hr.salary.rule:
  Flags l10n_at_pfandung_unpfandbar (AP12-Schnittstelle) und
  l10n_at_pfandung_beendigung (AP14/15-Schnittstelle)
- Engine (hr.payslip): Existenzminimum-Maschine § 291a EO je Topf
  (laufend/sz13/sz14/beendigung), Pfändungsberechnungsgrundlage
  § 291 EO (laufend = Bezüge − unpfändbar − SV-DN − LSt),
  Masse, Kostenersatz § 292h (2 %/max 8 € + 1 %/max 4 €, nie vom
  Existenzminimum), Regeln PFAENDUNG (seq 75) / PFAENDUNG_SZ (seq 76);
  result_rules enthält ungerundete Rule-Summen — Lesezugänge
  runden auf Cents (Zeilenbeträge), sonst 1-Cent-Drift
- Parameter at_eo_azr (2025: 1.273,99 / 2026: 1.308,39 €) und
  at_eo_kostenersatz; DSE-Report (qweb-pdf auf hr.employee),
  Views/Menu unter Payroll-Wurzel, Security (payroll-Groups +
  Company-ir.rule)
- Rechenfälle docs/rechenfaelle/pfaendung.md (RF-PFA-1…7):
  lb-pfa-03 exakt verifiziert (33.840 € → EX 16.684 € /
  pfändbar 17.156 €); 103/103 Tests grün
- Offene Reste dokumentiert: Unterhaltsexekution 75 %/Koinzidenz,
  Vorschüsse § 290c, Sachbezüge (AP12), Beendigungs-Regeln (AP14/15),
  2027-AZR-Werte

Version 19.0.9.5.0
This commit is contained in:
2026-09-13 02:33:26 +02:00
parent c3b9d6eb8e
commit 018554b215
15 changed files with 1556 additions and 3 deletions
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP11: Lohnpfändung — AZR-Werte (ASVG § 293 Abs 1 lit a -->
<!-- sublit bb) versioniert je Gültigkeitsjahr. Die EO-§-291a- -->
<!-- Grundbeträge (allg./erhöht/Unterhalt) und die HöBG werden -->
<!-- in der Engine aus dem AZR abgeleitet (KB-KONFLIKTE A9: -->
<!-- 2025 1.273,99 € BGBl II 417/2024; 2026 1.308,39 € BGBl II -->
<!-- 263/2025). Jährliche Anpassung über die Anm.-Reihe nach- -->
<!-- führen (Wartung, s. RUNBOOK). -->
<!-- ============================================================ -->
<record id="hr_rule_parameter_at_eo_azr" model="hr.rule.parameter">
<field name="name">EO Pfändung — Ausgleichszulagenrichtsatz (AZR)</field>
<field name="code">at_eo_azr</field>
<field name="country_id" ref="base.at"/>
</record>
<record id="hr_rule_parameter_value_at_eo_azr_2025"
model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="hr_rule_parameter_at_eo_azr"/>
<field name="date_from">2025-01-01</field>
<field name="parameter_value">{'azr': 1273.99}</field>
</record>
<record id="hr_rule_parameter_value_at_eo_azr_2026"
model="hr.rule.parameter.value">
<field name="rule_parameter_id" ref="hr_rule_parameter_at_eo_azr"/>
<field name="date_from">2026-01-01</field>
<field name="parameter_value">{'azr': 1308.39}</field>
</record>
<!-- Kostenersatz für Pfändungsdurchführung (§ 292h EO) und
Drittschuldnererklärung (§ 302 EO) — pauschaliert, lb-pfa-09.
USt auf den §-302-Kostenersatz: keine (VwGH 2011/15/0181). -->
<record id="hr_rule_parameter_at_eo_kostenersatz"
model="hr.rule.parameter">
<field name="name">EO Pfändung — Kostenersatz (§ 292h/§ 302)</field>
<field name="code">at_eo_kostenersatz</field>
<field name="country_id" ref="base.at"/>
</record>
<record id="hr_rule_parameter_value_at_eo_kostenersatz"
model="hr.rule.parameter.value">
<field name="rule_parameter_id"
ref="hr_rule_parameter_at_eo_kostenersatz"/>
<field name="date_from">2017-01-01</field>
<field name="parameter_value">{'erste_rate': 2.0, 'erste_max': 8.0, 'weitere_rate': 1.0, 'weitere_max': 4.0, 'dse_normal': 35.0, 'dse_ausnahme': 25.0}</field>
</record>
</odoo>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP11: Lohnpfändung — DN-Abzug (Einbehalt) in ATP_ABZUG. -->
<!-- Reihenfolge: nach SV-DN (seq 6065) und LSt (seq 7071), -->
<!-- vor NET (seq 100) — die Pfändungsberechnungsgrundlage -->
<!-- (§ 291 EO) ist das Netto nach SV-DN/LSt (Bemessung 'neutral' -->
<!-- → kein SV-/LSt-Effekt). PFAENDUNG = laufender Topf; -->
<!-- PFAENDUNG_SZ = 13./14.-Bezug (eigener Berechnungskreis, -->
<!-- lb-pfa-05). Kostenersatz (§ 292h/§ 302) ist Teil des -->
<!-- pfändbaren Betrags (Verteilposition, keine extra Abzugs- -->
<!-- zeile — sonst Doppelabzug; s. _at_pfaendung_kostenersatz). -->
<!-- ============================================================ -->
<record id="rule_pfaendung" model="hr.salary.rule">
<field name="name">Lohnpfändung — Einbehalt (laufender Bezug, § 291a EO)</field>
<field name="code">PFAENDUNG</field>
<field name="sequence" eval="75"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python"><![CDATA[
# Einbehalt nur bei aktiver Pfändung und pfändbarem laufendem Bezug.
result = bool(payslip.employee_id._at_pfaendungen_aktiv(payslip.date_to)) \
and payslip._at_pfaendung_masse(result_rules, 'laufend') > 0
]]></field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="amount_python_compute"><![CDATA[
# Laufender Topf: Berechnungsgrundlage (Netto nach SV-DN/LSt, ohne
# unpfändbare Bezugsarten) minus Existenzminimum (§ 291a EO).
result = payslip._at_pfaendung_masse(result_rules, 'laufend')
]]></field>
</record>
<record id="rule_pfaendung_sz" model="hr.salary.rule">
<field name="name">Lohnpfändung — 13./14. Bezug (eigener Topf, § 291a EO)</field>
<field name="code">PFAENDUNG_SZ</field>
<field name="sequence" eval="76"/>
<field name="category_id" ref="l10n_at_hr_payroll_private.category_atp_abzug"/>
<field name="struct_id" ref="l10n_at_hr_payroll_private.structure_at_privat"/>
<field name="condition_select">python</field>
<field name="condition_python"><![CDATA[
# 13./14.-Bezug als eigener Pfändungsberechnungskreis (lb-pfa-05).
masse = (payslip._at_pfaendung_masse(result_rules, 'sz13')
+ payslip._at_pfaendung_masse(result_rules, 'sz14'))
result = bool(payslip.employee_id._at_pfaendungen_aktiv(payslip.date_to)) \
and masse > 0
]]></field>
<field name="amount_select">code</field>
<field name="l10n_at_bemessung">neutral</field>
<field name="amount_python_compute"><![CDATA[
# 13. und 14. Bezug je eigener Existenzminimum (allg. Grundbetrag,
# SZ = § 290b → nicht erhöht).
result = (payslip._at_pfaendung_masse(result_rules, 'sz13')
+ payslip._at_pfaendung_masse(result_rules, 'sz14'))
]]></field>
</record>
</odoo>