diff --git a/fet2020/finance/forms.py b/fet2020/finance/forms.py
index f2d88019..b40830e1 100644
--- a/fet2020/finance/forms.py
+++ b/fet2020/finance/forms.py
@@ -22,13 +22,13 @@ class BankDataForm(forms.ModelForm):
class BillCreateForm(forms.ModelForm):
- # bank data
+ # 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
resolution_text = forms.CharField(max_length=128)
class Meta:
@@ -78,7 +78,7 @@ class BillCreateForm(forms.ModelForm):
self.fields["invoice"].cols = 30
self.fields["invoice"].rows = 4
- # bank data fields
+ # Bank data fields
self.fields["payer"].autofocus = True
bank_data = BankData.objects.filter(
@@ -102,14 +102,13 @@ class BillCreateForm(forms.ModelForm):
self.fields["saving"].label = "Bankdaten speichern."
self.fields["saving"].required = False
- # resolution fields
+ # 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")
@@ -121,7 +120,7 @@ class BillCreateForm(forms.ModelForm):
only_digital = cleaned_data.get("only_digital")
file_field = cleaned_data.get("file_field")
- # check if resolution exists
+ # Check if resolution exists.
if resolution != "":
try:
Resolution.objects.get(id=resolution)
@@ -130,7 +129,7 @@ class BillCreateForm(forms.ModelForm):
f"Es gibt keinen Beschluss mit dieser ID. (Eingegebene ID: {resolution})"
)
- # check that amount is valid because invalid amount is a NoneType.
+ # Check that amount is valid because invalid amount is a NoneType.
"""
if amount:
if amount > 30 and resolution == "":
@@ -140,6 +139,7 @@ class BillCreateForm(forms.ModelForm):
)
"""
+ # If payer is 'Me', you need name, iban and bic data.
if payer == Bill.Payer.ME:
if name == "" or iban == "" or bic == "":
raise ValidationError(
@@ -147,6 +147,7 @@ class BillCreateForm(forms.ModelForm):
f"IBAN: '{iban}', BIC: '{bic}')."
)
+ # No saving if payer is 'Verein' or you don't want to save bank data.
if payer == Bill.Payer.VEREIN or saving is not True:
cleaned_data["name_text"] = ""
cleaned_data["iban_text"] = ""
@@ -159,10 +160,17 @@ class BillCreateForm(forms.ModelForm):
class BillUpdateForm(forms.ModelForm):
- resolution_text = forms.CharField(max_length=128)
+ # 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()
+
+ # only digital bill
+ only_digital_new = forms.BooleanField()
+
+ # Resolution
+ resolution_text = forms.CharField(max_length=128)
class Meta:
model = Bill
@@ -178,6 +186,7 @@ class BillUpdateForm(forms.ModelForm):
"only_digital",
"file_field",
"comment",
+ "status",
"resolution",
]
@@ -190,7 +199,7 @@ class BillUpdateForm(forms.ModelForm):
"affiliation": "Abrechnungsbudget",
"payer": "Wie wurde die Rechnung bezahlt?",
"only_digital": "Ich habe nur eine digitale Rechnung.",
- "file_field": "Rechnung hochladen (PDF)",
+ "file_field": "Neue Rechnung hochladen (PDF)",
"comment": "Kommentar",
}
@@ -201,48 +210,122 @@ class BillUpdateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
+ self.fields["bill_creator"].initial = kwargs["instance"].bill_creator
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["status"].disabled = True
- self.fields["name_text"].disabled = True
- self.fields["name_text"].label = "Kontoinhaber:in"
- self.fields["name_text"].required = False
+ # Config for textarea of invoice. Calc rows for a better view.
+ self.fields["invoice"].cols = 30
+ if (rows := kwargs["instance"].invoice.count("\n") + 1) < 3:
+ rows = 3
+ self.fields["invoice"].rows = rows
- self.fields["iban_text"].disabled = True
- self.fields["iban_text"].label = "IBAN"
- self.fields["iban_text"].required = False
+ # Config for textarea of comment. Calc rows for a better view.
+ self.fields["comment"].cols = 30
+ rows = kwargs["instance"].comment.count("\n") + 1
+ self.fields["comment"].rows = rows
- self.fields["bic_text"].disabled = True
- self.fields["bic_text"].label = "BIC"
- self.fields["bic_text"].required = False
+ if kwargs["instance"].status == Bill.Status.INCOMPLETE:
+ # 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["saving"].initial = True
+ else:
+ self.fields["name_text"].initial = ""
+ self.fields["iban_text"].initial = ""
+ self.fields["bic_text"].initial = ""
+ self.fields["saving"].initial = False
- # resolution fields
- if kwargs["instance"].resolution:
- self.fields["resolution_text"].initial = kwargs["instance"].resolution.name
+ self.fields["name_text"].label = "Kontoinhaber:in"
+ self.fields["name_text"].required = False
- self.fields["resolution_text"].disabled = True
- self.fields["resolution_text"].label = "Beschlussnummer"
- self.fields["resolution_text"].required = False
+ self.fields["iban_text"].label = "IBAN"
+ self.fields["iban_text"].required = False
- # comment disabled when bill is cleared or finished
- if kwargs["instance"].status != "S":
- self.fields["comment"].disabled = True
+ self.fields["bic_text"].label = "BIC"
+ self.fields["bic_text"].required = False
- self.fields["comment"].autofocus = True
+ self.fields["saving"].label = "Bankdaten speichern."
+ self.fields["saving"].required = False
+
+ # only digital bill field
+ self.fields[
+ "only_digital_new"
+ ].label = "Ich habe eine neue digitale Rechnung."
+ self.fields["only_digital_new"].required = False
+
+ # Resolution fields
+ if kwargs["instance"].resolution:
+ _name = kwargs["instance"].resolution.name
+ self.fields["resolution_text"].initial = _name
+
+ self.fields["resolution_text"].label = "Beschlussnummer"
+ self.fields["resolution_text"].required = False
+
+ self.fields["payer"].autofocus = True
+
+ else:
+ 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["name_text"].label = "Kontoinhaber:in"
+ self.fields["name_text"].required = True
+
+ self.fields["iban_text"].initial = kwargs["instance"].bankdata.iban
+ self.fields["iban_text"].label = "IBAN"
+ self.fields["iban_text"].required = True
+
+ self.fields["bic_text"].initial = kwargs["instance"].bankdata.bic
+ self.fields["bic_text"].label = "BIC"
+ self.fields["bic_text"].required = True
+
+ self.fields["saving"].initial = True
+ self.fields["saving"].required = True
+ else:
+ self.fields["name_text"].required = False
+
+ self.fields["iban_text"].required = False
+
+ self.fields["bic_text"].required = False
+
+ self.fields["saving"].required = False
+ self.fields["saving"].initial = False
+
+ self.fields["name_text"].disabled = True
+ self.fields["iban_text"].disabled = True
+ self.fields["bic_text"].disabled = True
+
+ self.fields["saving"].disabled = True
+ self.fields["saving"].label = "Bankdaten sind gespeichert."
+
+ # Resolution fields
+ if kwargs["instance"].resolution:
+ _name = kwargs["instance"].resolution.name
+ self.fields["resolution_text"].initial = _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 != Bill.Status.SUBMITTED:
+ self.fields["comment"].disabled = True
+
+ self.fields["comment"].autofocus = True
class ResolutionCreateForm(forms.ModelForm):
diff --git a/fet2020/finance/views.py b/fet2020/finance/views.py
index a7f5745c..69b85ab1 100644
--- a/fet2020/finance/views.py
+++ b/fet2020/finance/views.py
@@ -22,7 +22,7 @@ class BillCreateView(LoginRequiredMixin, CreateView):
template_name = "finance/bill_create.html"
def form_valid(self, form):
- # get or create resolution object
+ # Get or create resolution object
resolution = form.cleaned_data["resolution_text"]
if resolution != "":
obj, created = Resolution.objects.get_or_create(
@@ -31,7 +31,7 @@ class BillCreateView(LoginRequiredMixin, CreateView):
)
form.instance.resolution = obj
- # get or create bankdata object
+ # Get or create bankdata object. Replace whitespaces in iban and bic text.
name = form.cleaned_data["name_text"]
iban = form.cleaned_data["iban_text"].replace(" ", "")
bic = form.cleaned_data["bic_text"].replace(" ", "")
@@ -44,7 +44,7 @@ class BillCreateView(LoginRequiredMixin, CreateView):
)
form.instance.bankdata = obj
- # disable old bank data
+ # Disable old bank data.
qs = BankData.objects.filter(
~Q(id=obj.id)
& Q(bankdata_creator=obj.bankdata_creator)
@@ -57,6 +57,8 @@ class BillCreateView(LoginRequiredMixin, CreateView):
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
+
+ # Request user for bill creator.
kwargs["user"] = self.request.user
return kwargs
@@ -86,15 +88,23 @@ class BillUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
template_name = "finance/bill_update.html"
def form_valid(self, form):
+ # Set status to submitted if changes are valid and bill is incompleted.
+ if self.object.status == Bill.Status.INCOMPLETE:
+ self.object.status = Bill.Status.SUBMITTED
+
+ # Override only_digital db value by value of new only_digital.
+ if "file_field" in form.changed_data:
+ self.object.only_digital = form.cleaned_data["only_digital_new"]
+
add_log_action(self.request, form, "finance", "bill", False)
return super().form_valid(form)
- # call bill if it's only yours
+ # Call bill if it's only yours.
def test_func(self):
if self.get_object().bill_creator.username == self.request.user.username:
return True
- # call handle_no_permissions method
+ # Call handle_no_permissions method.
return False
def handle_no_permission(self):
diff --git a/fet2020/templates/finance/bill_update.html b/fet2020/templates/finance/bill_update.html
index 2dd99b83..32dc9339 100644
--- a/fet2020/templates/finance/bill_update.html
+++ b/fet2020/templates/finance/bill_update.html
@@ -11,6 +11,13 @@
{% csrf_token %}
{% include "baseform/non_field_errors.html" %}
+ Bankdaten
Angaben zu den Bankdaten für die Rückerstattung des Rechnungsbetrags.
@@ -20,20 +27,29 @@
{% include "baseform/select.html" with field=form.payer %}
- {% if form.name_text.value %}
+ {% if form.payer.value == object.Payer.ME %}