function it_should_spread_the_bursary_when_the_plan_spans_multiple_years($baseCalculator, PaymentPlan $planBeforeBursary, PaymentPlan $finalPlan) { $baseCalculator->getPlan(Def::withName('Foo'), Money::GBP(250), Argument::any())->willReturn($planBeforeBursary); $planBeforeBursary->getPlannedPayments()->willReturn([PlannedPayment::immediate(Money::GBP(50)), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2014-01-01')), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2014-06-01')), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2015-01-01')), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2015-06-01'))]); $planBeforeBursary->getShortDescription()->willReturn('foo'); $planBeforeBursary->getLongDescription()->willReturn('foofoo'); $finalPlan = new PaymentPlan([PlannedPayment::immediate(Money::GBP(50)), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2014-01-01')), PlannedPayment::withDueDate(Money::GBP(40), DueDate::fromString('2014-06-01')), PlannedPayment::withDueDate(Money::GBP(50), DueDate::fromString('2015-01-01')), PlannedPayment::withDueDate(Money::GBP(40), DueDate::fromString('2015-06-01'))], 'foo', 'foofoo'); $this->getPlan(Def::withName('Foo'), Money::GBP(230), Params::fromArray(['bursary_total_deduction' => 20]))->shouldBeLike($finalPlan); }
function it_should_use_a_registered_modifier_when_it_is_part_of_the_plan_definition($basePlan, PlanModifierInterface $modifier, PaymentPlan $planProvidedByModifier, PaymentPlan $unmodifiedPlan) { $definition = PlanDefinition::withNameAndAttributesAsArray('Foo', ['modifiers' => ['mymodifier']]); $this->registerModifier('mymodifier', $modifier); $modifier->setBaseCalculator($basePlan)->shouldBeCalled(); $modifier->getPlan($definition, Money::GBP(100), PlanParameters::none())->shouldBeCalled()->willReturn($planProvidedByModifier); $basePlan->getPlan(PlanDefinition::withName('Foo'), Money::GBP(100), PlanParameters::none())->willReturn($unmodifiedPlan); $this->getPlan($definition, Money::GBP(100), PlanParameters::none())->shouldReturn($planProvidedByModifier); $this->getPlan(PlanDefinition::withName('Foo'), Money::GBP(100), PlanParameters::none())->shouldReturn($unmodifiedPlan); }
function testIntegration() { $definition = PlanDefinition::withNameAndAttributesAsArray('PercentOnDate', ['short_description' => '20/40/40 split', 'long_description' => '20% immediately, 40% on 2014/01/01, 40% on 2014/03/01, except that bursaries are always taken from the final instalment', 'payments' => ['immediate' => 0.2, '2014-01-01' => 0.4, '2014-03-01' => 0.4], 'modifiers' => ['bursary_off_final_payment']]); $params = PlanParameters::fromArray(['bursary_total_deduction' => 10]); $this->assertTrue($this->factory->isAvailable($definition, Money::GBP(90), $params)); $plan = $this->factory->getPlan($definition, Money::GBP(90), $params); /** * The net booking cost is 90, which includes a 10 deduction for a bursary. Without the bursary, we'd expect * the 100 to be split as 20/40/40. With the bursary_off_final_payment modifier, this becomes 20/40/30 */ $this->assertEquals(new PaymentPlan([PlannedPayment::immediate(Money::GBP(20)), PlannedPayment::withDueDate(Money::GBP(40), DueDate::fromString('2014-01-01')), PlannedPayment::withDueDate(Money::GBP(30), DueDate::fromString('2014-03-01'))], '20/40/40 split', '20% immediately, 40% on 2014/01/01, 40% on 2014/03/01, except that bursaries are always taken from the final instalment'), $plan); }
/** * @param PlanDefinition $definition * @param Money $amountToPay * @param PlanParameters $parameters * @return bool */ public function isAvailable(PlanDefinition $definition, Money $amountToPay, PlanParameters $parameters) { return $definition->hasAttributes(['short_description', 'long_description', 'payments']); }
public function testFunction() { $calculator = $this->getContainer()->get('ice.payment_plan.calculator'); $plan = $calculator->getPlan(PlanDefinition::withNameAndAttributesAsArray('PercentOnDate', ['short_description' => 'Test', 'long_description' => 'My test plan', 'payments' => ['immediate' => 0.4, '2016-01-01' => 0.6], 'modifiers' => ['bursary_off_final_payment']]), Money::GBP(1000), PlanParameters::none()); $this->assertInstanceOf('Ice\\PaymentPlan\\PaymentPlan', $plan); }
function it_should_return_a_plan_based_on_definition_attributes() { $expected = new PaymentPlan([PlannedPayment::immediate(Money::GBP(10)), PlannedPayment::withDueDate(Money::GBP(70), DueDate::fromString('2014-01-01')), PlannedPayment::withDueDate(Money::GBP(20), DueDate::fromString('2015-01-01'))], 'Foo', 'FooFoo'); $this->getPlan(PlanDefinition::withNameAndAttributesAsArray('PercentOnDate', ['short_description' => 'Foo', 'long_description' => 'FooFoo', 'payments' => ['immediate' => 0.1, '2014-01-01' => 0.7, '2015-01-01' => 0.2]]), Money::GBP(100), PlanParameters::none())->shouldBeLike($expected); }
function it_should_support_whatever_plan_codes_its_children_support() { $this->supportsDefinition(PlanDefinition::withName('Foo'))->shouldReturn(true); $this->supportsDefinition(PlanDefinition::withName('Bar'))->shouldReturn(false); }
/** * @param PlanDefinition $definition * @param Money $amountToPay * @param \Ice\PaymentPlan\PlanParameters $parameters * @internal param string $planCode * @return \Ice\PaymentPlan\PaymentPlan */ public function getPlan(PlanDefinition $definition, Money $amountToPay, PlanParameters $parameters) { $calculator = $this->getModifiedCalculator($definition->hasAttribute('modifiers') ? $definition->getAttribute('modifiers') : []); return $calculator->getPlan($definition, $amountToPay, $parameters); }