Files
fet2020/fet2020/finance/forms.py
2024-01-23 23:38:59 +00:00

449 lines
13 KiB
Python

from django import forms
from django.core.validators import ValidationError
from django.db.models import Count, Q
from django.forms import DateInput
from members.models import Member
from .models import BankData, Bill, Resolution, Wiref
class DateInput(DateInput):
input_type = "date"
class BankDataForm(forms.ModelForm):
class Meta:
model = BankData
fields = ["iban", "bic", "name"]
labels = {"iban": "IBAN", "bic": "BIC", "name": "Kontoinhaber:in"}
class BillCreateForm(forms.ModelForm):
# bank data
name_text = forms.CharField(max_length=128)
iban_text = forms.CharField(max_length=34)
bic_text = forms.CharField(max_length=11)
saving = forms.BooleanField()
# resolution
resolution_text = forms.CharField(max_length=128)
class Meta:
model = Bill
fields = [
"bill_creator",
"date",
"invoice",
"amount",
"purpose",
"affiliation",
"payer",
"only_digital",
"file_field",
"comment",
"resolution",
]
labels = {
"date": "Rechnungsdatum",
"invoice": "Rechnungsaussteller",
"amount": "Betrag (EUR)",
"purpose": "Verwendungszweck",
"affiliation": "Abrechnungsbudget",
"payer": "Ursprüngliche Bezahlmethode",
"only_digital": "Ich habe nur eine digitale Rechnung.",
"file_field": "Rechnung hochladen (PDF)",
"comment": "Kommentar",
}
widgets = {
"date": DateInput(format=("%Y-%m-%d")),
}
def __init__(self, *args, **kwargs):
user = kwargs.pop("user") if "user" in kwargs else None
super().__init__(*args, **kwargs) # to get the self.fields set
member = Member.objects.get(username=user.username)
self.fields["bill_creator"].initial = member
self.fields["bill_creator"].disabled = True
self.fields["invoice"].placeholder = "Firmenname\nStraße\nPLZ und Ort"
self.fields["invoice"].cols = 30
self.fields["invoice"].rows = 4
# bank data fields
self.fields["payer"].autofocus = True
bank_data = BankData.objects.filter(
Q(bankdata_creator=member) & Q(is_disabled=False)
).first()
if bank_data is not None:
self.fields["name_text"].initial = bank_data.name
self.fields["iban_text"].initial = bank_data.iban
self.fields["bic_text"].initial = bank_data.bic
self.fields["saving"].initial = True
self.fields["name_text"].label = "Kontoinhaber:in"
self.fields["name_text"].required = False
self.fields["iban_text"].label = "IBAN"
self.fields["iban_text"].required = False
self.fields["bic_text"].label = "BIC"
self.fields["bic_text"].required = False
self.fields["saving"].label = "Bankdaten speichern."
self.fields["saving"].required = False
# resolution fields
self.fields["resolution_text"].label = "Beschlussnummer"
self.fields["resolution_text"].required = False
def clean(self):
cleaned_data = super().clean()
# amount = cleaned_data.get("amount")
resolution = cleaned_data.get("resolution_text")
payer = cleaned_data.get("payer")
name = cleaned_data.get("name_text")
iban = cleaned_data.get("iban_text")
bic = cleaned_data.get("bic_text")
saving = cleaned_data.get("saving")
only_digital = cleaned_data.get("only_digital")
file_field = cleaned_data.get("file_field")
# check if resolution exists
if resolution != "":
try:
Resolution.objects.get(id=resolution)
except Exception:
raise ValidationError(
f"Es gibt keinen Beschluss mit dieser ID. (Eingegebene ID: {resolution})"
)
# check that amount is valid because invalid amount is a NoneType.
"""
if amount:
if amount > 30 and resolution == "":
raise ValidationError(
"Die Beschlussnummer fehlt, weil der Betrag über 30€ beträgt "
f"(Betrag: {amount}€)."
)
"""
if payer == Bill.Payer.ME:
if name == "" or iban == "" or bic == "":
raise ValidationError(
f"Bankdaten bei privater Bezahlung unvollständig. (Kontoinhaber:in: '{name}', "
f"IBAN: '{iban}', BIC: '{bic}')."
)
if payer == Bill.Payer.VEREIN or saving is not True:
cleaned_data["name_text"] = ""
cleaned_data["iban_text"] = ""
cleaned_data["bic_text"] = ""
if only_digital and file_field is None:
raise ValidationError("Digitale Rechnung fehlt.")
return cleaned_data
class BillUpdateForm(forms.ModelForm):
resolution_text = forms.CharField(max_length=128)
name_text = forms.CharField(max_length=128)
iban_text = forms.CharField(max_length=34)
bic_text = forms.CharField(max_length=11)
class Meta:
model = Bill
fields = [
"bill_creator",
"date",
"invoice",
"amount",
"purpose",
"affiliation",
"payer",
"only_digital",
"file_field",
"comment",
"resolution",
]
labels = {
"bill_creator": "Verantwortliche:r für die Einreichung",
"date": "Rechnungsdatum",
"invoice": "Rechnungsaussteller",
"amount": "Betrag (EUR)",
"purpose": "Verwendungszweck",
"affiliation": "Abrechnungsbudget",
"payer": "Wie wurde die Rechnung bezahlt?",
"only_digital": "Ich habe nur eine digitale Rechnung.",
"file_field": "Rechnung hochladen (PDF)",
"comment": "Kommentar",
}
widgets = {
"date": DateInput(format=("%Y-%m-%d")),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["bill_creator"].disabled = True
self.fields["date"].disabled = True
self.fields["invoice"].disabled = True
self.fields["amount"].disabled = True
self.fields["purpose"].disabled = True
self.fields["affiliation"].disabled = True
self.fields["payer"].disabled = True
self.fields["only_digital"].disabled = True
self.fields["file_field"].disabled = True
self.fields["resolution"].disabled = True
# bank data fields
if kwargs["instance"].bankdata:
self.fields["name_text"].initial = kwargs["instance"].bankdata.name
self.fields["iban_text"].initial = kwargs["instance"].bankdata.iban
self.fields["bic_text"].initial = kwargs["instance"].bankdata.bic
self.fields["name_text"].disabled = True
self.fields["name_text"].label = "Kontoinhaber:in"
self.fields["name_text"].required = False
self.fields["iban_text"].disabled = True
self.fields["iban_text"].label = "IBAN"
self.fields["iban_text"].required = False
self.fields["bic_text"].disabled = True
self.fields["bic_text"].label = "BIC"
self.fields["bic_text"].required = False
# resolution fields
if kwargs["instance"].resolution:
self.fields["resolution_text"].initial = kwargs["instance"].resolution.name
self.fields["resolution_text"].disabled = True
self.fields["resolution_text"].label = "Beschlussnummer"
self.fields["resolution_text"].required = False
# comment disabled when bill is cleared or finished
if kwargs["instance"].status != "S":
self.fields["comment"].disabled = True
self.fields["comment"].autofocus = True
class ResolutionCreateForm(forms.ModelForm):
class Meta:
model = Resolution
fields = [
"option",
"name",
"date",
"voting",
"voting_text",
]
labels = {
"option": "Beschluss",
"date": "Datum",
"voting": "Abstimmungsverhalten",
"voting_text": "Abstimmungstext",
}
widgets = {
"date": DateInput(format=("%Y-%m-%d")),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["option"].autofocus = True
class ResolutionUpdateForm(forms.ModelForm):
class Meta:
model = Resolution
fields = [
"option",
"name",
"date",
"voting",
"voting_text",
]
labels = {
"option": "Beschluss",
"date": "Datum",
"voting": "Abstimmungsverhalten",
"voting_text": "Abstimmungstext",
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["date"].disabled = True
self.fields["option"].autofocus = True
class BillInlineForm(forms.ModelForm):
class Meta:
fields = [
"purpose",
"file_field",
]
model = Bill
labels = {
"purpose": "Verwendungszweck",
"file_field": "Hochgeladene Rechnung",
}
class BankDataAdminForm(forms.ModelForm):
class Meta:
model = BankData
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["bankdata_creator"].widget.can_add_related = False
self.fields["bankdata_creator"].widget.can_change_related = False
self.fields["bankdata_creator"].widget.can_delete_related = False
class BillAdminForm(forms.ModelForm):
class Meta:
model = Bill
fields = "__all__"
labels = {
"affiliation": "Abrechnungsbudget",
"amount": "Betrag (EUR)",
"comment": "Kommentar",
"date": "Rechnungsdatum",
"file_field": "Rechnung hochladen (PDF)",
"invoice": "Rechnungsaussteller",
"only_digital": "Ich habe nur eine digitale Rechnung.",
"payer": "Wie wurde die Rechnung bezahlt?",
"purpose": "Verwendungszweck",
"resolution": "Beschlussnummer",
}
widgets = {
"date": DateInput(format=("%Y-%m-%d")),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["bill_creator"].widget.can_add_related = False
self.fields["bill_creator"].widget.can_change_related = False
self.fields["bill_creator"].widget.can_delete_related = False
# delete wiref id from list if there are already 8 bills in wiref form.
qs = (
self.fields["wiref"]
.queryset.annotate(num_bills=Count("bill"))
.filter(num_bills__lt=8)
)
# delete wiref id from if status is not opened.
qs = qs.filter(status=Wiref.Status.OPENED)
self.fields["wiref"].queryset = qs.order_by("-wiref_id")
class ResolutionAdminForm(forms.ModelForm):
total = forms.CharField()
budget_remaining = forms.CharField()
class Meta:
model = Resolution
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
resolution = kwargs.get("instance", None)
bills = Bill.objects.filter(resolution=resolution)
total = 0
for elem in bills:
total += elem.amount
self.fields["total"].disabled = True
self.fields["total"].initial = total
self.fields["total"].label = "Gesamtsumme (EUR)"
self.fields["total"].required = False
budget = 0
if resolution:
budget = resolution.budget
self.fields["budget_remaining"].disabled = True
self.fields["budget_remaining"].initial = budget - total
self.fields["budget_remaining"].label = "Restbudget (EUR)"
self.fields["budget_remaining"].required = False
self.fields["budget"].required = False
if resolution is not None:
self.fields["id"].disabled = True
self.fields["id"].required = False
class WirefAdminForm(forms.ModelForm):
total = forms.CharField()
class Meta:
model = Wiref
fields = [
"wiref_id",
"status",
"file_field",
"total",
]
labels = {
"wiref_id": "Wiref ID",
"file_field": "Wiref Formular",
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["wiref_id"].required = True
wiref = kwargs.get("instance", None)
total = 0
if wiref is not None:
bills = Bill.objects.filter(wiref=wiref)
for elem in bills:
total += elem.amount
self.fields["total"].disabled = True
self.fields["total"].initial = total
self.fields["total"].label = "Gesamtsumme (EUR)"
self.fields["total"].required = False