Skip to content
Snippets Groups Projects

Add models for manual invoicing

Merged Nik | Klampfradler requested to merge 2-add-manual-invoicing into master
@@ -2,6 +2,7 @@ from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import Q
from django.shortcuts import reverse
from django.utils.translation import gettext_lazy as _
@@ -10,6 +11,7 @@ from payments import PaymentStatus, PurchasedItem
from payments.models import BasePayment
from aleksis.core.mixins import ExtensibleModel, PureDjangoModel
from aleksis.core.models import Person
from .base import Client
from ..tables import PurchasedItemsTable, TotalsTable
@@ -60,6 +62,10 @@ class Invoice(BasePayment, PureDjangoModel):
for_object_id = models.PositiveIntegerField()
for_object = GenericForeignKey("for_content_type", "for_object_id")
# For manual invoicing
person = models.ForeignKey(Person, on_delete=models.SET_NULL, verbose_name=_("Invoice recipient (person)"), blank=True, null=True)
items = models.ManyToManyField("InvoiceItem", verbose_name=_("Invoice items"))
@classmethod
def get_variant_choices(cls):
choices = []
@@ -77,10 +83,15 @@ class Invoice(BasePayment, PureDjangoModel):
return self.__class__.STATUS_ICONS[self.status]
def get_purchased_items(self):
return self.for_object.get_purchased_items()
for item in self.items.all():
yield item.as_purchased_item()
else:
return self.for_object.get_purchased_items()
def get_person(self):
if hasattr(self.for_object, "person"):
if self.person:
return self.person
elif hasattr(self.for_object, "person"):
return self.for_object.person
elif hasattr(self.for_object, "get_person"):
return self.for_object.get_person()
@@ -89,7 +100,8 @@ class Invoice(BasePayment, PureDjangoModel):
class Meta:
constraints = [
models.UniqueConstraint(fields=["number", "group"], name="number_uniq_per_group")
models.UniqueConstraint(fields=["number", "group"], name="number_uniq_per_group"),
models.CheckConstraint(Q(for_object_id__isnull=True) | Q(person__isnull=True)),
]
@property
@@ -125,3 +137,14 @@ class Invoice(BasePayment, PureDjangoModel):
def get_failure_url(self):
return reverse("invoice_by_token", kwargs={"slug": self.token})
class InvoiceItem(ExtensibleModel):
sku = models.CharField(max_length=255, verbose_name=_("Article no."), blank=True)
description = models.CharField(max_length=255, verbose_name=_("Purchased item"))
price = models.DecimalField(verbose_name=_("Item gross price"), max_digits=9, decimal_places=2, default="0.0")
currency = models.CharField(max_length=10, verbose_name=_("Currency"))
tax_rate = models.DecimalField(verbose_name=_("Tax rate"), max_digits=4, decimal_places=1, default="0.0")
def as_purchased_item(self):
yield PurchasedItem(name=self.description, quantity=1, price=self.price, currency=self.currency, sku=self.sku, tax_rate=self.tax_rate)
Loading