Problem
In www/pages/mahnwesen.php (Funktion MahnwesenMessage) wurde die Platzhalter-Logik teilweise umgebaut: Der historische Block, der {DATUM*}, {TAGE}, {MAHNDATUM} etc. via str_replace setzte (Zeilen 633–723), ist auskommentiert. Aktiv ist nur noch das $mapping-Array (Zeile 725) mit:
{RECHNUNG}, {BELEGNR}, {DATUM}, {OFFEN}, {MAHNGEBUEHR}, {HEUTE}
Symptome
{DATUMRECHNUNGZAHLUNGSZIEL} und ähnliche Platzhalter werden nicht ersetzt — sie erscheinen als Literaltext in versendeten Mahnungen, sobald ein Briefpapier-Template sie verwendet.
- Keine Möglichkeit, ein berechnetes Frist-Datum auszugeben (z.B. „letztmalig zur Zahlung bis zum 15.05.2026"), obwohl die Mahnstufen-Tage in den System-Einstellungen → Mahnwesen konfiguriert sind und auch via
mahnwesen.tage aus der DB gejointt werden (m.tage as mahn_tage im SELECT bei Zeile 570).
- Use-before-define: Zeile 678
if(\$tage <=0) \$tage = 0; referenziert \$tage bevor es im aktiven Codepfad definiert wird (die Zuweisungen \$tage = \$this->GetKonfiguration(...) stehen im auskommentierten Block).
Reproduktion
- Briefpapier-Vorlage (
MahnwesenMahnung1/MahnwesenInkasso etc.) editieren und einen Platzhalter wie {FRIST} oder {DATUMRECHNUNGZAHLUNGSZIEL} einfügen.
- Mahnung auslösen.
- Im versendeten Brief / im CRM-Dokument bleibt der Platzhalter als Literal stehen.
Bonus-Bug (separat, nicht Bestandteil dieses PRs): Wenn die Vorlage HTML mit doppelten Anführungszeichen enthält (z.B. von ChatGPT-Copy-Paste mit <p data-start=\"...\" data-end=\"...\">), crasht die ganze Mahnung mit mysqli_sql_exception in class.erpapi.php:DokumentCreate — der Content wird ohne Escape in den INSERT-String konkateniert.
Fix
Mapping um folgende Platzhalter erweitern (aus bereits im Scope verfügbaren Variablen):
| Platzhalter |
Quelle |
{FRIST} |
mahnwesen_datum + mahn_tage (deutsches Format) |
{DATUMRECHNUNG} |
Alias auf Rechnungsdatum (deutsches Format) |
{MAHNDATUM} |
Datum der aktuellen Mahnung (deutsches Format) |
{TAGE} |
konfigurierte Mahnstufen-Tage |
Außerdem \$tage korrekt aus \$rechnungarr['mahn_tage'] setzen und 0000-00-00 für \$mahnwesen_datum abfangen.
PR folgt.
Problem
In
www/pages/mahnwesen.php(FunktionMahnwesenMessage) wurde die Platzhalter-Logik teilweise umgebaut: Der historische Block, der{DATUM*},{TAGE},{MAHNDATUM}etc. viastr_replacesetzte (Zeilen 633–723), ist auskommentiert. Aktiv ist nur noch das$mapping-Array (Zeile 725) mit:{RECHNUNG},{BELEGNR},{DATUM},{OFFEN},{MAHNGEBUEHR},{HEUTE}Symptome
{DATUMRECHNUNGZAHLUNGSZIEL}und ähnliche Platzhalter werden nicht ersetzt — sie erscheinen als Literaltext in versendeten Mahnungen, sobald ein Briefpapier-Template sie verwendet.mahnwesen.tageaus der DB gejointt werden (m.tage as mahn_tageim SELECT bei Zeile 570).if(\$tage <=0) \$tage = 0;referenziert\$tagebevor es im aktiven Codepfad definiert wird (die Zuweisungen\$tage = \$this->GetKonfiguration(...)stehen im auskommentierten Block).Reproduktion
MahnwesenMahnung1/MahnwesenInkassoetc.) editieren und einen Platzhalter wie{FRIST}oder{DATUMRECHNUNGZAHLUNGSZIEL}einfügen.Bonus-Bug (separat, nicht Bestandteil dieses PRs): Wenn die Vorlage HTML mit doppelten Anführungszeichen enthält (z.B. von ChatGPT-Copy-Paste mit
<p data-start=\"...\" data-end=\"...\">), crasht die ganze Mahnung mitmysqli_sql_exceptioninclass.erpapi.php:DokumentCreate— der Content wird ohne Escape in den INSERT-String konkateniert.Fix
Mapping um folgende Platzhalter erweitern (aus bereits im Scope verfügbaren Variablen):
{FRIST}mahnwesen_datum + mahn_tage(deutsches Format){DATUMRECHNUNG}{MAHNDATUM}{TAGE}Außerdem
\$tagekorrekt aus\$rechnungarr['mahn_tage']setzen und0000-00-00für\$mahnwesen_datumabfangen.PR folgt.