diff --git a/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php b/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php index 9f5a4275a9d1..2a185cf82fad 100644 --- a/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php +++ b/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php @@ -14,6 +14,7 @@ namespace App\Http\Controllers\ClientPortal; use App\Http\Controllers\Controller; use App\Http\Requests\ClientPortal\Subscriptions\ShowPlanSwitchRequest; +use App\Models\RecurringInvoice; use App\Models\Subscription; use Illuminate\Http\Request; @@ -23,15 +24,20 @@ class SubscriptionPlanSwitchController extends Controller * Show the page for switching between plans. * * @param ShowPlanSwitchRequest $request - * @param Subscription $subscription + * @param RecurringInvoice $recurring_invoice * @param string $target * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function index(ShowPlanSwitchRequest $request, Subscription $subscription, Subscription $target) + public function index(ShowPlanSwitchRequest $request, RecurringInvoice $recurring_invoice, Subscription $target) { + //calculate whether a payment is required or whether we pass through a credit for this. + + $amount = $recurring_invoice->subscription->service()->calculateUpgradePrice($recurring_invoice, $target); + return render('subscriptions.switch', [ 'subscription' => $subscription, 'target' => $target, + 'amount' => $amount, ]); } } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 86296b632a15..4ae0787809df 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -297,7 +297,6 @@ class InvoiceService public function deletePdf() { - nlog("delete PDF"); //UnlinkFile::dispatchNow(config('filesystems.default'), $this->invoice->client->invoice_filepath() . $this->invoice->numberFormatter().'.pdf'); Storage::disk(config('filesystems.default'))->delete($this->invoice->client->invoice_filepath() . $this->invoice->numberFormatter().'.pdf'); diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index ec0867065619..44ff80daf285 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -33,6 +33,7 @@ use App\Utils\Ninja; use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; use App\Utils\Traits\SubscriptionHooker; +use Carbon\Carbon; use GuzzleHttp\RequestOptions; class SubscriptionService @@ -44,14 +45,15 @@ class SubscriptionService /** @var subscription */ private $subscription; - /** @var client_subscription */ - // private $client_subscription; - public function __construct(Subscription $subscription) { $this->subscription = $subscription; } + /* + Performs the initial purchase of a + one time or recurring product + */ public function completePurchase(PaymentHash $payment_hash) { @@ -181,9 +183,72 @@ class SubscriptionService return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id); } + public function calculateUpgradePrice(RecurringInvoice $recurring_invoice, Subscription $target) + { + //calculate based on daily prices + + $current_amount = $recurring_invoice->amount; + $currency_frequency = $recurring_invoice->frequency_id; + + $outstanding = $recurring_invoice->invoices + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) + ->where('balance', '>', 0); + + $outstanding_amounts = $outstanding->sum('balance'); + $outstanding_invoices = $outstanding->get(); + + if ($outstanding->count() == 0){ + //nothing outstanding + } + elseif ($outstanding_amounts > $current_amount){ + //user has multiple amounts outstanding + } + elseif ($outstanding_amounts < $current_amount && $outstanding_amounts > 0) { + //user is changing plan mid frequency cycle + } + + // $current_plan_price = $this->subscription + } + + private function calculateProRataRefund($invoice) + { + //determine the start date + + $start_date = Carbon::parse($invoice->date); + + $current_date = now(); + + $days_to_refund = $start_date->diffInDays($current_date); + } public function createChangePlanInvoice($data) { + //Data array structure + /** + * [ + * 'subscription' => Subscription::class, + * 'target' => Subscription::class + * ] + */ + + //logic + + // Is the user paid up to date? ie are there any outstanding invoices for this subscription + + // User in arrears. + + + // User paid up to date (in credit!) + + //generate credit amount. + // + //generate new billable amount + // + + //if billable amount is LESS than 0 -> generate a credit and pass through. + // + //if billable amoun is GREATER than 0 -> gener return Invoice::where('status_id', Invoice::STATUS_SENT)->first(); } diff --git a/resources/views/portal/ninja2020/recurring_invoices/show.blade.php b/resources/views/portal/ninja2020/recurring_invoices/show.blade.php index 23faca8dcbf1..4858ebb8aa70 100644 --- a/resources/views/portal/ninja2020/recurring_invoices/show.blade.php +++ b/resources/views/portal/ninja2020/recurring_invoices/show.blade.php @@ -92,7 +92,7 @@