Reiter am Kunden nur bei vorhandenen Protokollen (1.3.1) [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 13s

Der Reiter stand auf jeder Kundenkarte; die Leiste dort traegt ueber 20
Eintraege, auf Prod gibt es 20 Protokolle bei 6 von 111 Kunden. Er
erscheint jetzt nur bei Bestand, mit Anzahl. Am AUFTRAG bleibt er fest.

Als Hook (class/actions_netdiag.class.php, completeTabsHead) statt
festem Tab, Muster wie bei Mahnung und ElektroPlanung. Uebernimmt einen
bereits vorhandenen Eintrag desselben Schluessels statt einen zweiten
anzuhaengen — kein doppelter Reiter auch vor der Reaktivierung.

Lokal verifiziert: Kunde mit 13 Protokollen zeigt 'Netzwerk-Diagnose 13'
einmalig, Kunde ohne Protokoll zeigt den Reiter gar nicht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-09-07 21:27:51 +02:00
parent 087f37afa6
commit bb6681ac37
3 changed files with 145 additions and 3 deletions

View file

@ -1,5 +1,20 @@
# Changelog NetDiag
## 1.3.1 — 2026-09-07
### Reiter am Kunden nur noch bei vorhandenen Protokollen
Der Reiter „Netzwerk-Diagnose" stand auf **jeder** Kundenkarte. Die Reiterleiste dort trägt
über 20 Einträge; auf Prod gibt es 20 Protokolle bei 6 von 111 Kunden — bei den übrigen 105
zeigte er eine leere Seite. Er erscheint jetzt nur bei Bestand, mit der Anzahl daneben.
**Am Auftrag bleibt er unverändert ein fester Tab.**
Technisch als Hook statt festem Tab (`class/actions_netdiag.class.php`, `completeTabsHead`),
weil die Bedingung eines Descriptor-Tabs keine Datenbankabfrage zulässt — Muster wie bei den
Modulen Mahnung und ElektroPlanung. **Nach dem Deploy Modul einmal reaktivieren**, sonst
steht der alte feste Reiter bis dahin als `MAIN_MODULE_NETDIAG_TABS_0` in der Datenbank; der
Hook übernimmt einen bereits vorhandenen Eintrag statt einen zweiten anzuhängen, doppelte
Reiter kann es also auch im Zwischenzustand nicht geben.
## 1.3.0 — 2026-08-19
### Neues Werkzeug: SIP-Erreichbarkeit (Telefonie)

View file

@ -0,0 +1,126 @@
<?php
/* Copyright (C) 2026 Alles Watt lauft
*
* Hooks des Moduls NetDiag.
*/
/**
* Hook-Klasse: setzt den Reiter „Netzwerk-Diagnose" auf der Kundenkarte.
*
* Warum als Hook und nicht als fester Tab im Descriptor: die Bedingung eines
* Descriptor-Tabs wird mit `verifCond($cond, '2')` ausgewertet und laesst keine
* Abfrage zu der Reiter stuende auf JEDER Kundenkarte. Die Leiste dort traegt
* bereits ueber 20 Eintraege (Stand 2026-09-07); auf Prod gibt es 20 Protokolle
* bei 6 von 111 Kunden. Muster wie bei den Modulen Mahnung und ElektroPlanung.
*
* Am AUFTRAG bleibt der Reiter unveraendert ein fester Tab.
*/
class ActionsNetdiag
{
/** @var array Fehlerliste */
public $errors = array();
/** @var string Ausgabe fuer Hooks, die Text zurueckgeben */
public $resprints;
/** @var DoliDB */
private $db;
/**
* @param DoliDB $db Datenbank
*/
public function __construct($db)
{
$this->db = $db;
}
/**
* Hook completeTabsHead: Reiter „Netzwerk-Diagnose" an der Kundenkarte — nur bei
* vorhandenen Protokollen.
*
* @param array $parameters Hook-Parameter (context, head, mode, filterorigmodule)
* @param CommonObject $object Societe
* @param string $action Aktuelle Aktion
* @param HookManager $hookmanager Hook-Verwaltung
* @return int 0 = weiter
*/
public function completeTabsHead($parameters, &$object, &$action, $hookmanager)
{
global $langs, $user;
$contexts = explode(':', $parameters['context'] ?? '');
if (!in_array('thirdpartycard', $contexts, true)) {
return 0;
}
if (empty($object->id) || !isset($parameters['head']) || !is_array($parameters['head'])) {
return 0;
}
if (($parameters['mode'] ?? '') !== 'add' || ($parameters['filterorigmodule'] ?? '') !== 'external') {
return 0;
}
if (!$user->hasRight('netdiag', 'protocol', 'read')) {
return 0;
}
$anzahl = $this->zaehleProtokolle((int) $object->id);
$head = &$parameters['head'];
// Der frühere feste Tab steht bis zur Modul-Reaktivierung als
// MAIN_MODULE_NETDIAG_TABS_0 in der Datenbank — vorhandenen Eintrag
// uebernehmen statt einen zweiten anzuhaengen, sonst waere der Reiter doppelt.
$vorhanden = -1;
foreach ($head as $i => $eintrag) {
if (isset($eintrag[2]) && $eintrag[2] === 'netdiag') {
$vorhanden = $i;
break;
}
}
if ($anzahl < 1) {
if ($vorhanden >= 0) {
unset($head[$vorhanden]);
$head = array_values($head);
}
return 0;
}
$langs->load('netdiag@netdiag');
$pos = ($vorhanden >= 0) ? $vorhanden : count($head);
$head[$pos][0] = DOL_URL_ROOT.'/custom/netdiag/netdiag_object_tab.php'
.'?socid='.((int) $object->id).'&objecttype=thirdparty';
$head[$pos][1] = $langs->trans('NetDiagTab').' <span class="badge">'.$anzahl.'</span>';
$head[$pos][2] = 'netdiag';
return 0;
}
/**
* Wie viele Diagnose-Protokolle liegen an diesem Kunden?
*
* @param int $socId Kunde
* @return int Anzahl
*/
private function zaehleProtokolle($socId)
{
if ($socId <= 0) {
return 0;
}
$resql = $this->db->query("SHOW TABLES LIKE '".$this->db->escape(MAIN_DB_PREFIX)."netdiag_protocol'");
if (!$resql || $this->db->num_rows($resql) == 0) {
return 0;
}
$sql = "SELECT COUNT(*) AS anzahl FROM ".MAIN_DB_PREFIX."netdiag_protocol";
$sql .= " WHERE fk_soc = ".((int) $socId);
$resql = $this->db->query($sql);
if (!$resql) {
return 0;
}
$obj = $this->db->fetch_object($resql);
return $obj ? (int) $obj->anzahl : 0;
}
}

View file

@ -67,7 +67,7 @@ class modNetDiag extends DolibarrModules
$this->editor_url = '';
$this->editor_squarred_logo = '';
$this->version = '1.3.0';
$this->version = '1.3.1';
// Konstanten-Name in llx_const für Modul-Status
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
@ -88,7 +88,7 @@ class modNetDiag extends DolibarrModules
'theme' => 0,
'css' => array(),
'js' => array(),
'hooks' => array(),
'hooks' => array('data' => array('thirdpartycard'), 'entity' => '0'),
'moduleforexternal' => 0,
'websitetemplates' => 0,
'captcha' => 0,
@ -136,7 +136,8 @@ class modNetDiag extends DolibarrModules
// Neue Tabs an bestehenden Objekten
// Tab "Netzwerk-Diagnose" an Kunde (thirdparty) und Auftrag (order)
$this->tabs = array(
'thirdparty:+netdiag:NetDiagTab:netdiag@netdiag:$user->hasRight(\'netdiag\', \'protocol\', \'read\'):/custom/netdiag/netdiag_object_tab.php?socid=__ID__&objecttype=thirdparty',
// Am KUNDEN setzt den Reiter die Hook-Klasse (nur bei vorhandenen Protokollen) —
// ein fester Tab kann das nicht pruefen (verifCond() laesst keine Abfrage zu).
'order:+netdiag:NetDiagTab:netdiag@netdiag:$user->hasRight(\'netdiag\', \'protocol\', \'read\'):/custom/netdiag/netdiag_object_tab.php?id=__ID__&objecttype=order',
);