Neue Spalte "Vsl. Zahlung" in box_mahnung_offen: je offener Rechnung
Prognose (Faelligkeit + round(Oe-Verzug)) aus dem bisherigen Zahlungs-
verhalten des Kunden, mit Ampel-Icon + Bewertungsstufe + Tooltip.
- Skala 1:1 aus BuchhaltungsWidget uebernommen (KB #886), damit die
Ampel zur "Zahlungsverhalten"-Box auf der Kundenkarte passt: 5 Stufen
Vorbildlich/Puenktlich/Spaetzahler/Verspaetet/Problematisch anhand
Oe-Tage nach Faelligkeit, gleiche Schwellen + Farben.
- Berechnung als self-contained Kopie (getZahlprognose, 1 Query je
Kunde/Request gecacht) - keine Laufzeit-Abhaengigkeit auf das
BuchhaltungsWidget.
- Prognose ueberschritten + Rechnung noch offen -> "(ueberfaellig)"
als zusaetzliches Mahnsignal.
- Mindest-Stichprobe MAHNUNG_PROGNOSE_MIN_N (Default 3), sonst
"keine Historie". Neue Lang-Keys MahnungProg* (de_DE + en_US).
- $langs->transnoentities() statt trans() genutzt (sonst leere %s
durch doppeltes sprintf bzw. doppeltes &-Encoding, siehe KB #897).
End-to-end via CLI-Harness gegen die lokale Test-DB verifiziert
(alle 5 Stufen, Overdue-Zweig, Empty-State, php -l sauber).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summenzeile zeigt jetzt Netto und Brutto (aus f.total_ttc der Rechnung,
nicht aus Netto hochgerechnet - damit bleiben Reverse-Charge, Steuer-
befreiung und Kleinunternehmerregelung korrekt). Neue Lang-Keys
MahnungBoxNetto/MahnungBoxBrutto in de_DE + en_US.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wenn alle Rechnungen bezahlt sind, blieb info_box_contents leer und
ModeleBoxes::showBox renderte keinen Widget-Rahmen mehr. Widget kam
auch nach neuen Rechnungen nicht zurück. Fix: bei 0 Treffern eine
Platzhalter-Zeile "Keine offenen Kundenrechnungen" einfügen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Umlaute in allen lang-Dateien korrigiert. Alle hardcodierten deutschen Strings
in 22 PHP-Dateien durch $langs->trans('Key') ersetzt. Neue Schlüssel für
Cron-Meldungen, Dokument-Aktionen, Bonität, Vorschlag-Status, Template-Vars u.a.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rechnungen ohne Mahnung: "—" als Zeichen
- Rechnungen mit Mahnung: farbiger Badge verlinkt auf card.php der Mahnung
- Mahnung-ID per Subquery geholt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Widget basiert jetzt 1:1 auf box_factures_imp.php:
- Alle offenen Rechnungen (nicht nur ueberfaellige)
- Status-Icon wie Original (LibStatut)
- Summenzeile ueber alle offenen (separate Query)
- Link zur Rechnungsliste im Header
Plus: Extra-Spalte Mahnstufe mit farbigem Badge (wenn vorhanden)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- box_mahnung_offen.php: require_once mahnung.class.php nach oben verschoben,
da Mahnung::STATUS_STORNIERT in der SQL-Query vor dem bisherigen Include benutzt wurde
- setup.php: actions_setmoduleoptions.inc.php vor llxHeader() verschoben
(sonst scheitert der ODT-Upload wegen "headers already sent"), Duplikat entfernt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>