from django.db import models from django.conf import settings from auditlog.registry import auditlog from auditlog.models import AuditlogHistoryField from django.contrib.auth.models import User from datetime import datetime from .misc import get_week_dates, paperwork_user_directory_path # Create your models here. class Customer(models.Model): history = AuditlogHistoryField() name = models.CharField(max_length=256) address = models.CharField(max_length=256) phone_number = models.DecimalField(max_digits=16,decimal_places=0) email_address = models.CharField(max_length=256) contact_name = models.CharField(max_length=256) def __str__(self): return self.name class Load(models.Model): history = AuditlogHistoryField() date = models.DateField() user = models.ForeignKey(settings.AUTH_USER_MODEL) customer = models.ForeignKey(Customer) description = models.CharField(max_length=256) delivered_to = models.CharField(max_length=256, default="") amount = models.DecimalField(max_digits=10,decimal_places=2, default="0") def __str__(self): return "{c}, {d} ( {a} )".format( c=self.customer, d=self.description, a=self.amount) def get_absolute_url(self): return "/loads/view/%i" % self.id class Paperwork(models.Model): load = models.ForeignKey(Load, on_delete=models.CASCADE) description = models.CharField(max_length=256) document = models.FileField(upload_to=paperwork_user_directory_path) def __str__(self): return "%s" % self.load class Identity(models.Model): name = models.CharField(max_length=256) address = models.CharField(max_length=256) city = models.CharField(max_length=256) state = models.CharField(max_length=256) zip_code = models.CharField(max_length=256) def __str__(self): return "{}".format(self.name) class Settings(models.Model): key = models.CharField(max_length=256) value = models.CharField(max_length=256) def __str__(self): return "{}: {}".format(self.key, self.value) class Invoice(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) owner = models.ForeignKey(Identity, on_delete=models.CASCADE, related_name="owner") bill_to = models.ForeignKey(Identity, on_delete=models.CASCADE, related_name="bill_to") invoice_id = models.IntegerField() invoice_date = models.DateField() due_date = models.DateField() paid = models.BooleanField(default=False) def __str__(self): return "Invoice for {} by {} for ${}".format( self.bill_to.name, self.owner.name, self.total()) def set_invoice_id(self): # A fucking terrible hack inv_number = Settings.objects.get(key="user_{:d}_invoice_number".format(self.user.pk)) inv_number.value = str(int(inv_number.value) + 1) self.invoice_id = int(inv_number.value) inv_number.save() def populate_bill_to(self): pk = Settings.objects.get(key="default_bill_to").value self.bill_to = Identity.objects.get(pk=pk) def set_owner(self, ident): setting = Settings(key="user_{:d}_identity".format(self.user.pk), value=ident.pk) return setting.save() def populate_owner(self): key = "user_{:d}_identity".format(self.user.id) pk = Settings.objects.get(key=key).value self.owner = Identity.objects.get(pk=pk) def populate_items_default_date(self): wk = get_week_dates() return self.populate_items(start_date=wk['start_date'], end_date=wk['end_date']) def populate_items(self, start_date, end_date): loads = Load.objects.filter(user__exact=self.user.id, date__range=(start_date, end_date)) for load in loads: i = InvoiceItem(invoice=self, date=load.date, description=load.description, quantity=1, amount=load.amount) i.save() def clear_items(self): items = self.items() for item in items: item.delete() def items(self): return InvoiceItem.objects.filter(invoice__exact=self.pk) def total(self): t = 0 for i in InvoiceItem.objects.filter(invoice__exact=self.pk): t += i.total() return t def get_absolute_url(self): return "/invoices/view/%i" % self.pk class InvoiceItem(models.Model): invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE) date = models.DateField() description = models.CharField(max_length=256) quantity = models.IntegerField() amount = models.DecimalField(max_digits=19,decimal_places=2) def __str__(self): return "Invoice ID: {} Item: {} for ${}".format( self.invoice.pk, self.description, self.amount) def total(self): return self.quantity*self.amount # class Invoice(): # load_ids = [] # total = 0.00 # # def __init__(self, **kwargs): # # self.args = kwargs # if isinstance(kwargs['driver'], User): # self.driver = kwargs['driver'] # else: # raise Exception("'driver' must be a Django User instance") # # if isinstance(kwargs.get('start_date'), datetime) and isinstance(kwargs.get('end_date'), datetime): # self.start_date = kwargs.get('start_date') # self.end_date = kwargs.get('end_date') # else: # dates = get_week_dates() # self.start_date = dates['start_date'] # self.end_date = dates['end_date'] # # self.loads = Load.objects.filter(user__exact=self.driver.id, # date__range=(self.start_date, self.end_date)) # # for l in self.loads: # self.load_ids.append(l.pk) # self.total += float(l.amount) # # if isinstance(kwargs.get('bill_to'), Owner): # self.bill_to = kwargs.get('bill_to') # else: # self.bill_to = Owner.objects.get(pk=Settings.objects.get(key='default_owner').value) # # # def __str__(self): # return "Invoice for {} from {} for: {}".format(self.end_date, self.driver, self.total) auditlog.register(Customer) auditlog.register(Load)