diff --git a/app/Http/Controllers/ClientPortal/SubscriptionController.php b/app/Http/Controllers/ClientPortal/SubscriptionController.php index 21fa9116c23e..dd7634cfc264 100644 --- a/app/Http/Controllers/ClientPortal/SubscriptionController.php +++ b/app/Http/Controllers/ClientPortal/SubscriptionController.php @@ -13,6 +13,7 @@ namespace App\Http\Controllers\ClientPortal; use App\Http\Controllers\Controller; +use App\Http\Requests\ClientPortal\RecurringInvoices\ShowRecurringInvoiceRequest; use App\Models\RecurringInvoice; use App\Utils\Ninja; use Illuminate\Http\Request; @@ -38,4 +39,20 @@ class SubscriptionController extends Controller return render('subscriptions.index'); } + + /** + * Display the recurring invoice. + * + * @param ShowRecurringInvoiceRequest $request + * @param RecurringInvoice $recurring_invoice + * @return Factory|View + */ + public function show(ShowRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) + { + return $this->render('subscriptions.show', [ + 'invoice' => $recurring_invoice->load('invoices','subscription'), + 'subscription' => $recurring_invoice->subscription + ]); + } + } diff --git a/app/Http/Controllers/PaymentWebhookController.php b/app/Http/Controllers/PaymentWebhookController.php index 9f03b3697e09..7cd9152e949c 100644 --- a/app/Http/Controllers/PaymentWebhookController.php +++ b/app/Http/Controllers/PaymentWebhookController.php @@ -18,6 +18,10 @@ class PaymentWebhookController extends Controller { public function __invoke(PaymentWebhookRequest $request) { + //return early if we cannot resolve the company gateway + if(!$request->getCompanyGateway()) + return response()->json([], 200); + return $request ->getCompanyGateway() ->driver() diff --git a/app/Http/Livewire/SubscriptionsTable.php b/app/Http/Livewire/SubscriptionsTable.php new file mode 100644 index 000000000000..3f5071ed1028 --- /dev/null +++ b/app/Http/Livewire/SubscriptionsTable.php @@ -0,0 +1,51 @@ +company->db); + } + + public function render() + { + $query = RecurringInvoice::query() + ->where('client_id', auth()->guard('contact')->user()->client->id) + ->where('company_id', $this->company->id) + ->whereNotNull('subscription_id') + ->where('is_deleted', false) + ->where('status_id', RecurringInvoice::STATUS_ACTIVE) + ->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc') + ->withTrashed() + ->paginate($this->per_page); + + return render('components.livewire.subscriptions-table', [ + 'recurring_invoices' => $query, + ]); + } +} diff --git a/app/Http/Requests/Payments/PaymentWebhookRequest.php b/app/Http/Requests/Payments/PaymentWebhookRequest.php index b3c528c776d9..b55c587ab54a 100644 --- a/app/Http/Requests/Payments/PaymentWebhookRequest.php +++ b/app/Http/Requests/Payments/PaymentWebhookRequest.php @@ -47,7 +47,8 @@ class PaymentWebhookRequest extends Request { MultiDB::findAndSetDbByCompanyKey($this->company_key); - return CompanyGateway::withTrashed()->findOrFail($this->decodePrimaryKey($this->company_gateway_id)); + return CompanyGateway::withTrashed()->find($this->decodePrimaryKey($this->company_gateway_id)); + } /** diff --git a/resources/views/portal/ninja2020/components/livewire/subscriptions-table.blade.php b/resources/views/portal/ninja2020/components/livewire/subscriptions-table.blade.php index cf8af07fcd43..2c14db058ddb 100644 --- a/resources/views/portal/ninja2020/components/livewire/subscriptions-table.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/subscriptions-table.blade.php @@ -1,10 +1,5 @@
-

- One-time payments -

- -
+
- - - - - -
-
-
-
- - - + + - @forelse($invoices as $invoice) + @forelse($recurring_invoices as $recurring_invoice) + + + @empty @@ -138,13 +83,13 @@
- - {{ ctrans('texts.invoice') }} - +

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

+
+

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

- - {{ ctrans('texts.total') }} - +

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

+
+

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

- - {{ ctrans('texts.date') }} -
- subscription->name }} + + {{ \App\Models\RecurringInvoice::frequencyForKey($recurring_invoice->frequency_id) }} + + - {{ $invoice->number }} + {{ $recurring_invoice->number }} - {{ App\Utils\Number::formatMoney($invoice->amount, $invoice->client) }} + {{ App\Utils\Number::formatMoney($recurring_invoice->amount, $recurring_invoice->client) }} - {{ $invoice->translateDate($invoice->date, $invoice->client->date_format(), $invoice->client->locale()) }} + {{ $recurring_invoice->translateDate($recurring_invoice->date, $recurring_invoice->client->date_format(), $recurring_invoice->client->locale()) }} + + + {{ ctrans('texts.view') }} +
+
- @if($invoices->total() > 0) + @if($recurring_invoices->total() > 0) @endif - {{ $invoices->links('portal/ninja2020/vendor/pagination') }} + {{ $recurring_invoices->links('portal/ninja2020/vendor/pagination') }}
-
diff --git a/resources/views/portal/ninja2020/subscriptions/index.blade.php b/resources/views/portal/ninja2020/subscriptions/index.blade.php index fd25ac7a1e51..83da36c5e909 100644 --- a/resources/views/portal/ninja2020/subscriptions/index.blade.php +++ b/resources/views/portal/ninja2020/subscriptions/index.blade.php @@ -3,6 +3,6 @@ @section('body')
- @livewire('subscription-recurring-invoices-table', ['company' => $company]) + @livewire('subscriptions-table', ['company' => $company])
@endsection diff --git a/resources/views/portal/ninja2020/subscriptions/show.blade.php b/resources/views/portal/ninja2020/subscriptions/show.blade.php new file mode 100644 index 000000000000..15e8b41b4357 --- /dev/null +++ b/resources/views/portal/ninja2020/subscriptions/show.blade.php @@ -0,0 +1,120 @@ +@extends('portal.ninja2020.layout.app') +@section('meta_title', ctrans('texts.subscription')) + +@section('body') +
+
+
+

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

