Löschschutz für Ausleiher, Geräte und Reservierungen #8
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/loeschschutz"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Behebt die Befunde 1 und 2 des externen Checks.
Ausleiher sind nur noch löschbar, wenn nichts mehr offen ist: keine ausgegebenen Geräte, kein ausgegebenes Zubehör, keine offene Reservierung. Die Prüfung sitzt im Modell (
Holder::deleteBlockReason()+deleting-Hook), greift also auch bei Sammelauswahl und auf der Kommandozeile. Die Sammelaktion überspringt betroffene Ausleiher mit Begründung, statt abzubrechen.Der Verlauf hält den Namen des Ausleihers jetzt selbst fest (
asset_activities.holder_name), damit er nach einem späteren Löschen lesbar bleibt. Vorhandene Einträge werden in der Migration nachgetragen.Geräte sind nicht mehr löschbar, solange sie ausgegeben sind. Beim Löschen werden offene Reservierungen storniert.
Die Reservierungsliste bricht nicht mehr ab: Die Beziehung schließt gelöschte Geräte ein (
withTrashed), und die Erfüllbarkeit wird an einer Stelle im Modell geprüft (Reservation::isFulfillable()). Ursache war nicht ein fehlgeschlagenes Cascade, sondern dassAssetSoftDeletes nutzt und die Kaskade deshalb nie feuert.8 neue Tests in
tests/Feature/LoeschschutzTest.php. Volle Suite grün (158 Tests), Pint sauber.Dieser Branch ist die Grundlage für die folgenden Blöcke und sollte zuerst gemergt werden.
🤖 Generated with Claude Code
https://claude.ai/code/session_01QKiq6LV8Lk1vst5CQW15ar
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.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.