diff --git a/uncloud/uncloud_pay/management/commands/handle-overdue-bills.py b/uncloud/uncloud_pay/management/commands/handle-overdue-bills.py new file mode 100644 index 0000000..f4749f0 --- /dev/null +++ b/uncloud/uncloud_pay/management/commands/handle-overdue-bills.py @@ -0,0 +1,43 @@ +from django.core.management.base import BaseCommand +from uncloud_auth.models import User +from uncloud_pay.models import Order, Bill +from uncloud_pay.helpers import get_balance_for, get_payment_method_for + +from datetime import timedelta +from django.utils import timezone + +class Command(BaseCommand): + help = 'Generate bills and charge customers if necessary.' + + def add_arguments(self, parser): + pass + + def handle(self, *args, **options): + users = User.objects.all() + print("Processing {} users.".format(users.count())) + for user in users: + balance = get_balance_for(user) + if balance < 0: + print("User {} has negative balance ({}), checking for overdue bills." + .format(user.username, balance)) + + # Get bills DESCENDING by creation date (= latest at top). + bills = Bill.objects.filter( + owner=user, + due_date__lt=timezone.now() + ).order_by('-creation_date') + overdue_balance = abs(balance) + overdue_bills = [] + for bill in bills: + if overdue_balance < 0: + break # XXX: I'm (fnux) not fond of breaks! + + overdue_balance -= bill.amount + overdue_bills.append(bill) + + for bill in overdue_bills: + print("/!\ Overdue bill for {}, {} with amount {}" + .format(user.username, bill.uuid, bill.amount)) + # TODO: take action? + + print("=> Done.")