Ein Report-Start-Band mit dem Titel, ein Tabellenkopf, ein Detailband, eine Gruppe pro Kategorie mit eigenem Kopf und Fuss, eine summierte Zwischensumme, ein Report-Ende-Band und ein Filterformular.
Ein reportStart()-Band für den Titel und ein reportEnd()-Band für die Zusammenfassung — einmal pro Report
Ein Tabellenkopf, danach ein Detailband, das pro Datensatz einmal gerendert wird
Eine Gruppe pro Kategorie mit eigenen Kopf- und Fuss-Bändern
Eine Zwischensumme pro Gruppe via aggSum()
Ein Filterformular mit typisierten Controls (Text, Enum, Number, Relation)
Eine vollständige Rechnung pro Datensatz, aufgebaut aus Page-Blocks mit deklarierten Höhen. Der Swiss-QR-Einzahlungsschein bleibt auf Seite 1, wenn er Platz hat, und rutscht auf Seite 2, wenn die Rechnungspositionen den Platz brauchen.
freeform() rendert ein vollständiges Formular pro Detail-Datensatz
Jeder Abschnitt ist ein <x-reports::page-block> mit deklarierter Höhe
Der Einzahlungsschein ist mit anchor="bottom" verankert: 105 mm ab Papierunterkante, als Layer über dem Footer
pageNumbering(perForm) startet den Seitenzähler für jede Rechnung neu
Der Seitenkopf mit Rechnungsnummer und Kunde wird auf Seite 1 ausgeblendet
Ein Block, der höher als der Seiteninhalt ist, wirft eine BandOverflowException
Autokaufvertrag
· Free-form-Flow mit Allgemeinen Bedingungen
Ein Report, fünf Source-Adapter: QuerySource, EloquentSource, RawSqlSource, CollectionSource und ArraySource lesen dieselbe SQLite-Tabelle. Der Adapter lässt sich im Filterformular wählen.
Eine echte SQLite-Tabelle mit Demo-Aufträgen, per Migration angelegt
QuerySource und EloquentSource pushen Filter und Sortierung nach SQL
RawSqlSource, CollectionSource und ArraySource filtern und sortieren in-memory
Die Quellen-Auswahl ist ein normaler typisierter Filter-Control
Report-Start/End zeigen den aktiven Adapter und die aggregierten Summen
Mehrsprachige Preisliste
· Sprache und Format im Frame-Header wählen
Die Sprache lässt sich direkt im Header der Vorschau umschalten. Report-Texte kommen aus dem Modul-lang-Verzeichnis, Datum und Zahlen folgen der Format-Locale; die Währung bleibt CHF.
Sprachwahl im Header des Report-Frames
Modul-eigene Übersetzungen unter app/Reports/Multilanguage/lang
Produkt-, Kategorie- und Status-Texte kommen als Sprach-Arrays aus der Source (wie Spatie Translatable)
Datum und Zahlen folgen der Format-Locale (de_CH vs. en_US)
Die Währung bleibt unabhängig von der Sprache CHF
Der Wechsel wirkt auf HTML-Vorschau und PDF
Gruppierter Umsatz mit Enrichment
· Gruppendaten aus einem Eloquent-Model
Flow
Gruppen
Sprache
Aggregate
Enrichment
/reports/group_enrichment/run
Die Detailzeilen kommen aus demo_orders. Jeder Gruppenkopf lädt Kategoriename und Ziel über enrichWith() aus dem Eloquent-Model demo_categories; der Name wird pro Sprache über einen Accessor aufgelöst.
enrichWith() läuft genau einmal pro Gruppe, nicht pro Detailzeile
Die Gruppenschlüssel werden als Filter an die Enrichment-Source übergeben
Eloquent liefert das übersetzte Attribut, weil die Engine app()->getLocale() gesetzt hat
Die Gruppendaten stehen als $ctx->groupData() im Kopf- und Fuss-Band bereit
Gruppen-Aggregat über $r->aggregate(..., scope: "group:1")
Sprachwechsel im Frame-Header wirkt auf Kategorienamen und Zahlenformat