Files
odoo-at-payroll/personalverrechnung/RUNBOOK.md
T
fegger 5b629a5916 [ADD] personalverrechnung: machine-readable KV library (all current collective agreements)
Cross-checked catalogue of all currently valid Austrian collective
agreements, per the source policy: main source = the responsible
employer-side chamber, kollektivvertrag.at (OEGB-Verlag) as complete
cross-check baseline.

- oegb/: 593 variants from kollektivvertrag.at with full consolidated
  texts (JSON primary format, Markdown for review/diff) plus
  catalog.json/.csv; fetched via the portal's JSON servlets
  (dashboard/structure/slices/topics), resumable
- wko/: 614 current documents from the WKO KV database (1,820 branch
  overviews across 10 regions) with texts and catalog; match-report
  against the baseline: 407 pairs, 30 date disagreements flagged
- chambers/chambers.json: curated registry of chamber-side sources and
  publication gaps (GOeD member-only, RA/Notariat not public, OCR-less
  scan PDFs, missing hospital-doctors KV)
- kv-catalog.json/.csv: merged catalogue, 768 entries, chamber
  classification, main_source, cross_check status, manual_review lists
- tools/fetch_kv_portal.py / fetch_wko_kv.py / build_kv_catalog.py:
  stdlib-only fetchers and merge step, each with a --refresh diff mode
- RUNBOOK.md: update cycle for keeping the library current (annual,
  tied to the Wartung rhythm and KV rounds)

Lohntafel PDFs are linked but not downloaded; wage tables contained in
the KV texts are converted. No Odoo module changes.
2026-09-09 19:10:07 +02:00

4.2 KiB
Raw Blame History

RUNBOOK — Personalverrechnung

Operational memory for recurring workflows. Update when a procedure changes or a validation step catches an error it should have caught.

KV-Library (alle aktuellen Kollektivverträge, maschinenlesbar)

Stand: 2026-09-09 · Aufbau siehe quellen/kv/ und die Skript-Docstrings.

Architektur

Quelle Rolle Werkzeug Rohdaten (unversioniert)
kollektivvertrag.at (ÖGB-Verlag) Baseline — einziger vollständiger, maschinenlesbarer Korpus über alle Kammern; Kreuzcheck-Referenz tools/fetch_kv_portal.py .firecrawl/kv-portal/
wko.at KV-Datenbank Main source für WKO-Gewerbe/Industrie/Handel… tools/fetch_wko_kv.py .firecrawl/wko-kv/
Kammern (Ärzte, Apotheke, RA, Notariat, LWK, öffentl. Dienst) Main source soweit öffentlich; Registry der Quellen + Lücken quellen/kv/chambers/chambers.json (kuratiert)

Merge/Crosscheck: tools/build_kv_catalog.pyquellen/kv/kv-catalog.json|.csv mit chamber, main_source, cross_check (Match-Status + Datumsabgleich WKO „gültig ab" vs. ÖGB-Slice-Version) und manual_review-Listen.

Kuratierte Texte: quellen/kv/oegb/texts/SI-*.json|.md (Struktur: §-Hierarchie, Slices = Teile mit Versionsdatum, Topics; JSON ist das maschinenlesbare Primärformat, MD nur Review/Diff) sowie quellen/kv/wko/texts/{slug}.json|.md. Lohntafel-PDFs werden nicht downgeloadet (nur verlinkt); im KV-Text enthaltene Entgelttabellen sind Bestandteil der Konvertierung.

Aktuell halten (Wartungszyklus)

Mindestens jährlich mit der Bezügeanpassungs-Runde (Jänner) und nach bekannten KV-Abschluss-Runden (üblich: Jänner + Juli):

python3 personalverrechnung/tools/fetch_kv_portal.py --refresh   # diff lastContentUpdate/validFrom
python3 personalverrechnung/tools/fetch_wko_kv.py --refresh      # diff wko_lastmod (DV-Sitemap)
python3 personalverrechnung/tools/build_kv_catalog.py            # Merge + Crosscheck neu

Danach manuell sichten (Reihenfolge):

  1. oegb/update-reports/update-<datum>.json — changed/new/removed.
  2. kv-catalog.json → manual_review:
    • wko_without_clear_match (Match-Heuristik! Titelmorphologie, Hilfsdokumente wie Lohnordnungen/Tabellen landen hier),
    • date_disagreements (WKO-Datum vs. Portal-Slice — meist noch nicht aktualisierte WKO-Seite oder neuere Konsolidierung),
    • unclassified (v. a. Einzelträger-KVs: Austro Control, Diözesen, Orchester … — nur prüfen, ob eine Zuordnung Sinn ergibt).
  3. chambers/chambers.json stichprobenartig verifizieren (URLs können sich ändern); nicht mehr öffentliche Quellen als solche vermerken.

Validierung

  • Strukturcheck: Katalog-Zahlen (entries = oegb + wko_only), alle texts/*.json parsebar, jede ÖGB-Variante hat json+md (Skript-Schnelltest siehe git-history dieses RUNBOOKs).
  • Rechenfälle gegen Portaldarstellung: 23 bekannte KVs (z. B. SI-2203 Handwerk und Gewerbe, SI-2748 Metallgewerbe, SI-2757 Zahntechnik) im Dashboard/Volltext gegen texts/*.md halten.
  • Änderungen niemals aus Trainingswerten — nur aus den gespeicherten Rohdaten (--build-only baut kuratierte Ausgaben offline neu).

Bekannte Limitierungen (Stand 2026-09-09)

  • Match WKO↔ÖGB ist heuristisch (Token-Overlap mit Prefix-Fuzzy); alles unter Score 0,75 bzw. Hilfsdokumente landet bewusst in manual_review statt stillschweigend zugeordnet zu werden.
  • WKO-Übersichtsseiten listen je Bundesland identische, regionenneutrale aktuelle Dokumente (614 aktuell); Archivjahre nur über die DV-Sitemap (3.879 URLs, wko_lastmod getrieben).
  • Kammer-PDFs teils Scans ohne Textlage (RA Vbg, LÄK NÖ/OÖ/Bgld) — OCR wäre nötig, ist nicht eingebaut; ÖGB-Portal liefert dafür maschinenlesbare Texte.
  • Öffentlicher Dienst: GÖD-Volltexte member-only; Gemeindebedienstete teils Landesgesetze statt KV (Bgld. GemBG 2014 — siehe RECHTSQUELLEN-Bgld.md).
  • Angestelltenärzte-KV (Krankenanstalten): nirgends öffentlich — einzige systematische Lücke des Korpus.

Weitere Workflows

(SV-Werte/TASY-Import und GemBG-Katalog siehe tools/-Docstrings und docs/CHANGELOG.md; hier ergänzen, wenn sich wiederholende Beobachtungen zeigen.)