diff --git a/core/models/billable.py b/core/models/billable.py index 9326029..2f7009f 100644 --- a/core/models/billable.py +++ b/core/models/billable.py @@ -1,9 +1,14 @@ from django.db.models import IntegerChoices, Model, ForeignKey, CASCADE, TextField, PositiveIntegerField, BooleanField, DateField +from django.utils import timezone from core.models.profiles import ClientProfile from core.models.brands import Brand from core.fields.base import LongCharField from core.fields.numbers import CostField +from core.models.invoices import InvoiceItem, Invoice + +from dateutil.relativedelta import relativedelta + class ActionChoices(IntegerChoices): WAIT = 0, "Do not invoice for now" @@ -11,12 +16,14 @@ class ActionChoices(IntegerChoices): CRON = 2, "Invoice at next cron run" DATE = 3, "Invoice at date" + class CycleChoices(IntegerChoices): DAYS = 0, "Days" WEEKS = 1, "Weeks" MONTHS = 2, "Months" YEARS = 3, "Years" + class Billable(Model): client = ForeignKey(ClientProfile, on_delete=CASCADE) brand = ForeignKey(Brand, on_delete=CASCADE) @@ -29,3 +36,21 @@ class Billable(Model): date = DateField(null=True) recur_cycle = PositiveIntegerField(choices=CycleChoices.choices, null=True) recur_count = PositiveIntegerField(null=True) + + def next_invoicing(self): + try: + invoiceitems = InvoiceItem.objects.filter(billable=self) + + if not recur_cycle: + return False + + invoice = Invoice.objects.filter(invoiceitem_set__contains=invoiceitems).latest("created") + delta = relativedelta(days=self.recur_count if self.recur_cycle == CycleChoices.DAYS else 0, + weeks=self.recur_count if self.recur_cycle == CycleChoices.WEEKS else 0, + months=self.recur_count if self.recur_cycle == CycleChoices.MONTHS else 0, + years=self.recur_count if self.recur_cycle == CycleChoices.YEARS else 0) + + return invoice.created + delta + + except: + return self.date diff --git a/core/models/invoices.py b/core/models/invoices.py index b2f5cd2..563dc9f 100644 --- a/core/models/invoices.py +++ b/core/models/invoices.py @@ -5,6 +5,7 @@ from core.fields.numbers import CostField from core.models.services import Service from core.models.profiles import ClientProfile from core.models.local import Currency +from core.models.billable import Billable class Invoice(Model): client = ForeignKey(ClientProfile, on_delete=CASCADE) @@ -22,4 +23,5 @@ class InvoiceItem(Model): price = CostField() discount = CostField() taxable = BooleanField() - service = ForeignKey(Service, on_delete=SET_NULL, null=True) \ No newline at end of file + service = ForeignKey(Service, on_delete=SET_NULL, null=True) + billable = ForeignKey(Billable, on_delete=SET_NULL, null=True) \ No newline at end of file