begin refactor product to user orders instead of single order
Signed-off-by: Nico Schottelius <nico@nico-notebook.schottelius.org>
This commit is contained in:
parent
ef02cb61fd
commit
8df1d8dc7c
10 changed files with 224 additions and 90 deletions
|
|
@ -53,6 +53,10 @@ def end_of_this_month():
|
|||
_, last_day = monthrange(a_day.year, a_day.month)
|
||||
return a_day.replace(day=last_day,hour=23,minute=59,second=59, microsecond=0)
|
||||
|
||||
def end_before(a_date):
|
||||
""" Return suitable datetimefield for ending just before a_date """
|
||||
return a_date - datetime.timedelta(seconds=1)
|
||||
|
||||
def default_payment_delay():
|
||||
return timezone.now() + BILL_PAYMENT_DELAY
|
||||
|
||||
|
|
@ -363,30 +367,7 @@ class Order(models.Model):
|
|||
super().save(*args, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.description} (order {self.id})"
|
||||
|
||||
|
||||
# def active_before(self, ending_date):
|
||||
# # Was this order started before the specified ending date?
|
||||
# if self.starting_date <= ending_date:
|
||||
# if self.ending_date:
|
||||
# if self.ending_date > ending_date:
|
||||
# pass
|
||||
|
||||
|
||||
# Termination needs to be verified, maybe also include checking depending orders
|
||||
# @property
|
||||
# def is_terminated_now(self):
|
||||
# return self.is_terminated_at(timezone.now())
|
||||
|
||||
# def is_terminated_at(self, a_date):
|
||||
# return self.ending_date != None and self.ending_date <= a_date
|
||||
|
||||
# def terminate(self):
|
||||
# if not self.is_terminated:
|
||||
# self.ending_date = timezone.now()
|
||||
# self.save()
|
||||
|
||||
return f"{self.description} (order={self.id})"
|
||||
|
||||
class Bill(models.Model):
|
||||
"""
|
||||
|
|
@ -433,6 +414,14 @@ class Bill(models.Model):
|
|||
bill_records = BillRecord.objects.filter(bill=self)
|
||||
return sum([ br.sum for br in bill_records ])
|
||||
|
||||
@classmethod
|
||||
def create_bills_for_all_users(cls):
|
||||
"""
|
||||
Create bills for all users
|
||||
"""
|
||||
|
||||
for owner in get_user_model().objects.all():
|
||||
cls.create_next_bills_for_user(owner)
|
||||
|
||||
@classmethod
|
||||
def create_next_bills_for_user(cls, owner, ending_date=None):
|
||||
|
|
@ -578,14 +567,6 @@ class Bill(models.Model):
|
|||
|
||||
return bill
|
||||
|
||||
@classmethod
|
||||
def create_all_bills(cls):
|
||||
for owner in get_user_model().objects.all():
|
||||
# mintime = time of first order
|
||||
# maxtime = time of last order
|
||||
# iterate month based through it
|
||||
|
||||
cls.create_next_bill_for_user(owner)
|
||||
|
||||
class BillRecord(models.Model):
|
||||
"""
|
||||
|
|
@ -633,10 +614,19 @@ class Product(UncloudModel):
|
|||
|
||||
description = "Generic Product"
|
||||
|
||||
order = models.ForeignKey(Order,
|
||||
on_delete=models.CASCADE,
|
||||
editable=True,
|
||||
null=True)
|
||||
orders = models.ManyToManyField(Order)
|
||||
# one_time_order = models.ForeignKey(Order,
|
||||
# on_delete=models.CASCADE,
|
||||
# editable=True,
|
||||
# null=True,
|
||||
# related_name='product_one_time')
|
||||
|
||||
# recurring_order = models.ForeignKey(Order,
|
||||
# on_delete=models.CASCADE,
|
||||
# editable=True,
|
||||
# null=True,
|
||||
# related_name='product_recurring')
|
||||
|
||||
# FIXME: editable=True -> is in the admin, but also editable in DRF
|
||||
|
||||
status = models.CharField(max_length=32,
|
||||
|
|
@ -691,12 +681,10 @@ class Product(UncloudModel):
|
|||
if not when_to_start:
|
||||
when_to_start = timezone.now()
|
||||
|
||||
if not self.order:
|
||||
self.create_order_at(when_to_start, recurring_period)
|
||||
|
||||
else:
|
||||
# Update order = create new order
|
||||
if self.order:
|
||||
previous_order = self.order
|
||||
when_to_end = when_to_start - datetime.timedelta(seconds=1)
|
||||
when_to_end = end_before(when_to_start)
|
||||
|
||||
new_order = Order.objects.create(owner=self.owner,
|
||||
billing_address=self.order.billing_address,
|
||||
|
|
@ -706,11 +694,15 @@ class Product(UncloudModel):
|
|||
description=str(self),
|
||||
replaces=self.order)
|
||||
|
||||
print(new_order)
|
||||
self.order.end_date = when_to_end
|
||||
self.order.save()
|
||||
|
||||
self.order = new_order
|
||||
|
||||
else:
|
||||
return self.create_order_at(when_to_start, recurring_period)
|
||||
|
||||
@property
|
||||
def recurring_price(self):
|
||||
""" implement correct values in the child class """
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue