contractOf($this->customer()); // Geklemmt an der tatsächlich noch buchbaren Menge, nicht an der // absoluten Grenze: ein Vertrag, der schon einen Block hält, darf im // Dialog nicht mehr versprechen, als purchase() nachher wirklich in // den Warenkorb legt. // // Kein `max(1, …)` mehr darum herum: bei null buchbaren Blöcken — // Deckel erreicht oder Modul für dieses Paket nicht vorgesehen — machte // das daraus wieder einen. Dieselbe Falle, die in purchase() schon // behoben ist ($lines floorte auf eine Bestellzeile), hatte im Fenster // überlebt: ein direkt geöffnetes oder veraltetes Fenster versprach // einen Block und schickte eine Bestellung los, die purchase() danach // ablehnt. Nach oben wird weiter geklemmt, nach unten nur noch auf // null. $max = $catalogue->bookableQuantity($subscription, AddonCatalogue::STORAGE); $this->packs = min($max, max(1, $packs)); $this->packGb = $catalogue->packGb(); // Absage statt geschlossenem Fenster: der Kunde hat gerade auf eine // Karte geklickt, die ihm diesen Ausweg angeboten hat, und ein Dialog, // der sich wortlos wieder schließt, ist von einem kaputten Knopf nicht // zu unterscheiden. In dem Satz, den er zu dieser Grenze überall sonst // liest — derselbe, mit dem purchase() und BookAddon ablehnen. $this->refusal = $this->packs > 0 ? '' : (string) ( $catalogue->availabilityRefusal($subscription, AddonCatalogue::STORAGE) ?? $catalogue->quantityRefusal($subscription, AddonCatalogue::STORAGE, 1) ); } public function proceed(): void { // Nichts buchbar, nichts losgeschickt — der Knopf, der hier ankommt, // ist bei einer Absage gar nicht gezeichnet. Die Menge steht in einer // öffentlichen Eigenschaft und damit im Browser, deshalb ist das hier // nicht die Grenze, sondern nur die Ehrlichkeit des Fensters: gehalten // wird sie in purchase() und in BookAddon, wo das Geld fließt. if ($this->packs < 1) { $this->closeModal(); return; } $this->dispatch('storage-packs-confirmed', packs: $this->packs); $this->closeModal(); } public function render() { return view('livewire.confirm-book-storage'); } }