Dolibarr-Modul NetDiag — Netzwerk-Diagnose-Protokolle, JSON-API für die NetDiag-App
Find a file
Eduard Wisch 3d12ee1e61 Vier Bestandsfehler im Kundendokument und im Sync behoben
Alle vier durch eine systematische Gegenpruefung des echten Codes gefunden,
nicht durch Symptome — sie waren bereits ausgeliefert und still.

1. Whitelist-Schluessel 'typ' existiert nicht. Die App liefert das
   LinkInfo-Objekt durch, dort heisst das Feld 'type' (app/src/lib/types.ts).
   Folge: im Kundendokument fehlte ausgerechnet beim IP-Test an der Dose die
   Angabe, ob per LAN oder WLAN gemessen wurde - bei einem Abnahmebeleg die
   halbe Aussage. Zusaetzlich 'rssi' aufgenommen: bei einer WLAN-Dose IST der
   Empfangspegel der Messwert, er wurde bisher verworfen.
   Die Rohwerte sind englisch; netdiagKundentext() bildet sie jetzt ab
   ('ethernet' -> 'LAN (Kabel)'), sonst stuende "Anschlussart: ethernet" im
   Abnahmeprotokoll eines deutschen Handwerksbetriebs.

2. Leeres Array druckte "Offene Ports: " ohne Wert. Die Leerpruefung ist ein
   elseif hinter dem Array-Zweig und wurde nie erreicht. Betraf ausgerechnet
   die GUTEN Ergebnisse: Portscan ohne offenen Port, IP-Konflikt ohne
   Konflikt, IP-Scan ohne Veraenderung. Jetzt "keine" - Weglassen waere
   schlechter, weil der Kunde sonst nicht unterscheiden kann, ob nichts
   gefunden oder nichts geprueft wurde.

3. 'error' fehlte in der Whitelist. Der IP-Konflikt gibt im Abbruchfall
   { error: ... } mit roter Ampel zurueck - im Kundendokument stand eine rote
   Ampel ohne einen Buchstaben Erklaerung. Die App vereinheitlicht kuenftig
   auf 'fehler', aber Altdaten lassen sich nicht aendern.

4. tool/category/label wurden beim Sync nicht auf die Spaltenlaenge gekuerzt
   (varchar 64/32/255). Bei striktem SQL-Modus kippt EIN zu langes Label den
   gesamten Sync per rollback() - der Techniker steht beim Kunden mit einem
   Protokoll da, das sich nicht abschliessen laesst, weil eine Beschriftung zu
   lang war. Die App setzt Labels durch Verketten zusammen, 255 Zeichen sind
   erreichbar. found_via wurde 20 Zeilen darueber laengst gekappt.

Ausserdem:
- GET-Zweig der API prueft jetzt eine Berechtigung. Bisher konnte jeder
  angemeldete Benutzer mit einer geratenen ID ein fremdes Protokoll samt
  Geraeteliste, IP-Adressen und offenen Ports abrufen. 'write' wird bewusst
  mit akzeptiert: die Rechte sind in Dolibarr einzeln vergebbar, und ein
  Techniker mit Schreib- ohne ausdruecklichem Leserecht duerfte nicht
  ausgesperrt werden - das waere erst beim Kunden aufgefallen.
- netdiagDauerLesbar: "1 Tage 0 Std" -> "1 Tag". floor() liefert einen Float,
  1.0 === 1 ist in PHP false.

