from django.db import models from django.conf import settings from auditlog.registry import auditlog from auditlog.models import AuditlogHistoryField # from django.contrib.auth import get_user_model from datetime import datetime from django.core.exceptions import ObjectDoesNotExist from .misc import get_week_dates, paperwork_user_directory_path, \ get_week_dates_datetime from django.core.urlresolvers import reverse import re # 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 def has_paperwork(self, dt=None): week_dates = get_week_dates_datetime(dt) loads = self.load_set.filter( date__range=(week_dates['start_date'], week_dates['end_date'])) if len(loads) >= 1: for l in loads: if len(l.paperwork_set.all()) >=1: return True return False 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 "Load, Customer: {c}, Description: {d} Amount: {a}".format( c=self.customer, d=self.description, a=self.amount) def get_absolute_url(self): return "/loads/view/%i" % self.id def can_invoice(self): # Prevent $0 and $1 invoices as well as loads w/o attachments if self.amount >= 2 and len(self.paperwork_set.all()) >= 1: return True else: return False class Paperwork(models.Model): load = models.ForeignKey(Load, on_delete=models.CASCADE) document = models.FileField(upload_to=paperwork_user_directory_path) def __str__(self): # It's a terrible fucking hack, but it works return re.sub('paperwork\/\d+\/[a-zA-z0-9]+-', '', str(self.document)) # return "%s" % self.load class Identity(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, 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: st = Settings.objects.get(key="default_bill_to") st.value = str(self.pk) st.save() 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(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) number = models.IntegerField(default=1200) def get_absolute_url(self): return '/drivers/view/{:d}'.format(self.user.pk) class Invoice(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, 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) payment_identifier = models.CharField(default="", max_length=256) def __str__(self): return "Invoice for {} by {} for ${}".format( self.bill_to.name, self.owner.name, self.total()) 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 auditlog.register(Invoice) auditlog.register(UserInvoiceNumber) auditlog.register(Identity) auditlog.register(Customer) auditlog.register(Load)