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.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
...@@ -13,23 +11,3 @@ class Client(ExtensibleModel): ...@@ -13,23 +11,3 @@ class Client(ExtensibleModel):
constraints = [ constraints = [
models.UniqueConstraint(fields=["name", "site"], name="uniq_client_per_site") 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.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from djmoney.models.fields import CurrencyField, MoneyField 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 from .base import Client, Subject
...@@ -20,41 +24,20 @@ class InvoiceGroup(ExtensibleModel): ...@@ -20,41 +24,20 @@ class InvoiceGroup(ExtensibleModel):
] ]
class Invoice(ExtensibleModel): class Invoice(BasePayment, PureDjangoModel):
group = models.ForeignKey( group = models.ForeignKey(
InvoiceGroup, verbose_name=_("Invoice group"), related_name="invoices" InvoiceGroup, verbose_name=_("Invoice group"), related_name="invoices"
) )
number = models.CharField(verbose_name=_("Invoice number")) 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 for_content_type = models.ForeignKey(ContetType, on_delete=models.SET_NULL)
def currency(self): for_object_id = models.PositiveIntegerField()
try: for_object = GenericForeignKey("content_type", "object_id")
return self.positions.first().net_amount_currency
except InvoicePosition.DoesNotExist: def get_purchased_items(self):
return None return self.for_object.get_purchased_items()
class Meta: class Meta:
constraints = [ 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 from . import views
urlpatterns = [ urlpatterns = [
path("empty", views.empty, name="empty"), path("empty", views.empty, name="empty"),
path("payments/", include("payments.urls")),
] ]
...@@ -32,6 +32,7 @@ secondary = true ...@@ -32,6 +32,7 @@ secondary = true
python = "^3.9" python = "^3.9"
aleksis-core = "^2.7" aleksis-core = "^2.7"
django-money = "^2.1.1" django-money = "^2.1.1"
django-payments = "^0.15.0"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
aleksis-builddeps = "*" 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