From 30d3c8a92e7c2b92436f4e32ef17c16e2ae668f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:04:22 +0200 Subject: [PATCH 1/7] pull the initial price from the model itself --- app/Http/Livewire/BillingPortalPurchase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index b77bc7ec6276..6aab073bf4c0 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -157,7 +157,7 @@ class BillingPortalPurchase extends Component public function mount() { - $this->price = $this->subscription->service()->price(); + $this->price = $this->subscription->price; } /** From 0b2613146b37c3e1f2aa83803ecca54b85b77212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:09:30 +0200 Subject: [PATCH 2/7] Show spinner after clicking payment method --- app/Http/Livewire/BillingPortalPurchase.php | 3 ++ .../billing-portal-purchase.blade.php | 35 +++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index 6aab073bf4c0..5be7aff56aab 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -106,6 +106,7 @@ class BillingPortalPurchase extends Component 'fetched_client' => false, 'show_start_trial' => false, 'passwordless_login_sent' => false, + 'started_payment' => false, ]; /** @@ -280,6 +281,8 @@ class BillingPortalPurchase extends Component */ public function handleBeforePaymentEvents() { + $this->steps['started_payment'] = true; + $data = [ 'client_id' => $this->contact->client->id, 'date' => now()->format('Y-m-d'), diff --git a/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php b/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php index 14066fc16cdb..85b2682524d9 100644 --- a/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php @@ -71,7 +71,8 @@

- {{ ctrans('texts.total') }}: {{ \App\Utils\Number::formatMoney($price, $subscription->company) }} + {{ ctrans('texts.total') }} + : {{ \App\Utils\Number::formatMoney($price, $subscription->company) }}

@@ -121,13 +122,25 @@ - @foreach($this->methods as $method) - - @endforeach + @if($steps['started_payment'] == false) + @foreach($this->methods as $method) + + @endforeach + @endif + + @if($steps['started_payment']) + + + + + @endif @elseif($steps['show_start_trial'])
@@ -167,12 +180,14 @@ @enderror - @if($steps['passwordless_login_sent']) - E-mail sent. Please check your inbox! + E-mail sent. Please check your inbox! @endif @endif From 45c23cbaf5d349b906b8ea63011e90ca3e0ee1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:09:52 +0200 Subject: [PATCH 3/7] remove blue badges on the top --- .../livewire/billing-portal-purchase.blade.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php b/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php index 85b2682524d9..1081b675b21c 100644 --- a/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/billing-portal-purchase.blade.php @@ -5,20 +5,6 @@ alt="{{ $subscription->company->present()->name }}">
- @if(!empty($subscription->product_ids)) -

- One-time purchase -

- @endif - - @if(!empty($subscription->recurring_product_ids)) -

- Subscription -

- @endif -

{{ $subscription->name }}

From 6af6668ba62c1166405f14d5c255dcb8b17b4984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:10:26 +0200 Subject: [PATCH 4/7] remove price() from subscriptionservice --- .../Subscription/SubscriptionService.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 2fce756982e4..9932e4029cef 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -111,14 +111,14 @@ class SubscriptionService $recurring_invoice->next_send_date = now()->addSeconds($this->subscription->trial_duration); $recurring_invoice->backup = 'is_trial'; - if(array_key_exists('coupon', $data) && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) + if(array_key_exists('coupon', $data) && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) { $recurring_invoice->discount = $this->subscription->promo_discount; $recurring_invoice->is_amount_discount = $this->subscription->is_amount_discount; - } + } $recurring_invoice = $recurring_invoice_repo->save($data, $recurring_invoice); - + /* Start the recurring service */ $recurring_invoice->service() ->start() @@ -144,7 +144,7 @@ class SubscriptionService $invoice->line_items = $subscription_repo->generateLineItems($this->subscription); $invoice->subscription_id = $this->subscription->id; - if(strlen($data['coupon']) >=1 && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) + if(strlen($data['coupon']) >=1 && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) { $invoice->discount = $this->subscription->promo_discount; $invoice->is_amount_discount = $this->subscription->is_amount_discount; @@ -161,7 +161,7 @@ class SubscriptionService $subscription_repo = new SubscriptionRepository(); $recurring_invoice = RecurringInvoiceFactory::create($this->subscription->company_id, $this->subscription->user_id); - $recurring_invoice->client_id = $client_id; + $recurring_invoice->client_id = $client_id; $recurring_invoice->line_items = $subscription_repo->generateLineItems($this->subscription, true); $recurring_invoice->subscription_id = $this->subscription->id; $recurring_invoice->frequency_id = $this->subscription->frequency_id ?: RecurringInvoice::FREQUENCY_MONTHLY; @@ -249,10 +249,4 @@ class SubscriptionService { return Product::whereIn('id', $this->transformKeys(explode(",", $this->subscription->recurring_product_ids)))->get(); } - - public function price() - { - return 1; - } - } From e69e9f76200ce073b1b220404816925cc4719acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:11:09 +0200 Subject: [PATCH 5/7] update text on passwordless login --- resources/views/email/billing/passwordless-login.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/email/billing/passwordless-login.blade.php b/resources/views/email/billing/passwordless-login.blade.php index 0781cf9eadf7..de25c0aed036 100644 --- a/resources/views/email/billing/passwordless-login.blade.php +++ b/resources/views/email/billing/passwordless-login.blade.php @@ -3,8 +3,8 @@ @include('email.components.header', ['logo' => 'https://www.invoiceninja.com/wp-content/uploads/2015/10/logo-white-horizontal-1.png']) @endslot -

Passwordless login link requested

-

Hey, there was a request to log in using passwordless link.

+

Login link requested

+

Hey, there was a request to log in using link.

Sign in to Invoice Ninja From b25f79f4e1154b1b306ae2494309a231662df7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:20:31 +0200 Subject: [PATCH 6/7] carry coupon over magic link --- app/Http/Livewire/BillingPortalPurchase.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index 5be7aff56aab..b140d1e43db9 100644 --- a/app/Http/Livewire/BillingPortalPurchase.php +++ b/app/Http/Livewire/BillingPortalPurchase.php @@ -159,6 +159,11 @@ class BillingPortalPurchase extends Component public function mount() { $this->price = $this->subscription->price; + + if (request()->query('coupon')) { + $this->coupon = request()->query('coupon'); + $this->handleCoupon(); + } } /** @@ -371,7 +376,7 @@ class BillingPortalPurchase extends Component ->first(); $mailer = new NinjaMailerObject(); - $mailer->mailable = new ContactPasswordlessLogin($this->email, (string)route('client.subscription.purchase', $this->subscription->hashed_id)); + $mailer->mailable = new ContactPasswordlessLogin($this->email, (string)route('client.subscription.purchase', $this->subscription->hashed_id) . '?coupon=' . $this->coupon); $mailer->company = $this->subscription->company; $mailer->settings = $this->subscription->company->settings; $mailer->to_user = $contact; From 08b317f7b898550e69642f054a36cc886cdfa689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Thu, 1 Apr 2021 16:38:46 +0200 Subject: [PATCH 7/7] allow cancellation under specific conditions --- .../RecurringInvoiceController.php | 33 +++++++-------- app/Models/RecurringInvoice.php | 15 ++++--- .../recurring_invoices/show.blade.php | 40 ++++++++++--------- 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php b/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php index e484dedeba06..5d8043c767ec 100644 --- a/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php +++ b/app/Http/Controllers/ClientPortal/RecurringInvoiceController.php @@ -61,27 +61,28 @@ class RecurringInvoiceController extends Controller public function requestCancellation(Request $request, RecurringInvoice $recurring_invoice) { - //todo double check the user is able to request a cancellation - //can add locale specific by chaining ->locale(); - - $nmo = new NinjaMailerObject; - $nmo->mailable = (new NinjaMailer((new ClientContactRequestCancellationObject($recurring_invoice, auth()->user()))->build())); - $nmo->company = $recurring_invoice->company; - $nmo->settings = $recurring_invoice->company->settings; + if (is_null($recurring_invoice->subscription_id) || optional($recurring_invoice->subscription)->allow_cancellation) { + $nmo = new NinjaMailerObject; + $nmo->mailable = (new NinjaMailer((new ClientContactRequestCancellationObject($recurring_invoice, auth()->user()))->build())); + $nmo->company = $recurring_invoice->company; + $nmo->settings = $recurring_invoice->company->settings; - $notifiable_users = $this->filterUsersByPermissions($recurring_invoice->company->company_users, $recurring_invoice, ['recurring_cancellation']); + $notifiable_users = $this->filterUsersByPermissions($recurring_invoice->company->company_users, $recurring_invoice, ['recurring_cancellation']); - $notifiable_users->each(function ($company_user) use($nmo){ + $notifiable_users->each(function ($company_user) use($nmo){ - $nmo->to_user = $company_user->user; - NinjaMailerJob::dispatch($nmo); + $nmo->to_user = $company_user->user; + NinjaMailerJob::dispatch($nmo); - }); + }); - //$recurring_invoice->user->notify(new ClientContactRequestCancellation($recurring_invoice, auth()->user())); + //$recurring_invoice->user->notify(new ClientContactRequestCancellation($recurring_invoice, auth()->user())); - return $this->render('recurring_invoices.cancellation.index', [ - 'invoice' => $recurring_invoice, - ]); + return $this->render('recurring_invoices.cancellation.index', [ + 'invoice' => $recurring_invoice, + ]); + } + + return back(); } } diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 6bba8fc6242d..6727e0285c5c 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -196,7 +196,7 @@ class RecurringInvoice extends BaseModel { return $this->morphMany(Document::class, 'documentable'); } - + public function getStatusAttribute() { if ($this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture()) { @@ -394,9 +394,9 @@ class RecurringInvoice extends BaseModel if ($this->remaining_cycles == -1) { $iterations = 10; } - + $data = []; - + if (!Carbon::parse($this->next_send_date)) { return $data; } @@ -407,7 +407,7 @@ class RecurringInvoice extends BaseModel // we don't add the days... we calc the day of the month!! $next_due_date = $this->calculateDueDate($next_send_date->copy()->format('Y-m-d')); $next_due_date_string = $next_due_date ? $next_due_date->format('Y-m-d') : ''; - + $next_send_date = Carbon::parse($next_send_date); $data[] = [ @@ -420,7 +420,7 @@ class RecurringInvoice extends BaseModel /*If no due date is set - unset the due_date value */ // if(!$this->due_date_days || $this->due_date_days == 0){ - + // foreach($data as $key => $value) // $data[$key]['due_date'] = ''; @@ -468,4 +468,9 @@ class RecurringInvoice extends BaseModel { return new RecurringService($this); } + + public function subscription(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(Subscription::class); + } } diff --git a/resources/views/portal/ninja2020/recurring_invoices/show.blade.php b/resources/views/portal/ninja2020/recurring_invoices/show.blade.php index 3509eed15064..fb25f6beaed2 100644 --- a/resources/views/portal/ninja2020/recurring_invoices/show.blade.php +++ b/resources/views/portal/ninja2020/recurring_invoices/show.blade.php @@ -55,31 +55,35 @@ {{ \App\Utils\Number::formatMoney($invoice->amount, $invoice->client) }}
+ -
-
-
-
-

- {{ ctrans('texts.cancellation') }} -

-
-

- {{ ctrans('texts.about_cancellation') }} -

+ @if(is_null($invoice->subscription_id) || optional($invoice->subscription)->allow_cancellation) +
+
+
+
+

+ {{ ctrans('texts.cancellation') }} +

+
+

+ {{ ctrans('texts.about_cancellation') }} +

+
-
-
-
- - @include('portal.ninja2020.recurring_invoices.includes.modals.cancellation') +
+
+ + @include('portal.ninja2020.recurring_invoices.includes.modals.cancellation') +
-
+ @endif +
@endsection