diff --git a/fet2020/finance/admin.py b/fet2020/finance/admin.py index a59d9e2b..a04647de 100644 --- a/fet2020/finance/admin.py +++ b/fet2020/finance/admin.py @@ -380,152 +380,6 @@ class BillAdmin(admin.ModelAdmin): ) -# @admin.register(Fee) -# class FeeAdmin(admin.ModelAdmin): -# form = FeeAdminForm -# model = Fee - -# list_display = ["id", "amount", "job", "fix_name_desc", "status_colored"] - -# list_filter = ["status"] -# show_facets = admin.ShowFacets.ALWAYS -# ordering = ["-id"] - -# readonly_fields = [ -# "address", -# "get_qrcode", -# ] -# fieldsets = ( -# ( -# None, -# { -# "fields": ( -# "fee_creator", -# "bankdata", -# "address", -# "get_qrcode", -# ), -# }, -# ), -# ( -# "Tätigkeit", -# { -# "fields": ( -# "job", -# "date_start", -# "date_end", -# "amount", -# ), -# }, -# ), -# ( -# "Sonstiges", -# { -# "fields": ( -# "comment", -# "status", -# "file_field", -# ), -# }, -# ), -# ) - -# def add_view(self, request, form_url="", extra_context=None): -# extra_context = extra_context or {} -# extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." -# return super().add_view( -# request, -# form_url, -# extra_context=extra_context, -# ) - -# def change_view(self, request, object_id, form_url="", extra_context=None): -# extra_context = extra_context or {} -# extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." -# extra_context["generate_fee_pdf"] = True -# return super().change_view( -# request, -# object_id, -# form_url, -# extra_context=extra_context, -# ) - -# def response_change(self, request, obj): -# if "_generate_fee_pdf" in request.POST: -# if generate_fee_pdf(obj): -# self.message_user( -# request, -# "Neue Honorarnote wurde generiert.", -# messages.SUCCESS, -# ) -# else: -# self.message_user( -# request, -# ( -# "Das PDF-Dokument konnte nicht generiert werden, da der Status nicht auf " -# "'Eingereicht' gesetzt ist." -# ), -# messages.WARNING, -# ) -# return HttpResponseRedirect(".") -# return super().response_change(request, obj) - -# def save_model(self, request, obj, form, change): -# # set status to submitted, if a file exists and status is opened. -# if ( -# change -# and obj.file_field -# and obj.status == Fee.Status.SUBMITTED -# and "_generate_fee_pdf" not in request.POST -# ): -# obj.status = Fee.Status.APPROVED -# super().save_model(request, obj, form, change) - -# @admin.display(description="Adresse") -# def address(self, obj): -# return obj.bankdata.address - -# @admin.display(description="QR Code") -# def get_qrcode(self, obj): -# # QR Code is only set if status is approved. -# if obj.status != Fee.Status.APPROVED: -# return "-" - -# try: -# qrcode = helpers.make_epc_qr( -# name=obj.bankdata.name, -# iban=obj.bankdata.iban, -# amount=obj.amount, -# text=f"Honorarnote Nr.{obj.id}", -# bic=obj.bankdata.bic, -# encoding="utf-8", -# ) -# except Exception: -# return "Daten für QR Code ungültig" - -# uri = qrcode.png_data_uri(scale=3.0) -# return format_html('', uri) - -# @admin.display(description="Name") -# def fix_name_desc(self, obj): -# return obj.bankdata.name - -# @admin.display(description="Status") -# def status_colored(self, obj): -# # TODO: if there is a status without color, set nothing. -# colors = { -# Fee.Status.SUBMITTED: "red", -# Fee.Status.APPROVED: "darkorange", -# Fee.Status.PAYOUT: "green", -# Fee.Status.CLEARED: "DarkMagenta", -# } -# return format_html( -# '{status}', -# color=colors[obj.status], -# status=obj.get_status_display(), -# ) - - @admin.register(Resolution) class ResolutionAdmin(admin.ModelAdmin): form = ResolutionAdminForm diff --git a/fet2020/finance/forms.py b/fet2020/finance/forms.py index 3761c2a8..4968750b 100644 --- a/fet2020/finance/forms.py +++ b/fet2020/finance/forms.py @@ -283,171 +283,6 @@ class BillUpdateForm(forms.ModelForm): return get_cleaned_data(super().clean()) -# class FeeCreateForm(forms.ModelForm): -# # Bank data -# name_text = forms.CharField(required=True, label="Kontoinhaber:in", initial="", max_length=128) -# iban_text = forms.CharField(required=True, label="IBAN", initial="", max_length=34) -# bic_text = forms.CharField(required=True, label="BIC", initial="", max_length=11) -# address_text = forms.CharField( -# required=True, widget=forms.Textarea, label="Adresse", initial="" -# ) -# saving = forms.BooleanField( -# required=False, -# label="Bankdaten für die nächsten Rechnungen speichern.", -# initial=False, -# ) - -# # Conformation -# conformation = forms.BooleanField( -# required=True, -# label=( -# "Hiermit bestätige ich, dass mir die relevanten rechtlichen und steuerlichen " -# "Bestimmungen im Zusammenhang mit Honorarnoten bekannt sind. Ich verpflichte " -# "mich, diese in Übereinstimmung mit den geltenden steuerlichen Vorschriften " -# "ordnungsgemäß zu melden." -# ), -# initial=False, -# ) - -# class Meta: -# model = Fee - -# fields = [ -# "fee_creator", -# "job", -# "date_start", -# "date_end", -# "amount", -# "comment", -# ] - -# help_texts = { -# "date_end": "Bei einer leeren Eingabe Eingabe wird automatisch das Startdatum gesetzt." -# } - -# labels = { -# "job": "Tätigkeitsbeschreibung", -# } - -# widgets = { -# "date_start": DateInput(format=("%Y-%m-%d")), -# "date_end": DateInput(format=("%Y-%m-%d")), -# } - -# def __init__(self, *args, **kwargs): -# user = kwargs.pop("user") if "user" in kwargs else None - -# super().__init__(*args, **kwargs) # to get the self.fields set - -# member = Member.objects.get(username=user.username) -# self.fields["fee_creator"].initial = member -# self.fields["fee_creator"].disabled = True -# self.fields["fee_creator"].required = True - -# self.fields["date_end"].required = False - -# self.fields["address_text"].placeholder = "Straße\nPLZ und Ort" - -# # Bank data fields -# bank_data = BankData.objects.filter( -# Q(bankdata_creator=member) & Q(is_disabled=False), -# ).first() -# if bank_data: -# self.fields["name_text"].initial = bank_data.name -# self.fields["iban_text"].initial = bank_data.iban -# self.fields["bic_text"].initial = bank_data.bic -# self.fields["address_text"].initial = bank_data.address -# self.fields["saving"].initial = True - - -# class FeeUpdateForm(forms.ModelForm): -# # Bank data -# name_text = forms.CharField(required=False, label="Kontoinhaber:in", initial="", max_length=128) -# iban_text = forms.CharField(required=False, label="IBAN", initial="", max_length=34) -# bic_text = forms.CharField(required=False, label="BIC", initial="", max_length=11) -# address_text = forms.CharField( -# required=False, widget=forms.Textarea, label="Adresse", initial="" -# ) -# saving = forms.BooleanField( -# required=False, -# label="Bankdaten für die nächsten Rechnungen speichern.", -# initial=False, -# ) - -# class Meta: -# model = Fee - -# fields = [ -# "fee_creator", -# "job", -# "date_start", -# "date_end", -# "amount", -# "status", -# "comment", -# ] - -# labels = { -# "job": "Tätigkeitsbeschreibung", -# } - -# widgets = { -# "date_start": DateInput(format=("%Y-%m-%d")), -# "date_end": DateInput(format=("%Y-%m-%d")), -# } - -# def __init__(self, *args, **kwargs): -# super().__init__(*args, **kwargs) # to get the self.fields set - -# self.fields["fee_creator"].initial = kwargs["instance"].fee_creator -# self.fields["fee_creator"].disabled = True -# self.fields["fee_creator"].required = True - -# self.fields["status"].disabled = True - -# # Config for textarea of job. Calc rows for a better view. -# if (rows := kwargs["instance"].job.count("\n") + 1) < 3: -# rows = 3 -# self.fields["job"].rows = rows -# self.fields["job"].disabled = True - -# self.fields["date_start"].disabled = True -# self.fields["date_end"].disabled = True -# self.fields["amount"].disabled = True - -# # Bank data fields -# if kwargs["instance"].bankdata: -# self.fields["name_text"].initial = kwargs["instance"].bankdata.name -# self.fields["name_text"].required = True - -# self.fields["iban_text"].initial = kwargs["instance"].bankdata.iban -# self.fields["iban_text"].required = True - -# self.fields["bic_text"].initial = kwargs["instance"].bankdata.bic -# self.fields["bic_text"].required = True - -# self.fields["address_text"].initial = kwargs["instance"].bankdata.address - -# self.fields["saving"].initial = not kwargs["instance"].bankdata.is_disabled - -# self.fields["name_text"].disabled = True -# self.fields["iban_text"].disabled = True -# self.fields["bic_text"].disabled = True -# self.fields["address_text"].disabled = True - -# self.fields["saving"].disabled = True - -# # Config for textarea of comment. Calc rows for a better view. -# rows = kwargs["instance"].comment.count("\n") + 1 -# self.fields["comment"].rows = rows - -# # 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): class Meta: model = Resolution @@ -603,28 +438,6 @@ class BillAdminForm(forms.ModelForm): self.fields["wiref"].queryset = qs.order_by("-wiref_id") -# class FeeAdminForm(forms.ModelForm): -# class Meta: -# model = Fee - -# fields = "__all__" - -# help_texts = { -# "date_end": "Bei einer leeren Eingabe Eingabe wird automatisch das Startdatum gesetzt." -# } - -# widgets = { -# "date": DateInput(format=("%Y-%m-%d")), -# } - -# def __init__(self, *args, **kwargs): -# super().__init__(*args, **kwargs) - -# self.fields["bankdata"].required = True - -# self.fields["date_end"].required = False - - class ResolutionAdminForm(forms.ModelForm): total = forms.CharField() budget_remaining = forms.CharField() diff --git a/fet2020/finance/models.py b/fet2020/finance/models.py index 56e9daf3..6f49b490 100644 --- a/fet2020/finance/models.py +++ b/fet2020/finance/models.py @@ -38,71 +38,6 @@ class BankData(models.Model): self.bic = self.bic.replace(" ", "") -# class Fee(models.Model): -# fee_creator = models.ForeignKey( -# Member, -# on_delete=models.PROTECT, -# blank=True, -# null=True, -# verbose_name="Verantwortliche:r", -# ) - -# bankdata = models.ForeignKey( -# BankData, -# on_delete=models.SET_NULL, -# blank=True, -# null=True, -# verbose_name="Bankdaten", -# ) - -# job = models.TextField(verbose_name="Tätigkeit") -# date_start = models.DateField(verbose_name="Start der Tätigkeit") -# date_end = models.DateField(verbose_name="Ende der Tätigkeit") -# amount = models.DecimalField(max_digits=7, decimal_places=2, verbose_name="Betrag (EUR)") - -# class Status(models.TextChoices): -# SUBMITTED = "S", "Eingereicht" -# APPROVED = "A", "Für Überweisung freigegeben" -# PAYOUT = "P", "Ausbezahlt" -# CLEARED = "C", "An Dekanat verrechnet" - -# status = models.CharField( -# max_length=1, -# choices=Status.choices, -# default=Status.SUBMITTED, -# verbose_name="Status", -# ) - -# date_created = models.DateTimeField(auto_now_add=True) - -# file_field = models.FileField( -# upload_to="uploads/finance/fee/", -# validators=[FileExtensionValidator(["pdf"])], -# blank=True, -# null=True, -# verbose_name="Honorarnote", -# ) - -# comment = models.TextField(blank=True, default="", verbose_name="Kommentar") - -# class Meta: -# verbose_name = "Honorar" -# verbose_name_plural = "Honorare" - -# def __str__(self): -# return f"Honorar #{self.id} / {self.job}" - -# def save(self, *args, **kwargs): -# if not self.date_end: -# self.date_end = self.date_start - -# super().save(*args, **kwargs) - -# @property -# def filename(self): -# return Path(self.file_field.name).name - - class Resolution(models.Model): id = models.CharField(primary_key=True, max_length=128, verbose_name="Beschlussnummer") name = models.CharField(max_length=128, verbose_name="Bezeichnung") diff --git a/fet2020/finance/urls.py b/fet2020/finance/urls.py index 21ecd0d9..4db309a1 100644 --- a/fet2020/finance/urls.py +++ b/fet2020/finance/urls.py @@ -24,14 +24,6 @@ urlpatterns = [ BillCreateDoneView.as_view(), name="bill_create_done", ), - # # Fee views - # path("create-fee/", FeeCreateView.as_view(), name="fee_create"), - # path( - # "create-fee//done/", - # FeeCreateDoneView.as_view(), - # name="fee_create_done", - # ), - # path("fee//", FeeUpdateView.as_view(), name="fee_update"), # Resolution views path("create-resolution/", ResolutionCreateView.as_view(), name="resolution_create"), path("resolutions/", ResolutionListView.as_view(), name="resolution_list"), diff --git a/fet2020/finance/utils.py b/fet2020/finance/utils.py index 832198cf..270f5765 100644 --- a/fet2020/finance/utils.py +++ b/fet2020/finance/utils.py @@ -80,58 +80,3 @@ def generate_pdf(wiref): wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name)) return True - - -# def generate_fee_pdf(fee: Fee): -# if not fee or fee.status != Fee.Status.SUBMITTED: -# return False - -# # Get data for pdf -# data = {} -# data.update( -# { -# "Full_Name": fee.bankdata.name, -# "Adresse": fee.bankdata.address, -# # Change to the correct date format -# "Date": str(fee.date_created.strftime("%d.%m.%Y")), -# "Honorarnoten-Nummer": str(fee.pk), -# "Taetigkeit_1": fee.job, -# # Change to the correct date format -# "Date_1": str(fee.date_start.strftime("%d.%m.%Y")), -# # Change to the correct date format -# "Date_2": str(fee.date_end.strftime("%d.%m.%Y")), -# # Replace decimal separator from '.' to ',' -# "EUR_1": str(fee.amount).replace(".", ","), -# "IBAN": fee.bankdata.iban, -# "BIC": fee.bankdata.bic, -# }, -# ) - -# # Add mail only if a fet user create the fee -# if fee.fee_creator: -# mail = fee.fee_creator.mailaccount -# data.update( -# { -# "Email": mail, -# }, -# ) - -# # Write data in pdf -# pdf_path = Path(Path(__file__).parent) / "static/fee/Honorarnote-Vorlage.pdf" -# reader = PdfReader(pdf_path) -# writer = PdfWriter() -# writer.append(reader) - -# writer.update_page_form_field_values( -# writer.pages[0], -# data, -# ) - -# with io.BytesIO() as bytes_stream: -# writer.write(bytes_stream) - -# # Save pdf in fee -# fee_name = f"Honorarnote-{fee.pk}.pdf" -# fee.file_field.save(fee_name, File(bytes_stream, fee_name)) - -# return True diff --git a/fet2020/finance/views.py b/fet2020/finance/views.py index 80ae92a9..737a1cd7 100644 --- a/fet2020/finance/views.py +++ b/fet2020/finance/views.py @@ -89,26 +89,17 @@ class BillListView(LoginRequiredMixin, ListView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - # context["fee_status"] = Fee.Status context["bill_status"] = Bill.Status return context def get_queryset(self): - # qs1 = ( - # Fee.objects.filter(fee_creator__username=self.request.user) - # .values("amount", "status", "id") - # .annotate( - # date=F("date_start"), purpose=F("job"), model=Value("FEE", output_field=CharField()) - # ) - # ) qs = ( Bill.objects.filter(bill_creator__username=self.request.user) .values("amount", "status", "id", "date", "purpose") .annotate(model=Value("BILL", output_field=CharField())) ) - # qs = qs1.union(qs2, all=True) return qs.order_by("-date", "purpose") @@ -146,57 +137,6 @@ class BillUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): return redirect("finance:bill_list") -# class FeeCreateView(LoginRequiredMixin, CreateView): -# form_class = FeeCreateForm -# model = Fee -# template_name = "finance/fee/create.html" - -# def form_valid(self, form): -# # Get or create bankdata object. -# creator = form.cleaned_data["fee_creator"] -# name = form.cleaned_data["name_text"] -# iban = form.cleaned_data["iban_text"] -# bic = form.cleaned_data["bic_text"] -# address = form.cleaned_data["address_text"] -# saving = form.cleaned_data["saving"] -# form.instance.bankdata = set_bankdata(creator, name, iban, bic, saving, address) - -# add_log_action(self.request, form, "finance", "fee", True) -# return super().form_valid(form) - -# def get_form_kwargs(self): -# kwargs = super().get_form_kwargs() - -# # Request user for fee creator. -# kwargs["user"] = self.request.user -# return kwargs - -# def get_success_url(self): -# return reverse("finance:fee_create_done", kwargs={"pk": self.object.pk}) - - -# class FeeCreateDoneView(LoginRequiredMixin, TemplateView): -# template_name = "finance/fee/create_done.html" - - -# class FeeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): -# form_class = FeeUpdateForm -# model = Fee -# success_url = reverse_lazy("finance:bill_list") -# template_name = "finance/fee/update.html" - -# def form_valid(self, form): -# add_log_action(self.request, form, "finance", "fee", False) -# return super().form_valid(form) - -# # Call fee if it's only yours. -# def test_func(self): -# return self.get_object().fee_creator.username == self.request.user.username - -# def handle_no_permission(self): -# return redirect("finance:bill_list") - - class ResolutionCreateView(LoginRequiredMixin, CreateView): form_class = ResolutionCreateForm model = Resolution