449 lines
13 KiB
Python
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
|