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 django.core.exceptions import ObjectDoesNotExist 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): user = models.OneToOneField(User, on_delete=models.CASCADE) 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) def set_default(self): try: Settings.objects.get(key="default_bill_to").value except ObjectDoesNotExist: st = Settings(key="default_bill_to", value=int(self.pk)) st.save() def get_absolute_url(self): return '/drivers/view/{:d}'.format(self.user.pk) 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 UserInvoiceNumber(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) number = models.IntegerField(default=1200) 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 __init__(self, user, invoice_date, due_date): # super(Invoice, self).__init__() def setup(self): try: uinv = UserInvoiceNumber.objects.get(user=self.user.pk) uinv.number += 1 uinv.save() self.invoice_id = uinv.number except ObjectDoesNotExist: uinv = UserInvoiceNumber() uinv.user = self.user uinv.save() self.invoice_id = uinv.number self.owner = Identity.objects.get(user=self.user.pk) bill_to_id = Settings.objects.get(key='default_bill_to') self.bill_to = Identity.objects.get(pk=int(bill_to_id.value)) def populate_bill_to(self): pk = Settings.objects.get(key="default_bill_to").value self.bill_to = Identity.objects.get(pk=pk) def populate_owner(self): self.owner = Identity.objects.get(user=self.user.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)