*/ public function grandfatheredFor(User $user): Collection { return UserPaymentOption::query() ->where('user_id', $user->getKey()) ->where('status', UserPaymentOptionStatus::Grandfathered->value) ->whereNull('cancelled_at') ->get(); } /** * Kündigt das GESAMTE Bestandsschutz-Bündel eines Kunden gemeinsam. Es gibt * keine Einzelkündigung – alle laufenden Grandfathered-Posten werden in einem * Schritt auf `cancelled` gesetzt, womit der 04:30-Worker keine weiteren * MAN-Rechnungen mehr erzeugt (duePaymentOptions berücksichtigt nur * Active/Grandfathered). * * @return int Anzahl der gekündigten Posten */ public function cancelBundleFor(User $user): int { return UserPaymentOption::query() ->where('user_id', $user->getKey()) ->where('status', UserPaymentOptionStatus::Grandfathered->value) ->whereNull('cancelled_at') ->update([ 'status' => UserPaymentOptionStatus::Cancelled->value, 'cancelled_at' => now(), ]); } }