This commit is contained in:
Felix Baumann
2026-06-28 10:20:36 +00:00
parent 64b32d0b44
commit 148efd919d
86 changed files with 2475 additions and 760 deletions
@@ -18,7 +18,7 @@ Kunde bearbeiten
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<h2 class="text-xl font-bold mb-2">Kundendaten</h2>
<h2 class="text-lg font-bold mb-2">Kundendaten</h2>
<div class="grid md:grid-cols-2 gap-4 mb-8">
@@ -18,7 +18,7 @@ Kundenstammdaten verwalten
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">
Kunden anlegen
</p>
@@ -36,7 +36,7 @@ Kundenstammdaten verwalten
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors mb-8">
<div class="mb-6">
<h2 class="text-xl font-bold">Kundenliste</h2>
<h2 class="text-lg font-bold">Kundenliste</h2>
<p class="text-slate-400 text-sm mt-1">Alle Kunden, inkl. Standorte und Ansprechpartner</p>
</div>
@@ -49,7 +49,7 @@ Kundenstammdaten verwalten
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="mb-6">
<h2 class="text-xl font-bold">Archivierte Kunden</h2>
<h2 class="text-lg font-bold">Archivierte Kunden</h2>
<p class="text-slate-400 text-sm mt-1">Alle inaktiven Kunden, inkl. Standorte und Ansprechpartner</p>
</div>
@@ -0,0 +1,249 @@
{% extends "base.html" %}
{% block title %}Rechnungswesen - Rechnungen{% endblock %}
{% block header_title %}
Zahlung erfassen
{% endblock %}
{% block header_description %}
Zahlung für Rechnung {{ invoice.invoice_number }} hinzufügen
{% endblock %}
{% block content %}
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- PAYMENT FORM -->
<div class="lg:col-span-2">
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<form method="post" enctype="multipart/form-data" class="space-y-4">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-save">
Speichern
</button>
</form>
</div>
</div>
<!-- PAYMENT SUMMARY -->
<div class="lg:col-span-1">
<div class="bg-white dark:bg-slate-800 rounded-xl shadow p-6 font-mono text-sm">
<!-- HEADER -->
<div class="text-center">
<h2 class="text-lg font-bold">
Zahlungsübersicht
</h2>
<p class="text-xs text-slate-400 mt-1">
Rechnung {{ invoice.invoice_number }}
</p>
</div>
<div class="border-t border-dashed border-slate-300 dark:border-slate-600 my-5"></div>
<!-- RECHNUNG -->
<div class="space-y-2">
{% if not invoice.is_small_business %}
<div class="flex justify-between">
<span class="text-slate-400">
Netto
</span>
<span>
{{ invoice.total_net|floatformat:2 }} €
</span>
</div>
<div class="flex justify-between">
<span class="text-slate-400">
Umsatzsteuer
</span>
<span>
{{ invoice.total_tax|floatformat:2 }} €
</span>
</div>
{% endif %}
<div class="flex justify-between font-semibold">
<span>
Rechnungsbetrag
</span>
<span>
{{ invoice.total_amount|floatformat:2 }} €
</span>
</div>
</div>
<!-- MAHNUNGEN -->
{% if invoice.reminder_amount > 0 %}
<div class="border-t border-dashed border-slate-300 dark:border-slate-600 my-5"></div>
<div class="space-y-2">
<div class="flex justify-between text-red-600">
<span>
Mahngebühren
</span>
<span>
+ {{ invoice.reminder_amount|floatformat:2 }} €
</span>
</div>
{% for reminder in invoice.reminders.all %}
{% if reminder.status != "canceled" %}
<div class="flex justify-between text-xs text-slate-400">
<span>
{{ reminder.level }}. Mahnung
</span>
<span>
{{ reminder.fee|floatformat:2 }} €
</span>
</div>
{% endif %}
{% endfor %}
</div>
{% endif %}
<!-- GESAMT -->
<div class="border-t border-dashed border-slate-300 dark:border-slate-600 my-5"></div>
<div class="flex justify-between text-lg font-bold">
<span>
Gesamtforderung
</span>
<span>
{{ invoice.total_with_reminders|floatformat:2 }} €
</span>
</div>
<!-- ZAHLUNGEN -->
<div class="mt-4 space-y-2">
<div class="flex justify-between text-green-600">
<span>
Bereits bezahlt
</span>
<span>
- {{ invoice.paid_amount|floatformat:2 }} €
</span>
</div>
{% for payment in invoice.payments.all %}
<div class="flex justify-between text-xs text-slate-400">
<span>
Zahlung {{ payment.date|date:"d.m.Y" }}
</span>
<span>
{{ payment.amount|floatformat:2 }} €
</span>
</div>
{% endfor %}
</div>
<!-- OFFEN -->
<div class="border-t border-dashed border-slate-300 dark:border-slate-600 my-5"></div>
<div class="bg-slate-100 dark:bg-slate-700 rounded-xl p-4 text-center">
<p class="text-xs uppercase text-slate-400">
Offener Betrag
</p>
<p class="text-3xl font-bold text-red-600 mt-1">
{{ invoice.open_amount|floatformat:2 }} €
</p>
</div>
<!-- FOOTER -->
<div class="border-t border-dashed border-slate-300 dark:border-slate-600 my-5"></div>
<div class="text-center text-xs text-slate-400">
Zahlungserfassung
</div>
</div>
</div>
</div>
{% endblock %}
@@ -16,7 +16,7 @@ Details & Positionen
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">
Positionen zur Rechnung hinzufügen
</p>
@@ -32,7 +32,6 @@ Details & Positionen
<a href="{% url 'invoices:invoices_download' invoice.id %}" class="btn btn-action">Download</a>
<a href="{% url 'invoices:invoices_cancel' invoice.id %}" onclick="startDownloadAndRedirect()" class="btn btn-delete">Stornieren</a>
<a href="{% url 'invoices:invoices_paid' invoice.id %}" class="btn btn-action">Zahlung verbuchen</a>
<a href="{% url 'invoices:invoices_overdue' invoice.id %}" class="btn btn-action">Überfällig</a>
{% endif %}
{% if invoice.status == "paid" %}
<a href="{% url 'invoices:invoices_download' invoice.id %}" class="btn btn-action">Download</a>
@@ -44,6 +43,8 @@ Details & Positionen
{% endif %}
{% if invoice.status == "overdue" %}
<a href="{% url 'invoices:invoices_download' invoice.id %}" class="btn btn-action">Download</a>
<a href="{% url 'invoices:invoices_cancel' invoice.id %}" onclick="startDownloadAndRedirect()" class="btn btn-delete">Stornieren</a>
<a href="{% url 'invoices:invoices_paid' invoice.id %}" class="btn btn-action">Zahlung verbuchen</a>
{% endif %}
</div>
@@ -11,7 +11,7 @@
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">Neue Rechnung erstellen</p>
</div>
@@ -24,7 +24,7 @@
</div>
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="mb-6">
<h2 class="text-xl font-bold">Rechnungen</h2>
<h2 class="text-lg font-bold">Rechnungen</h2>
<p class="text-slate-400 text-sm mt-1">Alle Rechnungen mit aktuellem Status</p>
</div>
<div class="overflow-x-auto rounded-xl">
@@ -158,7 +158,7 @@ table {
margin-top:30px;
margin-left:auto;
width:250px;
width: 300px;
}
@@ -178,7 +178,7 @@ table {
border-top:1px solid #cbd5e1;
margin-top:10px;
padding-top:10px;
font-size:16px;
font-size:14px;
font-weight:bold;
}
@@ -454,7 +454,7 @@ Preis
</th>
{% if not company.is_small_business %}
{% if not invoice.is_small_business %}
<th class="left">
Steuer
@@ -518,7 +518,7 @@ Gesamt
</td>
{% if not company.is_small_business %}
{% if not invoice.is_small_business %}
<td class="left">
{{ item.unit_tax_rate|floatformat:0 }} %
@@ -569,7 +569,7 @@ Netto
{% if not company.is_small_business %}
{% if not invoice.is_small_business %}
{% for tax_rate,tax_amount in tax_summary.items %}
<div class="total-row">
@@ -603,7 +603,7 @@ Gesamt
<span>
{% if company.is_small_business %}
{% if invoice.is_small_business %}
{{ total_net|floatformat:2 }}
{% else %}
{{ total_gross|floatformat:2 }}
@@ -644,7 +644,7 @@ Rechnungshinweis
{% if company.is_small_business %}
{% if invoice.is_small_business %}
<div class="note">
@@ -155,10 +155,9 @@ table {
.total-box {
margin-top:30px;
margin-left:auto;
width:250px;
width:300px;
}
@@ -174,11 +173,10 @@ table {
.total-final {
border-top:1px solid #cbd5e1;
margin-top:10px;
padding-top:10px;
font-size:16px;
font-size:14px;
font-weight:bold;
}
@@ -414,12 +412,11 @@ Stornodatum: {{ cancel_date|date:"d.m.Y" }}
<!-- POSITIONEN -->
<div class="items-wrapper">
<table class="items">
<table class="items">
<thead>
@@ -429,37 +426,46 @@ Stornodatum: {{ cancel_date|date:"d.m.Y" }}
Nr.
</th>
<th>
Beschreibung
</th>
{% if show_service_date %}
<th class="left">Leistungsdatum</th>
{% endif %}
<th class="left">
{% if show_service_date %}
<th>
Leistungsdatum
</th>
{% endif %}
<th class="right">
Menge
</th>
<th class="left">
<th>
Einheit
</th>
<th class="left">
Preis
<th class="right">
Einzelpreis
</th>
{% if not company.is_small_business %}
{% if not invoice.is_small_business %}
<th class="left">
<th class="right">
Steuer
</th>
{% endif %}
<th class="left">
<th class="right">
Gesamt
</th>
@@ -469,7 +475,6 @@ Gesamt
</thead>
<tbody>
@@ -483,40 +488,52 @@ Gesamt
</td>
<td>
{{ item.description }}
Storno: {{ item.description }}
</td>
{% if show_service_date %}
<td class="left">
{% if item.service_period_from %}
{{ item.service_period_from|date:"d.m.Y" }}
{% endif %}
{% if item.service_period_to %}
- {{ item.service_period_to|date:"d.m.Y" }}
{% endif %}
</td>
{% endif %}
<td class="left">
{% if show_service_date %}
<td>
{% if item.service_period_from %}
{{ item.service_period_from|date:"d.m.Y" }}
{% endif %}
{% if item.service_period_to %}
- {{ item.service_period_to|date:"d.m.Y" }}
{% endif %}
</td>
{% endif %}
<td class="right">
{{ item.quantity }}
</td>
<td class="left">
<td>
{{ item.unit }}
</td>
<td class="left">
<td class="right">
-{{ item.unit_price_net|floatformat:2 }} €
</td>
{% if not company.is_small_business %}
<td class="left">
{% if not invoice.is_small_business %}
<td class="right">
{{ item.unit_tax_rate|floatformat:0 }} %
</td>
@@ -524,7 +541,7 @@ Gesamt
<td class="left">
<td class="right">
-{{ item.calculated_total_net|floatformat:2 }} €
</td>
@@ -540,14 +557,28 @@ Gesamt
</table>
</div>
<!-- SUMMEN -->
<!-- SUMMEN -->
<div class="total-box">
@@ -565,7 +596,9 @@ Netto
{% if not company.is_small_business %}
{% if not invoice.is_small_business %}
{% for tax_rate,tax_amount in tax_summary.items %}
<div class="total-row">
@@ -574,32 +607,27 @@ Netto
Umsatzsteuer {{ tax_rate|floatformat:0 }} %
</span>
<span>
-{{ tax_amount|floatformat:2 }} €
</span>
</div>
{% endfor %}
{% endif %}
<div class="total-row total-final">
<span>
Gesamt
Rechnungsbetrag
</span>
<span>
{% if company.is_small_business %}
{% if invoice.is_small_business %}
-{{ total_net|floatformat:2 }}
{% else %}
-{{ total_gross|floatformat:2 }}
@@ -609,12 +637,41 @@ Gesamt
</span>
</div>
<div class="total-row">
<span>
Bereits bezahlt
</span>
<span>
-{{ paid_amount|floatformat:2 }} €
</span>
</div>
<div class="total-row total-final">
<span>
Erstattungsbetrag
</span>
<span>
{{ refund_amount|floatformat:2 }} €
</span>
</div>
</div>
<div class="note">
<div class="receiver-title">
@@ -623,37 +680,45 @@ Gesamt
<br>
Die Rechnung {{ invoice.invoice_number }}
wird durch diese Stornorechnung vollständig aufgehoben.
{% if original_status == "paid" %}
Die Rechnung
<strong>{{ invoice.invoice_number }}</strong>
vom {{ invoice.issue_date|date:"d.m.Y" }}
wird durch diese Stornorechnung aufgehoben.
<br><br>
Die ursprüngliche Rechnung wurde bereits bezahlt.
{% if paid_amount > 0 %}
Es entsteht ein Guthaben in Höhe von
<br><br>
{% if company.is_small_business %}
{{ total_net|floatformat:2 }}
{% else %}
{{ total_gross|floatformat:2 }}
{% endif %}
€.
Die ursprüngliche Rechnung wurde bereits bezahlt.
Der zu erstattende Betrag beträgt:
<strong>
{{ refund_amount|floatformat:2 }} €
</strong>
<br><br>
Die Rückerstattung erfolgt separat.
Die Rückerstattung erfolgt separat.
{% endif %}
</div>
{% if company.is_small_business %}
{% if invoice.is_small_business %}
<div class="note">
@@ -18,7 +18,7 @@ Leistungen und Artikel verwalten
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">
Leistungen und Artikel anlegen
</p>
@@ -38,7 +38,7 @@ Leistungen und Artikel verwalten
<div class="flex flex-wrap justify-between items-center mb-6">
<div>
<h2 class="text-xl font-bold">
<h2 class="text-lg font-bold">
Artikel und Leistungen
</h2>
@@ -16,7 +16,7 @@ Details & Positionen
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">
Positionen zum Angebot hinzufügen
</p>
@@ -32,7 +32,6 @@ Details & Positionen
<a href="{% url 'invoices:offers_download' offer.id %}" class="btn btn-action">Download</a>
<a href="{% url 'invoices:offers_accept' offer.id %}" class="btn btn-action">Akzeptiert</a>
<a href="{% url 'invoices:offers_reject' offer.id %}" class="btn btn-action">Abgelehnt</a>
<a href="{% url 'invoices:offers_expire' offer.id %}" class="btn btn-action">Ausgelaufen</a>
{% endif %}
{% if offer.status == "accepted" or offer.status == "rejected" or offer.status == "expired" %}
<a href="{% url 'invoices:offers_download' offer.id %}" class="btn btn-action">Download</a>
@@ -11,7 +11,7 @@
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">Neues Angebot erstellen</p>
</div>
@@ -24,7 +24,7 @@
</div>
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="mb-6">
<h2 class="text-xl font-bold">Angebote</h2>
<h2 class="text-lg font-bold">Angebote</h2>
<p class="text-slate-400 text-sm mt-1">Alle Angebote mit aktuellem Status</p>
</div>
<div class="overflow-x-auto rounded-xl">
+2 -2
View File
@@ -158,7 +158,7 @@ table {
margin-top:30px;
margin-left:auto;
width:250px;
width: 300px;
}
@@ -178,7 +178,7 @@ table {
border-top:1px solid #cbd5e1;
margin-top:10px;
padding-top:10px;
font-size:16px;
font-size:14px;
font-weight:bold;
}
+15 -22
View File
@@ -18,44 +18,37 @@ Angebote, Rechnungen, Mahnungen verwalten
<!-- MODULE GRID -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<a href="{% url 'invoices:invoices_offers_overview' %}" class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<a href="{% url 'invoices:invoices_offers_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">📄</div>
<h2 class="text-xl font-bold">Angebote</h2>
<h2 class="text-lg font-bold">Angebote</h2>
<p class="text-slate-400 text-sm mt-1">Angebote erstellen und verwalten</p>
</a>
<a href="{% url 'invoices:invoices_invoices_overview' %}" class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<a href="{% url 'invoices:invoices_invoices_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">🧾</div>
<h2 class="text-xl font-bold">Rechnungen</h2>
<h2 class="text-lg font-bold">Rechnungen</h2>
<p class="text-slate-400 text-sm mt-1">Rechnungen erstellen und verwalten</p>
</a>
<a href="{% url 'invoices:invoices_reminders_overview' %}" class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<a href="{% url 'invoices:invoices_reminders_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">⚠️</div>
<h2 class="text-xl font-bold">Mahnungen</h2>
<h2 class="text-lg font-bold">Mahnungen</h2>
<p class="text-slate-400 text-sm mt-1">Offene Forderungen verfolgen</p>
</a>
<a href="{% url 'invoices:customers_overview' %}" class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<a href="{% url 'invoices:customers_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">👥</div>
<h2 class="text-xl font-bold">Kunden</h2>
<h2 class="text-lg font-bold">Kunden</h2>
<p class="text-slate-400 text-sm mt-1">Kundenstammdaten verwalten</p>
</a>
<a href="{% url 'invoices:items_overview' %}" class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<a href="{% url 'invoices:items_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">📦</div>
<h2 class="text-xl font-bold">Posten</h2>
<h2 class="text-lg font-bold">Posten</h2>
<p class="text-slate-400 text-sm mt-1">Leistungen und Artikel verwalten</p>
</a>
</div>
<!-- OPTIONAL INFO BOX -->
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors mt-8">
<h2 class="text-xl font-bold">
Zusammenfassung
</h2>
<p class="text-slate-400 text-sm mt-1">
folgt
</p>
<a href="{% url 'invoices:invoices_payments_overview' %}" class="border border-slate-100 dark:border-slate-700 hover:border-[var(--company-color)]/40 hover:shadow-sm transition-all duration-200 p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="text-2xl mb-2">🏦</div>
<h2 class="text-lg font-bold">Zahlungen</h2>
<p class="text-slate-400 text-sm mt-1">Zahlungsvorgänge verfolgen</p>
</a>
</div>
{% endblock %}
@@ -0,0 +1,20 @@
{% extends "base.html" %}
{% block title %}Rechnungswesen - Zahlungen{% endblock %}
{% block header_title %}Zahlungen{% endblock %}
{% block header_description %}Zahlungsvorgänge verfolgen{% endblock %}
{% block content %}
{% load django_tables2 %}
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="mb-6">
<h2 class="text-lg font-bold">Zahlungen</h2>
<p class="text-slate-400 text-sm mt-1">Alle Zahlungsvorgänge</p>
</div>
<div class="overflow-x-auto rounded-xl">
{% render_table table %}
</div>
</div>
{% endblock %}
@@ -15,7 +15,7 @@ Details
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">
Mahnung verwalten
</p>
@@ -28,8 +28,6 @@ Details
{% if reminder.status == "sent" %}
<a href="{% url 'invoices:reminders_download' reminder.id %}" class="btn btn-action">Download</a>
<a href="{% url 'invoices:reminders_cancel' reminder.id %}" class="btn btn-delete">Stornieren</a>
<a href="{% url 'invoices:reminders_paid' reminder.id %}" class="btn btn-action">Zahlung verbuchen</a>
<a href="{% url 'invoices:reminders_expire' reminder.id %}" class="btn btn-action">Überfällig</a>
{% endif %}
{% if reminder.status == "paid" or reminder.status == "canceled" or reminder.status == "expired" %}
<a href="{% url 'invoices:reminders_download' reminder.id %}" class="btn btn-action">Download</a>
@@ -11,7 +11,7 @@
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div>
<h2 class="text-xl font-bold">Aktionen</h2>
<h2 class="text-lg font-bold">Aktionen</h2>
<p class="text-slate-400 text-sm mt-1">Neue Mahnung erstellen</p>
</div>
@@ -24,7 +24,7 @@
</div>
<div class="p-6 rounded-xl shadow bg-white dark:bg-slate-800 text-slate-900 dark:text-white transition-colors">
<div class="mb-6">
<h2 class="text-xl font-bold">Mahnungen</h2>
<h2 class="text-lg font-bold">Mahnungen</h2>
<p class="text-slate-400 text-sm mt-1">Alle Mahnungen mit aktuellem Status</p>
</div>
<div class="overflow-x-auto rounded-xl">
+59 -14
View File
@@ -149,16 +149,15 @@ table {
.right {
text-align:right;
text-align: right !important;
}
.total-box {
margin-top:30px;
margin-left:auto;
width:250px;
width:300px;
}
@@ -178,7 +177,7 @@ table {
border-top:1px solid #cbd5e1;
margin-top:10px;
padding-top:10px;
font-size:16px;
font-size:14px;
font-weight:bold;
}
@@ -440,7 +439,7 @@ Betrag
Rechnung {{ reminder.invoice.invoice_number }}
</td>
<td>
<td class="right">
{{ invoice_amount|floatformat:2 }} €
</td>
@@ -459,7 +458,7 @@ Rechnung {{ reminder.invoice.invoice_number }}
({{ old_reminder.issue_date|date:"d.m.Y" }})
</td>
<td>
<td class="right">
{{ old_reminder.fee|floatformat:2 }} €
</td>
@@ -474,7 +473,7 @@ Rechnung {{ reminder.invoice.invoice_number }}
Aktuelle Mahngebühr
</td>
<td>
<td class="right">
{{ reminder.fee|floatformat:2 }} €
</td>
@@ -484,6 +483,32 @@ Rechnung {{ reminder.invoice.invoice_number }}
{% if payments %}
{% for payment in payments %}
<tr>
<td>
Zahlung vom {{ payment.date|date:"d.m.Y" }}
{% if payment.payment_method %}
({{ payment.payment_method }})
{% endif %}
</td>
<td class="right">
- {{ payment.amount|floatformat:2 }} €
</td>
</tr>
{% endfor %}
{% endif %}
</tbody>
@@ -494,12 +519,20 @@ Rechnung {{ reminder.invoice.invoice_number }}
<!-- GESAMTFORDERUNG -->
<div class="total-box">
<div class="total-row">
<span>
@@ -513,7 +546,6 @@ Offener Rechnungsbetrag
</div>
{% if previous_reminders or reminder.fee > 0 %}
<div class="total-row">
@@ -531,23 +563,36 @@ Mahngebühren
{% endif %}
<div class="total-row">
<span>
Bereits bezahlt
</span>
<span>
- {{ total_paid|floatformat:2 }} €
</span>
</div>
<div class="total-row total-final">
<span>
Gesamtforderung
Gesamt
</span>
<span>
{{ total_due|floatformat:2 }} €
{{ open_amount|floatformat:2 }} €
</span>
</div>
</div>
</div>
@@ -1,35 +0,0 @@
<form
id="save-form-{{ record.id }}"
method="post"
action="{% url 'invoices:items_edit' record.id %}">
{% csrf_token %}
</form>
<div class="flex gap-2">
<button
type="submit"
form="save-form-{{ record.id }}"
class="btn btn-save">
Speichern
</button>
<form
method="post"
action="{% url 'invoices:items_delete' record.id %}">
{% csrf_token %}
<button
type="submit"
class="btn btn-delete">
Löschen
</button>
</form>
</div>
@@ -1,6 +0,0 @@
<input
type="text"
name="description"
form="save-form-{{ record.id }}"
value="{{ record.description }}"
class="border rounded px-2 py-1 w-full">
@@ -0,0 +1,176 @@
<form method="post" action="{% url 'invoices:items_edit' item.id %}">
{% csrf_token %}
<div class="grid md:grid-cols-2 xl:grid-cols-3 gap-4">
<div>
<label class="block text-sm mb-1">
Typ
</label>
<select
name="item_type"
class="border rounded px-3 py-2 w-full">
{% for value,label in item.ItemType.choices %}
<option
value="{{ value }}"
{% if item.item_type == value %}selected{% endif %}>
{{ label }}
</option>
{% endfor %}
</select>
</div>
<div>
<label class="block text-sm mb-1">
Beschreibung
</label>
<input
type="text"
name="description"
value="{{ item.description }}"
class="border rounded px-3 py-2 w-full">
</div>
<div>
<label class="block text-sm mb-1">
Kategorie
</label>
<select
name="category"
class="border rounded px-3 py-2 w-full">
<option value="">
---
</option>
{% for c in table.categories %}
<option
value="{{ c.id }}"
{% if item.category_id == c.id %}selected{% endif %}>
{{ c.name }}
</option>
{% endfor %}
</select>
</div>
<div>
<label class="block text-sm mb-1">
Beschreibung
</label>
<input
type="text"
name="description"
value="{{ item.description }}"
class="border rounded px-3 py-2 w-full">
</div>
<div>
<label class="block text-sm mb-1">
Einheit
</label>
<select
name="unit"
class="border rounded px-3 py-2 w-full">
<option value="">
---
</option>
{% for u in table.units %}
<option
value="{{ u.id }}"
{% if item.unit_id == u.id %}selected{% endif %}>
{{ u.name }}
</option>
{% endfor %}
</select>
</div>
<div>
<label class="block text-sm mb-1">
Einzelpreis Netto
</label>
<input
type="number"
step="0.01"
name="price_net"
value="{{ item.price_net }}"
class="border rounded px-3 py-2 w-full">
</div>
<div>
<label class="block text-sm mb-1">
MwSt. (%)
</label>
<input
type="number"
step="0.01"
name="tax_rate"
value="{{ item.tax_rate }}"
class="border rounded px-3 py-2 w-full">
</div>
<div>
<label class="block text-sm mb-1">
Einkaufspreis
</label>
<input
type="number"
step="0.01"
name="price_buy"
value="{{ item.price_buy }}"
class="border rounded px-3 py-2 w-full">
</div>
<div>
<label class="block text-sm mb-1">
Lieferant
</label>
<select
name="supplier"
class="border rounded px-3 py-2 w-full">
<option value="">
---
</option>
{% for s in table.suppliers %}
<option
value="{{ s.id }}"
{% if item.supplier_id == s.id %}selected{% endif %}>
{{ s.name }}
</option>
{% endfor %}
</select>
</div>
</div>
<div class="mt-5 flex gap-2">
<button
type="submit"
class="btn btn-save">
Speichern
</button>
<button
type="submit"
formaction="{% url 'invoices:items_delete' item.id %}"
class="btn btn-delete">
Löschen
</button>
</div>
</form>
@@ -1,16 +0,0 @@
<select
name="item_type"
form="save-form-{{ record.id }}"
class="border rounded px-2 py-1 w-full">
{% for v,l in table.types %}
<option
value="{{ v }}"
{% if record.item_type == v %}selected{% endif %}>
{{ l }}
</option>
{% endfor %}
</select>
@@ -1,7 +0,0 @@
<input
type="number"
step="0.01"
name="price_net"
form="save-form-{{ record.id }}"
value="{{ record.price_net }}"
class="border rounded px-2 py-1 w-full">
@@ -1,7 +0,0 @@
<input
type="number"
step="0.01"
name="tax_rate"
form="save-form-{{ record.id }}"
value="{{ record.tax_rate }}"
class="border rounded px-2 py-1 w-full">
@@ -1,20 +0,0 @@
<select
name="unit"
form="save-form-{{ record.id }}"
class="border rounded px-2 py-1 w-full">
{% for unit in table.units %}
<option
value="{{ unit.id }}"
{% if record.unit_id == unit.id %}selected{% endif %}>
{{ unit.name }}
</option>
{% endfor %}
</select>