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/Http/Livewire/BillingPortalPurchase.php b/app/Http/Livewire/BillingPortalPurchase.php index b77bc7ec6276..b140d1e43db9 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, ]; /** @@ -157,7 +158,12 @@ class BillingPortalPurchase extends Component public function mount() { - $this->price = $this->subscription->service()->price(); + $this->price = $this->subscription->price; + + if (request()->query('coupon')) { + $this->coupon = request()->query('coupon'); + $this->handleCoupon(); + } } /** @@ -280,6 +286,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'), @@ -368,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; 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/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; - } - } 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 -
Hey, there was a request to log in using passwordless link.
+Hey, there was a request to log in using link.
Sign in to Invoice Ninja 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..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 }}">- One-time purchase -
- @endif - - @if(!empty($subscription->recurring_product_ids)) -- Subscription -
- @endif -