test_mailbox_with_recharge tests passing
This commit is contained in:
parent
46f9f4d88e
commit
c8651cf4ed
|
@ -409,10 +409,30 @@ class ServiceHandler(plugins.Plugin):
|
||||||
lines = []
|
lines = []
|
||||||
bp = None
|
bp = None
|
||||||
for order in orders:
|
for order in orders:
|
||||||
|
bp = self.get_billing_point(order, bp=bp, **options)
|
||||||
|
if (self.billing_period != self.NEVER and
|
||||||
|
self.get_pricing_period() == self.NEVER and
|
||||||
|
self.payment_style == self.PREPAY and order.billed_on):
|
||||||
|
# Recharge
|
||||||
|
if self.payment_style == self.PREPAY and order.billed_on:
|
||||||
|
rini = order.billed_on
|
||||||
|
charged = None
|
||||||
|
new_metric, new_price = 0, 0
|
||||||
|
for cini, cend, metric in order.get_metric(rini, bp, changes=True):
|
||||||
|
if charged is None:
|
||||||
|
charged = metric
|
||||||
|
size = self.get_price_size(cini, cend)
|
||||||
|
new_price += self.get_price(order, metric) * size
|
||||||
|
new_metric += metric
|
||||||
|
size = self.get_price_size(rini, bp)
|
||||||
|
old_price = self.get_price(order, charged) * size
|
||||||
|
if new_price > old_price:
|
||||||
|
metric = new_metric - charged
|
||||||
|
price = new_price - old_price
|
||||||
|
lines.append(self.generate_line(order, price, rini, bp, metric=metric, computed=True))
|
||||||
if order.billed_until and order.cancelled_on and order.cancelled_on >= order.billed_until:
|
if order.billed_until and order.cancelled_on and order.cancelled_on >= order.billed_until:
|
||||||
continue
|
continue
|
||||||
if self.billing_period != self.NEVER:
|
if self.billing_period != self.NEVER:
|
||||||
bp = self.get_billing_point(order, bp=bp, **options)
|
|
||||||
ini = order.billed_until or order.registered_on
|
ini = order.billed_until or order.registered_on
|
||||||
# Periodic billing
|
# Periodic billing
|
||||||
if bp <= ini:
|
if bp <= ini:
|
||||||
|
@ -425,6 +445,8 @@ class ServiceHandler(plugins.Plugin):
|
||||||
lines.append(self.generate_line(order, price, cini, cend, metric=metric))
|
lines.append(self.generate_line(order, price, cini, cend, metric=metric))
|
||||||
elif self.get_pricing_period() == self.billing_period:
|
elif self.get_pricing_period() == self.billing_period:
|
||||||
# pricing_slots (Traffic-like)
|
# pricing_slots (Traffic-like)
|
||||||
|
if self.payment_style == self.PREPAY:
|
||||||
|
raise NotImplementedError
|
||||||
for cini, cend in self.get_pricing_slots(ini, bp):
|
for cini, cend in self.get_pricing_slots(ini, bp):
|
||||||
metric = order.get_metric(cini, cend)
|
metric = order.get_metric(cini, cend)
|
||||||
price = self.get_price(order, metric)
|
price = self.get_price(order, metric)
|
||||||
|
@ -456,7 +478,8 @@ class ServiceHandler(plugins.Plugin):
|
||||||
if options.get('commit', True):
|
if options.get('commit', True):
|
||||||
now = timezone.now().date()
|
now = timezone.now().date()
|
||||||
for line in lines:
|
for line in lines:
|
||||||
line.order.billed_on = now
|
order = line.order
|
||||||
line.order.billed_until = line.order.new_billed_until
|
order.billed_on = now
|
||||||
line.order.save()
|
order.billed_until = getattr(order, 'new_billed_until', order.billed_until)
|
||||||
|
order.save()
|
||||||
return lines
|
return lines
|
||||||
|
|
|
@ -129,5 +129,31 @@ class MailboxBillingTest(BaseBillingTest):
|
||||||
bill = service.orders.bill(**options).pop()
|
bill = service.orders.bill(**options).pop()
|
||||||
total = 9*10*0.5 + 19*10*0.25 + 29*10*0.25
|
total = 9*10*0.5 + 19*10*0.25 + 29*10*0.25
|
||||||
self.assertEqual(total, bill.get_total())
|
self.assertEqual(total, bill.get_total())
|
||||||
|
|
||||||
|
def test_mailbox_with_recharge(self):
|
||||||
|
service = self.create_mailbox_disk_service()
|
||||||
|
self.create_disk_resource()
|
||||||
|
account = self.create_account()
|
||||||
|
mailbox = self.create_mailbox(account=account)
|
||||||
|
now = timezone.now()
|
||||||
|
bp = now.date() + relativedelta(years=1)
|
||||||
|
options = dict(billing_point=bp, fixed_point=True)
|
||||||
|
|
||||||
|
self.allocate_disk(mailbox, 100)
|
||||||
|
bill = service.orders.bill(**options).pop()
|
||||||
|
self.assertEqual(99*10, bill.get_total())
|
||||||
|
|
||||||
|
with freeze_time(now+relativedelta(months=6)):
|
||||||
|
self.allocate_disk(mailbox, 50)
|
||||||
|
bills = service.orders.bill(**options)
|
||||||
|
self.assertEqual([], bills)
|
||||||
|
|
||||||
|
with freeze_time(now+relativedelta(months=6)):
|
||||||
|
self.allocate_disk(mailbox, 200)
|
||||||
|
bill = service.orders.bill(new_open=True, **options).pop()
|
||||||
|
self.assertEqual((199-99)*10*0.5, bill.get_total())
|
||||||
|
|
||||||
|
with freeze_time(now+relativedelta(months=6)):
|
||||||
|
bills = service.orders.bill(new_open=True, **options)
|
||||||
|
self.assertEqual([], bills)
|
||||||
|
|
||||||
# TODO recharge missing stuff
|
|
||||||
|
|
Loading…
Reference in New Issue