diff --git a/CHANGELOG.md b/CHANGELOG.md index 305b199..a89da26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [0.3.1] — 2026-10-13 — Mahnschreiben nur im Reiter der Rechnung + +Eddys Regel (13.10.2026, KB #1641): Verknüpfungen, angehängte Dateien und Archiv-Dokumente stehen +nur im Reiter am Beleg, nie vorne im Kasten der Belegkarte — „außer Dolibarr packt sie darein". +Das Mahnschreiben liegt bewusst im Rechnungsordner (damit es im Reiter der Rechnung erscheint), +war aber nicht indexiert; Dolibarr führte es als `unknown`. + +- `ModelePDFMahnung::alsBeilageIndexieren()`: Eintrag mit `gen_or_uploaded = 'uploaded'` und Bezug + auf die Rechnung; vorhandener Eintrag (Mahnung neu erzeugt) wird aktualisiert, nicht verdoppelt. +- Aufgerufen von beiden Vorlagen (`pdf_standard_mahnung`, `doc_generic_mahnung_odt` — dort für die + ODT und, mit `MAIN_ODT_AS_PDF`, die PDF gleichen Namens). +- Vorne auf der Rechnungskarte blendet FileArchive 4.15.1 das Schreiben bereits über den Namen aus + (`MAHN…`/`mahnung-…` ist kein Belegreferenz-Name) — auch für vorhandene Mahnungen. + ## [Unreleased] ### Reiter am Kunden nur noch, wenn es Mahnungen gibt diff --git a/core/modules/mahnung/doc/doc_generic_mahnung_odt.modules.php b/core/modules/mahnung/doc/doc_generic_mahnung_odt.modules.php index eabb5ef..f435b97 100644 --- a/core/modules/mahnung/doc/doc_generic_mahnung_odt.modules.php +++ b/core/modules/mahnung/doc/doc_generic_mahnung_odt.modules.php @@ -384,6 +384,12 @@ class doc_generic_mahnung_odt extends ModelePDFMahnung $mahnung->pdf_path = $file; $mahnung->update($user); + // Liegt im Rechnungsordner → als Beilage indexieren (nur im Reiter, KB #1641). + // Mit MAIN_ODT_AS_PDF entsteht neben/anstelle der ODT eine PDF gleichen Namens. + foreach (array_unique(array($file, preg_replace('/\.odt$/i', '.pdf', $file))) as $erzeugt) { + $this->alsBeilageIndexieren($erzeugt, $facture); + } + $this->result = array('fullpath' => $file); $outputlangs->charset_output = $sav_charset_output; diff --git a/core/modules/mahnung/doc/pdf_standard_mahnung.modules.php b/core/modules/mahnung/doc/pdf_standard_mahnung.modules.php index f065fc3..ff6b805 100644 --- a/core/modules/mahnung/doc/pdf_standard_mahnung.modules.php +++ b/core/modules/mahnung/doc/pdf_standard_mahnung.modules.php @@ -135,6 +135,9 @@ class pdf_standard_mahnung extends ModelePDFMahnung $mahnung->pdf_path = $absPath; $mahnung->update($user); + // Liegt im Rechnungsordner → als Beilage indexieren (nur im Reiter, KB #1641) + $this->alsBeilageIndexieren($absPath, $facture); + $this->result = array('fullpath' => $absPath); return 1; } diff --git a/core/modules/mahnung/modules_mahnung.php b/core/modules/mahnung/modules_mahnung.php index 11f1379..732163f 100644 --- a/core/modules/mahnung/modules_mahnung.php +++ b/core/modules/mahnung/modules_mahnung.php @@ -52,4 +52,49 @@ abstract class ModelePDFMahnung extends CommonDocGenerator */ abstract public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0); // phpcs:enable + + /** + * Mahnschreiben im Rechnungsordner als „hochgeladen" indexieren. + * + * Die Mahnung liegt bewusst bei der Rechnung, damit sie im Reiter der Rechnung erscheint. + * Sie ist aber kein Belegdokument der Rechnung: nach Eddys Regel (13.10.2026, KB #1641) + * steht sie nur im Reiter, nie vorne im Kasten der Rechnungskarte. Ohne Indexeintrag + * führte Dolibarr sie als „unknown". Vorhandener Eintrag (Mahnung neu erzeugt) wird + * aktualisiert, nicht verdoppelt. Fehler nur protokollieren — die Datei liegt bereits. + * + * @param string $fullpath Absoluter Pfad der erzeugten Datei + * @param Facture $facture Gemahnte Rechnung (Belegbezug) + * @return void + */ + protected function alsBeilageIndexieren($fullpath, $facture) + { + global $user; + + if (empty($fullpath) || !is_file($fullpath) || strpos($fullpath, DOL_DATA_ROOT.'/') !== 0) { + return; + } + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + + $dir = dirname($fullpath); + $name = basename($fullpath); + $relDir = ltrim(substr($dir, strlen(DOL_DATA_ROOT)), '/'); + + $ecm = new EcmFiles($this->db); + if ($ecm->fetch(0, '', $relDir.'/'.$name) > 0) { + $ecm->gen_or_uploaded = 'uploaded'; + $ecm->label = md5_file($fullpath); + if (is_object($facture) && !empty($facture->id)) { + $ecm->src_object_type = $facture->table_element; + $ecm->src_object_id = (int) $facture->id; + } + if ($ecm->update($user) < 0) { + dol_syslog(get_class($this).'::alsBeilageIndexieren Update fehlgeschlagen: '.$relDir.'/'.$name, LOG_WARNING); + } + return; + } + if (addFileIntoDatabaseIndex($dir, $name, '', 'uploaded', 0, is_object($facture) ? $facture : null) < 0) { + dol_syslog(get_class($this).'::alsBeilageIndexieren Anlegen fehlgeschlagen: '.$relDir.'/'.$name, LOG_WARNING); + } + } }