diff --git a/docs/superpowers/plans/2026-08-01-neue-pakete.md b/docs/superpowers/plans/2026-08-01-neue-pakete.md index 97eefda..6f43a8c 100644 --- a/docs/superpowers/plans/2026-08-01-neue-pakete.md +++ b/docs/superpowers/plans/2026-08-01-neue-pakete.md @@ -927,12 +927,21 @@ it('verkauft 20 GB für 15 Euro netto', function () { }); it('bleibt teurer je Gigabyte als der Aufstieg', function () { - $blockPerGb = 1500 / 20; // 75 ct - $startZuTeam = (7900 - 3900) / (85 - 30); // ~72,7 ct - $teamZuBusiness = (13900 - 7900) / (175 - 85); // ~66,7 ct + // Gerechnet wird mit dem, was Katalog und Konfiguration WIRKLICH sagen — + // mit festen Zahlen prüfte dieser Test nur, ob PHP dividieren kann. So + // schlägt er an, wenn ein Preis später einmal so gesetzt wird, dass + // Stapeln sich wieder lohnt. + $catalogue = app(AddonCatalogue::class); + $plans = app(App\Services\Billing\PlanCatalogue::class)->sellable(); - expect($blockPerGb)->toBeGreaterThan($startZuTeam) - ->and($blockPerGb)->toBeGreaterThan($teamZuBusiness); + $blockPerGb = $catalogue->priceCents(AddonCatalogue::STORAGE) / $catalogue->packGb(); + + foreach ([['start', 'team'], ['team', 'business']] as [$von, $nach]) { + $mehrGb = $plans[$nach]['quota_gb'] - $plans[$von]['quota_gb']; + $mehrCent = $plans[$nach]['price_cents'] - $plans[$von]['price_cents']; + + expect($blockPerGb)->toBeGreaterThan($mehrCent / $mehrGb); + } }); it('bietet Enterprise keinen Zusatzspeicher an', function () { @@ -1566,14 +1575,22 @@ it('nimmt das interne Paket und Enterprise aus dem Laden', function () { ->and(PlanFamily::query()->where('key', 'enterprise')->value('sales_enabled'))->toBeFalsy(); }); -it('lässt einen laufenden Vertrag unberührt', function () { - // Ein Vertrag, der vor der Umschaltung auf altem Team geschlossen wurde, - // trägt seine eigenen Zahlen und liest den Katalog nicht mehr. +it('lässt einen laufenden Vertrag auf seinen eigenen Zahlen', function () { + // Ein Vertrag, wie ihn OpenSubscription vor der Umschaltung geschrieben + // hat, mit der Maschine dazu. $subscription = Subscription::factory()->create([ 'plan' => 'team', 'quota_gb' => 500, 'disk_gb' => 540, 'price_cents' => 17900, ]); + $instance = App\Models\Instance::factory()->create([ + 'customer_id' => $subscription->customer_id, 'status' => 'active', + 'quota_gb' => 500, 'disk_gb' => 540, + ]); - expect($subscription->fresh()->quota_gb)->toBe(500) + // Der Katalog sagt heute etwas anderes — und keine Leseseite schreibt es + // dem Vertrag um. Die mittlere Zusicherung ist die eigentliche: sie geht + // durch denselben Weg, über den eine Bereitstellung das Kontingent holt. + expect(app(PlanCatalogue::class)->sellable()['team']['quota_gb'])->toBe(85) + ->and(App\Services\Billing\StorageAllowance::for($instance)->planGb)->toBe(500) ->and($subscription->fresh()->price_cents)->toBe(17900); }); ```