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.
4.2 KiB
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.py → quellen/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):
oegb/update-reports/update-<datum>.json— changed/new/removed.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).
chambers/chambers.jsonstichprobenartig verifizieren (URLs können sich ändern); nicht mehr öffentliche Quellen als solche vermerken.
Validierung
- Strukturcheck: Katalog-Zahlen (entries = oegb + wko_only), alle
texts/*.jsonparsebar, jede ÖGB-Variante hat json+md (Skript-Schnelltest siehe git-history dieses RUNBOOKs). - Rechenfälle gegen Portaldarstellung: 2–3 bekannte KVs
(z. B. SI-2203 Handwerk und Gewerbe, SI-2748 Metallgewerbe,
SI-2757 Zahntechnik) im Dashboard/Volltext gegen
texts/*.mdhalten. - Änderungen niemals aus Trainingswerten — nur aus den gespeicherten
Rohdaten (
--build-onlybaut 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_reviewstatt 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_lastmodgetrieben). - 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.)