Geprueft: php -l, und netdiagFeldFuerKunde() mit 13 echten Faellen gegen die
lokale Instanz durchgerechnet (LAN/WLAN/Mobilfunk, leere und gefuellte Arrays,
error/fehler, tote Schluessel, Interna).
2026-08-16 19:02:11 +02:00
.forgejo/workflows Initiales Commit — Dolibarr-Modul NetDiag [deploy] 2026-05-19 12:12:11 +02:00
admin Initiales Commit — Dolibarr-Modul NetDiag [deploy] 2026-05-19 12:12:11 +02:00
api Vier Bestandsfehler im Kundendokument und im Sync behoben 2026-08-16 19:02:11 +02:00
class Phase 5 abgeschlossen: Klarnamen, Parameter, Listen-Ampel, N+1, Standort 2026-08-16 11:09:28 +02:00
core/modules Anmeldung ueber das zentrale Auth-Modul awlauth — v1.1.0 [deploy] 2026-08-14 18:23:29 +02:00
langs Phase 5 abgeschlossen: Klarnamen, Parameter, Listen-Ampel, N+1, Standort 2026-08-16 11:09:28 +02:00
lib Vier Bestandsfehler im Kundendokument und im Sync behoben 2026-08-16 19:02:11 +02:00
sql Phase 5: Kundendokument lesbar, Gerätemerkmale kommen endlich an 2026-08-15 18:54:01 +02:00
ChangeLog.md Anmeldung ueber das zentrale Auth-Modul awlauth — v1.1.0 [deploy] 2026-08-14 18:23:29 +02:00
netdiag_object_tab.php Initiales Commit — Dolibarr-Modul NetDiag [deploy] 2026-05-19 12:12:11 +02:00
netdiagindex.php Phase 5 abgeschlossen: Klarnamen, Parameter, Listen-Ampel, N+1, Standort 2026-08-16 11:09:28 +02:00
netdiagprotocol_card.php Phase 5 abgeschlossen: Klarnamen, Parameter, Listen-Ampel, N+1, Standort 2026-08-16 11:09:28 +02:00
README.md orders.php: Auftragsliste nach letzter Bearbeitung sortieren [deploy] 2026-05-19 22:05:09 +02:00

NetDiag — Netzwerk-Diagnose für Dolibarr

Dolibarr-Modul für die Ablage von Netzwerk-Diagnose-Protokollen. Erfasst per mobiler App (siehe Projekt NetzwerkDiagnose/app) gefundene Geräte, Ports und Messungen und hängt die Protokolle dauerhaft an Kunde und Auftrag.

Funktionen

  • Datenmodell: Protokoll → Geräte → Messungen (llx_netdiag_*)
  • Tab Netzwerk-Diagnose an Kunde (thirdparty) und Auftrag (commande)
  • JSON-API unter /custom/netdiag/api/ für die mobile App (JWT-Auth)
  • PDF-Protokoll, wird im Dokumentenarchiv (ECM) abgelegt
  • Rechtesystem: netdiag → protocol → read/write/delete
  • Mehrsprachig (de_DE, en_US)
  • QR-Code zum App-Download in der Modul-Einrichtung

Installation

  1. Verzeichnis netdiag/ nach htdocs/custom/ auf den Dolibarr-Server kopieren. Auf dem Produktivsystem übernimmt das die Forgejo-Pipeline (.forgejo/workflows/deploy.yml) — Commit mit [deploy] in der Message synct das Modul automatisch auf den Server.
  2. In Dolibarr: Einrichtung → Module → NetDiag aktivieren.
  3. Beim Aktivieren werden die Tabellen llx_netdiag_protocol, llx_netdiag_device, llx_netdiag_measurement angelegt und ein JWT-Schlüssel erzeugt.
  4. Benutzern das Recht NetDiag → Protokolle lesen/schreiben geben.

API-Endpunkte

Alle unter https://<dolibarr>/custom/netdiag/api/:

Endpunkt Methode Zweck
auth.php POST {login,password} Anmeldung → {token,expiresIn,user}
customers.php GET ?q= / ?id= Kundensuche / Kundendetail
orders.php GET ?open=1&q= / ?id= Auftragsliste / Auftragsdetail
protocols.php GET ?id= Protokoll mit Geräten + Messungen
protocols.php POST {action:"sync",protocol:{…}} Protokoll anlegen/aktualisieren (idempotent über clientUuid)
pdf.php GET ?id=&jwt= Protokoll-PDF streamen

Authentifizierung per Authorization: Bearer <token> oder ?jwt=<token>.

Einrichtung

Einrichtung → Module → NetDiag → Einstellungen:

  • Token-Gültigkeit (Sekunden)
  • App-Download-URL (APK) — wird als QR-Code angezeigt

Lizenz

GPLv3