isOpen()) { return false; } $customerId = $case->subscription?->customer?->stripe_customer_id; if (blank($customerId)) { return false; } $offen = array_column(app(StripeClient::class)->openInvoices((string) $customerId), 'id'); $unsere = array_merge([$case->stripe_invoice_id], array_values($case->fee_invoice_ids ?? [])); // Steht noch eine davon offen, ist der Fall nicht zu. if (array_intersect($unsere, $offen) !== []) { return false; } $case->update(['settled_at' => Carbon::now()]); $stand = $case->level; // Und die Cloud kommt zurück. Nur die des betroffenen Vertrags — // andere Verträge desselben Kunden waren nie betroffen. foreach (Instance::query() ->where('customer_id', $case->subscription?->customer_id) ->whereNotNull('suspended_at') ->get() as $instance) { app(ResumeInstance::class)($instance); } // Nur wer wirklich stand, bekommt die Entwarnung. Wer auf Stufe 1 // bezahlt hat, hat nie eine Sperre gesehen — ihm zu schreiben, seine // Cloud laufe wieder, wäre eine Nachricht über etwas, das nie war. if ($stand >= DunningSchedule::SUSPENDED) { app(DunningMailer::class)->resumed($case); } return true; } }