+

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

+
+
+
+
+
+ {{ ctrans('texts.start_date') }} +
+
+ {{ $invoice->translateDate($invoice->start_date, $invoice->client->date_format(), $invoice->client->locale()) }} +
+
+
+
+ {{ ctrans('texts.next_send_date') }} +
+
+ {{ $invoice->translateDate(\Carbon\Carbon::parse($invoice->next_send_date)->subSeconds($invoice->client->timezone_offset()), $invoice->client->date_format(), $invoice->client->locale()) }} +
+
+
+
+ {{ ctrans('texts.frequency') }} +
+
+ {{ \App\Models\RecurringInvoice::frequencyForKey($invoice->frequency_id) }} +
+
+
+
+ {{ ctrans('texts.cycles_remaining') }} +
+
+ {{ $invoice->remaining_cycles == '-1' ? ctrans('texts.endless') : $invoice->remaining_cycles }} + @if($invoice->remaining_cycles == '-1') ∞ @endif +
+
+
+
+ {{ ctrans('texts.amount') }} +
+
+ {{ \App\Utils\Number::formatMoney($invoice->amount, $invoice->client) }} +
+
+
+
+
+ + @include('portal.ninja2020.components.entity-documents', ['entity' => $invoice]) + + @if($invoice->auto_bill === 'optin' || $invoice->auto_bill === 'optout') +
+
+
+

{{ ctrans('texts.auto_bill') }}

+

{{ ctrans('texts.auto_bill_option')}}

+
+ +
+ @livewire('recurring-invoices.update-auto-billing', ['invoice' => $invoice]) +
+
+
+ @endif + + @if($invoice->subscription && $invoice->subscription?->allow_cancellation) + {{-- INV2-591 --}} + {{-- @if(false) --}} +
+
+
+
+

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

+
+

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

+
+
+
+
+ + @include('portal.ninja2020.recurring_invoices.includes.modals.cancellation') +
+
+
+
+
+ @endif + + @if($invoice->subscription && $invoice->subscription->allow_plan_changes) +
+

Switch Plans:

+

Upgrade or downgrade your current plan.

+ +
+ @foreach($invoice->subscription->service()->getPlans() as $subscription) + {{ $subscription->name }} + @endforeach +
+
+ @endif +
+@endsection diff --git a/routes/client.php b/routes/client.php index f322850ab1b0..c02a23cb26a3 100644 --- a/routes/client.php +++ b/routes/client.php @@ -98,8 +98,9 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'domain_db','check_clie Route::resource('documents', App\Http\Controllers\ClientPortal\DocumentController::class)->only(['index', 'show']); Route::get('subscriptions/{recurring_invoice}/plan_switch/{target}', [App\Http\Controllers\ClientPortal\SubscriptionPlanSwitchController::class, 'index'])->name('subscription.plan_switch'); - - Route::resource('subscriptions', SubscriptionController::class)->middleware('portal_enabled')->only(['index']); + + Route::get('subscriptions/{recurring_invoice}', [SubscriptionController::class, 'show'])->middleware('portal_enabled')->name('subscriptions.show'); + Route::get('subscriptions', [SubscriptionController::class, 'index'])->middleware('portal_enabled')->name('subscriptions.index'); Route::resource('tasks', TaskController::class)->only(['index']);