diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py index 366b4527..c9c6bf69 100644 --- a/apps/note/models/transactions.py +++ b/apps/note/models/transactions.py @@ -264,6 +264,17 @@ class SpecialTransaction(Transaction): def type(self): return _('Credit') if isinstance(self.source, NoteSpecial) else _("Debit") + def is_credit(self): + return isinstance(self.source, NoteSpecial) + + def is_debit(self): + return isinstance(self.destination, NoteSpecial) + + def clean(self): + # SpecialTransaction are only possible with NoteSpecial object + if self.is_credit() == self.is_debit(): + raise(ValidationError(_("A special transaction is only possible between a Note associated to a payment method and a User or a Club"))) + class MembershipTransaction(Transaction): """ diff --git a/apps/treasury/models.py b/apps/treasury/models.py index 5628504b..1e7f2a95 100644 --- a/apps/treasury/models.py +++ b/apps/treasury/models.py @@ -191,7 +191,7 @@ class SpecialTransactionProxy(models.Model): """ In order to keep modularity, we don't that the Note app depends on the treasury app. That's why we create a proxy in this app, to link special transactions and remittances. - If it isn't very clean, that makes what we want. + If it isn't very clean, it does what we want. """ transaction = models.OneToOneField( diff --git a/apps/treasury/signals.py b/apps/treasury/signals.py index 188be1a7..b7038ab6 100644 --- a/apps/treasury/signals.py +++ b/apps/treasury/signals.py @@ -1,7 +1,6 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from note.models import NoteSpecial from treasury.models import SpecialTransactionProxy, RemittanceType @@ -9,6 +8,10 @@ def save_special_transaction(instance, created, **kwargs): """ When a special transaction is created, we create its linked proxy """ - if created and isinstance(instance.source, NoteSpecial) \ - and RemittanceType.objects.filter(note=instance.source).exists(): - SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save() + + if instance.is_credit(): + if created and RemittanceType.objects.filter(note=instance.source).exists(): + SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save() + else: + if created and RemittanceType.objects.filter(note=instance.destination).exists(): + SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save()