Ausgabe prüft Status und Reservierungen, Rücknahme hängt an der Ausleihe #10

Open
thiel wants to merge 1 commit from feature/ausgabe-regeln into fix/import-sicherheit
Owner

Behebt die Befunde 4 und 5 des externen Checks.

Ausgabe (Befund 4): Geprüft wurde bisher nur, ob das Gerät schon weg ist. Ein Status, der nicht „einsatzbereit" ist (defekt, ausgemustert, ausstehend), sperrt die Ausgabe jetzt; eine fremde Reservierung im Ausleihzeitraum ebenso, mit Nennung von Empfänger und Zeitraum. Eine eigene Reservierung gilt mit der Ausgabe als eingelöst. Geräte ohne Status bleiben unverändert ausgebbar — sonst wären Bestände ohne gepflegten Status plötzlich gesperrt.

Rücknahme (Befund 5): checkIn() nahm „das Gerät" zurück, ohne Bezug zu einer Ausleihe. assets.checkout_activity_id zeigt jetzt auf den Ausgabe-Eintrag der laufenden Ausleihe, asset_activities.checkout_activity_id verbindet die Rücknahme mit ihrer Ausgabe. checkIn() nimmt die erwartete Ausleihe entgegen und bricht ab, wenn das Gerät zwischenzeitlich neu ausgegeben wurde. Das lockForUpdate schützte nur gegen Gleichzeitigkeit, nicht gegen veraltete Vorgänge. Der Rücknahme-Dialog führt die Ausleihe mit, die beim Öffnen lief.

Die Migration trägt laufende Ausleihen auf ihren jüngsten Ausgabe-Eintrag nach.

Nebenbei: die Sammelausgabe bricht nicht mehr beim ersten gesperrten Gerät ab, sondern überspringt es mit Grund.

8 neue Tests. Volle Suite grün (178 Tests), Pint sauber.

Setzt auf #9 auf — Reihenfolge #8, #9, dieser.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QKiq6LV8Lk1vst5CQW15ar

Behebt die Befunde 4 und 5 des externen Checks. **Ausgabe (Befund 4):** Geprüft wurde bisher nur, ob das Gerät schon weg ist. Ein Status, der nicht „einsatzbereit" ist (defekt, ausgemustert, ausstehend), sperrt die Ausgabe jetzt; eine fremde Reservierung im Ausleihzeitraum ebenso, mit Nennung von Empfänger und Zeitraum. Eine eigene Reservierung gilt mit der Ausgabe als eingelöst. Geräte ohne Status bleiben unverändert ausgebbar — sonst wären Bestände ohne gepflegten Status plötzlich gesperrt. **Rücknahme (Befund 5):** `checkIn()` nahm „das Gerät" zurück, ohne Bezug zu einer Ausleihe. `assets.checkout_activity_id` zeigt jetzt auf den Ausgabe-Eintrag der laufenden Ausleihe, `asset_activities.checkout_activity_id` verbindet die Rücknahme mit ihrer Ausgabe. `checkIn()` nimmt die erwartete Ausleihe entgegen und bricht ab, wenn das Gerät zwischenzeitlich neu ausgegeben wurde. Das `lockForUpdate` schützte nur gegen Gleichzeitigkeit, nicht gegen veraltete Vorgänge. Der Rücknahme-Dialog führt die Ausleihe mit, die beim Öffnen lief. Die Migration trägt laufende Ausleihen auf ihren jüngsten Ausgabe-Eintrag nach. Nebenbei: die Sammelausgabe bricht nicht mehr beim ersten gesperrten Gerät ab, sondern überspringt es mit Grund. 8 neue Tests. Volle Suite grün (178 Tests), Pint sauber. **Setzt auf #9 auf** — Reihenfolge #8, #9, dieser. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01QKiq6LV8Lk1vst5CQW15ar
Ausgabe prüft Status und Reservierungen, Rücknahme hängt an der Ausleihe
All checks were successful
Tests / phpunit (pull_request) Successful in 1m17s
6d5f5ab2a0
Die Ausgabe prüfte nur, ob das Gerät schon weg ist. Ein defektes oder
archiviertes Gerät ging genauso raus, und eine Ausleihe konnte über eine
fremde Reservierung hinausreichen, ohne Warnung.

Ein Status, der nicht "einsatzbereit" ist, sperrt die Ausgabe jetzt; eine
fremde Reservierung im Ausleihzeitraum ebenso, mit Nennung von Empfänger
und Zeitraum. Eine eigene Reservierung gilt mit der Ausgabe als
eingelöst. Geräte ohne Status bleiben ausgebbar.

assets.checkout_activity_id zeigt auf den Ausgabe-Eintrag der laufenden
Ausleihe, asset_activities.checkout_activity_id verbindet die Rücknahme
mit ihrer Ausgabe. checkIn nimmt die erwartete Ausleihe entgegen und
bricht ab, wenn das Gerät inzwischen neu ausgegeben wurde - das
lockForUpdate schützte nur gegen Gleichzeitigkeit, nicht gegen veraltete
Vorgänge. Der Rücknahme-Dialog führt die Ausleihe mit, die beim Öffnen
lief.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKiq6LV8Lk1vst5CQW15ar
All checks were successful
Tests / phpunit (pull_request) Successful in 1m17s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feature/ausgabe-regeln:feature/ausgabe-regeln
git switch feature/ausgabe-regeln

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch fix/import-sicherheit
git merge --no-ff feature/ausgabe-regeln
git switch feature/ausgabe-regeln
git rebase fix/import-sicherheit
git switch fix/import-sicherheit
git merge --ff-only feature/ausgabe-regeln
git switch feature/ausgabe-regeln
git rebase fix/import-sicherheit
git switch fix/import-sicherheit
git merge --no-ff feature/ausgabe-regeln
git switch fix/import-sicherheit
git merge --squash feature/ausgabe-regeln
git switch fix/import-sicherheit
git merge --ff-only feature/ausgabe-regeln
git switch fix/import-sicherheit
git merge feature/ausgabe-regeln
git push origin fix/import-sicherheit
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
thiel/natec-inventar!10
No description provided.