Mahnschreiben als „hochgeladen" indexieren — nur im Reiter der Rechnung (0.3.1) [deploy]
All checks were successful
Deploy mahnung / deploy (push) Successful in 13s

Das Schreiben liegt im Rechnungsordner, war aber nicht indexiert (Dolibarr:
'unknown'). Neu: ModelePDFMahnung::alsBeilageIndexieren() — Eintrag mit
gen_or_uploaded = 'uploaded' und Rechnungsbezug, vorhandener Eintrag wird
aktualisiert. Beide Vorlagen (PDF, ODT inkl. ODT→PDF). Regel KB #1641.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-10-13 21:50:59 +02:00
parent 1c666287f5
commit 3bd7cfd0ea
4 changed files with 68 additions and 0 deletions

View file

@ -1,5 +1,19 @@
# Changelog # 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] ## [Unreleased]
### Reiter am Kunden nur noch, wenn es Mahnungen gibt ### Reiter am Kunden nur noch, wenn es Mahnungen gibt

View file

@ -384,6 +384,12 @@ class doc_generic_mahnung_odt extends ModelePDFMahnung
$mahnung->pdf_path = $file; $mahnung->pdf_path = $file;
$mahnung->update($user); $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); $this->result = array('fullpath' => $file);
$outputlangs->charset_output = $sav_charset_output; $outputlangs->charset_output = $sav_charset_output;

View file

@ -135,6 +135,9 @@ class pdf_standard_mahnung extends ModelePDFMahnung
$mahnung->pdf_path = $absPath; $mahnung->pdf_path = $absPath;
$mahnung->update($user); $mahnung->update($user);
// Liegt im Rechnungsordner → als Beilage indexieren (nur im Reiter, KB #1641)
$this->alsBeilageIndexieren($absPath, $facture);
$this->result = array('fullpath' => $absPath); $this->result = array('fullpath' => $absPath);
return 1; return 1;
} }

View file

@ -52,4 +52,49 @@ abstract class ModelePDFMahnung extends CommonDocGenerator
*/ */
abstract public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0); abstract public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0);
// phpcs:enable // 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);
}
}
} }