Rechnungen
Rechnungen generieren
Die Jahresrechnungen werden über ein Dashboard-Widget als Stapel erzeugt. Der Prozess läuft im Hintergrund und kann jederzeit verfolgt werden.
Nur Administratoren und Vorstandsmitglieder können Rechnungen generieren.
#Dashboard-Widget: Jahresrechnungen erstellen
Das Widget Jahresrechnungen erstellen befindet sich auf der Dashboard-Seite.
| Feld | Beschreibung |
|---|---|
| Jahr | Abrechnungsjahr; Standard: aktuelles Jahr |
| Rechnungsdatum | Datum auf der Rechnung; Standard: heute |
| Fälligkeitsdatum | Datum, bis zu dem die Zahlung fällig ist; Standard: 30 Tage ab heute |
Klicken Sie auf Jahresrechnungen erstellen, um den Stapellauf zu starten.
#Ablauf der Stapelgenerierung
Der Stapellauf wird als Hintergrundjob (GenerateYearlyInvoicesJob) ausgeführt. Für jede aktive Parzelle des Vereins werden folgende Schritte durchgeführt:
- Mitglieder ermitteln — alle aktiven Erstbelegten der Parzelle für das Abrechnungsjahr werden geladen; bei einem Mitgliederwechsel im Abrechnungsjahr werden zwei Rechnungsdurchläufe erzeugt (siehe Mitgliederwechsel).
- Rechnungstemplate lesen — das Template des Vereins für das Abrechnungsjahr bestimmt Modus und Positionen.
- Faktoren berechnen —
membershipFactorundpaymentPeriodFactorwerden pro Mitglied/Parzelle-Kombination ermittelt. - Posten berechnen — für jeden Positionstyp im Template wird der Betrag berechnet und als Snapshot in
invoices.itemsgespeichert. - Rechnung anlegen (
CreateInvoiceAction) — Rechnungsdatensatz mit Status Entwurf wird erzeugt und eine verknüpfte Belastungszahlung angelegt. - PDF-Generierung in die Warteschlange —
GenerateInvoicePdfJobwird für jeden Entwurf eingereiht.
Tritt bei einer Parzelle ein Fehler auf, wird dieser protokolliert und der Stapellauf setzt mit der nächsten Parzelle fort.
#Fortschrittsanzeige
Während der Stapellauf läuft, aktualisiert das Widget den Fortschrittsbalken automatisch. Nach Abschluss erscheint eine Zusammenfassung:
| Kennzahl | Beschreibung |
|---|---|
| Rechnungen erstellt | Anzahl erfolgreich angelegter Rechnungen |
| PDFs bereit | PDFs, die erfolgreich erzeugt wurden |
| PDFs ausstehend/fehlgeschlagen | Rechnungen, bei denen die PDF-Generierung noch läuft oder fehlgeschlagen ist |
Über die Schaltfläche Fehlgeschlagene PDFs neu generieren können fehlgeschlagene PDF-Jobs erneut eingereiht werden.
#PDF-Generierung
Jedes PDF wird asynchron im Hintergrund erzeugt (GenerateInvoicePdfJob). Das PDF wird mit WeasyPrint aus einer Blade-Vorlage gerendert und in der Dokumentenablage der Rechnung gespeichert. Sobald das PDF erfolgreich gespeichert ist, wird pdf_generated_at gesetzt und der Rechnungsstatus wechselt von Entwurf zu Aktiv.
#Mitgliederwechsel
Wechselt die Erstbelegung einer Parzelle im Abrechnungsjahr (Mitglied A scheidet aus, Mitglied B zieht ein), erzeugt der Stapellauf zwei separate Rechnungen für dieselbe Parzelle:
| Rechnung | Abrechnungszeitraum | membershipFactor |
|---|---|---|
| Ausscheidendes Mitglied A | 1. Januar → no_member_since von A |
(no_member_since − 1. Jan) / Jahrestage |
| Einziehendes Mitglied B | first_member_since von B → 31. Dezember |
(31. Dez − first_member_since) / Jahrestage |
Beide Faktoren addieren sich zu ≈ 1,0. Bei aktivem Wasser-Feature deckt jede Rechnung den entsprechenden Wasserverbrauchszeitraum ab (Wechsel-Ablesung als Grenze).
#E-Mail-Versand
Aktive Rechnungen können per E-Mail an das Mitglied versandt werden. Die E-Mail-Adresse wird aus dem Mitgliedsprofil gelesen; der Mitgliedskanal muss auf E-Mail eingestellt sein.
Einzelversand: Im Aktionsmenü einer Rechnung → Per E-Mail senden.
Stapelversand: Über die Schaltfläche Alle senden im Dashboard-Widget werden alle aktiven, noch nicht gesendeten Rechnungen des gewählten Jahres in die Warteschlange eingereiht.
Nach erfolgreichem Versand wird sent_at auf der Rechnung gesetzt; im Aktionsmenü erscheint statt Per E-Mail senden der Hinweis, dass die Rechnung bereits versandt wurde.
Alle versandten Rechnungs-E-Mails werden automatisch im E-Mail-Protokoll erfasst.
#Proratierungsregeln
#membershipFactor (je Mitglied)
| Situation | Faktor |
|---|---|
| Mitglied war seit vor dem 1. Januar des Jahres aktiv | 1,0 |
| Mitglied ist im Jahresverlauf eingezogen | (31. Dez − first_member_since).Tage / Jahrestage |
| Mitglied ist im Jahresverlauf ausgeschieden | (no_member_since − 1. Jan).Tage / Jahrestage |
#paymentPeriodFactor (je Parzelle)
| Situation | Faktor |
|---|---|
| Keine Freistellung im Abrechnungsjahr | 1,0 |
| Parzelle wird im Jahresverlauf zahlungsfrei gestellt | (no_payment_from − 1. Jan).Tage / Jahrestage |
Der effektive Faktor ergibt sich aus min(membershipFactor, paymentPeriodFactor) und wird auf alle Geldposten angewendet. Der Arbeitsstunden-Ausgleich wird nicht proratiert.
Weitere Informationen zu den Positionstypen und der Templatestruktur finden Sie unter Rechnungsvorlagen.