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>
126 lines
3.5 KiB
PHP
126 lines
3.5 KiB
PHP
<?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;
|
|
}
|
|
}
|