[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,128 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ============================================================ -->
<!-- AP11: Drittschuldnererklärung (DSE, lb-pfa-06). An das -->
<!-- Exekutionsgericht und den betreibenden Gläubiger bzw. bei -->
<!-- Verwalterbestellung an diesen; idR binnen 4 Wochen ab -->
<!-- Zustellung (§ 301 EO). Auch bei Null-Pfändung / Ex- -->
<!-- Mitarbeiter abzugeben. -->
<!-- ============================================================ -->
<record id="action_report_pfaendung_dse" model="ir.actions.report">
<field name="name">Drittschuldnererklärung (Lohnpfändung)</field>
<field name="model">hr.employee</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">l10n_at_hr_payroll_private.report_pfaendung_dse</field>
<field name="report_file">l10n_at_hr_payroll_private.report_pfaendung_dse</field>
<field name="paperformat_id" ref="base.paperformat_euro"/>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="binding_type">report</field>
</record>
<template id="report_pfaendung_dse">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="employee">
<t t-set="w" t-value="werte[employee.id]"/>
<t t-call="web.external_layout">
<div class="page">
<h2>Drittschuldnererklärung — Arbeitsverhältnis</h2>
<p class="text-muted">
Erklärung des Dienstgebers als Drittschuldner
über die Bezügeansprüche des Verpflichteten
(§ 301 EO; lb-pfa-06).
</p>
<table class="table table-sm o_main_table">
<tbody>
<tr>
<td><strong>Dienstnehmer:in</strong></td>
<td><t t-out="employee.name"/></td>
<td><strong>Unterhaltspflichten</strong></td>
<td><t t-out="employee.l10n_at_unterhaltspflichten or 0"/> (max 5 wirksam)</td>
</tr>
<tr>
<td><strong>Sonderzahlungsanspruch (13./14.)</strong></td>
<td><t t-if="employee.l10n_at_sz_anspruch">ja</t><t t-else="">nein (erhöhter Grundbetrag)</t></td>
<td><strong>Beschäftigt beim Drittschuldner</strong></td>
<td><t t-if="w['lauf_basis'] is not None">ja (letzter validierter Lauf vorhanden)</t><t t-else="">— kein validierter Lauf</t></td>
</tr>
</tbody>
</table>
<h3>Pfändungen / Exekutionen (nach Rang)</h3>
<table class="table table-sm o_main_table">
<thead>
<tr>
<th>Rang</th>
<th>Gläubiger</th>
<th>Art</th>
<th>Zustellung</th>
<th class="text-end">Forderung</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr t-foreach="w['pfandungen']" t-as="p">
<td><t t-out="p.rang"/></td>
<td><t t-out="p.glaubiger"/></td>
<td><t t-out="p.pfandung_art"/></td>
<td><t t-out="p.zustellungsdatum"/></td>
<td class="text-end">
<span t-out="p.forderungshoehe"
t-options='{"widget": "monetary", "display_currency": employee.currency_id}'/>
</td>
<td><t t-out="p.status"/></td>
</tr>
<tr t-if="not w['pfandungen']">
<td colspan="6" class="text-muted">
Keine aktive Pfändungsvormerkung erfasst.
</td>
</tr>
</tbody>
</table>
<h3>Pfändbarer Betrag (laufender Bezug, § 291a EO)</h3>
<table class="table table-sm o_main_table">
<tbody>
<tr t-if="w['lauf_basis'] is not None">
<td>Berechnungsgrundlage (Netto nach SV-DN/LSt)</td>
<td class="text-end">
<span t-out="w['lauf_basis']"
t-options='{"widget": "monetary", "display_currency": employee.currency_id}'/>
</td>
</tr>
<tr t-if="w['lauf_basis'] is not None">
<td>Existenzminimum (unpfändbar)</td>
<td class="text-end">
<span t-out="w['lauf_ex']"
t-options='{"widget": "monetary", "display_currency": employee.currency_id}'/>
</td>
</tr>
<tr t-if="w['lauf_basis'] is not None">
<td><strong>Pfändbarer Betrag</strong></td>
<td class="text-end">
<strong><span t-out="w['lauf_pfaendbar']"
t-options='{"widget": "monetary", "display_currency": employee.currency_id}'/></strong>
</td>
</tr>
<tr t-if="w['lauf_basis'] is None">
<td colspan="2" class="text-muted">
Kein validierter Lauf — Beträge nicht
ermittelt (Null-Pfändung / Ex-Mitarbeiter:
Erklärung dennoch abgeben, lb-pfa-06).
</td>
</tr>
</tbody>
</table>
<p class="small text-muted">
Hinweis: Die Erklärung ist auch dann zu erstatten,
wenn der Verpflichtete nicht (mehr) beschäftigt ist
oder nichts Pfändbares bezogen wird (lb-pfa-06).
Kostenersatz für die Erklärung: § 302 EO (keine USt,
VwGH 2011/15/0181).
</p>
</div>
</t>
</t>
</t>
</template>
</odoo>