add incomplete status to update view and update other status here
This commit is contained in:
@@ -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,6 +210,64 @@ 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["status"].disabled = True
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
# 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
|
||||
@@ -212,34 +279,50 @@ class BillUpdateForm(forms.ModelForm):
|
||||
self.fields["file_field"].disabled = True
|
||||
self.fields["resolution"].disabled = True
|
||||
|
||||
# bank data fields
|
||||
# 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 = 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"].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
|
||||
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:
|
||||
self.fields["resolution_text"].initial = kwargs["instance"].resolution.name
|
||||
_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 != "S":
|
||||
# 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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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,24 +79,25 @@
|
||||
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.status.value == object.Status.INCOMPLETE %}
|
||||
{% if form.file_field.value %}
|
||||
<div class="col-span-full">
|
||||
{% include "baseform/checkbox.html" with field=form.only_digital %}
|
||||
</div>
|
||||
|
||||
<div class="col-span-full">
|
||||
<label>
|
||||
<span class="text-gray-700 dark:text-gray-200">Derzeit:</span>
|
||||
{% 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 %}
|
||||
|
||||
<a
|
||||
href="{{ form.file_field.value.url }}"
|
||||
@@ -88,13 +105,39 @@
|
||||
>{{ form.file_field.value }}</a>
|
||||
</label>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="col-span-full">
|
||||
|
||||
<span class="text-gray-700 dark:text-gray-200">Keine digitale Rechnung eingereicht.</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<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 %}
|
||||
{% 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>
|
||||
|
||||
{% 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,7 +148,7 @@
|
||||
<div class="sm:col-span-3">
|
||||
{% include "baseform/select.html" with field=form.affiliation %}
|
||||
</div>
|
||||
{% if form.resolution_text.value %}
|
||||
{% 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>
|
||||
|
||||
Reference in New Issue
Block a user