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