From bcf34a6e62d5a2bf7e2ebc2aac763fa5d86a26d2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 21 Oct 2021 12:40:59 +1100 Subject: [PATCH] Refactor Refunds --- app/Helpers/Invoice/Refund.php | 62 +++++++++++++++++++ .../Subscription/SubscriptionService.php | 54 ---------------- tests/Unit/RefundUnitTest.php | 48 ++------------ 3 files changed, 67 insertions(+), 97 deletions(-) create mode 100644 app/Helpers/Invoice/Refund.php diff --git a/app/Helpers/Invoice/Refund.php b/app/Helpers/Invoice/Refund.php new file mode 100644 index 000000000000..e4e12dd0b9c8 --- /dev/null +++ b/app/Helpers/Invoice/Refund.php @@ -0,0 +1,62 @@ +diffInDays($to_date); + $days_in_frequency = $this->getDaysInFrequency($frequency); + + return round( (($days/$days_in_frequency) * $amount),2); + } + + private function getDaysInFrequency($frequency) + { + + switch ($frequency) { + case RecurringInvoice::FREQUENCY_DAILY: + return 1; + case RecurringInvoice::FREQUENCY_WEEKLY: + return 7; + case RecurringInvoice::FREQUENCY_TWO_WEEKS: + return 14; + case RecurringInvoice::FREQUENCY_FOUR_WEEKS: + return now()->diffInDays(now()->addWeeks(4)); + case RecurringInvoice::FREQUENCY_MONTHLY: + return now()->diffInDays(now()->addMonthNoOverflow()); + case RecurringInvoice::FREQUENCY_TWO_MONTHS: + return now()->diffInDays(now()->addMonthNoOverflow(2)); + case RecurringInvoice::FREQUENCY_THREE_MONTHS: + return now()->diffInDays(now()->addMonthNoOverflow(3)); + case RecurringInvoice::FREQUENCY_FOUR_MONTHS: + return now()->diffInDays(now()->addMonthNoOverflow(4)); + case RecurringInvoice::FREQUENCY_SIX_MONTHS: + return now()->diffInDays(now()->addMonthNoOverflow(6)); + case RecurringInvoice::FREQUENCY_ANNUALLY: + return now()->diffInDays(now()->addYear()); + case RecurringInvoice::FREQUENCY_TWO_YEARS: + return now()->diffInDays(now()->addYears(2)); + case RecurringInvoice::FREQUENCY_THREE_YEARS: + return now()->diffInDays(now()->addYears(3)); + default: + return 0; + } + + } + +} \ No newline at end of file diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index e303b3038ab3..da820b59c75b 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -299,24 +299,6 @@ class SubscriptionService } - /** - * Calculates the pro rata refund between two dates - * using a daily calculation. - * - * @param float $amount - * @param Carbon $from_date - * @param Carbon $to_date - * @param int $frequency The billing interval - * @return float - */ - private function proRataRefund(float $amount, Carbon $from_date, Carbon $to_date, int $frequency) :float - { - $days = $from_date->diffInDays($to_date); - $days_in_frequency = $this->getDaysInFrequencySpecific($frequency); - - return round( ($days/$days_in_frequency) * $amount); - } - /** * Returns refundable set of line items * transformed for direct injection into @@ -952,42 +934,6 @@ class SubscriptionService } - private function getDaysInFrequencySpecific($frequency) - { - - switch ($frequency) { - case RecurringInvoice::FREQUENCY_DAILY: - return 1; - case RecurringInvoice::FREQUENCY_WEEKLY: - return 7; - case RecurringInvoice::FREQUENCY_TWO_WEEKS: - return 14; - case RecurringInvoice::FREQUENCY_FOUR_WEEKS: - return now()->diffInDays(now()->addWeeks(4)); - case RecurringInvoice::FREQUENCY_MONTHLY: - return now()->diffInDays(now()->addMonthNoOverflow()); - case RecurringInvoice::FREQUENCY_TWO_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(2)); - case RecurringInvoice::FREQUENCY_THREE_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(3)); - case RecurringInvoice::FREQUENCY_FOUR_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(4)); - case RecurringInvoice::FREQUENCY_SIX_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(6)); - case RecurringInvoice::FREQUENCY_ANNUALLY: - return now()->diffInDays(now()->addYear()); - case RecurringInvoice::FREQUENCY_TWO_YEARS: - return now()->diffInDays(now()->addYears(2)); - case RecurringInvoice::FREQUENCY_THREE_YEARS: - return now()->diffInDays(now()->addYears(3)); - default: - return 0; - } - - } - - - /** * 'email' => $this->email ?? $this->contact->email, * 'quantity' => $this->quantity, diff --git a/tests/Unit/RefundUnitTest.php b/tests/Unit/RefundUnitTest.php index 5679a534f8bc..bfecc4b616f5 100644 --- a/tests/Unit/RefundUnitTest.php +++ b/tests/Unit/RefundUnitTest.php @@ -10,6 +10,7 @@ */ namespace Tests\Unit; +use App\Helpers\Invoice\Refund; use App\Models\RecurringInvoice; use App\Utils\Ninja; use Illuminate\Support\Carbon; @@ -28,7 +29,8 @@ class RefundUnitTest extends TestCase public function testProRataRefundMonthly() { - $refund = $this->proRataRefund(10, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-31'), RecurringInvoice::FREQUENCY_MONTHLY); + $r = new Refund(); + $refund = $r->proRata(10, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-31'), RecurringInvoice::FREQUENCY_MONTHLY); $this->assertEquals(9.68, $refund); @@ -38,8 +40,9 @@ class RefundUnitTest extends TestCase public function testProRataRefundYearly() { + $r = new Refund(); - $refund = $this->proRataRefund(10, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-31'), RecurringInvoice::FREQUENCY_ANNUALLY); + $refund = $r->proRata(10, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-31'), RecurringInvoice::FREQUENCY_ANNUALLY); $this->assertEquals(0.82, $refund); } @@ -51,45 +54,4 @@ class RefundUnitTest extends TestCase } - private function proRataRefund(float $amount, Carbon $from_date, Carbon $to_date, int $frequency) :float - { - $days = $from_date->diffInDays($to_date); - $days_in_frequency = $this->getDaysInFrequencySpecific($frequency); - - return round( (($days/$days_in_frequency) * $amount),2); - } - - private function getDaysInFrequencySpecific($frequency) - { - - switch ($frequency) { - case RecurringInvoice::FREQUENCY_DAILY: - return 1; - case RecurringInvoice::FREQUENCY_WEEKLY: - return 7; - case RecurringInvoice::FREQUENCY_TWO_WEEKS: - return 14; - case RecurringInvoice::FREQUENCY_FOUR_WEEKS: - return now()->diffInDays(now()->addWeeks(4)); - case RecurringInvoice::FREQUENCY_MONTHLY: - return now()->diffInDays(now()->addMonthNoOverflow()); - case RecurringInvoice::FREQUENCY_TWO_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(2)); - case RecurringInvoice::FREQUENCY_THREE_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(3)); - case RecurringInvoice::FREQUENCY_FOUR_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(4)); - case RecurringInvoice::FREQUENCY_SIX_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(6)); - case RecurringInvoice::FREQUENCY_ANNUALLY: - return now()->diffInDays(now()->addYear()); - case RecurringInvoice::FREQUENCY_TWO_YEARS: - return now()->diffInDays(now()->addYears(2)); - case RecurringInvoice::FREQUENCY_THREE_YEARS: - return now()->diffInDays(now()->addYears(3)); - default: - return 0; - } - } - } \ No newline at end of file