From 9e9018060efac5e6536965222d44dd5a02e876fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Floure?= Date: Mon, 2 Mar 2020 10:46:04 +0100 Subject: [PATCH] Wire order records to bills, fix user balance --- uncloud/uncloud_pay/helpers.py | 13 +++++---- uncloud/uncloud_pay/models.py | 44 ++++++++++++++++++++---------- uncloud/uncloud_pay/serializers.py | 10 ++++++- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/uncloud/uncloud_pay/helpers.py b/uncloud/uncloud_pay/helpers.py index 9f775b7..b4216f6 100644 --- a/uncloud/uncloud_pay/helpers.py +++ b/uncloud/uncloud_pay/helpers.py @@ -8,12 +8,15 @@ from django.utils import timezone from django.core.exceptions import ObjectDoesNotExist from calendar import monthrange -def sum_amounts(entries): - return reduce(lambda acc, entry: acc + entry.amount, entries, 0) - def get_balance_for(user): - bills = sum_amounts(Bill.objects.filter(owner=user)) - payments = sum_amounts(Payment.objects.filter(owner=user)) + bills = reduce( + lambda acc, entry: acc + entry.total, + Bill.objects.filter(owner=user), + 0) + payments = reduce( + lambda acc, entry: acc + entry.amount, + Payment.objects.filter(owner=user), + 0) return payments - bills def get_payment_method_for(user): diff --git a/uncloud/uncloud_pay/models.py b/uncloud/uncloud_pay/models.py index 8b19c37..e257b9e 100644 --- a/uncloud/uncloud_pay/models.py +++ b/uncloud/uncloud_pay/models.py @@ -33,26 +33,40 @@ class Bill(models.Model): valid = models.BooleanField(default=True) @property - def entries(self): - # TODO: return list of Bill entries, extract from linked order - # for each related order - # for each product - # build BillEntry - return [] + def records(self): + bill_records = [] + orders = Order.objects.filter(bill=self) + for order in orders: + for order_record in order.records: + bill_record = BillRecord( + self, + order_record.setup_fee, + order_record.recurring_price, + order_record.recurring_period, + order_record.description) + bill_records.append(bill_record) + + return bill_records @property def total(self): - orders = Order.objects.filter(bill=self) - return reduce(lambda acc, order: acc + order.amount, orders, 0) + return reduce(lambda acc, record: acc + record.amount(), self.records, 0) -class BillEntry(): - start_date = timezone.now() - end_date = timezone.now() - recurring_period = RecurringPeriod.PER_MONTH - recurring_price = 0 - amount = 0 - description = "" +class BillRecord(): + def __init__(self, bill, setup_fee, recurring_price, recurring_period, description): + self.bill = bill + self.setup_fee = setup_fee + self.recurring_price = recurring_price + self.recurring_period = recurring_period + self.description = description + def amount(self): + # TODO: Billing logic here! + if self.recurring_period == RecurringPeriod.PER_MONTH: + return self.recurring_price # TODO + else: + raise Exception('Unsupported recurring period: {}.'. + format(record.recurring_period)) # /!\ BIG FAT WARNING /!\ # # diff --git a/uncloud/uncloud_pay/serializers.py b/uncloud/uncloud_pay/serializers.py index 83eebb6..976ab6b 100644 --- a/uncloud/uncloud_pay/serializers.py +++ b/uncloud/uncloud_pay/serializers.py @@ -7,11 +7,19 @@ from functools import reduce from uncloud_vm.serializers import VMProductSerializer from uncloud_vm.models import VMProduct +# TODO: remove magic numbers for decimal fields +class BillRecordSerializer(serializers.Serializer): + description = serializers.CharField() + recurring_period = serializers.CharField() + recurring_price = serializers.DecimalField(max_digits=10, decimal_places=2) + amount = serializers.DecimalField(max_digits=10, decimal_places=2) + class BillSerializer(serializers.ModelSerializer): + records = BillRecordSerializer(many=True, read_only=True) class Meta: model = Bill fields = ['owner', 'total', 'due_date', 'creation_date', - 'starting_date', 'ending_date'] + 'starting_date', 'ending_date', 'records'] class PaymentSerializer(serializers.ModelSerializer): class Meta: