From b6938703a69bbd0c98bf7c07aead8fc1631889ce Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sat, 5 Mar 2022 21:44:18 +0100
Subject: [PATCH] Add some model stubs

---
 aleksis/apps/tezor/models/__init__.py |  0
 aleksis/apps/tezor/models/base.py     | 13 +++++++
 aleksis/apps/tezor/models/invoice.py  | 55 +++++++++++++++++++++++++++
 3 files changed, 68 insertions(+)
 create mode 100644 aleksis/apps/tezor/models/__init__.py
 create mode 100644 aleksis/apps/tezor/models/base.py
 create mode 100644 aleksis/apps/tezor/models/invoice.py

diff --git a/aleksis/apps/tezor/models/__init__.py b/aleksis/apps/tezor/models/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py
new file mode 100644
index 0000000..e8feec9
--- /dev/null
+++ b/aleksis/apps/tezor/models/base.py
@@ -0,0 +1,13 @@
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+
+from aleksis.core.mixins import ExtensibleModel
+
+
+class Client(ExtensibleModel):
+    name = models.CharField(verbose_name=_("Name"))
+
+    class Meta:
+        constraints = [
+            models.UniqueConstraint(fields=["name", "site"], name="uniq_client_per_site")
+        ]
diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py
new file mode 100644
index 0000000..9c82d15
--- /dev/null
+++ b/aleksis/apps/tezor/models/invoice.py
@@ -0,0 +1,55 @@
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+
+from djmoney.models.fields import CurrencyField, MoneyField
+
+from aleksis.core.mixins import ExtensibleModel
+
+from .base import Client
+
+
+class InvoiceGroup(ExtensibleModel):
+    name = models.CharField(verbose_name=_("Invoice group name"), max_length=255)
+    client = models.ForeignKey(Client, verbose_name=_("Linked client"), related_name="invoice_groups")
+
+    class Meta:
+        constraints = [
+            models.UniqueConstraint(fields=["client", "name"], name="group_uniq_per_client")
+        ]
+
+
+class Invoice(ExtensibleModel):
+    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"))
+
+    @property
+    def currency(self):
+        try:
+            return self.positions.first().net_amount_currency
+        except InvoicePosition.DoesNotExist:
+            return None
+
+    class Meta:
+        constraints = [
+            models.UniqueConstraint(fields=["group", "number"], 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
-- 
GitLab