feat: Preistabelle auf App-Nutzer-Gebühr umgestellt, Rechnungsprüf-Dialog mit E-Mail-Versand und Rabatt-Erfassung

- Preistabelle: App-Nutzungslizenz und Umsatzbeteiligung durch Gebühr pro App-Nutzer ersetzt, Abrechnung pro konfiguriertem App-Nutzer (countByErstelltVon)
- Rechnungen erstellen: Prüf-Dialog mit Vor/Zurück-Navigation, Entfernen einzelner Rechnungen und Versand als PDF-Anhang an die Kunden (EmailService mit Anhang-Unterstützung)
- Rabatt pro Kunde über Icon-Dialog mit Prozentwert und Grund, als eigene Position auf der Rechnung berücksichtigt
- E-Mail-Spalte entfernt, Rechnung-erstellen-Button durch Icon ersetzt, (0 App-Nutzer)-Zusatz entfällt
- Version 0.9.20

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 15:35:20 +02:00
parent a7ea4fa803
commit ef019eecee
17 changed files with 552 additions and 130 deletions

View File

@@ -1051,8 +1051,8 @@ misc.retry=Erneut versuchen
# Admin Price Table
adminpricetable.title=Preistabelle
adminpricetable.field.monthly=Monatliches Basispaket
adminpricetable.field.applicense=App-Nutzungslizenz
adminpricetable.field.revenue=Umsatzbeteiligung
adminpricetable.field.appuserfee=Gebühr pro App-Nutzer
adminpricetable.field.appuserfee.helper=Wird je eingerichtetem App-Nutzer monatlich berechnet
adminpricetable.notification.saved=Preistabelle wurde gespeichert
adminpricetable.notification.save.error=Fehler beim Speichern: {0}
adminpricetable.notification.load.error=Fehler beim Laden: {0}
@@ -1112,7 +1112,12 @@ page.title.admin.createinvoices=Rechnungen erstellen
admincreateinvoices.title=Rechnungen erstellen
admincreateinvoices.hint=Rechnungen werden zum Monatsende (Ultimo) fällig. Beginnt ein Kunde im laufenden Monat, werden nur die verbleibenden Tage bis Ultimo berechnet.
admincreateinvoices.column.customer=Kunde
admincreateinvoices.column.email=E-Mail
admincreateinvoices.column.discount=Rabatt
admincreateinvoices.discount.position=Rabatt ({0} %)
admincreateinvoices.discount.dialog.title=Rabatt erfassen
admincreateinvoices.discount.dialog.percent=Rabatt in %
admincreateinvoices.discount.dialog.reason=Grund für den Rabatt
admincreateinvoices.discount.dialog.apply=Übernehmen
admincreateinvoices.column.start=Kunde seit
admincreateinvoices.column.days=Abgerechnete Tage
admincreateinvoices.column.due=Fällig am
@@ -1120,8 +1125,20 @@ admincreateinvoices.column.net=Nettobetrag
admincreateinvoices.days.full=Voller Monat
admincreateinvoices.days.partial={0} von {1} Tagen
admincreateinvoices.prorata.suffix=(anteilig {0}/{1} Tage)
admincreateinvoices.appusers.suffix=({0} App-Nutzer)
admincreateinvoices.button.create=Rechnung erstellen
admincreateinvoices.notification.notemplate=Kein Rechnungstemplate vorhanden. Bitte zuerst im Rechnungsgenerator ein Template speichern.
admincreateinvoices.notification.error=Fehler beim Erstellen der Rechnung: {0}
admincreateinvoices.button.createselected=Rechnungen erstellen ({0})
admincreateinvoices.field.month=Abrechnungsmonat
admincreateinvoices.dialog.title=Rechnungen prüfen
admincreateinvoices.dialog.position=Rechnung {0} von {1}
admincreateinvoices.dialog.button.previous=Zurück
admincreateinvoices.dialog.button.next=Weiter
admincreateinvoices.dialog.button.delete=Aus Liste entfernen
admincreateinvoices.dialog.button.send=Rechnungen senden
admincreateinvoices.dialog.notification.removed=Rechnung aus der Liste entfernt
admincreateinvoices.mail.subject=Ihre Rechnung {0}
admincreateinvoices.mail.body=Sehr geehrte Damen und Herren,\n\nanbei erhalten Sie Ihre Rechnung {0} für den Abrechnungszeitraum {1}.\n\nMit freundlichen Grüßen\n{2}
admincreateinvoices.notification.sent={0} Rechnung(en) per E-Mail versendet
admincreateinvoices.notification.sendfailed={0} Rechnung(en) konnten nicht versendet werden