From a382dbe1b65d4ea032f4b934ad714c853a4a73b6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 19 Jan 2023 13:20:05 +1100 Subject: [PATCH] Fixes for calculating pro rata refunds for subscriptions --- app/Jobs/Product/UpdateOrCreateProduct.php | 2 ++ .../Subscription/SubscriptionService.php | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/Jobs/Product/UpdateOrCreateProduct.php b/app/Jobs/Product/UpdateOrCreateProduct.php index a614820441d9..f5ef6ef22a50 100644 --- a/app/Jobs/Product/UpdateOrCreateProduct.php +++ b/app/Jobs/Product/UpdateOrCreateProduct.php @@ -29,6 +29,8 @@ class UpdateOrCreateProduct implements ShouldQueue public $company; + public $deleteWhenMissingModels = true; + /** * Create a new job instance. * diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 6a7c7ea327c0..3c59d33fdfbc 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -331,6 +331,7 @@ class SubscriptionService * We refund unused days left. * * @param Invoice $invoice + * * @return float */ private function calculateProRataRefundForSubscription($invoice) :float @@ -338,6 +339,20 @@ class SubscriptionService if(!$invoice || !$invoice->date || $invoice->status_id != Invoice::STATUS_PAID) return 0; + /*Remove previous refunds from the calculation of the amount*/ + $invoice->line_items = collect($invoice->line_items)->filter(function($item){ + + if($item->product_key == ctrans("texts.refund")) + { + return false; + } + + return true; + + })->toArray(); + + $amount = $invoice->calc()->getTotal(); + $start_date = Carbon::parse($invoice->date); $current_date = now(); @@ -346,7 +361,7 @@ class SubscriptionService $days_in_frequency = $this->getDaysInFrequency(); - $pro_rata_refund = round((($days_in_frequency - $days_of_subscription_used)/$days_in_frequency) * $invoice->amount ,2); + $pro_rata_refund = round((($days_in_frequency - $days_of_subscription_used)/$days_in_frequency) * $amount ,2); return max(0, $pro_rata_refund);