PlatformOrder create: require_subscription flag narrows order types

This commit is contained in:
萝卜
2026-03-15 02:36:27 +00:00
parent 015d3bec25
commit 3182dd72a0
4 changed files with 50 additions and 4 deletions

View File

@@ -93,6 +93,7 @@ class PlatformOrderController extends Controller
'siteSubscription' => $siteSubscription, 'siteSubscription' => $siteSubscription,
'billingCycleLabels' => $this->billingCycleLabels(), 'billingCycleLabels' => $this->billingCycleLabels(),
'orderTypeLabels' => $this->orderTypeLabels(), 'orderTypeLabels' => $this->orderTypeLabels(),
'requireSubscription' => $requireSubscription,
'defaults' => $defaults, 'defaults' => $defaults,
]); ]);
} }

View File

@@ -107,13 +107,25 @@
@php @php
$canRenew = ((int) ($defaults['site_subscription_id'] ?? 0) > 0) && (($siteSubscription ?? null) && ($siteSubscription->id ?? 0)); $canRenew = ((int) ($defaults['site_subscription_id'] ?? 0) > 0) && (($siteSubscription ?? null) && ($siteSubscription->id ?? 0));
$selectedOrderType = (string) old('order_type', $defaults['order_type'] ?? 'new_purchase'); $selectedOrderType = (string) old('order_type', $defaults['order_type'] ?? 'new_purchase');
// 治理口径:续费必须绑定订阅。若当前页面未绑定订阅,则不允许选中 renewal避免提交后才报错 // 治理口径:续费必须绑定订阅。若当前页面未绑定订阅,则不允许选中 renewal避免提交后才报错
if (! $canRenew && $selectedOrderType === 'renewal') { if (! $canRenew && $selectedOrderType === 'renewal') {
$selectedOrderType = 'new_purchase'; $selectedOrderType = 'new_purchase';
} }
// 更强治理:若来源页声明 require_subscription=1且当前未绑定订阅则不展示 upgrade/downgrade 等类型,避免误用。
$requireSub = (bool) ($requireSubscription ?? false);
$allowedTypes = array_keys($orderTypeLabels ?? []);
if ($requireSub && ! $canRenew) {
$allowedTypes = ['new_purchase'];
}
@endphp @endphp
<select name="order_type" required> <select name="order_type" required>
@foreach(($orderTypeLabels ?? []) as $value => $label) @foreach(($orderTypeLabels ?? []) as $value => $label)
@if(!in_array($value, $allowedTypes, true))
@continue
@endif
@if($value === 'renewal' && ! $canRenew) @if($value === 'renewal' && ! $canRenew)
<option value="{{ $value }}" disabled>{{ $label }}(需从订阅进入)</option> <option value="{{ $value }}" disabled>{{ $label }}(需从订阅进入)</option>
@else @else

View File

@@ -26,10 +26,9 @@ class AdminPlatformOrderCreateRequireSubscriptionFlagShouldDisableRenewalTest ex
$res = $this->get('/admin/platform-orders/create?require_subscription=1&order_type=renewal'); $res = $this->get('/admin/platform-orders/create?require_subscription=1&order_type=renewal');
$res->assertOk(); $res->assertOk();
// 续费选项应禁用 // 当 require_subscription=1 且未绑定订阅时:续费选项不应可选(可能被隐藏或 disabled
$res->assertSee('value="renewal" disabled', false);
// 不应出现 renewal 被选中(避免误导)
$res->assertDontSee('value="renewal" selected', false); $res->assertDontSee('value="renewal" selected', false);
// 更强口径:不应出现 renewal option避免误导
$res->assertDontSee('value="renewal"', false);
} }
} }

View File

@@ -0,0 +1,34 @@
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminPlatformOrderCreateRequireSubscriptionFlagShouldOnlyShowNewPurchaseTypeTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_create_should_only_show_new_purchase_when_require_subscription_flag_and_no_subscription_context(): void
{
$this->loginAsPlatformAdmin();
$res = $this->get('/admin/platform-orders/create?require_subscription=1');
$res->assertOk();
// 仅保留 new_purchase 作为可选项(避免误用 upgrade/downgrade 等)
$res->assertSee('value="new_purchase"', false);
$res->assertDontSee('value="upgrade"', false);
$res->assertDontSee('value="downgrade"', false);
}
}