diff --git a/ChangeLog.md b/ChangeLog.md index 5fa2acd..464786d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,17 @@ # Changelog +## 1.7.1 — 2026-09-07 + +### Reiter am Kunden nur noch bei vorhandenen Berichten +Der Reiter „Berichte" stand auf **jeder** Kundenkarte. Die Reiterleiste dort trägt über 20 +Einträge; auf Prod gibt es 9 Berichte (über Aufträge, Rechnungen, Angebote) bei einem Teil der +Kunden. Er erscheint jetzt nur bei Bestand, mit der Anzahl daneben — reiner Lesereiter, kein +Anlegen-Weg geht dadurch verloren. + +Technisch als Hook (`class/actions_bericht.class.php`, `completeTabsHead`, gleiche UNION- +Abfrage wie `bericht_thirdparty.php`) statt festem Tab. Muster wie bei Mahnung, +ElektroPlanung, NetDiag, ElektroCheck. **Nach dem Deploy Modul einmal reaktivieren.** + ## 1.7.0 — 2026-08-28 ### Fotoqualität ist einstellbar — Vorgabe ist jetzt 1:1 diff --git a/class/actions_bericht.class.php b/class/actions_bericht.class.php index 37a4326..f903f65 100644 --- a/class/actions_bericht.class.php +++ b/class/actions_bericht.class.php @@ -8,6 +8,17 @@ class ActionsBericht { + /** @var DoliDB */ + private $db; + + /** + * @param DoliDB $db Datenbank + */ + public function __construct($db) + { + $this->db = $db; + } + /** @var string */ public $error = ''; /** @var string[] */ @@ -74,4 +85,103 @@ class ActionsBericht } return 0; } + + /** + * Hook completeTabsHead: Reiter "Berichte" an der Kundenkarte — nur bei + * vorhandenen Berichten. Ein fester Tab kann das nicht pruefen (verifCond() + * laesst keine Abfrage zu). Die Leiste dort traegt ueber 20 Eintraege + * (Stand 2026-09-07); auf Prod gibt es 9 Berichte bei einem Teil der Kunden. + * Reiner Lesereiter — kein Anlegen-Weg, der verloren gehen koennte. + * + * @param array $parameters Hook-Parameter (context, head, mode, filterorigmodule) + * @param object $object Societe + * @param string $action Aktuelle Aktion + * @param object $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('bericht', 'read')) { + return 0; + } + + $anzahl = $this->zaehleBerichte((int) $object->id); + $head = &$parameters['head']; + + // Der frühere feste Tab steht bis zur Modul-Reaktivierung als + // MAIN_MODULE_BERICHT_TABS_3 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] === 'bericht') { + $vorhanden = $i; + break; + } + } + + if ($anzahl < 1) { + if ($vorhanden >= 0) { + unset($head[$vorhanden]); + $head = array_values($head); + } + return 0; + } + + $langs->load('bericht@bericht'); + + $pos = ($vorhanden >= 0) ? $vorhanden : count($head); + $head[$pos][0] = DOL_URL_ROOT.'/custom/bericht/bericht_thirdparty.php?socid='.((int) $object->id); + $head[$pos][1] = $langs->trans('Berichte').' '.$anzahl.''; + $head[$pos][2] = 'bericht'; + + return 0; + } + + /** + * Wie viele Berichte (an Auftrag, Rechnung oder Angebot) haengen an diesem Kunden? + * Gleiche UNION-Abfrage wie in bericht_thirdparty.php. + * + * @param int $socId Kunde + * @return int Anzahl + */ + private function zaehleBerichte($socId) + { + if ($socId <= 0) { + return 0; + } + + $sql = "SELECT COUNT(*) AS anzahl FROM ("; + $sql .= "SELECT b.rowid FROM ".MAIN_DB_PREFIX."bericht b"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."commande c ON c.rowid = b.fk_element"; + $sql .= " WHERE b.element_type = 'order' AND c.fk_soc = ".((int) $socId); + $sql .= " UNION "; + $sql .= "SELECT b.rowid FROM ".MAIN_DB_PREFIX."bericht b"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."facture f ON f.rowid = b.fk_element"; + $sql .= " WHERE b.element_type = 'invoice' AND f.fk_soc = ".((int) $socId); + $sql .= " UNION "; + $sql .= "SELECT b.rowid FROM ".MAIN_DB_PREFIX."bericht b"; + $sql .= " INNER JOIN ".MAIN_DB_PREFIX."propal p ON p.rowid = b.fk_element"; + $sql .= " WHERE b.element_type = 'propal' AND p.fk_soc = ".((int) $socId); + $sql .= ") AS alle"; + + $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/modBericht.class.php b/core/modules/modBericht.class.php index 4fc8558..8cd09ea 100644 --- a/core/modules/modBericht.class.php +++ b/core/modules/modBericht.class.php @@ -27,7 +27,7 @@ class modBericht extends DolibarrModules $this->editor_name = 'Alles Watt läuft'; $this->editor_url = ''; - $this->version = '1.6.0'; + $this->version = '1.7.1'; $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); $this->picto = 'fa-file-pdf'; @@ -43,7 +43,7 @@ class modBericht extends DolibarrModules 'theme' => 0, 'css' => array('/bericht/css/bericht.css'), 'js' => array(), - 'hooks' => array('data' => array('odtgeneration')), + 'hooks' => array('data' => array('odtgeneration', 'thirdpartycard')), 'moduleforexternal' => 0, ); @@ -90,7 +90,8 @@ class modBericht extends DolibarrModules 'invoice:+bericht:Bericht:bericht@bericht:$user->hasRight("bericht","read"):/custom/bericht/bericht_card.php?id=__ID__&element=invoice', 'order:+bericht:Bericht:bericht@bericht:$user->hasRight("bericht","read"):/custom/bericht/bericht_card.php?id=__ID__&element=order', 'propal:+bericht:Bericht:bericht@bericht:$user->hasRight("bericht","read"):/custom/bericht/bericht_card.php?id=__ID__&element=propal', - 'thirdparty:+bericht:Berichte:bericht@bericht:$user->hasRight("bericht","read"):/custom/bericht/bericht_thirdparty.php?socid=__ID__', + // Am KUNDEN setzt den Reiter die Hook-Klasse (nur bei vorhandenen + // Berichten) — ein fester Tab kann das nicht pruefen. 'shipping:+bericht:Bericht:bericht@bericht:$user->hasRight("bericht","read"):/custom/bericht/bericht_card.php?id=__ID__&element=shipment', );