Skip to content

fix: manager and HR approval for outside-frame time entries (#41) - #47

Open
patrickschiller wants to merge 4 commits into
mainfrom
fix/41-outside-frame-approval
Open

patrickschiller wants to merge 4 commits into
mainfrom
fix/41-outside-frame-approval

Conversation

@patrickschiller

@patrickschiller patrickschiller commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Fixes #41.

Abhängigkeit und Merge-Reihenfolge

Depends on #46. Dieser PR basiert auf dem unabhängig akzeptierten #42-Head
4ff247bc18adfc0b245d8dbb044f7968cf2a4678 und zielt bewusst auf main, damit
alle bestehenden CI-Jobs laufen. Der Diff gegen main ist kumulativ #42 + #41.

Vorgesehene Reihenfolge: zuerst #46, danach dieser PR. Es wird hier weder
gemergt noch Auto-Merge aktiviert. Der obere Branch kann schon jetzt beide
Pakete gemeinsam testen, ohne etwas zu mergen.

Nur #41 gegenüber #46: Commit dbe68f57a93ba26bdc315d31fd4b313586a4337b,
22 Dateien, +2915/−18. Kumulativ gegen main: 32 Dateien, +5526/−293.

Umsetzung #41

  • Echte Freigabe normaler gestempelter TimeEntries, getrennt vom vorhandenen
    Zeitkorrektur-Antragsworkflow: aktuell zugewiesene aktive Führungskraft mit
    Rolle Manager → danach zwingend HRAdmin
    . HR darf die erste Stufe nicht
    ersetzen; eigene Buchungen darf auch eine breite Rolle nicht selbst freigeben.
  • Neue authentifizierte Endpunkte:
    GET /api/timeentries/approvals?scope=own|review,
    POST /api/timeentries/:id/approval,
    GET /api/timeentries/:id/approval-history.
    Identität aus JWT, aktuelle Rollen/Zuordnungen serverseitig gelesen,
    Managerliste strikt eigenes Team; fremde Beschäftigte erhalten keinen Zugriff.
  • Pflichtrevision und Stufe, atomarer Versions-/Statusvergleich, gemeinsame
    Buchungssperren sowie Zeilensperren für Rollen/Managerzuordnung sichern
    doppelte, stale und konkurrierende Entscheidungen gegen Änderungen ab.
    Offene laufende Buchungen können nicht genehmigt werden.
  • Erfolgreiche Manager-/HR-Entscheidungen und Ablehnungen behalten Akteur,
    Zeitpunkt, Ergebnis und Notiz im bestehenden Auditmodell. Ablehnung verlangt
    eine Begründung. Buchungsänderungen nach Teil-/Endfreigabe starten beide
    Prüfungen neu; Split/Projektbereich behandeln jedes Segment korrekt, ohne
    Ablehnungen reinzuwaschen. Alte Historie bleibt auch bei nun in-frame liegenden
    Segmenten auffindbar.
  • Fehlender, inaktiver oder falsch berechtigter Manager: erklärter blockierter
    Zustand. HR muss eine gültige Führungskraft zuordnen; keine stille
    HR-/Selbstfreigabe. Ein anderer Manager vor HR-Bestätigung muss erneut prüfen.
  • Auffindbare DE/EN-Oberfläche unter Genehmigungen → Zeitbuchungen, eigene
    Status-/Verlaufssicht unter Buchen, verständliche nächste Rolle/Ort,
    Ergebnis und Fehler, verpflichtende Ablehnungsnotiz, Realtime-/Cache-Refresh.
  • Additive Migration 20261107031000_time_entry_frame_approval: zwei nullable
    Signaturmarker. Bestehende Pending/null-mode-Team-Einträge benötigen keine
    Neuanlage und starten bei der Managerprüfung. In-frame-, Tagesblock- und
    Solo-Verhalten bleiben erhalten. OpenAPI und generierter Client synchron.

Lokale Verifikation

Ausschließlich synthetischer, isolierter PostgreSQL-16-Stack; keine vorhandene
Datenbank zurückgesetzt. pnpm 9.15.9, Gesamttests zusätzlich mit CI-Node 20.20.2.

Gate Ergebnis
Neue TimeEntry-Freigabe-API-/Service-Regressionssuite 27/27 bestanden
TZ=Europe/Berlin pnpm nx e2e api-e2e unter Node 20.20.2 331/331 Tests, 38 Suites bestanden
TZ=UTC pnpm nx run-many -t test -p web,shared --run --skip-nx-cache unter Node 20.20.2 Web 234/234, Shared 88/88 bestanden, ohne Cache
Abschließender Web-Nachlauf nach Realtime-Anbindung 234/234 bestanden
pnpm nx run-many -t typecheck,lint -p api,web,shared,api-e2e Alle vier Typechecks und Lint erfolgreich; 0 Fehler, nur bestehende Warnungen
pnpm nx run-many -t build -p api,web,shared, getrennt von Typechecks Alle Builds erfolgreich, einschließlich Web/PWA
pnpm verify:api und git diff --check Erfolgreich
Akzeptiertes #42-Schema → synthetische Upgrade-Sentinels → neue Migration → ops/upgrade-smoke.mjs verify Erfolgreich, einschließlich bestehender Pending-Buchung ohne erfundene Signatur

Nachtest

Deutsche Anleitung mit eigenem Docker-Stack, synthetischen Rollen, echten
Stempel-Schritten, reproduzierbaren Legacy-Daten, Positiv-/Negativ-/Konkurrenzfällen
und Ergebnissen
.

UI-Regressionen sind React-Testing-Library-Prüfungen. Der dokumentierte manuelle
Docker-/Browser-Durchlauf wurde nicht als durchgeführt gewertet.

Grenzen

Nur Pakete #42 und #41 auf diesem kumulativen Branch. #43, #45 und #44 nicht
begonnen. Kein Release, Tag, Versionsbump, Merge, Deployment oder Release-Workflow.

GitHub-Gates auf dbe68f57a93ba26bdc315d31fd4b313586a4337b vollständig grün:

  • CI-Lauf:
    build-test-lint, api-e2e, database-upgrade und
    terminal-pin-browser erfolgreich.
  • CI-API: 331/331 Tests, 38 Suites; pnpm verify:api erfolgreich.
  • CI-Web: 234/234 Tests, 35 Dateien; vier Projekt-Typechecks und relevante
    Builds erfolgreich.
  • DCO
    erfolgreich; verlangter DCO-/Co-Author-Trailer vorhanden.

Reopen returned drafts with their values and revision reason. Add owner-only versioned editing/resubmission, shared validation, balance/overlap self-exclusion, transactional concurrency guards, employee names, synchronized API contracts and regression/manual acceptance coverage.

Co-authored-by: patrickschiller <39913537+patrickschiller@users.noreply.github.com>
Signed-off-by: Patrick Schiller <39913537+patrickschiller@users.noreply.github.com>
Keep persisted timestamps unchanged until their time field is edited. Resolve wall-clock validation and payloads to identical instants, require explicit ambiguous-time choices, reject clock-change gaps, and cover seconds, both fold occurrences and reason-only save/resubmit cycles.

Co-authored-by: patrickschiller <39913537+patrickschiller@users.noreply.github.com>
Signed-off-by: Patrick Schiller <39913537+patrickschiller@users.noreply.github.com>
Keep the English DST selection regression independent of jsdom persisted locale on Node 20. Verify all 208 web tests with Node 20.20.2 and document the CI follow-up.

Co-authored-by: patrickschiller <39913537+patrickschiller@users.noreply.github.com>
Signed-off-by: Patrick Schiller <39913537+patrickschiller@users.noreply.github.com>
Add scoped, versioned TimeEntry review with distinct current-manager and HR stages, durable decision audit, legacy pending support and conservative edit invalidation. Surface employee guidance, reviewer actions and history in German/English, synchronize API contracts, and verify additive database upgrades and security/concurrency regressions. Based on accepted #42; no release or merge.

Co-authored-by: patrickschiller <39913537+patrickschiller@users.noreply.github.com>
Signed-off-by: Patrick Schiller <39913537+patrickschiller@users.noreply.github.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-07T02:27:25.693474Z dbe68f5 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Genehmigung von Buchungen außerhalb der Rahmenzeit

1 participant