Dateien am Beleg als „hochgeladen" indexieren — nur im Reiter, nicht vorne (1.7.2) [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 14s
All checks were successful
Deploy bericht / deploy (push) Successful in 14s
Fotos, Notizen, Sprachnotizen, Scans (bisher ohne Indexeintrag → 'unknown') und Bericht-PDFs (bisher ohne Herkunft) werden mit gen_or_uploaded = 'uploaded' und Belegbezug indexiert; vorhandene Einträge werden aktualisiert statt verdoppelt. Neue lib/bericht_index.lib.php. Regel KB #1641. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
cf7471d2d2
commit
8606ecc50d
10 changed files with 99 additions and 0 deletions
21
ChangeLog.md
21
ChangeLog.md
|
|
@ -1,5 +1,26 @@
|
||||||
# Changelog
|
# 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
|
## 1.7.1 — 2026-09-07
|
||||||
|
|
||||||
### Reiter am Kunden nur noch bei vorhandenen Berichten
|
### Reiter am Kunden nur noch bei vorhandenen Berichten
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ $register_ecm = function ($obj_type, $obj_id, $filepath_dir, $filename, $target_
|
||||||
$ecmfile->src_object_type = $obj_type;
|
$ecmfile->src_object_type = $obj_type;
|
||||||
$ecmfile->src_object_id = $obj_id;
|
$ecmfile->src_object_id = $obj_id;
|
||||||
$ecmfile->label = md5_file($target_path);
|
$ecmfile->label = md5_file($target_path);
|
||||||
|
$ecmfile->gen_or_uploaded = 'uploaded'; // Beilage, kein Belegdokument → nur im Reiter (KB #1641)
|
||||||
@$ecmfile->create($user);
|
@$ecmfile->create($user);
|
||||||
};
|
};
|
||||||
$register_ecm($dir_key, $parent->id, $dir_key.'/'.dol_sanitizeFileName($parent->ref), $filename, $target_path);
|
$register_ecm($dir_key, $parent->id, $dir_key.'/'.dol_sanitizeFileName($parent->ref), $filename, $target_path);
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ if (!$res) die("Include of main fails");
|
||||||
|
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||||
require_once __DIR__.'/../class/upload_token.class.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');
|
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).');
|
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
|
// Token-Counter erhöhen
|
||||||
$tok->incrementCount();
|
$tok->incrementCount();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,7 @@ if (!empty($_GET['file'])) {
|
||||||
if (@file_put_contents($path, note_build($subject, $text, $created, $stamp)) === false) {
|
if (@file_put_contents($path, note_build($subject, $text, $created, $stamp)) === false) {
|
||||||
api_fail('Speichern fehlgeschlagen', 500);
|
api_fail('Speichern fehlgeschlagen', 500);
|
||||||
}
|
}
|
||||||
|
bericht_als_beilage_indexieren($path, $cmd); // Prüfsumme nachziehen, Beilage (KB #1641)
|
||||||
api_ok(array(
|
api_ok(array(
|
||||||
'file' => basename($path),
|
'file' => basename($path),
|
||||||
'subject' => $subject,
|
'subject' => $subject,
|
||||||
|
|
@ -170,6 +171,7 @@ if (@file_put_contents($target, note_build($subject, $text, $stamp, '')) === fal
|
||||||
api_fail('Speichern fehlgeschlagen', 500);
|
api_fail('Speichern fehlgeschlagen', 500);
|
||||||
}
|
}
|
||||||
@chmod($target, 0664);
|
@chmod($target, 0664);
|
||||||
|
bericht_als_beilage_indexieren($target, $cmd); // Beilage → nur im Reiter (KB #1641)
|
||||||
|
|
||||||
api_ok(array(
|
api_ok(array(
|
||||||
'file' => $filename,
|
'file' => $filename,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
$filename = 'foto_'.dol_print_date(dol_now(), '%Y%m%d_%H%M%S').'_'.uniqid().'.'.$ext;
|
||||||
$target = $upload_dir.'/'.$filename;
|
$target = $upload_dir.'/'.$filename;
|
||||||
if (!move_uploaded_file($_FILES['file']['tmp_name'], $target)) api_fail('Upload fehlgeschlagen', 500);
|
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);
|
$relpath = str_replace(DOL_DATA_ROOT.'/', '', $target);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -190,6 +190,7 @@ if ($action === 'finalize') {
|
||||||
$ecmfile->src_object_type = $dir_key;
|
$ecmfile->src_object_type = $dir_key;
|
||||||
$ecmfile->src_object_id = $parent->id;
|
$ecmfile->src_object_id = $parent->id;
|
||||||
$ecmfile->label = md5_file($target_path);
|
$ecmfile->label = md5_file($target_path);
|
||||||
|
$ecmfile->gen_or_uploaded = 'uploaded'; // Beilage, kein Belegdokument → nur im Reiter (KB #1641)
|
||||||
@$ecmfile->create($user);
|
@$ecmfile->create($user);
|
||||||
|
|
||||||
$bericht->status = Bericht::STATUS_FINAL;
|
$bericht->status = Bericht::STATUS_FINAL;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
$filename = 'voice_'.dol_print_date(dol_now(), '%Y%m%d_%H%M%S').'.'.$ext;
|
||||||
$target = $upload_dir.'/'.$filename;
|
$target = $upload_dir.'/'.$filename;
|
||||||
if (!move_uploaded_file($_FILES['file']['tmp_name'], $target)) api_fail('Upload fehlgeschlagen', 500);
|
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));
|
api_ok(array('filename' => $filename, 'path' => 'commande/'.dol_sanitizeFileName($cmd->ref).'/'.$filename));
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
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).
|
* Erzeugt die Tab-Header-Leiste für die Editor-Seite (Übersicht / Editor).
|
||||||
|
|
|
||||||
66
lib/bericht_index.lib.php
Normal file
66
lib/bericht_index.lib.php
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
|
||||||
|
*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -78,6 +78,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES['file']['tmp_name'])
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bericht_als_beilage_indexieren($target, $tok->fetchParentObject()); // Beilage → nur im Reiter (KB #1641)
|
||||||
$tok->incrementCount();
|
$tok->incrementCount();
|
||||||
echo json_encode(array('success' => true, 'filename' => $filename));
|
echo json_encode(array('success' => true, 'filename' => $filename));
|
||||||
exit;
|
exit;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue