diff --git a/ChangeLog.md b/ChangeLog.md index 5afe215..f40e2f2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -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) diff --git a/class/actions_netdiag.class.php b/class/actions_netdiag.class.php new file mode 100644 index 0000000..5ea8aa4 --- /dev/null +++ b/class/actions_netdiag.class.php @@ -0,0 +1,126 @@ +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').' '.$anzahl.''; + $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; + } +} diff --git a/core/modules/modNetDiag.class.php b/core/modules/modNetDiag.class.php index a48b390..dcdf789 100644 --- a/core/modules/modNetDiag.class.php +++ b/core/modules/modNetDiag.class.php @@ -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', );