From 0ac76fb05b0f3a521646c1406bb938ce9107d50c Mon Sep 17 00:00:00 2001 From: nexxo Date: Sat, 1 Aug 2026 12:14:04 +0200 Subject: [PATCH] Plan: zwei Tests, die nichts bewiesen haben Der eine rechnete mit festen Zahlen und pruefte damit, ob PHP dividieren kann; er liest jetzt Katalog und Konfiguration und schlaegt an, wenn ein Preis so gesetzt wird, dass Stapeln sich wieder lohnt. Der andere legte einen Vertrag an und pruefte die Werte, die er gerade selbst geschrieben hatte; er geht jetzt ueber den Weg, ueber den eine Bereitstellung das Kontingent holt. Co-Authored-By: Claude Opus 5 --- .../plans/2026-08-01-neue-pakete.md | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) 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); }); ```