[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,126 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP11: Lohnpfändung/Exekution — Vormerkung (Drittschuldner). -->
<!-- ============================================================ -->
<record id="pfaendung_list_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.pfaendung.list</field>
<field name="model">l10n.at.payroll.pfaendung</field>
<field name="arch" type="xml">
<list string="Lohnpfändungen">
<field name="employee_id"/>
<field name="glaubiger"/>
<field name="pfandung_art" optional="show"/>
<field name="zustellungsdatum"/>
<field name="rang"/>
<field name="forderungshoehe"
widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="dse_frist" optional="hide"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="status" widget="badge"
decoration-success="status == 'aktiv'"
decoration-info="status == 'gesetzt'"
decoration-muted="status == 'geloest'"/>
</list>
</field>
</record>
<record id="pfaendung_form_view" model="ir.ui.view">
<field name="name">l10n.at.payroll.pfaendung.form</field>
<field name="model">l10n.at.payroll.pfaendung</field>
<field name="arch" type="xml">
<form string="Lohnpfändung / Exekution">
<header>
<button name="action_aktiv" type="object"
string="Aktivieren"
invisible="status == 'aktiv'"/>
<button name="action_gesetzt" type="object"
string="Setzen (aussetzen)"
invisible="status == 'gesetzt'"/>
<button name="action_geloest" type="object"
string="Als gelöst markieren"
class="btn-secondary"
invisible="status == 'geloest'"/>
<field name="status" widget="statusbar"
statusbar_visible="aktiv,gesetzt,geloest"/>
</header>
<sheet>
<group>
<group string="Drittschuldner / Gläubiger">
<field name="employee_id"/>
<field name="glaubiger"/>
<field name="vollstreckung_traeger"/>
<field name="pfandung_art"/>
<field name="forderungshoehe"/>
<field name="rang" readonly="1"/>
<field name="note" optional="show"/>
</group>
<group string="Fristen &amp; Ablauf">
<field name="zustellungsdatum"/>
<field name="dse_frist"/>
<field name="auszahlung_frist"/>
<field name="zahlungssperre"/>
<field name="loesungsdatum"
invisible="status != 'geloest'"/>
<field name="verwalter"/>
<field name="verwalter_name"
invisible="not verwalter"/>
<field name="kostenersatz_variante"/>
<field name="company_id"
groups="base.group_multi_company"/>
</group>
</group>
<group string="Bemerkung">
<field name="note"
nolabel="1"
placeholder="Gläubiger-Adressat, Verwalter-Kontakt, Besonderheiten der Exekutionsbewilligung …"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_pfaendung" model="ir.actions.act_window">
<field name="name">Lohnpfändungen / Exekutionen</field>
<field name="res_model">l10n.at.payroll.pfaendung</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Erste Lohnpfändung erfassen
</p>
<p>
Pfändungsvormerkung (Drittschuldner) nach Einlangen der
Exekutionsbewilligung: Gläubiger, Zustellungsdatum,
Rang, Fristen (Drittschuldnererklärung § 301 EO,
Zahlungssperre § 304 EO) und Kostenersatz (§ 292h/§ 302 EO).
</p>
</field>
</record>
<menuitem id="menu_l10n_at_payroll_pfaendung"
name="Lohnpfändung (Exekution)"
parent="hr_work_entry_enterprise.menu_hr_payroll_root"
action="action_pfaendung" sequence="40"/>
<!-- ============================================================ -->
<!-- Pfändungsrelevante Mitarbeiter-/Vertragsstammdaten -->
<!-- (Unterhaltspflichten, SZ-Anspruch) am Payroll-Gruppenblock. -->
<!-- ============================================================ -->
<record id="payroll_hr_employee_view_form_pfaendung" model="ir.ui.view">
<field name="name">hr.employee.form.pfaendung</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr_payroll.payroll_hr_employee_view_form"/>
<field name="arch" type="xml">
<group name="payroll_group" position="inside">
<group name="pfaendung_stammdaten"
string="Lohnpfändung (Stammdaten)"
groups="hr_payroll.group_hr_payroll_user">
<field name="l10n_at_unterhaltspflichten"/>
<field name="l10n_at_sz_anspruch"/>
</group>
</group>
</field>
</record>
</odoo>