add incomplete status to update view and update other status here

This commit is contained in:
2024-01-29 23:05:56 +00:00
parent 491a81aece
commit a23321a98b
3 changed files with 212 additions and 76 deletions

View File

@@ -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):

View File

@@ -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):

View File

@@ -11,6 +11,13 @@
{% csrf_token %}
{% include "baseform/non_field_errors.html" %}
<section>
<div class="grid grid-cols-1 gap-x-6 gap-y-6 sm:grid-cols-6">
<div class="sm:col-span-3">
{% include "baseform/select.html" with field=form.status %}
</div>
</div>
</section>
<section>
<h2>Bankdaten</h2>
<small>Angaben zu den Bankdaten für die Rückerstattung des Rechnungsbetrags.</small>
@@ -20,20 +27,29 @@
{% include "baseform/select.html" with field=form.payer %}
</div>
{% if form.name_text.value %}
{% if form.payer.value == object.Payer.ME %}
<div class="sm:col-span-4">
{% include "baseform/text.html" with field=form.name_text %}
</div>
{% endif %}
{% if form.iban_text.value %}
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.iban_text %}
</div>
{% endif %}
{% if form.bic_text.value %}
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.bic_text %}
</div>
{% elif form.status.value == object.Status.INCOMPLETE %}
<div class="sm:col-span-4">
{% include "baseform/text.html" with field=form.name_text %}
</div>
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.iban_text %}
</div>
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.bic_text %}
</div>
<div class="col-span-full">
{% include "baseform/checkbox.html" with field=form.saving %}
</div>
{% endif %}
</div>
</section>
@@ -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"
>
</label>
</div>
{% if form.file_field.value %}
<div class="col-span-full">
{% include "baseform/checkbox.html" with field=form.only_digital %}
</div>
{% if form.status.value == object.Status.INCOMPLETE %}
{% if form.file_field.value %}
<div class="col-span-full">
<label>
{% if object.only_digital %}
<span class="text-gray-700 dark:text-gray-200">Ich habe nur eine digitale Rechnung hochgeladen:</span>
{% else %}
<span class="text-gray-700 dark:text-gray-200">Hochgeladene Rechnung:</span>
{% endif %}
<div class="col-span-full">
<label>
<span class="text-gray-700 dark:text-gray-200">Derzeit:</span>
<a
href="{{ form.file_field.value.url }}"
class="text-gray-700 dark:text-gray-200 block w-full mt-1 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"
>{{ form.file_field.value }}</a>
</label>
</div>
{% endif %}
<a
href="{{ form.file_field.value.url }}"
class="text-gray-700 dark:text-gray-200 block w-full mt-1 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"
>{{ form.file_field.value }}</a>
</label>
</div>
<div class="col-span-full">
{% include "baseform/file.html" with field=form.file_field %}
</div>
<div class="col-span-full">
{% include "baseform/checkbox.html" with field=form.only_digital_new %}
</div>
{% else %}
<div class="col-span-full">
{% if form.file_field.value %}
<div class="col-span-full">
<label>
<span class="text-gray-700 dark:text-gray-200">Hochgeladene Rechnung:</span>
<a
href="{{ form.file_field.value.url }}"
class="text-gray-700 dark:text-gray-200 block w-full mt-1 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"
>{{ form.file_field.value }}</a>
</label>
</div>
<span class="text-gray-700 dark:text-gray-200">Keine digitale Rechnung eingereicht.</span>
</div>
{% if form.only_digital.value %}
<div class="col-span-full">
{% include "baseform/checkbox.html" with field=form.only_digital %}
</div>
{% endif %}
{% else %}
<div class="col-span-full">
<label>
<span class="text-gray-700 dark:text-gray-200">Keine digitale Rechnung eingereicht.</span>
</label>
</div>
{% endif %}
{% endif %}
</div>
</section>
<section>
@@ -105,10 +148,10 @@
<div class="sm:col-span-3">
{% include "baseform/select.html" with field=form.affiliation %}
</div>
{% if form.resolution_text.value %}
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.resolution_text %}
</div>
{% if form.status.value == object.Status.INCOMPLETE or form.resolution_text.value %}
<div class="sm:col-span-3">
{% include "baseform/text.html" with field=form.resolution_text %}
</div>
{% endif %}
</div>
</section>