Skip to content

fix: edit and resubmit returned employee requests (#42) - #46

Open
patrickschiller wants to merge 3 commits into
mainfrom
fix/42-returned-request-edit
Open

patrickschiller wants to merge 3 commits into
mainfrom
fix/42-returned-request-edit

Conversation

@patrickschiller

@patrickschiller patrickschiller commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Zusammenfassung

Closes #42

  • Zurückgegebene Anträge lassen sich über Entwurf · Antrag bearbeiten zugänglich öffnen. Die Maske enthält bestehende Werte, Namen, Vertretung, Halbtage und den Rückgabe-/Ablehnungsgrund; DE/EN, Speichern und erneutes Einreichen sind angebunden.
  • Owner-only PATCH /api/requests/:id und POST /api/requests/:id/resubmit: nur workflowState=Draft, Bearer-Identität, unveränderliche ID/Typ/Eigentümer, erforderliches expectedUpdatedAt gegen veraltete Tabs.
  • Wiederverwendete Validierung für Neuanlage und Revision: Zeitraum, Jahresgrenze, Arbeitstage/Halbtage, aktive Vertretung, Urlaubssaldo, Antrags- und Zeitbuchungsüberschneidungen. Nur die eigene Reservierung wird aus Überschneidung und Saldo ausgenommen (auch bei legacy status=Submitted).
  • Transaktionale Mitarbeiter-Sperre verhindert parallele Saldo-/Überschneidungsfehler; atomarer Versionsvergleich sichert auch laufende alte Freigabeentscheidungen gegen Rückgabe/Wiedereinreichung ab. Alte Entscheidungs-/Annahmefelder werden zurückgesetzt, Historie und Anlagen bleiben erhalten.
  • Mitarbeitername auch im Genehmigungseingang/Verlauf. OpenAPI und generierter Client inklusive Antwortschema synchronisiert. Keine neue Datenbankmigration erforderlich.

P2-Nachkorrektur aus der unabhängigen Abnahme

  • Unveränderte Zeitfelder behalten exakt ihre gespeicherten ISO-Zeitpunkte, inklusive Sekunden/Millisekunden und erstem/zweitem DST-Vorkommen; reines Ändern der Begründung verschiebt keine Zeit.
  • Bereichsprüfung und API-Payload verwenden dieselben aufgelösten Zeitpunkte. Ein gültiges Intervall über die Herbst-Rückstellung wird auch bei lokal früherem Ende akzeptiert.
  • Geänderte mehrdeutige Ortszeiten verlangen eine explizite, zugängliche DE/EN-Auswahl des Vorkommens mit UTC-Offset. Nicht existierende Frühjahrslücken und leere Zeitfelder werden blockiert. Keine API-/Datenbank-/OpenAPI-Änderung.
  • 18 zusätzliche Regressionen: 10 UI-Fälle und 8 Zeitauflösungsfälle, einschließlich erfolgreichem Speichern → Wiederöffnen → Wiedereinreichen, beiden Herbst-Vorkommen, Sekunden/Millisekunden, DE/EN, Bereichsprüfung und halbstündiger Lord-Howe-Umstellung.
  • Red/Green-Nachweis: Die vier neuen Begründungs-Roundtrips schlagen gegen die vorherige RequestsPage.tsx aus 230dbb0 fehl und bestehen mit dem Fix.

Verifikation

Synthetische, isolierte PostgreSQL-16-Testdatenbank; Node v26.12.1, pnpm 9.15.9:

  • API-E2E: 75/75 Tests in 8 Suites, einschließlich 20 neuer Revisionsfälle (Manager-Rückgabe, Vertretungsablehnung, Fremdzugriff, alle Nicht-Draft-Zustände, Saldo, Überlappung, Anlagen, parallele/stale Änderungen und alte Managerentscheidung im neuen Freigabezyklus).
  • Web: 208/208 Tests, Shared-Domain: 88/88 Tests.
  • API/Web/Shared-Builds erfolgreich; API/Web/Shared/API-E2E-Typechecks erfolgreich.
  • Lint: 0 Fehler, 13 bestehende Warnungen im ursprünglichen Gesamtpaket; gezielter Web-Nachlauf: 2 bestehende Warnungen, keine neue Warnung.
  • pnpm verify:api und git diff --check erfolgreich.

Ein kombinierter paralleler Build-/Typecheck-Zwischenlauf zeigte einen vorhandenen Output-Verzeichniskonflikt (Vite leert Web-dist, TS6305). Der anschließend erzwungene separate Web-Typecheck und der separate Vier-Projekt-Typecheck bestanden. Keine Konfigurationsänderung dafür.

Lokaler Nachlauf der P2-Korrektur

  • TZ=UTC pnpm nx test web --run src/routes/RequestsPage.spec.tsx src/lib/local-date-time.spec.ts src/app/i18n.spec.tsx: 29/29 bestanden.
  • TZ=UTC pnpm nx test web --run: 208/208 Tests, 34 Dateien bestanden.
  • pnpm nx run-many -t typecheck,lint -p web: erfolgreich, 0 Fehler, 2 bestehende Warnungen.
  • pnpm nx build web: erfolgreich, einschließlich PWA.
  • git diff --check: erfolgreich.
  • Zusätzlich Node 20.20.2: TZ=UTC pnpm nx test web --run --skip-nx-cache, 208/208 Tests bestanden. Der erste CI-Nachlauf deckte eine gespeicherte deutsche Sprachpräferenz in der neuen EN-Testfixture auf (207/208); Storage danach wie in den bestehenden i18n-Tests isoliert. Kein Anwendungscode musste dafür geändert werden.
  • Shared-Domain unverändert: 88/88 aus Nx-Cache; API-Synchronität und API-E2E werden in der regulären PR-CI erneut geprüft.

Manueller Nachtest

Deutsche Anleitung mit isoliertem Docker-Setup, synthetischen Rollen, Schritten/Erwartungen und Negativtests.

UI-Regressionsprüfungen wurden mit React Testing Library ausgeführt. Der dokumentierte manuelle Docker-/Browser-Durchlauf wurde nicht als durchgeführt gewertet.

Umfang

Nur Paket #42. Keine Folgepakete #41/#43/#45/#44, kein Release, kein Tag, kein Versionsbump, kein Merge, kein Deployment und kein Release-Workflow.

Ursprüngliche GitHub-Prüfungen vor der P2-Nachkorrektur vollständig grün: CI-Lauf mit build-test-lint, vollständiger api-e2e-Suite, database-upgrade und terminal-pin-browser; zusätzlich DCO. Alle fünf PR-Checks erfolgreich.

Finaler Head nach P2-Nachkorrektur

Finale CI auf 4ff247bc18adfc0b245d8dbb044f7968cf2a4678 vollständig grün:

  • CI: build-test-lint, api-e2e, database-upgrade, terminal-pin-browser erfolgreich.
  • Vollständige API-E2E: 304/304 Tests, 37 Suites; pnpm verify:api erfolgreich.
  • CI-Web: 208/208 Tests, 34 Dateien; vier Projekt-Typechecks und relevante Builds erfolgreich.
  • DCO erfolgreich; beide Korrekturcommits mit DCO und verlangtem Co-Author-Trailer.

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>
@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-07T01:34:47.814814Z 230dbb0 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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 230dbb0e0c

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

return (
<Dialog open onOpenChange={(open) => !open && onClose()}>
<DialogContent className="max-h-[90dvh] max-w-lg overflow-y-auto">
{request.data && !request.isFetching ? (

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve unsaved edits during background request refetches

If the browser reconnects to the network while an employee is editing a returned request, React Query's default reconnect refetch applies because this query has staleTime: 0. Checking !request.isFetching here unmounts NewRequestForm during that background fetch, destroying all locally edited dates, reason, substitute and half-day selections. When the fetch finishes, the form initializes from the server values again—even if updatedAt did not change—silently losing the employee's work. Keep the initialized form mounted during background fetches rather than treating every fetch as an initial load.

Useful? React with 👍 / 👎.

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>

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] Bearbeiten von Anträgen

1 participant