From c9de0d76af28f922466028fc16e26d0c05a15dba Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 6 Mar 2022 20:44:04 +0100
Subject: [PATCH] Add invoice recipients

---
 aleksis/apps/tezor/models/base.py    | 22 ++++++++++++++++++++++
 aleksis/apps/tezor/models/invoice.py |  3 ++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py
index e8feec9..a7e9020 100644
--- a/aleksis/apps/tezor/models/base.py
+++ b/aleksis/apps/tezor/models/base.py
@@ -1,3 +1,5 @@
+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 _
 
@@ -11,3 +13,23 @@ 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
diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py
index 4b4c6d0..e18fb9a 100644
--- a/aleksis/apps/tezor/models/invoice.py
+++ b/aleksis/apps/tezor/models/invoice.py
@@ -5,7 +5,7 @@ from djmoney.models.fields import CurrencyField, MoneyField
 
 from aleksis.core.mixins import ExtensibleModel
 
-from .base import Client
+from .base import Client, Subject
 
 
 class InvoiceGroup(ExtensibleModel):
@@ -27,6 +27,7 @@ class Invoice(ExtensibleModel):
 
     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):
-- 
GitLab