Skip to content
Snippets Groups Projects
Verified Commit 67b16cfb authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Replace invoicing with django-payments

parent c9de0d76
No related branches found
No related tags found
No related merge requests found
Pipeline #58380 failed
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import gettext_lazy as _
......@@ -13,23 +11,3 @@ class Client(ExtensibleModel):
constraints = [
models.UniqueConstraint(fields=["name", "site"], name="uniq_client_per_site")
]
class Subject(ExtensibleModel):
content_type = models.ForeignKey(ContetType, on_delete=models.SET_NULL)
object_id = models.PositiveIntegerField()
related = GenericForeignKey("content_type", "object_id")
def get_address(self):
if hasattr(self.related, "get_address"):
return self.related.get_address()
elif hasattr(self.related, "addressing_name") and hasattr(self.related, "street") and hasattr(self.related, "housenumber") and hasattr(self.related, "postal_code") and hasattr(self.related, "place"):
# FIXME Use proper locale-based address generation
return f"{self.related.addressing_name}\n{self.related.street} {self.related.housenumber}\n{self.related.postal_code} {self.related.place}"
@classmethod
def from_person(cls, person):
ct = ContentType.objects.get_for_model(person)
subject, created = cls.objects.get_or_create(content_type=ct, object_id=person)
return subject
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import gettext_lazy as _
from djmoney.models.fields import CurrencyField, MoneyField
from payments import PurchasedItem
from payments.models import BasePayment
from aleksis.core.mixins import ExtensibleModel
from aleksis.core.mixins import ExtensibleModel, PureDjangoModel
from .base import Client, Subject
......@@ -20,41 +24,20 @@ class InvoiceGroup(ExtensibleModel):
]
class Invoice(ExtensibleModel):
class Invoice(BasePayment, PureDjangoModel):
group = models.ForeignKey(
InvoiceGroup, verbose_name=_("Invoice group"), related_name="invoices"
)
number = models.CharField(verbose_name=_("Invoice number"))
date = models.DateField(verbose_name=_("Invoice date"))
recipient = models.ForeignKey(Subject, verbose_name=_("Recipient"), on_delete=models.SET_NULL)
@property
def currency(self):
try:
return self.positions.first().net_amount_currency
except InvoicePosition.DoesNotExist:
return None
for_content_type = models.ForeignKey(ContetType, on_delete=models.SET_NULL)
for_object_id = models.PositiveIntegerField()
for_object = GenericForeignKey("content_type", "object_id")
def get_purchased_items(self):
return self.for_object.get_purchased_items()
class Meta:
constraints = [
models.UniqueConstraint(fields=["group", "number"], name="number_uniq_per_group")
models.UniqueConstraint(fields=["number", "token"], name="number_uniq_per_group")
]
class InvoicePosition(ExtensibleModel):
invoice = models.ForeignKey(Invoice, verbose_name=_("Invoice"), related_name="positions")
description = models.TextField(verbose_name=_("Description"))
vat_rate = models.PositiveSmallIntegerField(verbose_name=_("VAT rate"), default=0)
net_amount = models.MoneyField(verbose_name=_("Net amount"))
@property
def gross_amount(self):
# FIXME turn into manager/annotation/etc.
return self.net_amount * (1 + self.vat_rate / 100)
class Meta:
# FIXME Add check constraint for currency
pass
INSTALLED_APPS = ["payments"]
from django.urls import path
from django.urls import include, path
from . import views
urlpatterns = [
path("empty", views.empty, name="empty"),
path("payments/", include("payments.urls")),
]
......@@ -32,6 +32,7 @@ secondary = true
python = "^3.9"
aleksis-core = "^2.7"
django-money = "^2.1.1"
django-payments = "^0.15.0"
[tool.poetry.dev-dependencies]
aleksis-builddeps = "*"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment