def test_pennies_zeros(self): values = ratio_split( Decimal("11.05"), [Decimal("1"), Decimal("1"), Decimal("0")] ) self.assertEqual(values, [Decimal("5.53"), Decimal("5.52"), Decimal("0.00")]) values = ratio_split( Decimal("11.05"), [Decimal("0"), Decimal("1"), Decimal("1")] ) self.assertEqual(values, [Decimal("0.00"), Decimal("5.53"), Decimal("5.52")])
def get_amount_normal(self, billing_cycle): """Get the amount due on the given billing cycle For regular recurring costs this is simply `fixed_amount`. For one-off costs this is the portion of `fixed_amount` for the given billing_cycle. """ if self.is_one_off(): billing_cycle_number = self._get_billing_cycle_number( billing_cycle) if billing_cycle_number > self.total_billing_cycles: # A future billing cycle after this one has ended return Decimal('0') else: # This is a current cycle. Split the amount into # equal parts then return the part for this cycle splits = ratio_split( amount=self.fixed_amount, ratios=[Decimal('1')] * self.total_billing_cycles, ) return splits[billing_cycle_number - 1] else: # This is a none-one-off recurring cost, so the logic is simple return self.fixed_amount
def test_pennies(self): values = ratio_split( Decimal("-11.06"), [Decimal("1"), Decimal("1"), Decimal("1"), Decimal("1")] ) self.assertEqual( values, [Decimal("-2.77"), Decimal("-2.77"), Decimal("-2.76"), Decimal("-2.76")], )
def test_extra_penny(self): values = ratio_split( Decimal('10'), [Decimal('3'), Decimal('3'), Decimal('3')]) self.assertEqual(values, [Decimal('3.33'), Decimal('3.33'), Decimal('3.34')])
def test_less_penny(self): values = ratio_split( Decimal('8'), [Decimal('3'), Decimal('3'), Decimal('3')]) self.assertEqual(values, [Decimal('2.67'), Decimal('2.67'), Decimal('2.66')])
def test_extra_penny(self): values = ratio_split( Decimal("10"), [Decimal("3"), Decimal("3"), Decimal("3")]) self.assertEqual(values, [Decimal("3.33"), Decimal("3.33"), Decimal("3.34")])
def test_less_penny(self): values = ratio_split( Decimal("8"), [Decimal("3"), Decimal("3"), Decimal("3")]) self.assertEqual(values, [Decimal("2.67"), Decimal("2.67"), Decimal("2.66")])
def split(self, amount): """Split the value given by amount according to the RecurringCostSplit's portions Args: amount (Decimal): Returns: list[(RecurringCostSplit, Decimal)]: A list with elements in the form (RecurringCostSplit, Decimal) """ split_objs = list(self.all()) if not split_objs: raise NoSplitsFoundForRecurringCost() portions = [split_obj.portion for split_obj in split_objs] split_amounts = ratio_split(amount, portions) return [(split_objs[i], split_amount) for i, split_amount in enumerate(split_amounts)]
def test_all_equal(self): values = ratio_split( Decimal('30'), [Decimal('3'), Decimal('3'), Decimal('3')]) self.assertEqual(values, [Decimal('10'), Decimal('10'), Decimal('10')])
def test_all_equal(self): values = ratio_split( Decimal("30"), [Decimal("3"), Decimal("3"), Decimal("3")]) self.assertEqual(values, [Decimal("10"), Decimal("10"), Decimal("10")])