diff --git a/app/Helpers/Invoice/ProRata.php b/app/Helpers/Invoice/ProRata.php index c27394662c2c..e3291b25c218 100644 --- a/app/Helpers/Invoice/ProRata.php +++ b/app/Helpers/Invoice/ProRata.php @@ -34,7 +34,7 @@ class ProRata */ public function refund(float $amount, Carbon $from_date, Carbon $to_date, int $frequency) :float { - $days = $from_date->diffInDays($to_date); + $days = $from_date->copy()->diffInDays($to_date); $days_in_frequency = $this->getDaysInFrequency($frequency); return round( (($days/$days_in_frequency) * $amount),2); @@ -52,9 +52,12 @@ class ProRata */ public function charge(float $amount, Carbon $from_date, Carbon $to_date, int $frequency) :float { - $days = $from_date->diffInDays($to_date); + $days = $from_date->copy()->diffInDays($to_date); $days_in_frequency = $this->getDaysInFrequency($frequency); - +nlog($from_date->format('Y-m-d')); +nlog($days); +nlog($days_in_frequency); +nlog($amount); return round( (($days/$days_in_frequency) * $amount),2); } diff --git a/app/Helpers/Subscription/SubscriptionCalculator.php b/app/Helpers/Subscription/SubscriptionCalculator.php index 3956ef4617ff..18dc20cd2d01 100644 --- a/app/Helpers/Subscription/SubscriptionCalculator.php +++ b/app/Helpers/Subscription/SubscriptionCalculator.php @@ -15,6 +15,7 @@ use App\Helpers\Invoice\ProRata; use App\Models\Invoice; use App\Models\RecurringInvoice; use App\Models\Subscription; +use Illuminate\Support\Carbon; /** * SubscriptionCalculator. @@ -24,7 +25,7 @@ class SubscriptionCalculator public Subscription $target_subscription; - public Invoice $invoice + public Invoice $invoice; public function __construct(Subscription $target_subscription, Invoice $invoice) { @@ -57,6 +58,8 @@ class SubscriptionCalculator //set the starting refund amount $refund_amount = 0; + $refund_invoice = false; + //are they paid up to date. //yes - calculate refund @@ -68,7 +71,7 @@ class SubscriptionCalculator $subscription = Subscription::find($this->invoice->subscription_id); $pro_rata = new ProRata(); - $to_date = $subscription->getNextDateForFrequency(Carbon::parse($refund_invoice->date), $subscription->frequency_id); + $to_date = $subscription->service()->getNextDateForFrequency(Carbon::parse($refund_invoice->date), $subscription->frequency_id); $refund_amount = $pro_rata->refund($refund_invoice->amount, now(), $to_date, $subscription->frequency_id); @@ -88,11 +91,9 @@ class SubscriptionCalculator private function getRefundInvoice() { - return Invoice::where('subscription_id', $this->invoice->subscription_id) ->where('client_id', $this->invoice->client_id) ->where('is_deleted', 0) - ->where('balance', '>', 0) ->orderBy('id', 'desc') ->first(); diff --git a/database/factories/SubscriptionFactory.php b/database/factories/SubscriptionFactory.php index 63bff1c98914..db73008bb34a 100644 --- a/database/factories/SubscriptionFactory.php +++ b/database/factories/SubscriptionFactory.php @@ -33,7 +33,8 @@ class SubscriptionFactory extends Factory public function definition() { return [ - 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY + 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, + 'name' => $this->faker->company(), ]; } } diff --git a/tests/Unit/SubscriptionsCalcTest.php b/tests/Unit/SubscriptionsCalcTest.php index 7100f25b8533..61a0adad81bd 100644 --- a/tests/Unit/SubscriptionsCalcTest.php +++ b/tests/Unit/SubscriptionsCalcTest.php @@ -10,8 +10,11 @@ */ namespace Tests\Unit; +use App\Helpers\Invoice\ProRata; +use App\Helpers\Subscription\SubscriptionCalculator; use App\Models\Invoice; use App\Models\Subscription; +use Illuminate\Support\Carbon; use Tests\MockUnitData; use Tests\TestCase; @@ -41,7 +44,13 @@ class SubscriptionsCalcTest extends TestCase 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'price' => 10, + ]); + + $target = Subscription::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'price' => 20, ]); $invoice = Invoice::factory()->create([ @@ -57,7 +66,7 @@ class SubscriptionsCalcTest extends TestCase 'tax_name3' => '', 'discount' => 0, 'subscription_id' => $subscription->id, - 'date' => now() + 'date' => '2021-01-01', ]); $invoice = $invoice->calc()->getInvoice(); @@ -69,6 +78,33 @@ class SubscriptionsCalcTest extends TestCase $this->assertEquals(10, $invoice->amount); $this->assertEquals(10, $invoice->balance); + $sub_calculator = new SubscriptionCalculator($target->fresh(), $invoice->fresh()); + + $this->assertFalse($sub_calculator->isPaidUp()); + + $invoice->service()->markPaid()->save(); + + $this->assertTrue($sub_calculator->isPaidUp()); + + $this->assertEquals(10, $invoice->amount); + $this->assertEquals(0, $invoice->balance); + + $pro_rata = new ProRata(); + + $refund = $pro_rata->refund($invoice->amount, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-06'), $subscription->frequency_id); + + $this->assertEquals(1.61, $refund); + + $pro_rata = new ProRata(); + + $upgrade = $pro_rata->charge($target->price, Carbon::parse('2021-01-01'), Carbon::parse('2021-01-06'), $subscription->frequency_id); + + $this->assertEquals(3.23, $upgrade); + + // $net_upgrade_price = $sub_calculator->calcUpgradePlan(); + + // $this->assertEquals(1.62, $net_upgrade_price); + }