Führerschein- & Zertifikats-Kontrolle (NFC-Siegel, Planungs-Gate, Halterhaftung)
§4.11 Führerschein- & Zertifikats-Kontrolle — Feinkonzept
Abschnitt betitelt „§4.11 Führerschein- & Zertifikats-Kontrolle — Feinkonzept“„Der Halter ist verantwortlich, dass das von ihm zugelassene Fahrzeug nicht von Personen in Betrieb gesetzt wird, die keine Fahrerlaubnis besitzen“ – §21 Abs. 1 Nr. 2 StVG. 5.000 € Bußgeld plus Strafverfahren sind die Regel, nicht die Ausnahme.
Im Handwerk teilen sich regelmäßig 8–15 Mitarbeiter 3–4 Fahrzeuge. Eine manuelle Sichtprüfung „jährlich“ ist weder DSGVO-konform (Umfang!) noch juristisch ausreichend.
1. Ziel & Business-Nutzen
Abschnitt betitelt „1. Ziel & Business-Nutzen“Werkszeit bietet dem Flottenverantwortlichen, HR und dem Polier eine physisch fälschungssichere und gerichtsfeste Kontrollinfrastruktur für Führerscheine und sicherheitsrelevante Zertifikate (Kran D1/D2, SCC, Gerüstbauer, Staplerschein, Ersthelfer, Asbest TRGS 519, Sprengberechtigter §27 SprengG).
Kernhebel:
- Halterhaftung §21 StVG absichern: Polier darf Fahrzeugschlüssel erst übergeben, wenn Werkszeit zum Einsatzzeitpunkt ein grünes Licht liefert. Keine Theorie – eine physische Handlung.
- Planungs-Gate: Ein abgelaufener Kran-D1-Schein ist ein Disposition-Problem, nicht nur ein HR-Problem. Werkszeit sperrt den Mitarbeiter für entsprechende Tätigkeiten in der Einsatzplanung.
- NFC-Siegel (NTAG424 DNA): Ein am Originaldokument aufgebrachtes Siegel signiert pro Scan eine frische SUN-Message. Kopien, Fotos, Screenshots sind unmöglich zu authentifizieren.
- Revisionssichere Historie: Jede Prüfung (pass/fail, Scanner-ID, Geolocation, Zeitstempel) wird in einer append-only Hash-Kette abgelegt. Steht im Bußgeldbescheid die Halterhaftung zur Debatte, kann der Betrieb sekundengenau nachweisen, dass und wann er geprüft hat.
Nutzenmessung (Referenzkunde Maler Meier, 14 FE, 5 Fahrzeuge):
- Zeit pro Prüfung: von ca. 7 Min. (manuelle Sichtkontrolle + Excel) auf < 45 Sekunden (Tap-Scan).
- Audit-Aufwand bei Straßenverkehrskontrolle: von „Ordnerwälzen in Geschäftsstelle“ auf ein PDF-Export mit QR-Code zur Online-Verifikation.
- Vermeidung: 1 abgelaufener Kranschein ohne Folgebußgeld (allein bei Maler Meier 2025 passiert 2×).
2. Abgrenzung & Nicht-Ziele
Abschnitt betitelt „2. Abgrenzung & Nicht-Ziele“Werkszeit ist keine ausstellende Behörde. Werkszeit beurkundet nicht die Echtheit des staatlichen Führerscheins – diese liegt beim Aussteller (Landratsamt) bzw. beim Bundesdruckerei-Chip. Werkszeit bescheinigt ausschließlich:
- dass zu einem bestimmten Zeitpunkt das physisch originale Dokument präsent war (via NFC-Siegel CMAC),
- dass ein autorisierter Prüfer (HR/Flottenverantwortlicher/Polier) die Sichtprüfung durchgeführt und signiert hat,
- dass aus Werkszeit-Sicht keine dem Betrieb bekannten Ablauf-, Sperr- oder Entzugsgründe entgegenstehen.
Nicht im Scope V1.5:
- Auslesen des EU-Führerscheinchips nach BSI TR-03110 (technisch vorbereitet, aber Modul-Gate geschlossen, da BMI-Zertifizierung offen).
- Integration „Driver Check“ Dritt-Apps (z. B. Lapid, Lisy) – bewusst nicht Re-Sell, sondern eigene NFC-Infrastruktur.
- Führen der medizinischen Akte (ArbMedVV / G-Untersuchungen) – wird nur als Status geführt, Detaildaten liegen im HR-System.
- Erfassung ausländischer Papier-Führerscheine ohne EU-Umschreibung (Sonderprüfung manuell, nicht automatisierbar).
3. Referenzkunde & Nutzungskontext
Abschnitt betitelt „3. Referenzkunde & Nutzungskontext“Primär: Musterbetrieb Maler Meier GmbH, Stuttgart. 14 Festangestellte, 3 Azubis, 5 Fahrzeuge (3× T6, 1× Crafter, 1× VW up! als Poolwagen). Flottenverantwortlicher: Andreas Meier (Geschäftsführer in Personalunion).
Typische Szene: Montag 6:45. Mitarbeiter Dario Beck kommt, tippt sich ein, greift nach dem Crafter-Schlüssel am Brett. Das Schlüsselbrett hat Werkszeit-NFC-Tags. Beim Entnehmen (Tag-Scan am Fahrzeugschlüssel-Anhänger) prüft das Gerät: Ist für diese Person der Führerschein in Klasse C1 (Crafter 4,1 t) gültig? – Antwort in < 1 Sekunde. Rot → akustisches Signal, Polier bekommt Push.
Sekundär: SHK Gebrüder Schmidt nutzt zusätzlich Kran D1 (1 LKW-Ladekran), SCC, Gerüstbauer. Dort läuft Prüfung nicht am Schlüsselbrett, sondern als Planungs-Gate: Wenn Dispo „Krantransport 22.04.“ plant, aber der Kranführer Serkan Demir nur noch bis 18.04. gültig ist, geht das in der Planung schon nicht mehr zu. Prevention > Detection.
Personas:
- Andreas Meier (52, Meister, digital-affin): Will einmal im Quartal die Kontroll-Liste durchgehen, keinesfalls öfter.
- Stefanie Brenner (34, HR-Assistentin): Erfasst neue Zertifikate, überwacht Fristen, lädt Dokumente hoch, versendet Erinnerungen.
- Jörg Tölle (47, Polier): Sieht am Morgen auf dem Smartphone die Ampel je Fahrzeug/Tätigkeit.
- Dario Beck (26, Geselle): Scannt sein eigenes Siegel, sieht den grünen Haken, fährt los.
4. Compliance-Anker
Abschnitt betitelt „4. Compliance-Anker“| Anker | Anforderung | Umsetzung in Werkszeit |
|---|---|---|
| §21 StVG | Halter haftet für fehlende Fahrerlaubnis (Bußgeld 5.000 € + Strafverfahren) | Planungs-Gate + Schlüsselbrett-Scan + Append-Only Nachweis |
| §23 StVZO | Halter muss Einhaltung überwachen | Quartalsweise Prüf-Pflicht, auto-Fristen, KPI „letzte Prüfung < 90 Tage“ |
| DGUV V1 §4 + §31 | Arbeitssichere Einsatzvoraussetzungen | Verknüpfung Zertifikat ↔ Tätigkeit ↔ Einsatzplanung |
| DGUV V52 | Krane · Nachweis Befähigung | Zertifikatstyp „Kran D1/D2“, Ablaufdatum, Schulungshistorie |
| DGUV G25 / G26.3 | Arbeitsmed. Eignung (Fahr-, Steuertätigkeiten) | Nur als Status (gültig bis …), Detaildaten Art. 9 nicht in Werkszeit |
| TRGS 519 / §27 SprengG | Asbest- & Sprengberechtigung | Zertifikatstyp + Ablaufdatum + Sachkundenachweis-PDF |
| DSGVO Art. 6(1)(c), (f) | Rechtsgrundlage Datenverarbeitung | Rechtspflicht §21 StVG + berechtigtes Interesse (Haftungsabwehr) |
| DSGVO Art. 9 | Gesundheitsdaten (G25/G26.3) | KMS-Envelope, Zugriff nur HR-Rolle, separater Audit-Log |
| DSGVO Art. 5(1)(c) | Datenminimierung | Wir speichern Status, kein Scan des Original-Führerscheins im Original, nur Referenzbild-Hash |
| BetrVG §87(1)6 | Mitbestimmung techn. Überwachung | Betriebsvereinbarungs-Muster liefern, Feature hinter Modul-Gate |
| BSI TR-03110 | Elektronische Personalausweise | Vorbereitet, V2.0-Flag module.handwerk.fuehrerscheine.eid |
| eIDAS / QES | Qualifizierte Signatur (optional HR) | Über D-Trust-Sign-Adapter, nicht Pflicht |
| GoBD §147 AO | Aufbewahrung prüfungsrelevanter Unterlagen | 10 Jahre, S3 Object Lock Compliance Mode |
| NTAG424 DNA (NXP) | Fälschungssichere dynamische Authentifizierung | SUN-Message-Verifikation serverseitig, Pre-shared Key je Siegel |
5. User Stories
Abschnitt betitelt „5. User Stories“- US-01 (Flottenverantwortlicher) Als Flottenverantwortlicher will ich auf einen Blick sehen, welche Fahrer für welches Fahrzeug heute freigegeben sind, damit ich nicht jeden Morgen im Ordner suche.
- US-02 (Polier) Als Polier will ich beim Scannen eines Fahrzeugschlüssels ein klares rot/grün bekommen, damit ich in Sekunden entscheiden kann.
- US-03 (HR) Als HR will ich bei Einstellung per NFC-Siegel das Originaldokument anlernen, damit ich nie wieder einen Farb-Kopie-Führerschein archiviere.
- US-04 (Dispo) Als Disponent will ich bei der Einsatzplanung für einen Kran-Auftrag nur Mitarbeiter angeboten bekommen, deren D1-Schein zum Ausführungsdatum noch gültig ist.
- US-05 (Mitarbeiter) Als Mitarbeiter will ich bei ablaufendem Schein 90, 30 und 7 Tage vorher eine Push-Erinnerung erhalten, damit ich selbst rechtzeitig verlängere.
- US-06 (Geschäftsführung) Als GF will ich im Falle einer Straßenverkehrskontrolle per QR-Code-Link binnen Minuten einen manipulationssicheren Prüfnachweis erzeugen.
- US-07 (Betriebsrat) Als BR will ich bei der Einführung des Features die Auswertungs-Logs einsehen können und Verhaltensprofile ausschließen.
6. Wireframes
Abschnitt betitelt „6. Wireframes“6.1 Mobile – NFC-Scan Ampel (Polier am Fahrzeugschlüssel-Brett)
Abschnitt betitelt „6.1 Mobile – NFC-Scan Ampel (Polier am Fahrzeugschlüssel-Brett)“+-------------------------------------+| < Fahrzeugfreigabe ... |+-------------------------------------+| || [ Schlüsselbrett #1 · Crafter ] || || Halte das Handy an den NFC-Tag || des Fahrzeugschlüssels. || || (( )) scanning… || |+-------------------------------------+| || Dario Beck · C1 / CE || || [ GRÜN – OK ] || || Nächste Pflichtprüfung: 14.07.'26|| Letzte Vor-Ort-Prüfung: 08.04.'26|| Siegel-Auth: CMAC-SUN ✓ || |+-------------------------------------+| [ Übergabe dokumentieren ] |+-------------------------------------+6.2 Mobile – Scan-Ergebnis ROT
Abschnitt betitelt „6.2 Mobile – Scan-Ergebnis ROT“+-------------------------------------+| < Fahrzeugfreigabe ... |+-------------------------------------+| || ! Serkan Demir · Kran D1 || || [ ROT – STOP ] || || Grund: Kranschein abgelaufen || seit 03.04.2026 || Auftrag BV-26-091 Kranhub betr. || || Maßnahmen: || • Einsatz unterbinden || • Flottenverantw. informiert || • HR-Ticket geöffnet (#T-4491) || |+-------------------------------------+| [ Abbrechen ] [ SiFa anrufen ] |+-------------------------------------+6.3 Mobile – HR lernt Originaldokument mit NFC-Siegel an
Abschnitt betitelt „6.3 Mobile – HR lernt Originaldokument mit NFC-Siegel an“+-------------------------------------+| < Siegel anlernen ... |+-------------------------------------+| Mitarbeiter: Dario Beck || Dokument: EU-Führerschein C1/CE|| || Schritt 2/4 – Originalfoto || +---------------------------------+|| | [ Foto-Rahmen / Guides ] ||| | Platziere Führerschein ||| | innerhalb des Rahmens. ||| +---------------------------------+|| || ⚠ Das Foto wird nur als Hash || (SHA-256) gespeichert. Original || nicht im Dauerspeicher. || || [ Aufnehmen ] [ Manuell erfassen ]|+-------------------------------------+6.4 Mobile – HR lernt Siegel an (Schritt 3/4)
Abschnitt betitelt „6.4 Mobile – HR lernt Siegel an (Schritt 3/4)“+-------------------------------------+| < Siegel anlernen ... |+-------------------------------------+| Schritt 3/4 – Siegel aufbringen || || 1) Alkoholtuch → Fläche reinigen || 2) NTAG424-Siegel auf Foto-Seite || des Führerscheins aufkleben || (siehe Overlay) || 3) Halten des Handys an Siegel || || ((•)) warte auf Scan … || || Siegel-UID: 04:AB:77:12:EE:... || SUN-CMAC: ✓ verifiziert || Pre-Key: abgerufen HSM || |+-------------------------------------+| [ Zurück ] [ Weiter → Signatur ] |+-------------------------------------+6.5 Web – Flotten-Cockpit Ampel-Dashboard
Abschnitt betitelt „6.5 Web – Flotten-Cockpit Ampel-Dashboard“+----------------------------------------------------------------+| Werkszeit | Maler Meier GmbH Andreas Meier (Flottenverantw.) |+----------------------------------------------------------------+| Bautageb | Zeiterf | Arbeitssich | FÜHRERSCHEINE | Material |+----------------------------------------------------------------+| DSGVO Art 6(1)(c) · BetrVG §87(1)6 · letzte DSB-Freigabe OK |+----------------------------------------------------------------+| KPI: 14 MA · 5 Fahrzeuge · 47 aktive Zertifikate || [ 38 GRÜN ] [ 6 GELB (< 60 T) ] [ 3 ROT (abgelaufen)]|+----------------------------------------------------------------+| Mitarbeiter | FS-Kl. | Kran | SCC | G25 | nächste Pr. ||---------------------|--------|------|-----|-----|-------------|| Dario Beck | B/C1✓ | — | — | ✓ | 14.07.'26 ● || Serkan Demir | B ✓ | D1 ✗ | ✓ | ✓ | SOFORT ◼ || Jörg Tölle | BE ✓ | — | ✓ | ✓ | 22.05.'26 ◐ || Hannes Krüger | B ✓ | — | — | ✓ | 30.06.'26 ● || Andrea Brehm | B ✓ | — | ✓ | G26●| 05.05.'26 ◐ || Paul Lindner (Azubi)| B197 ✓| — | — | — | 12.10.'26 ● |+----------------------------------------------------------------+| Filter: [Rot] [Gelb] [Grün] Sort: [nächste Prüfung ▼] || [Export QR-Prüfnachweis] [Erinnerungen versenden] [Bericht] |+----------------------------------------------------------------+6.6 Web – Detailakte Mitarbeiter mit Historie
Abschnitt betitelt „6.6 Web – Detailakte Mitarbeiter mit Historie“+----------------------------------------------------------------+| Mitarbeiter: Serkan Demir · Kran D1 – ABGELAUFEN |+----------------------------------------------------------------+| Führerschein C1/CE ● gültig bis 30.11.2029 || Kranschein D1 (DGUV V52) ◼ abgelaufen 03.04.2026 [FOLGEN] || SCC-Zertifikat ● gültig bis 14.09.2027 || G25 (arbeitsmed.) ● gültig bis 20.10.2026 (verdeckt) || Ersthelfer ◐ Auffrischung fällig 15.05.2026 |+----------------------------------------------------------------+| Prüfhistorie (append-only, SHA-256 hash-chain) || 20.04.'26 09:12 · Scan Schlüsselbr. · Fahrzeug T6-1 · RED || 14.03.'26 07:45 · Scan Schlüsselbr. · Fahrzeug T6-1 · GREEN || 08.01.'26 10:20 · Quartalsprüfung · A. Meier · GREEN || 17.10.'25 14:05 · Siegel-Re-Anlernen · S. Brenner · GREEN |+----------------------------------------------------------------+| [ Dokument hochladen ] [ Verlängerung planen ] [ Sperren ] |+----------------------------------------------------------------+7. API-Oberfläche
Abschnitt betitelt „7. API-Oberfläche“Alle Endpunkte liegen unter /v1/handwerk/fuehrerscheine/..., verwenden Bearer-Token (tenant-scoped) und Idempotency-Key (UUID v7). Antworten sind Problem-JSON bei Fehlern (RFC 7807).
| Methode | Pfad | Zweck |
|---|---|---|
POST |
/seals/enroll |
Neues NTAG424-Siegel an Mitarbeiter+Dokument binden (HR) |
POST |
/seals/:sealUid/rotate-key |
Pre-shared Key rotieren (HSM) |
POST |
/seals/:sealUid/verify |
SUN-Message verifizieren (Server-seitig), gibt `pass |
POST |
/checks/scan |
Scan am Schlüsselbrett – liefert Ampel (green/yellow/red) |
POST |
/checks/quarterly |
Quartalsweise Sichtprüfung beurkunden (mit Signatur) |
GET |
/employees/:id/status |
Alle Zertifikate + Status in einem Rutsch |
GET |
/certificates?type=kran_d1&expires_in_days=60 |
Fristen-Report |
POST |
/certificates |
Zertifikat anlegen (Typ, Ausstelldatum, Ablauf, Scan-Datei) |
PATCH |
/certificates/:id |
Aktualisieren (Verlängerung) |
POST |
/gates/planning/check |
Planungs-Gate: Ist MA X für Tätigkeit Y am Datum Z freigegeben? |
GET |
/audit/export?from=…&to=…&qr=1 |
Revisionsexport als PDF/A-2b mit QR-Online-Verify |
POST |
/reminders/run |
Batch-Job Fristenerinnerung (Push + E-Mail) |
Scan-Antwort-Schema (Auszug):
{ "decision": "red", "reasons": [ { "code": "KRAN_D1_EXPIRED", "since": "2026-04-03" } ], "seal": { "uid": "04:AB:77:12:EE:…", "cmacVerified": true, "lastEnrollment": "2025-11-02T10:14:00Z" }, "employee": { "id": "emp_01HE…", "displayName": "Serkan Demir" }, "vehicle": { "id": "veh_01HE…", "requiredClasses": ["B", "C1"] }, "auditRef": "chk_01HRX…", "issuedAt": "2026-04-20T06:47:12Z"}8. Datenmodell (Drizzle Pseudo-Schema)
Abschnitt betitelt „8. Datenmodell (Drizzle Pseudo-Schema)“Alle Tabellen besitzen
tenant_id uuid not null,created_at,created_by, und RLS-Policies. Sicherheitsrelevante Tabellen sind append-only mit Hash-Kette.
// Zertifikats-Typen (Stammdaten, pro Tenant überschreibbar)export const zertifikatsTypenTable = pgTable("zertifikats_typen", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), code: text("code").notNull(), // 'fuehrerschein_c1', 'kran_d1', 'scc', 'g25' gruppe: text("gruppe").notNull(), // 'fahrerlaubnis' | 'qualifikation' | 'arbeitsmed' label: text("label").notNull(), frequenzMonate: integer("frequenz_monate"), // z.B. 60 für Kran D1 istArt9: boolean("ist_art9").default(false), // -> KMS-Envelope gesetzlicheBasis: text("gesetzliche_basis"), // 'DGUV V52', 'ArbMedVV', 'FeV §6' pflichtFuerTaetigkeiten: text("pflicht_fuer_taetigkeiten").array(), // ['krantransport', 'hubarbeitsbuehne']});
// NFC-Siegel (NTAG424 DNA), pre-shared key im HSMexport const nfcSiegelTable = pgTable("nfc_siegel", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), sealUid: text("seal_uid").notNull().unique(), // aus Chip hsmKeyRef: text("hsm_key_ref").notNull(), // Verweis, nie der Key selbst gebundenAnZertifikatId: uuid("gebunden_an_zertifikat_id"), enrollmentAt: timestamp("enrollment_at").notNull(), enrolledBy: uuid("enrolled_by").notNull(), status: text("status").notNull().default("active"), // active|revoked|re-enrolled revokedAt: timestamp("revoked_at"), revokedReason: text("revoked_reason"),});
// Mitarbeiter-Zertifikate (eigentliche Daten)export const zertifikateTable = pgTable("zertifikate", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), mitarbeiterId: uuid("mitarbeiter_id").notNull(), typId: uuid("typ_id").notNull(), klassenMask: text("klassen_mask"), // 'B|BE|C1' für Führerscheine ausgestelltAm: date("ausgestellt_am").notNull(), gueltigBis: date("gueltig_bis"), // null wenn unbefristet ausstellerBehoerde: text("aussteller_behoerde"), dokumentNummer: text("dokument_nummer"), // verschlüsselt bei Art9 artikel9Nutzdaten: bytea("artikel9_nutzdaten"), // KMS-envelope; Detail G25/G26.3 originalBildHash: text("original_bild_hash"), // SHA-256, nicht Bild scanPdfObjectKey: text("scan_pdf_object_key"), // S3 Object Lock, 10 J. status: text("status").notNull().default("active"), createdAt: timestamp("created_at").defaultNow().notNull(),});
// Jede Prüfung = unveränderlicher Eintrag (append-only)export const pruefungenTable = pgTable("pruefungen", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), mitarbeiterId: uuid("mitarbeiter_id").notNull(), fahrzeugId: uuid("fahrzeug_id"), tatigkeitCode: text("taetigkeit_code"), pruefungstyp: text("pruefungstyp").notNull(), // scan_schluesselbrett | quartalspruefung | planungs_gate ergebnis: text("ergebnis").notNull(), // green|yellow|red gruende: jsonb("gruende"), // [{code, since, ...}] sealUid: text("seal_uid"), cmacVerified: boolean("cmac_verified"), geolocation: jsonb("geolocation"), // {lat, lng, acc} geraeteId: text("geraete_id"), durchgefuehrtVon: uuid("durchgefuehrt_von").notNull(), durchgefuehrtAm: timestamp("durchgefuehrt_am").defaultNow().notNull(), signaturBlob: bytea("signatur_blob"), // nur bei quartalspruefung // Hash-Kette hashPrev: bytea("hash_prev").notNull(), // sha256(vorgänger) hashSelf: bytea("hash_self").notNull(), // sha256(canonical(record))});
// Fahrzeug <-> notwendige Klassenexport const fahrzeugeTable = pgTable("fahrzeuge", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), kennzeichen: text("kennzeichen").notNull(), modell: text("modell").notNull(), zulGesamtmasse: integer("zul_gesamtmasse"), // kg benoetigteKlassen: text("benoetigte_klassen").array().notNull(), schluesselbrettSealUid: text("schluesselbrett_seal_uid"),});
// Fristenerinnerungs-Ausgang (idempotent)export const fristenerinnerungenTable = pgTable("fristen_erinnerungen", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), zertifikatId: uuid("zertifikat_id").notNull(), abstandTage: integer("abstand_tage").notNull(), // 90 | 30 | 7 kanal: text("kanal").notNull(), // push|email|sms verschicktAm: timestamp("verschickt_am"), idempotencyKey: uuid("idempotency_key").notNull().unique(),});
// Planungs-Gate (Entscheidungscache)export const planungsGateEntscheidungenTable = pgTable("planungs_gate_entscheidungen", { id: uuid("id").primaryKey().defaultRandom(), tenantId: uuid("tenant_id").notNull(), mitarbeiterId: uuid("mitarbeiter_id").notNull(), einsatzId: uuid("einsatz_id").notNull(), taetigkeitCode: text("taetigkeit_code").notNull(), einsatzAm: date("einsatz_am").notNull(), entscheidung: text("entscheidung").notNull(), // allowed|blocked gruende: jsonb("gruende"), entschiedenAm: timestamp("entschieden_am").defaultNow().notNull(),});RLS-Policies (Auszug):
-- Tenant-IsolationCREATE POLICY zt_tenant_iso ON zertifikate USING (tenant_id = current_setting('app.tenant_id')::uuid);
-- Art. 9 Daten nur für HR-RolleCREATE POLICY zt_art9 ON zertifikate USING ( tenant_id = current_setting('app.tenant_id')::uuid AND ( (SELECT ist_art9 FROM zertifikats_typen WHERE id = typ_id) = false OR current_setting('app.role') IN ('hr', 'admin') ) );
-- Prüfungen: append-onlyCREATE POLICY pr_insert_only ON pruefungen FOR INSERT WITH CHECK (true);CREATE POLICY pr_no_update ON pruefungen FOR UPDATE USING (false);CREATE POLICY pr_no_delete ON pruefungen FOR DELETE USING (false);9. Workflows
Abschnitt betitelt „9. Workflows“9.1 Siegel-Enrollment (HR, 4 Schritte, ca. 2 Min.)
Abschnitt betitelt „9.1 Siegel-Enrollment (HR, 4 Schritte, ca. 2 Min.)“- HR wählt Mitarbeiter + Zertifikatstyp „Führerschein C1“.
- Foto des Originals (Rahmen-Guide). Foto wird ausschließlich als SHA-256-Hash persistiert.
- NTAG424-Siegel aufkleben, Tap. Server fordert HSM Pre-Key für neue Siegel-UID an (
POST /seals/enroll), Client und Chip tauschen erste SUN-Message aus. - HR signiert Enrollment-Beleg digital (optional QES via D-Trust).
Datenfluss (vereinfacht):
Client --(tap)--> App --verify SUN--> API --HSM lookup--> HSM --> SQL INSERT zertifikate + nfc_siegel --> Outbox: enrollment.complete9.2 Tägliche Fahrzeugfreigabe (Polier, < 45 Sek.)
Abschnitt betitelt „9.2 Tägliche Fahrzeugfreigabe (Polier, < 45 Sek.)“- Polier tippt am Fahrzeugschlüssel (Siegel am Anhänger).
- App liest
sealUid + CMAC-SUN→POST /checks/scan. - Server verifiziert SUN gegen HSM, schlägt Mitarbeiter nach, prüft Matrix Mitarbeiter × Fahrzeug × Datum.
- Ergebnis
green|yellow|red+ Gründe. Eintrag inpruefungen(append-only). - Bei
red: Push an Flottenverantwortlicher, optional Auto-Ticket im HR.
9.3 Planungs-Gate (Dispo)
Abschnitt betitelt „9.3 Planungs-Gate (Dispo)“- Beim Auswählen einer Tätigkeit in der Dispo (z. B. „Krantransport 22.04.“) ruft die Dispo-UI
POST /gates/planning/checkauf. - Der Server prüft:
zertifikatstyp.pflichtFuerTaetigkeiten[] ⊇ {taetigkeitCode}undgueltigBis >= einsatzAmundzertifikat.status = active. - Nur freigegebene Mitarbeiter erscheinen als Vorschlag. Aus Dispo-Sicht gibt es den Konflikt gar nicht erst.
9.4 Quartalsprüfung (Flottenverantwortlicher)
Abschnitt betitelt „9.4 Quartalsprüfung (Flottenverantwortlicher)“- Quartalsweise (Monate 3/6/9/12) triggert Werkszeit eine To-Do-Liste pro Mitarbeiter im Web.
- Der Flottenverantwortliche sieht Dokument auf dem Bildschirm, klickt auf „NFC Re-Scan am Original“ (Mobile-Handoff via QR-Code), tippt das Siegel am Dokument, Signatur.
- Ergebnis: Eintrag
pruefungen.pruefungstyp = 'quartalspruefung'mit Signatur.
9.5 Fristenerinnerung (Batch-Job)
Abschnitt betitelt „9.5 Fristenerinnerung (Batch-Job)“- Täglich 06:00 läuft
POST /reminders/run:- 90 Tage, 30 Tage, 7 Tage vor Ablauf.
- Kanäle: Push (App), E-Mail, optional SMS.
- Idempotent: jeder (zertifikat × abstand) nur einmal.
9.6 Revisionsexport
Abschnitt betitelt „9.6 Revisionsexport“- Flottenverantwortlicher klickt „Prüfnachweis Q1 2026“.
- Server erzeugt PDF/A-2b mit:
- Tabellarischer Übersicht pro Mitarbeiter/Fahrzeug
- letzte 8 Prüfungseinträge je Zeile
- Hash-Kette (letzter SHA-256 als „Plombe“)
- QR-Code → Online-Verify-Link (öffentlich, read-only, tenantisoliert).
- S3 Object Lock, 10 Jahre, ausschließlich WORM.
10. NFC-Siegel · Technische Tiefe
Abschnitt betitelt „10. NFC-Siegel · Technische Tiefe“- Chip: NXP NTAG424 DNA. Feature Secure Unique NFC Message (SUN): Chip signiert pro Tap eine Message
UID || counter || CMACmit AES-128 CMAC (Pre-shared Key im Chip). - Key-Management: Pro Siegel individueller Key, gespeichert nur im HSM (AWS CloudHSM / equivalent On-Prem). Werkszeit-App hat nie den Key.
- Scan-Verifikation: Server liest SUN, fordert HSM zur CMAC-Verifikation auf (
HsmVerify(sealUid, counter, cmac)). Counter muss monoton steigen → Replay-Schutz. - Stale-Detection: Wenn Counter nicht wächst, Antwort
stale→ Polier sieht Warnung. - Revoke: Siegel abgerissen / neu aufgeklebt? HR setzt in
nfc_siegel.status = 'revoked', re-enrollment-Workflow läuft erneut. - Physikalische Absicherung: Hologramm-Overlay-Siegel (Voidmaterial), das beim Ablösen „VOID“-Spuren hinterlässt. Damit sind Siegel + Dokument physikalisch gekoppelt.
Fällt die NFC-Verifikation aus (beschädigter Chip, fremde NFC-Reader-Kollision), entscheidet das System auf yellow – Sichtprüfung durch Mensch Pflicht, keine Automatik.
11. Offline-Fähigkeit
Abschnitt betitelt „11. Offline-Fähigkeit“- Scan am Schlüsselbrett muss offline funktionieren. Lösung:
- Client führt lokalen, read-only Cache der Matrix Mitarbeiter × Zertifikat × gueltigBis (max 24 h alt, signiert pro Tenant).
- CMAC-Verifikation offline: Nicht möglich (HSM erforderlich). Stattdessen Client-Challenge: prüft, ob SUN-Message syntaktisch stimmig ist, aber markiert Ergebnis mit
cmacVerified: false. - Server-Roundtrip nachgeholt bei erstem Netz; Ergebnis wird überschrieben falls HSM anders urteilt.
- Grenze: Mehr als 24 h offline → Ampel ausschließlich
yellow(Sichtprüfung). - Outbox für Scan-Events analog zu Bautagebuch.
12. Sicherheits- & DSGVO-Betrachtung
Abschnitt betitelt „12. Sicherheits- & DSGVO-Betrachtung“- Rechtsgrundlage: Art. 6(1)(c) DSGVO (Rechtspflicht §21 StVG) + Art. 6(1)(f) (berechtigtes Interesse Haftungsabwehr).
- Art. 9: G25/G26.3 nur als Status (valid until) im Klartext; Detailbefund getrennt im KMS-Envelope, sichtbar nur
hr|admin. Zugriff wird imaccess_loggeschrieben (wer, wann, wozu). - Datenminimierung: Wir speichern keinen Scan des Original-Führerscheins im persistierten Dauerspeicher. Das HR-Aufnahmefoto wird direkt nach Hash-Bildung vernichtet (oder per opt-in 30 Tage im Object Lock).
- Löschung vs. Aufbewahrung: Art. 17 DSGVO kollidiert mit GoBD §147 AO + §21 StVG. Lösung: Einschränkung der Verarbeitung nach Art. 18. Nach 10 Jahren: irreversible Löschung via Object-Lock-Verfall.
- BetrVG §87(1)6: Feature hinter Modul-Gate. Werkszeit liefert Muster-Betriebsvereinbarung (Anlage). Ohne BV kein Rollout.
- Kein Bewegungsprofil: Geolocation wird pro Scan gespeichert, aber nicht aggregiert. Keine Kartenansicht „wo war Mitarbeiter X“.
- Transport: TLS 1.3, HSTS, App-Pinning des Server-Zertifikats.
- Schlüsselrotation: Pro Siegel jährlich oder bei Verdacht. Alt-Key im HSM nur für Audit-Verifikation aufbewahrt.
- Pen-Test: Replay (Counter), Clone (Pre-Key-Extraktion), Downgrade (CMAC → Klartext), UID-Spoofing.
13. Schnittstellen zu anderen Modulen
Abschnitt betitelt „13. Schnittstellen zu anderen Modulen“- Zeiterfassung: Beim Einstempeln auf ein Fahrzeug ruft Zeiterfassung
/gates/planning/checkauf. Rot → Einstempeln blockiert. - Einsatzplanung / Dispo: Sieht nur Mitarbeiter, deren Gate grün sagt.
- Bautagebuch: Eintrag bei §4.01 verweist auf „Fahrzeug übergeben an“, Link in Akte.
- Arbeitssicherheit (§4.10): Ersthelfer-Zertifikat ist ein Zertifikatstyp in diesem Modul, wird dort nur referenziert.
- Subunternehmer (§4.08): Subunternehmer-Fahrer haben eigenen Datensatz,
nfc_siegel.gebundenAnZertifikatIdzeigt auf Subunternehmer-MA. - Kern/Rechteverwaltung: Rolle
flotten_verantwortlicherneu; Scopescan-any | scan-own-only.
14. Gherkin-Testsuite
Abschnitt betitelt „14. Gherkin-Testsuite“Feature: Fahrzeugfreigabe per NFC-Scan Zur Absicherung der Halterhaftung nach §21 StVG muss Werkszeit bei Fahrzeugübergabe die Fahrerlaubnis verifizieren.
Background: Given Tenant "musterbetrieb-maler" ist aktiv And Mitarbeiter "Dario Beck" hat FS-Klassen "B, C1" gültig bis "30.11.2029" And Mitarbeiter "Serkan Demir" hat Kranschein D1 abgelaufen seit "03.04.2026" And Fahrzeug "Crafter VS-MM 245" benötigt Klasse "C1"
Scenario: Happy Path – Dario übernimmt den Crafter (GREEN) Given Dario befindet sich am Schlüsselbrett "SB-1" When er das NFC-Siegel am Crafter-Schlüssel antippt Then verifiziert die App die SUN-Message gegen HSM erfolgreich And die Matrix-Prüfung liefert "green" And ein Eintrag wird in "pruefungen" mit "ergebnis=green" geschrieben And der Counter des Siegels wird monoton erhöht And die Antwort erscheint in weniger als 1 Sekunde
Scenario: Edge-Case 1 – Kranschein abgelaufen (RED) blockiert Einsatz Given Serkan ist eingeplant für Einsatz "BV-26-091 Krantransport" am "22.04.2026" When die Dispo "POST /gates/planning/check" aufruft Then liefert das Gate "blocked" mit Grund "KRAN_D1_EXPIRED" And Serkan erscheint nicht in der Vorschlagsliste für diesen Auftrag And HR-Ticket "#T-4491" wird automatisch erzeugt And Fristerinnerung wurde bereits "90", "30", "7" Tage vorher verschickt
Scenario: Edge-Case 2 – Siegel physisch abgerissen (CMAC fehlschlägt) Given ein abgerissenes und wieder aufgeklebtes Siegel When Dario scannt dieses Siegel Then die HSM-Verifikation liefert "cmac_invalid" And die App zeigt "yellow – Sichtprüfung erforderlich" And Eintrag in "pruefungen" mit "ergebnis=yellow, cmacVerified=false" And ein Revocation-Auftrag an HR wird erstellt
Scenario: Edge-Case 3 – Offline-Scan > 24 h Given der lokale Cache ist 28 Stunden alt When Jörg (Polier) ein Siegel scannt Then zeigt die App "yellow – Offline > 24 h" And fordert Sichtprüfung And beim nächsten Online-Gang wird der Scan server-seitig re-validiert And das Ergebnis kann rückwirkend "red" werden – ein neuer append-only Eintrag wird angelegt
Scenario: Edge-Case 4 – G25 arbeitsmed. Daten (Art. 9) nur für HR sichtbar Given Andrea Brehm hat G26.3 mit Zusatzinformation When Polier Jörg Andreas Akte öffnet Then sieht er den Status "gültig bis 05.05.2026" But er sieht nicht die Detaildaten im KMS-Envelope And jeder Zugriff eines HR-Mitglieds auf Detaildaten erzeugt Audit-Log-Eintrag
Scenario: Edge-Case 5 – Multi-Tenant-Isolation Given SHK Gebr. Schmidt nutzt dasselbe Siegel-System für eigenen Fuhrpark When ein Mitarbeiter von Maler Meier aus Versehen ein SHK-Siegel scannt Then liefert der Server "red – seal_unknown_in_tenant" And es findet KEIN Cross-Tenant-Lookup statt And der versuchte Zugriff wird im Security-Log notiert15. Edge Cases (System-Katalog)
Abschnitt betitelt „15. Edge Cases (System-Katalog)“| Nr | Situation | Verhalten |
|---|---|---|
| EC-01 | Führerschein abgelaufen | Red, Einsatz blockiert, HR-Ticket |
| EC-02 | Fahrzeug benötigt C1, MA hat nur B | Red, Einsatz blockiert |
| EC-03 | Probezeit-Führerschein | Hinweis an Polier, grün/gelb je Auftrag |
| EC-04 | Azubi B197 (Automatik) auf Schalt-T6 | Red, Einsatz blockiert |
| EC-05 | Siegel UID nicht in Tenant | Red, Security-Log |
| EC-06 | CMAC-Verifikation fehlgeschlagen | Yellow, Sichtprüfung Pflicht |
| EC-07 | Offline > 24 h | Yellow, Sichtprüfung Pflicht |
| EC-08 | Counter Replay erkannt | Red, Scan-Event forensisch markiert |
| EC-09 | EU-Scheckkarte aus Spanien (EU-Umschreibung OK) | Wie deutscher Führerschein |
| EC-10 | Ausländischer Nicht-EU-Führerschein (CH, USA) | Manuelle Prüfung, Sperre auto-gesetzt bis HR freigibt |
| EC-11 | G25-Eignung entzogen durch Arbeitsmediziner | Red bei allen relevanten Tätigkeiten |
| EC-12 | Kranschein gültig, aber Schulungstag fehlt (DGUV V52 jährl.) | Yellow, Erinnerung „Auffrischung“ |
| EC-13 | Mitarbeiter scheidet aus | Siegel sofort revoked, Scan liefert red |
| EC-14 | Siegel-Re-Enrollment (Ersatzführerschein) | Altes revoked, neues enrolled, Historie bleibt |
| EC-15 | Dispo plant in 3 Wochen, aber FS läuft in 10 Tagen ab | Gate blockiert mit Grund „wird vor Einsatz ablaufen“ |
| EC-16 | Subunternehmer-Fahrer | Gesonderter Datensatz, keine Detail-Historie sichtbar |
| EC-17 | BR möchte Auswertungs-Log | Eigener read-only Export, anonymisiert auf Teamebene |
| EC-18 | Smartphone-NFC defekt | Fallback manuelle Sichtprüfung + 4-Augen-Bestätigung |
| EC-19 | Datenklau-Versuch (Export API missbraucht) | Rate-Limit + Alert, Audit-Log |
| EC-20 | Behördliche Entzug-Mitteilung (Post) | HR setzt Status manuell auf „entzogen“, dokumentiert Anlass |
16. Telemetrie & KPI
Abschnitt betitelt „16. Telemetrie & KPI“fuehrerscheine.scan.count{decision}– grün/gelb/rot Verteilung.fuehrerscheine.scan.latency.p95– Ziel < 800 ms.fuehrerscheine.gate.blocked.count{reason}– Auswertung der häufigsten Blocker.fuehrerscheine.reminder.delivered.count{abstand_tage}– 90/30/7-Tage-Funnel.fuehrerscheine.offline_scans_ratio– Anteil Scans ohne HSM-Online-Verifikation.fuehrerscheine.cmac_invalid.count– harter Security-KPI (Siegel-Manipulation).- Produkt-KPI: Anteil Mitarbeiter „aktuell“ (<90 Tage letzte Prüfung) > 95 %.
- Compliance-KPI: 0 Fälle §21 StVG Bußgeld trotz Werkszeit-Rollout (gemessen über Kunden-Ticket-System).
17. Rollout-Plan
Abschnitt betitelt „17. Rollout-Plan“- Phase 0 (2 Wo): DSGVO-FIA + DSB-Abnahme, Muster-BV bereitstellen, HSM bereit.
- Phase 1 – Pilot bei Maler Meier (4 Wo): 14 MA, 5 Fahrzeuge, nur Führerscheine, kein Planungs-Gate.
- Phase 2 – Rollout SHK Gebr. Schmidt (3 Wo): Kranschein D1, Gerüstbauer, SCC, + Planungs-Gate.
- Phase 3 – GA: Modul-Gate öffnen, API stabil, NFC-Siegel-Paket (50 Stk) über Shop bestellbar.
- Ausbau V2.0: BSI TR-03110 Elektronischer Führerschein-Chip, Fahrerkarten-Integration (falls Tachograph).
18. Offene Annahmen
Abschnitt betitelt „18. Offene Annahmen“- HSM-Betrieb: Wir gehen von managed HSM (AWS CloudHSM oder G-Data HSM On-Prem) aus. Werkszeit-Cloud kann beide bedienen. Ein reines „im Backend-Prozessspeicher“ würde §9 BDSG (alt) / Art. 32 DSGVO nicht genügen.
- NFC-Siegel-Lieferant: Wir nehmen an, wir liefern fertig personalisierte NTAG424-DNA-Siegel inkl. VOID-Overlay direkt an Tenants (10 €/Siegel, Mindestbestellmenge 20). Eigenbeschaffung nur mit Freigabe.
- Offline-Cache-TTL: 24 h ist ein ausbalanciertes Default; Tenant-überschreibbar im Intervall 6–48 h. < 6 h führt zu zu vielen Yellows im Außendienst.
- G25/G26.3-Detaildaten: Annahme, dass der Kunde nur den Status (valid until) führt. Werkszeit liefert Haken für Dritt-HR, keine eigene Arbeitsmedizin.
- Probezeit-Logik: Wir bilden die deutsche 2-Jahres-Probezeit als zusätzliches Flag am Zertifikat ab. EU-Ausland (CH, AT) separater Fall.
- QES-Signatur HR: Optional über D-Trust-Sign. In Phase 1 nicht zwingend, in regulierten Gewerken (TRGS 519) später verpflichtend.
- Betriebsvereinbarung: Ohne BV kein Rollout; wir schicken ein BR-Muster, aber verhandeln nicht.
- Halterhaftung Jurist: Wir liefern Werkzeug, das die Erfüllung der Sorgfaltspflicht nach §21 StVG dokumentiert. Die endgültige juristische Bewertung liegt beim Kunden bzw. dessen Anwalt – wir beurkunden keine Verkehrstauglichkeit.
19. Admin-Konfiguration
Abschnitt betitelt „19. Admin-Konfiguration“Die zugehörigen Web-Admin-Screens sind in §6.5 (Flotten-Cockpit-Dashboard), §6.6 (Detailakte) und §9.4 (Quartalsprüfung) als Wireframes bzw. Workflows ausgearbeitet. Diese Sektion fasst die F-A-* Feature-IDs konsolidiert zusammen — Admin-Modul-Stub-URL: /admin/handwerk/fuehrerschein-zertifikate/.
- F-A-01 — Zertifikatstyp-Katalog. CRUD für Typen (Führerschein-Klassen B/BE/C/CE/T, Kran-Schein, Stapler-Schein, TRGS 519, Ersthelfer, SCC-Pass) mit Pflicht-Frist-Logik (jährlich/2-jährlich/befristet bis Datum), Pflicht-Originaldokument ja/nein, NFC-Siegel-Pflicht ja/nein.
- F-A-02 — Erinnerungs-Schwellen pro Typ. Default 60/30/7-Tage, anpassbar pro Typ. Eskalation: T-7 zusätzlich an Polier, T-0 zusätzlich an HR + Geschäftsleitung. Kein-Reminder-Liste für interne Test-Zertifikate.
- F-A-03 — NFC-Siegel-Onboarding (HR-Workflow). Anlern-Modus für HR-Rolle: Siegel scannen → UID erfassen → Foto Original-Dokument → Akte verknüpfen. Bulk-Modus für initiale Übernahme aus Altsystem (CSV-Import + Siegel-Anlernen pro Zeile).
- F-A-04 — Sperr-Workflow. Rote Ampel (abgelaufen/ungültig) blockt Asset-Freigabe in
kern/01(Stempel-Kiosk + Mobile). Override-Modus für Polier mit Begründungs-Pflicht und Audit-Eintrag, optional zwingend Geschäftsleitungs-Bestätigung in BV verankert. - F-A-05 — Quartalsprüfungs-Plan. Termin-Vorlage (z.B. erster Werktag im Quartal), automatische Erstellung der Prüf-Liste (alle Mitarbeiter mit Pflicht-Zertifikaten), Report-Versand an Compliance-Verantwortlichen, Abhak-UI mit Ergebnis-Persistenz für Audit.
- F-A-06 — Asset-Mapping (Fahrzeug/Maschine ↔ Zertifikat). Welche Zertifikat-Typen sind für welches Asset Pflicht (z.B. Lkw-3,5t → B; Lkw-7,5t → C1; Mobilkran → Kran-Schein). Mehrfach-Zuordnung möglich, Mindest-Klassen-Logik (CE umfasst C, BE etc.).
- F-A-07 — Aufbewahrungs-Policy. DSGVO-Lösch-Frist nach Mitarbeiter-Austritt (Default 6 Monate, max 3 Jahre bei Compliance-Pflicht), Ausnahme-Whitelist für Compliance-relevante Vorfälle (Sperr-Override nutzte Zertifikat → Aufbewahrung verlängert), DSFA-Verweis (siehe §12).
- F-A-08 — Externe Original-Verifikation. Optional D-Trust-QES für HR-Bestätigung dass Original gesichtet wurde (Phase 2). Bis dahin: HR-Account-MFA + Foto + NFC-Siegel als 3-Faktor-Beweiskette.
- F-A-09 — Subunternehmer-Auflage. Verknüpfung mit
handwerk/08-subunternehmer: Subunternehmer-Personen müssen vor Baustellen-Einsatz die hier konfigurierten Pflicht-Zertifikate vorlegen, sonst Einsatz-Sperre in der Disposition.
Für Entwickler — API-Endpoints4
| Methode | Pfad | Auth | Zweck |
|---|---|---|---|
| GET | /v1/handwerk/certificates | bearerAuth | Zertifikate auflisten (Mitarbeiter + Typ + Stichtag). |
| POST | /v1/handwerk/certificates | bearerAuth | Zertifikat anlegen. |
| GET | /v1/handwerk/certificates/{id} | bearerAuth | Zertifikats-Detail. |
| POST | /v1/handwerk/certificates/{id}/renewal | bearerAuth | Verlängerung anlegen (neuer Row supersetzt den alten). |