From a23321a98b5ce858ef06a0128b39e95167661478 Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Mon, 29 Jan 2024 23:05:56 +0000 Subject: [PATCH] add incomplete status to update view and update other status here --- fet2020/finance/forms.py | 167 +++++++++++++++------ fet2020/finance/views.py | 20 ++- fet2020/templates/finance/bill_update.html | 101 +++++++++---- 3 files changed, 212 insertions(+), 76 deletions(-) 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" %} +
+
+
+ {% include "baseform/select.html" with field=form.status %} +
+
+

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 %}
{% include "baseform/text.html" with field=form.name_text %}
- {% endif %} - {% if form.iban_text.value %}
{% include "baseform/text.html" with field=form.iban_text %}
- {% endif %} - {% if form.bic_text.value %}
{% include "baseform/text.html" with field=form.bic_text %}
+ {% elif form.status.value == object.Status.INCOMPLETE %} +
+ {% include "baseform/text.html" with field=form.name_text %} +
+
+ {% include "baseform/text.html" with field=form.iban_text %} +
+
+ {% include "baseform/text.html" with field=form.bic_text %} +
+
+ {% include "baseform/checkbox.html" with field=form.saving %} +
{% endif %}
@@ -63,38 +79,65 @@ type="number" name="amount" value={{ form.amount.value }} - required - disabled + {% if form.amount.field.required %}required{% endif %} + {% if form.amount.field.disabled %}disabled{% endif %} min="0.00" step="0.01" placeholder="123,99" - class="mt-1 block w-full rounded-md border-gray-300 dark:border-none shadow-sm focus:border-none focus:ring focus:ring-blue-200 dark:focus:ring-sky-700 focus:ring-opacity-50" + class="w-full" > - {% if form.file_field.value %} -
- {% include "baseform/checkbox.html" with field=form.only_digital %} -
+ {% if form.status.value == object.Status.INCOMPLETE %} + {% if form.file_field.value %} +
+ -
+
+ {% include "baseform/file.html" with field=form.file_field %} +
+
+ {% include "baseform/checkbox.html" with field=form.only_digital_new %} +
{% else %} -
+ {% if form.file_field.value %} +
+ +
- Keine digitale Rechnung eingereicht. -
+ {% if form.only_digital.value %} +
+ {% include "baseform/checkbox.html" with field=form.only_digital %} +
+ {% endif %} + {% else %} +
+ +
+ {% endif %} {% endif %} -
@@ -105,10 +148,10 @@
{% include "baseform/select.html" with field=form.affiliation %}
- {% if form.resolution_text.value %} -
- {% include "baseform/text.html" with field=form.resolution_text %} -
+ {% if form.status.value == object.Status.INCOMPLETE or form.resolution_text.value %} +
+ {% include "baseform/text.html" with field=form.resolution_text %} +
{% endif %}