diff --git a/CHANGELOG.md b/CHANGELOG.md index a89da26..3d29bd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,13 @@ war aber nicht indexiert; Dolibarr führte es als `unknown`. ## [Unreleased] +### Widget-Kopf: kein rohes HTML mehr im Tooltip +Beim Überfahren des Widgets „Überfällige Rechnungen mit Mahnstufe" erschien +`…Mahnstufe2` — die Zahl las sich wie eine Mahnstufe, war aber die +Anzahl offener Rechnungen. Dolibarr 22 schreibt den kompletten Titel samt Badge-HTML ins +title-Attribut des Kopfs und in die Bezeichnung der Widget-Auswahl. `mahnungBoxKopfOhneHtml()` +setzt dort jetzt den reinen Titel; Badge und Link im Kopf bleiben, wie sie sind. + ### Reiter am Kunden nur noch, wenn es Mahnungen gibt Der Reiter „Mahnwesen" stand auf **jeder** Kundenkarte, auch wenn dort nie gemahnt wurde. Die Reiterleiste trägt dort 21 Einträge; auf Prod gibt es 4 Mahnungen bei 3 von 111 Kunden — bei 108 diff --git a/CLAUDE.md b/CLAUDE.md index f7bddda..33d1e08 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -31,6 +31,7 @@ Dolibarr Custom-Modul: 3-stufiges Mahnwesen nach BGB §288 + Versand-Tracking + - Zeigt ALLE offenen Rechnungen, nicht nur überfällige - Mahnstufe-Badge nur wenn Mahnung existiert, sonst Strich - **Zähler im Kopf**: Der Badge im Widget-Kopf zeigt die tatsächliche Gesamtzahl offener Rechnungen (verlinkt auf die Rechnungsliste). Titel-Lang-Key hat kein `(%s)` mehr — die Zahl steckt im Badge. Der Zähler wird erst NACH der Query gesetzt (wenn `$num` bekannt ist), damit die frühen Return-Pfade (fehlende Rechte / SQL-Fehler) ohne Zähler bleiben. +- **Tooltip am Kopf**: Dolibarr 22 kopiert den kompletten Titel samt Badge-HTML ins `title` des Kopfs und in `boxlabelentry` — `showBox()` setzt beides über `mahnungBoxKopfOhneHtml()` auf den reinen Titel (ohne Anzahl, die las sich dort wie eine Mahnstufe). Gleiches Muster in BuchhaltungsWidget (`buchaltungswidgetCleanBoxHead()`). - **Zeilenanzahl konfigurierbar** via Konstante `MAHNUNG_BOX_MAXLINES` (Admin-Select in `setup.php`: Alle/5/10/20/30/50, Default `0` = alle). Widget lädt IMMER alle offenen Rechnungen (für den korrekten Zähler), rendert aber nur `MAHNUNG_BOX_MAXLINES` Zeilen + eine `...`-Überlaufzeile. **Nicht** auf das von Dolibarr übergebene `$max` verlassen — das kommt aus `MAIN_SIZE_SHORTLIST_LIMIT` (Default 5) und gilt global für ALLE Home-Boxen. (KB #598) - **Empty-State Pflicht**: bei `$num == 0` Platzhalter-Zeile in `info_box_contents` einfügen — sonst rendert `ModeleBoxes::showBox()` gar nichts und das Widget verschwindet komplett (auch nach neuen Rechnungen sieht der User es nicht zurückkommen). Siehe KB #682. - **Summenzeile Netto+Brutto**: Betragszelle der `liste_total`-Zeile zeigt zweizeilig Netto (`SUM(f.total_ht)`) und Brutto (`SUM(f.total_ttc)`). Brutto kommt direkt aus `f.total_ttc` der Rechnung, NICHT aus Netto × Steuersatz hochgerechnet — sonst wären Reverse-Charge §13b, Steuerbefreiung und Kleinunternehmer §19 UStG falsch. Lang-Keys `MahnungBoxNetto`/`MahnungBoxBrutto`. diff --git a/core/boxes/box_mahnung_offen.php b/core/boxes/box_mahnung_offen.php index c90165f..d78572d 100644 --- a/core/boxes/box_mahnung_offen.php +++ b/core/boxes/box_mahnung_offen.php @@ -547,6 +547,15 @@ class box_mahnung_offen extends ModeleBoxes */ public function showBox($head = null, $contents = null, $nooutput = 0) { - return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput); + global $langs; + + // Tooltip ohne Badge-HTML und ohne Anzahl (die Zahl liest sich dort wie eine Mahnstufe) + $out = parent::showBox($this->info_box_head, $this->info_box_contents, 1); + $out = mahnungBoxKopfOhneHtml($out, $langs->trans($this->boxlabel)); + if ($nooutput) { + return $out; + } + print $out; + return ''; } } diff --git a/lib/mahnung_ui.lib.php b/lib/mahnung_ui.lib.php index 6fab5c6..8080428 100644 --- a/lib/mahnung_ui.lib.php +++ b/lib/mahnung_ui.lib.php @@ -109,3 +109,30 @@ function mahnungStufeBadge($stufe, $label, $istErinnerung, $tooltip = '') $out .= ' title="'.dol_escape_htmltag($tooltip).'">'.dol_escape_htmltag($text).''; return $out; } + + +/** + * Setzt im Widget-Kopf Tooltip und Auswahl-Bezeichnung auf den reinen Titel. + * + * ModeleBoxes::showBox() schreibt den kompletten Widget-Titel zusätzlich in das + * title-Attribut des Tabellenkopfs und in die Bezeichnung für die Widget-Auswahl + * (boxlabelentry, landet nach dem Schließen im Auswahlfeld). Unser Titel trägt den + * Anzahl-Badge samt Link als HTML — der Browser zeigt beim Überfahren dann + * „…Mahnstufe2“. Der sichtbare Kopf bleibt unverändert. + * + * @param string $out Ausgabe von ModeleBoxes::showBox() + * @param string $label Titel ohne HTML (Entities wie von $langs->trans() erlaubt) + * @return string Bereinigte Ausgabe + */ +function mahnungBoxKopfOhneHtml($out, $label) +{ + $label = dol_escape_htmltag(html_entity_decode($label, ENT_QUOTES | ENT_HTML5, 'UTF-8')); + + $out = preg_replace_callback('/(