Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F118029069
D4298.1775579312.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
D4298.1775579312.diff
View Options
diff --git a/src/app/Http/Controllers/API/SignupController.php b/src/app/Http/Controllers/API/SignupController.php
--- a/src/app/Http/Controllers/API/SignupController.php
+++ b/src/app/Http/Controllers/API/SignupController.php
@@ -364,6 +364,13 @@
$login = Str::lower($request->login);
$domain_name = Str::lower($request->domain);
$domain = null;
+ $user_status = User::STATUS_RESTRICTED;
+
+ if ($request->discount && $request->discount->discount == 100
+ && $request->plan->mode == Plan::MODE_MANDATE
+ ) {
+ $user_status = User::STATUS_ACTIVE;
+ }
DB::beginTransaction();
@@ -379,7 +386,7 @@
$user = User::create([
'email' => $login . '@' . $domain_name,
'password' => $request->password,
- 'status' => User::STATUS_RESTRICTED,
+ 'status' => $user_status,
]);
if ($request->discount) {
@@ -435,6 +442,15 @@
$disc = 0;
if ($discount) {
+ // Free accounts don't need the auto-payment mandate
+ // Note: This means the voucher code is the only point of user verification
+ if ($discount->discount == 100) {
+ return [
+ 'content' => self::trans('app.signup-account-free'),
+ 'cost' => 0,
+ ];
+ }
+
$planCost = (int) ($planCost * (100 - $discount->discount) / 100);
$disc = $cost - $planCost;
}
@@ -513,6 +529,7 @@
$result['title'] = self::trans("app.signup-plan-{$period}");
$result['content'] = self::trans('app.signup-account-mandate', $params);
$result['summary'] = '<table>' . $summary . '</table>';
+ $result['cost'] = $planCost;
return $result;
}
diff --git a/src/resources/lang/en/app.php b/src/resources/lang/en/app.php
--- a/src/resources/lang/en/app.php
+++ b/src/resources/lang/en/app.php
@@ -128,6 +128,7 @@
'signup-account-mandate' => 'Now it is required to provide your credit card details.'
. ' This way you agree to charge you with an appropriate amount of money according to the plan you signed up for.',
+ 'signup-account-free' => 'You are signing up for an account with 100% discount. You will be redirected immediately to your Dashboard.',
'signup-plan-monthly' => 'You are choosing a monthly subscription.',
'signup-plan-yearly' => 'You are choosing a yearly subscription.',
'signup-subscription-monthly' => 'Monthly subscription',
diff --git a/src/resources/vue/Signup.vue b/src/resources/vue/Signup.vue
--- a/src/resources/vue/Signup.vue
+++ b/src/resources/vue/Signup.vue
@@ -102,7 +102,7 @@
</div>
<div class="card d-none border-0" id="step4">
- <div class="card-body row row-cols-lg-2 align-items-center">
+ <div v-if="checkout.cost" class="card-body row row-cols-lg-2 align-items-center">
<h4 class="card-title text-center mb-4 col-lg-5">{{ $t('signup.created') }}</h4>
<div class="card-text mb-4 col-lg-7">
<div class="card internal" id="summary">
@@ -124,6 +124,16 @@
</div>
</div>
</div>
+ <div v-else class="card-body">
+ <h4 class="card-title mb-4">{{ $t('signup.created') }}</h4>
+ <div class="card-text mb-4" id="summary">
+ <p id="summary-content">{{ checkout.content }}</p>
+ <form>
+ <btn class="btn-secondary me-2" @click="stepBack">{{ $t('btn.back') }}</btn>
+ <btn class="btn-primary" @click="submitStep4">{{ $t('btn.subscribe') }}</btn>
+ </form>
+ </div>
+ </div>
</div>
</div>
</template>
@@ -340,11 +350,11 @@
const post = this.lastStepPostData()
axios.post('/api/auth/signup', post).then(response => {
- // auto-login and goto to the payment checkout
- this.$root.loginUser(response.data, false)
-
let checkout = response.data.checkout
+ // auto-login and goto to the payment checkout (or Dashboard for a free account)
+ this.$root.loginUser(response.data, !checkout.id && !checkout.redirectUrl)
+
if (checkout.redirectUrl) {
location.href = checkout.redirectUrl
} else if (checkout.id) {
diff --git a/src/tests/Browser/SignupTest.php b/src/tests/Browser/SignupTest.php
--- a/src/tests/Browser/SignupTest.php
+++ b/src/tests/Browser/SignupTest.php
@@ -46,6 +46,7 @@
SignupInvitation::truncate();
Plan::whereNot('mode', Plan::MODE_EMAIL)->update(['mode' => Plan::MODE_EMAIL]);
+ Discount::where('discount', 100)->update(['code' => null]);
@unlink(storage_path('signup-tokens.txt'));
@@ -565,9 +566,9 @@
$browser->assertSeeIn('h4', 'The account is about to be created!')
->assertSeeIn('h5', 'You are choosing a monthly subscription')
->assertVisible('#summary-content')
- ->assertElementsCount('#summary-cc svg', 2)
- ->assertElementsCount('#summary-summary tr', 4)
- ->assertSeeIn('button.btn-primary', 'Continue')
+ ->assertElementsCount('#summary-content + p.credit-cards img', 2)
+ ->assertVisible('#summary-summary')
+ ->assertSeeIn('button.btn-primary', 'Subscribe')
->assertSeeIn('button.btn-secondary', 'Back')
->click('button.btn-secondary');
})
@@ -617,6 +618,57 @@
// TODO: Test the 'Try again' button on /payment/status page
}
+ /**
+ * Test signup with a mandate plan with a discount=100%
+ */
+ public function testSignupMandateDiscount100Percent(): void
+ {
+ // Test the individual plan
+ $plan = Plan::withEnvTenantContext()->where('title', 'individual')->first();
+ $plan->mode = Plan::MODE_MANDATE;
+ $plan->save();
+
+ $discount = Discount::where('discount', 100)->first();
+ $discount->code = 'FREE';
+ $discount->save();
+
+ $this->browse(function (Browser $browser) {
+ $browser->visit(new Signup())
+ ->waitFor('@step0 .plan-individual button')
+ ->click('@step0 .plan-individual button')
+ ->whenAvailable('@step0', function ($browser) {
+ $browser->click('.plan-individual button');
+ })
+ ->whenAvailable('@step3', function ($browser) {
+ $browser->type('#signup_login', 'signuptestdusk')
+ ->type('#signup_password', '12345678')
+ ->type('#signup_password_confirmation', '12345678')
+ ->type('#signup_voucher', 'FREE')
+ ->click('[type=submit]');
+ })
+ ->whenAvailable('@step4', function ($browser) {
+ $browser->assertSeeIn('h4', 'The account is about to be created!')
+ ->assertSeeIn('#summary-content', 'You are signing up for an account with 100% discount.')
+ ->assertMissing('#summary-summary')
+ ->assertSeeIn('button.btn-primary', 'Subscribe')
+ ->assertSeeIn('button.btn-secondary', 'Back')
+ ->click('button.btn-primary');
+ })
+ ->waitUntilMissing('@step4')
+ ->on(new Dashboard())
+ ->within(new Menu(), function ($browser) {
+ $browser->clickMenuItem('logout');
+ });
+ });
+
+ $user = User::where('email', 'signuptestdusk@' . \config('app.domain'))->first();
+
+ $this->assertSame($plan->id, $user->getSetting('plan_id'));
+ $this->assertTrue($user->isActive());
+ $this->assertFalse($user->isRestricted());
+ $this->assertSame($discount->id, $user->wallets->first()->discount_id);
+ }
+
/**
* Test signup with a token plan
*/
diff --git a/src/tests/Feature/Controller/SignupTest.php b/src/tests/Feature/Controller/SignupTest.php
--- a/src/tests/Feature/Controller/SignupTest.php
+++ b/src/tests/Feature/Controller/SignupTest.php
@@ -977,7 +977,7 @@
VatRate::create([
'country' => 'CH',
'rate' => 7.7,
- 'start' => now()->subSecond(),
+ 'start' => now()->copy()->subDay(),
]);
IP4Net::create([
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 7, 4:28 PM (6 h, 48 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18843272
Default Alt Text
D4298.1775579312.diff (8 KB)
Attached To
Mode
D4298: Improve signup for a free (vip) account in mandate mode
Attached
Detach File
Event Timeline