From 3d7f6b1820778b1f5d427b24905402083f953bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Mon, 21 Sep 2026 15:00:04 +0200 Subject: [PATCH] Add read-only Hermes document links --- .../market_management_hermes_mcp_api.md | 30 +++++++++ .../market_management_hermes_mcp_konzept.md | 5 +- modules/shared/auth/ui/home.php | 2 +- public/files.php | 67 +++++++++++++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 public/files.php diff --git a/docs/modules/market_management/konzepte/market_management_hermes_mcp_api.md b/docs/modules/market_management/konzepte/market_management_hermes_mcp_api.md index 7bd05cb..ad8efe8 100644 --- a/docs/modules/market_management/konzepte/market_management_hermes_mcp_api.md +++ b/docs/modules/market_management/konzepte/market_management_hermes_mcp_api.md @@ -22,6 +22,36 @@ Der Token wird nicht in dieser Dokumentation oder im Repository gespeichert. ## Verbindungsablauf +## Dokumentlinks in Marktdurchführungen + +Wenn Hermes Informationen aus einer Datei verarbeitet und diese in einer +Marktdurchführung speichert, muss Hermes die Quelldatei als vollständige +HTTPS-URL in das Feld `notes` aufnehmen. Der bestehende Text darf erhalten +bleiben; die Position im Freitext ist frei wählbar. + +Die URL verwendet dieses Format: + +```text +https://erpnaurua.imhochrain.ch/files.php?path= +``` + +Der Parameter `path` ist relativ zum Ordner `Hermes Naurua` und enthält nicht +den lokalen Mount-Prefix und nicht den Ordnernamen `Hermes Naurua` selbst. +Beispiel: + +```text +Quelldatei: Hermes Naurua/Marktmanagement/2026 Bellevue Noël/Standmietvertrag_Naurua.pdf +Link: https://erpnaurua.imhochrain.ch/files.php?path=Marktmanagement%2F2026%20Bellevue%20No%C3%ABl%2FStandmietvertrag_Naurua.pdf +``` + +Leerzeichen, Umlaute und sonstige Sonderzeichen müssen vollständig URL-encodiert +werden. Die ERP-Anzeige macht ausschließlich diese Dokument-URLs klickbar. Der +Link ist schreibgeschützt und erfordert eine aktive ERP-Anmeldung. + +Die Route benötigt auf dem ERP-Webserver die Konfiguration +`HERMES_DOCUMENT_ROOT=/volume1/Hermes/Hermes Naurua`. Dieser lokale Pfad ist +die auf DEV verifizierte Ablage der Synology-Freigabe. + ## Fachliche Begrifflichkeit für Hermes Die fachliche Hierarchie lautet: diff --git a/docs/modules/market_management/konzepte/market_management_hermes_mcp_konzept.md b/docs/modules/market_management/konzepte/market_management_hermes_mcp_konzept.md index 8243295..962bc13 100644 --- a/docs/modules/market_management/konzepte/market_management_hermes_mcp_konzept.md +++ b/docs/modules/market_management/konzepte/market_management_hermes_mcp_konzept.md @@ -68,7 +68,10 @@ Modulberechtigung. - Fehlgeschlagene Aufrufe erzeugen keine Teilpersistierung. - Alle Schreibvorgänge laufen über die interne Modul-API. - Hermes darf bei einem neuen Markt nur eine bestehende Kategorie referenzieren. -- Dokumentlinks können optional als Herkunftsinformation mitgegeben werden. +- Wenn Hermes Informationen aus einer Datei verarbeitet und in einer + Marktdurchführung speichert, muss die Quelldatei als vollständige HTTPS-URL + im Feld `notes` referenziert werden. Die Position im bestehenden Freitext ist + frei wählbar. - Unsichere Erkennung wird nicht durch eine zusätzliche App-Freigabelogik behandelt; die fachliche Qualitätssicherung liegt im Hermes-Training. diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php index 3512817..40dfc90 100644 --- a/modules/shared/auth/ui/home.php +++ b/modules/shared/auth/ui/home.php @@ -1152,7 +1152,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $otcM echo " const getCurrentLimit = () => parseInt(getTable()?.dataset.marketsLimit || '20', 10);"; echo " const getPageSize = () => parseInt(getTable()?.dataset.marketsPageSize || '20', 10);"; echo " const marketEscape = (value) => String(value ?? '').replace(/[&<>\"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[character] || character));"; - echo " const marketDisplay = (value) => value === null || value === undefined || value === '' ? 'Nicht hinterlegt' : marketEscape(value).replace(/\\r?\\n/g, '
');"; + echo " const marketDisplay = (value) => { if (value === null || value === undefined || value === '') { return 'Nicht hinterlegt'; } const escaped = marketEscape(value); const linked = escaped.replace(/https:\\/\\/erpnaurua\\.imhochrain\\.ch\\/files\\.php\\?path=[^\\s<]+/g, (url) => '' + url + ''); return linked.replace(/\\r?\\n/g, '
'); };"; echo " const marketBoolean = (value) => value === true || value === 'true' || value === 1 || value === '1' ? 'Ja' : value === false || value === 'false' || value === 0 || value === '0' ? 'Nein' : 'Nicht hinterlegt';"; echo " const marketMoney = (value) => value === null || value === undefined || value === '' ? 'Nicht hinterlegt' : 'CHF ' + Number(value).toFixed(2);"; echo " const marketContactName = (contact) => { if (!contact) { return 'Nicht hinterlegt'; } return marketDisplay([contact.first_name, contact.last_name].filter(Boolean).join(' ')); };"; diff --git a/public/files.php b/public/files.php new file mode 100644 index 0000000..b266b31 --- /dev/null +++ b/public/files.php @@ -0,0 +1,67 @@ +