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:

  1. 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).
  2. Rechnungstemplate lesen — das Template des Vereins für das Abrechnungsjahr bestimmt Modus und Positionen.
  3. Faktoren berechnenmembershipFactor und paymentPeriodFactor werden pro Mitglied/Parzelle-Kombination ermittelt.
  4. Posten berechnen — für jeden Positionstyp im Template wird der Betrag berechnet und als Snapshot in invoices.items gespeichert.
  5. Rechnung anlegen (CreateInvoiceAction) — Rechnungsdatensatz mit Status Entwurf wird erzeugt und eine verknüpfte Belastungszahlung angelegt.
  6. PDF-Generierung in die WarteschlangeGenerateInvoicePdfJob wird 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.