[ADD] l10n_at_payroll_dokumente: generate documents from templates

Document generation module: templates with own text (structure reference
and source stand documented per template, no licensed full text in the
repo), fill fields resolved from hr data (company, employee, hr.version
stand) plus wizard input, preview rendering and PDF/HTML attachment via
the generic report layout.

- templates: pilot set for the general-AT track formulated as own text
  after the KB muster structure (lb-bes-09, lb-bnd-55, lb-bnd-52/62,
  lb-end-35), legal status per template marked as draft
- rendering via convert_inline_template_to_qweb + ir.qweb (t-out
  auto-escapes values) — deliberately not mail.render.mixin inline
  engine, whose expression whitelist blocks werte[...] placeholders for
  non-template-editors
- wizard resolves hr.version by date_version at the reference date;
  PDF falls back to HTML attachment without wkhtmltopdf
- security: ir.model.access (hr user read / manager write) + company
  rule; 8 tests, suite 236/236 green on a fresh -i database run
This commit is contained in:
2026-09-16 10:36:49 +02:00
parent efe76e6b3d
commit 1df5fb19c4
16 changed files with 1048 additions and 0 deletions
+71
View File
@@ -2,6 +2,77 @@
## Current focus
**Modul l10n_at_payroll_dokumente (Dokumentgenerierung) umgesetzt — 236/236 Tests grün**
(2026-09-16, uncommittet bis Nutzerfreigabe; Modul **19.0.1.0.0**):
- **Anforderung (Nutzer):** Muster → Dokumente aus Stammdaten (Dienstvertrag,
Kündigung, DSE …). Nutzer-Entscheidungen: neues Modul; DSE = vorhandene
Pfändungs-DSE (kein Neubau); **eigene Texte nach Muster-Struktur** (kb_ref/
quell_stand je Vorlage dokumentiert, kein Lexis-Volltext im Repo —
Lizenzthema damit fürs Produkt gelöst; Muster werden laufend ergänzt,
kein Warten nötig: neue Vorlagen = Datenarbeit).
- **Bau:** Modell `l10n.at.payroll.dokument.vorlage` (+ feld): eigener Text
`inhalt_html` (Html, sanitize=False), Feldliste (auto/manuell, pflicht),
kb_ref/quell_stand/rechtsstatus (entwurf|geprueft), company + Rule.
Wizard `l10n.at.payroll.dokument.wizard` (+ Zeilen-Transient): Stichtag →
hr.version (date_version <= Stichtag!), Auto-Resolver (firma/firma_strasse/
firma_plz/firma_ort/mitarbeiter/mitarbeiter_strasse/plz/ort/ead/funktion/
geboren), Manuell-Eingaben, Pflicht-UserError, Vorschau, PDF via
`ir.actions.report._render_qweb_pdf` **mit HTML-Fallback** ohne
wkhtmltopdf (Anhang am hr.employee). Generisches QWeb-Print-Layout
(AbstractModel + data['body'] als Markup, wie DSE-Muster).
- **⚠️ Rendering-Weg (wichtig, abweichend vom Plan):** NICHT
`mail.render.mixin._render_template` (engine inline_template) — deren
Ausdrucks-Whitelist (`mail_allowed_qweb_expressions`, nur object.name u.ä.)
sperrt `werte['…']`-Ausdrücke für Nicht-Template-Editoren (AccessError).
Stattdessen: `rendering_tools.convert_inline_template_to_qweb`
`ir.qweb._render(lxml html.fragment_fromstring(src, create_parent='div'), …)`
+ Wrapper-[5:-6]-Strip (Muster `_render_template_qweb`). Autor-Syntax
bleibt identisch; **t-out escapt Werte automatisch** (kein manuelles
Escaping). t-if-Blöcke für optionale Absätze sind möglich (QWeb direkt).
- **Pilotvorlagen (eigen formuliert, Rechtsstatus 'entwurf'):** DV
Angestellte (lb-bes-09), Kündigung DG (lb-bnd-55), einvernehmliche
Auflösung (lb-bnd-52/62), Vordienstzeitenbestätigung (lb-end-35).
§-Verifikation: § 27 AngG (wichtiger Grund) RIS ✅; **§ 34 AngG =
Verjährung** (nicht Auflösung!) — Auflösungstexte zitieren bewusst keine §§.
- **Tests 8** (Auto-Werte, Platzhalter-Ersetzung, Pflicht-UserError,
Stichtags-Versionen, Anhang PDF/HTML, generisches Layout via
`_render_qweb_html` ohne wkhtmltopdf, ACL hr.group_hr_user vs. base,
Pilotvorlagen E2E). Suite **236/236** (73 Kern + 18 GemBG + 199 Privat
+ 10 Dokumente) frischer -i-Lauf.
- Offen: DSE-Pfändung-Link ins Dokumente-Menü (kosmetisch), mehr Vorlagen
nach Nutzermustererweiterung, Produktivsetzung erst nach rechtlicher
Prüfung (rechtsstatus je Vorlage).
**Erneuter Abgleich Modul ↔ Wissensbasis (2026-09-16, Read-only, Grep-Verifikation am Code):**
Basis PLAN-Restluecken-AP11 (Abgleich 2026-09-12, 601 Einträge) + Zwischenstand AP8/AP11AP16.
Befund:
- **Geplante Reste unverändert offen (0 Code-Treffer je Thema):** AP17 (L17, § 109a/
§ 109b-Meldung, mBGM Geringfügigen-Jahreszahlung 2,5 %), AP18 (NSchG-Monatszähler,
Schwerarbeitsmeldung — ASchV/NSchG-Beschaffungsgate), AP19 (GF/Vorstand-Flag,
Ferialpraktikanten, DVH-Sonderfälle, Präsenzdienst-BV-Fiktion), AP20+-Optionen
(ATZ, Kurzarbeit, Betriebspension/Beteiligung, Entsendung), Quer-LSt: FB+/ANV-
Automatik, Prämien-Anspruchsprinzip (A3-blockiert), 2027-Werte.
- **Zwischenzeitlich ✅ (Code-verifiziert):** All-in § 2g AVRAG (GP2-Deckungsrechnung,
payslip_private `_at_allin_deckung`), Fallweise-Felder + mBGM G3/G4 tagesgenau,
AVAB/AVB-Selection, Nachzahlungspfade (SV/LSt/Endabrechnung), Tod des DN =
Abgangsursache 13, §§ 23f/§ 47-Übertritte in abfertigung_private.
- **1 NEUER Restpunkt aus Batch 10:** **Ausbildungskostenrückersatz** (lb-end-27/28,
Checkliste + Muster) — 0 Code-Treffer, auch nicht im AP11-Plan erfasst →
als Zusatzpunkt in AP14/Endabrechnung (Scope-Gate Pilotmandant) aufnehmen.
- Batch 10 sonst: keine neuen Cluster, keine neuen Berechnungslogiken (Muster/
Checklisten/Übersichten); lb-end-30/31 (freiwillige Abf./Voll-Übertritt) und
lb-end-29 (Zeitschulden) abgedeckt; lb-grz-09..11/lb-swa-06 stützen AP18/AP20.
- KB-interne offene Punkte unverändert: A3 „Formel 7“, A4 All-In-Oberwert,
A7-2026-GFG, C7-2027-Werte, B3 Pensionisten (VwGH), ASchV/NSchG-Beschaffung.
- **Nachgetragen 2026-09-16 (Nutzer):** Ausbildungskostenrückersatz in
`PLAN-Restluecken-AP11.md` (AP14-Umsetzung/Rechtsanker + Lücken-Liste 2.4).
- **Neue Anfrage (2026-09-16, ERLEDIGT — siehe Modul-Block oben):**
`.lexis360/muster/` für Dokumente in Odoo nutzen → Modul
`l10n_at_payroll_dokumente` umgesetzt; Nutzer entschieden: eigene Texte
nach Muster-Struktur (kein Lexis-Volltext im Repo), Lizenz-Redistribution
damit fürs Produkt gelöst; Sammlung wird laufend ergänzt (kein Warten).
**Wissensbasis Batch 10 (3 neue Lexis-Subordner) ABGESCHLOSSEN — 64/64 kuratiert, `--registry` + `--check` grün**
(2026-09-16, Nutzerfreigabe "bitte zur wissensbasis hinzufuegen"):