diff --git a/ChangeLog.md b/ChangeLog.md index 464786d..d67ae64 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,26 @@ # Changelog +## 1.7.2 — 2026-10-13 + +### Fotos, Notizen, Sprachnotizen, Scans und Bericht-PDFs als „hochgeladen" indexiert +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". +Bericht legte seine Dateien ohne Indexeintrag in den Belegordner (Dolibarr führte sie dann als +`unknown`, auf Prod über 560 Fotos/Notizen in Aufträgen), den Bericht-PDF mit leerer Herkunft. + +- Neue `lib/bericht_index.lib.php` → `bericht_als_beilage_indexieren($pfad, $beleg)`: Eintrag mit + `gen_or_uploaded = 'uploaded'` und Belegbezug; vorhandener Eintrag wird aktualisiert (Notiz neu + gespeichert → neue Prüfsumme), nicht verdoppelt. +- Aufgerufen bei: Foto-Upload der PWA (`api/orders.php`), Notiz neu/ändern (`api/note.php`), + Sprachnotiz (`api/voice.php`), Handy-Upload per QR (`mobile_upload.php`), Scan-PDF + (`ajax/process_document.php`). +- Bericht-PDF (`ajax/generate_pdf.php`, `api/reports.php`): Herkunft `'uploaded'` gesetzt. +- Unverändert: der unterschriebene Lieferschein (Dolibarrs eigenes Dokument) und die + Unterschrift-PNG (liegt im Arbeitsordner von Bericht, nicht am Beleg). +- Altbestand: vorne auf der Belegkarte blendet FileArchive 4.15.1 die Dateien schon über den + Namen aus (`foto_…`, `notiz_…`, `voice_…`, `Bericht_…` sind keine Belegreferenz-Namen) — + keine Datenmigration nötig. + ## 1.7.1 — 2026-09-07 ### Reiter am Kunden nur noch bei vorhandenen Berichten diff --git a/ajax/generate_pdf.php b/ajax/generate_pdf.php index 9824983..5cbe7ac 100644 --- a/ajax/generate_pdf.php +++ b/ajax/generate_pdf.php @@ -113,6 +113,7 @@ $register_ecm = function ($obj_type, $obj_id, $filepath_dir, $filename, $target_ $ecmfile->src_object_type = $obj_type; $ecmfile->src_object_id = $obj_id; $ecmfile->label = md5_file($target_path); + $ecmfile->gen_or_uploaded = 'uploaded'; // Beilage, kein Belegdokument → nur im Reiter (KB #1641) @$ecmfile->create($user); }; $register_ecm($dir_key, $parent->id, $dir_key.'/'.dol_sanitizeFileName($parent->ref), $filename, $target_path); diff --git a/ajax/process_document.php b/ajax/process_document.php index 633010f..11fed55 100644 --- a/ajax/process_document.php +++ b/ajax/process_document.php @@ -25,6 +25,7 @@ if (!$res) die("Include of main fails"); require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once __DIR__.'/../class/upload_token.class.php'; +require_once __DIR__.'/../lib/bericht_index.lib.php'; header('Content-Type: application/json; charset=utf-8'); @@ -237,6 +238,9 @@ if (!$pdf_created) { fail('PDF konnte nicht erstellt werden. Bitte prüfen Sie die Server-Konfiguration (ImageMagick/ocrmypdf).'); } +// Scan-PDF ist eine Beilage → nur im Reiter am Beleg (KB #1641) +bericht_als_beilage_indexieren($pdf_path, $tok->fetchParentObject()); + // Token-Counter erhöhen $tok->incrementCount(); diff --git a/api/note.php b/api/note.php index 3139168..8bc0df1 100644 --- a/api/note.php +++ b/api/note.php @@ -145,6 +145,7 @@ if (!empty($_GET['file'])) { if (@file_put_contents($path, note_build($subject, $text, $created, $stamp)) === false) { api_fail('Speichern fehlgeschlagen', 500); } + bericht_als_beilage_indexieren($path, $cmd); // Prüfsumme nachziehen, Beilage (KB #1641) api_ok(array( 'file' => basename($path), 'subject' => $subject, @@ -170,6 +171,7 @@ if (@file_put_contents($target, note_build($subject, $text, $stamp, '')) === fal api_fail('Speichern fehlgeschlagen', 500); } @chmod($target, 0664); +bericht_als_beilage_indexieren($target, $cmd); // Beilage → nur im Reiter (KB #1641) api_ok(array( 'file' => $filename, diff --git a/api/orders.php b/api/orders.php index e4b9b68..25d08cf 100644 --- a/api/orders.php +++ b/api/orders.php @@ -257,6 +257,7 @@ if ($action === 'upload_photo' && $_SERVER['REQUEST_METHOD'] === 'POST') { $filename = 'foto_'.dol_print_date(dol_now(), '%Y%m%d_%H%M%S').'_'.uniqid().'.'.$ext; $target = $upload_dir.'/'.$filename; if (!move_uploaded_file($_FILES['file']['tmp_name'], $target)) api_fail('Upload fehlgeschlagen', 500); + bericht_als_beilage_indexieren($target, $cmd); // Beilage → nur im Reiter (KB #1641) $relpath = str_replace(DOL_DATA_ROOT.'/', '', $target); diff --git a/api/reports.php b/api/reports.php index fe45dc6..b5e587f 100644 --- a/api/reports.php +++ b/api/reports.php @@ -190,6 +190,7 @@ if ($action === 'finalize') { $ecmfile->src_object_type = $dir_key; $ecmfile->src_object_id = $parent->id; $ecmfile->label = md5_file($target_path); + $ecmfile->gen_or_uploaded = 'uploaded'; // Beilage, kein Belegdokument → nur im Reiter (KB #1641) @$ecmfile->create($user); $bericht->status = Bericht::STATUS_FINAL; diff --git a/api/voice.php b/api/voice.php index 9db3c08..beec833 100644 --- a/api/voice.php +++ b/api/voice.php @@ -35,5 +35,6 @@ elseif (strpos($mime, 'ogg') !== false) $ext = 'ogg'; $filename = 'voice_'.dol_print_date(dol_now(), '%Y%m%d_%H%M%S').'.'.$ext; $target = $upload_dir.'/'.$filename; if (!move_uploaded_file($_FILES['file']['tmp_name'], $target)) api_fail('Upload fehlgeschlagen', 500); +bericht_als_beilage_indexieren($target, $cmd); // Beilage → nur im Reiter (KB #1641) api_ok(array('filename' => $filename, 'path' => 'commande/'.dol_sanitizeFileName($cmd->ref).'/'.$filename)); diff --git a/lib/bericht.lib.php b/lib/bericht.lib.php index d39d90a..695420e 100644 --- a/lib/bericht.lib.php +++ b/lib/bericht.lib.php @@ -8,6 +8,7 @@ */ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once __DIR__.'/bericht_index.lib.php'; /** * Erzeugt die Tab-Header-Leiste für die Editor-Seite (Übersicht / Editor). diff --git a/lib/bericht_index.lib.php b/lib/bericht_index.lib.php new file mode 100644 index 0000000..0a30e37 --- /dev/null +++ b/lib/bericht_index.lib.php @@ -0,0 +1,66 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +/** + * \file bericht/lib/bericht_index.lib.php + * \ingroup bericht + * \brief Dateien, die Bericht in einen Belegordner legt, als „hochgeladen" indexieren. + * + * Fotos, Notizen, Sprachnotizen, Scans und Bericht-PDFs sind Beilagen, keine + * Belegdokumente aus der Vorlage. Eddys Regel (13.10.2026, KB #1641): sie stehen nur im + * Reiter am Beleg, nie vorne im Kasten der Belegkarte. Ohne Indexeintrag führt Dolibarr + * sie als „unknown" — dann kann kein Modul sie sicher als Beilage erkennen. + * + * Eigene Datei ohne weitere Abhängigkeiten, damit auch Endpunkte sie laden können, die + * bericht.lib.php nicht einbinden (ajax/process_document.php). + */ + +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + +/** + * Datei im ECM-Index als „uploaded" führen: vorhandenen Eintrag aktualisieren (Prüfsumme, + * Herkunft, Belegbezug), sonst neu anlegen. addFileIntoDatabaseIndex() allein prüft nicht + * auf Dubletten — eine überschriebene Notiz bekäme sonst bei jedem Speichern einen Eintrag. + * + * Fehler werden nur protokolliert: die Datei liegt bereits richtig, ein fehlender + * Indexeintrag ist kein Grund, den Upload als gescheitert zu melden. + * + * @param string $fullpath Absoluter Pfad der Datei unter DOL_DATA_ROOT + * @param CommonObject|null $beleg Beleg (für src_object_type/src_object_id), optional + * @return void + */ +function bericht_als_beilage_indexieren($fullpath, $beleg = null) +{ + global $db, $user; + + if (empty($fullpath) || !is_file($fullpath) || strpos($fullpath, DOL_DATA_ROOT.'/') !== 0) { + return; + } + $dir = dirname($fullpath); + $name = basename($fullpath); + $rel_dir = ltrim(substr($dir, strlen(DOL_DATA_ROOT)), '/'); + + $ecm = new EcmFiles($db); + if ($ecm->fetch(0, '', $rel_dir.'/'.$name) > 0) { + $ecm->gen_or_uploaded = 'uploaded'; + $ecm->label = md5_file($fullpath); + if (is_object($beleg) && !empty($beleg->id)) { + $ecm->src_object_type = $beleg->table_element; + $ecm->src_object_id = (int) $beleg->id; + } + if ($ecm->update($user) < 0) { + dol_syslog('bericht_als_beilage_indexieren: Update fehlgeschlagen für '.$rel_dir.'/'.$name.': '.$ecm->error, LOG_WARNING); + } + return; + } + if (addFileIntoDatabaseIndex($dir, $name, '', 'uploaded', 0, is_object($beleg) ? $beleg : null) < 0) { + dol_syslog('bericht_als_beilage_indexieren: Anlegen fehlgeschlagen für '.$rel_dir.'/'.$name, LOG_WARNING); + } +} diff --git a/mobile_upload.php b/mobile_upload.php index e7215db..cc430a5 100644 --- a/mobile_upload.php +++ b/mobile_upload.php @@ -78,6 +78,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES['file']['tmp_name']) exit; } + bericht_als_beilage_indexieren($target, $tok->fetchParentObject()); // Beilage → nur im Reiter (KB #1641) $tok->incrementCount(); echo json_encode(array('success' => true, 'filename' => $filename)); exit;