Reiter am Kunden nur bei vorhandenen Auftraegen (1.1.1) [deploy]
All checks were successful
Deploy Eplan / deploy (push) Successful in 9s

Der Reiter Aufmass stand auf jeder Kundenkarte, auch ohne einen einzigen
Auftrag — der Reiter listet Auftraege und fuehrt je Auftrag per Link in
die externe Aufmass-PWA, ohne Auftrag ist er also leer. Auf Prod haben
25 von 99 Kunden einen Auftrag. Er erscheint jetzt nur bei Bestand, mit
Anzahl. Am AUFTRAG bleibt er unveraendert fest.

Als Hook (class/actions_eplan.class.php, completeTabsHead) statt festem
Tab, Muster wie bei den anderen Modulen dieser Reihe.

⚠ Nur per Code-Review und SQL-Gegenprobe verifiziert, nicht per Browser-
Klick: das lokale Testmodul war nie vollstaendig aktiviert (keine
Rechte-Zeilen), und ein Rechte-Nachtrag mitten in der Sitzung greift
wegen des Dolibarr-Sitzungs-Caches nicht sofort. Nach dem Deploy einmal
an einem Kunden mit Auftrag gegenpruefen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-09-07 21:28:36 +02:00
parent 9a830f1397
commit b35cd5d22d
2 changed files with 116 additions and 3 deletions

View file

@ -0,0 +1,111 @@
<?php
/* Copyright (C) 2026 Alles Watt lauft
*
* Hooks des Moduls Eplan.
*/
/**
* Hook-Klasse: setzt den Reiter „Aufmaß" auf der Kundenkarte.
*
* Der Reiter listet die Aufträge des Kunden und führt je Auftrag per Link in die
* externe Aufmaß-PWA er ist also an Aufträge gebunden, nicht an gespeicherte
* Messdaten. Ohne Auftrag gibt es nichts zu vermessen; die Bedingung ist deshalb
* „mindestens ein Auftrag", nicht „mindestens ein Aufmaß".
*
* 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); von 99 Kunden haben 25 einen
* Auftrag. Muster wie bei den Modulen Mahnung, ElektroPlanung, NetDiag,
* ElektroCheck, Planungsboard, Bericht.
*
* Am AUFTRAG bleibt der Reiter unveraendert ein fester Tab.
*/
class ActionsEplan
{
/** @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 „Aufmaß" an der Kundenkarte — nur bei
* vorhandenen Aufträgen.
*
* @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('eplan', 'read')) {
return 0;
}
$anzahl = $this->zaehleAuftraege((int) $object->id);
if ($anzahl < 1) {
return 0;
}
$langs->load('eplan@eplan');
$head = &$parameters['head'];
$pos = count($head);
$head[$pos][0] = DOL_URL_ROOT.'/custom/eplan/aufmass_thirdparty.php?socid='.((int) $object->id);
$head[$pos][1] = $langs->trans('Aufmaß').' <span class="badge">'.$anzahl.'</span>';
$head[$pos][2] = 'aufmass';
return 0;
}
/**
* Wie viele Aufträge hat dieser Kunde? (Grundlage: der Reiter listet Aufträge,
* kein eigenes Messdaten-Schema.)
*
* @param int $socId Kunde
* @return int Anzahl
*/
private function zaehleAuftraege($socId)
{
if ($socId <= 0) {
return 0;
}
$sql = "SELECT COUNT(*) AS anzahl FROM ".MAIN_DB_PREFIX."commande";
$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

@ -24,14 +24,15 @@ class modEplan extends DolibarrModules
$this->editor_name = 'Alles Watt läuft'; $this->editor_name = 'Alles Watt läuft';
$this->editor_url = ''; $this->editor_url = '';
$this->version = '1.1.0'; $this->version = '1.1.1';
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
$this->picto = 'fa-drafting-compass'; $this->picto = 'fa-drafting-compass';
$this->module_parts = array( $this->module_parts = array(
'triggers' => 0, 'login' => 0, 'substitutions' => 0, 'menus' => 0, 'triggers' => 0, 'login' => 0, 'substitutions' => 0, 'menus' => 0,
'tpl' => 0, 'barcode' => 0, 'models' => 0, 'printing' => 0, 'tpl' => 0, 'barcode' => 0, 'models' => 0, 'printing' => 0,
'theme' => 0, 'css' => array(), 'js' => array(), 'hooks' => array(), 'theme' => 0, 'css' => array(), 'js' => array(),
'hooks' => array('data' => array('thirdpartycard'), 'entity' => '0'),
'moduleforexternal' => 0, 'moduleforexternal' => 0,
); );
@ -57,7 +58,8 @@ class modEplan extends DolibarrModules
// Tabs auf Auftrag + Kundenkarte // Tabs auf Auftrag + Kundenkarte
$this->tabs = array( $this->tabs = array(
'order:+aufmass:Aufmaß:eplan@eplan:$user->hasRight("eplan","read"):/custom/eplan/aufmass_order.php?id=__ID__', 'order:+aufmass:Aufmaß:eplan@eplan:$user->hasRight("eplan","read"):/custom/eplan/aufmass_order.php?id=__ID__',
'thirdparty:+aufmass:Aufmaß:eplan@eplan:$user->hasRight("eplan","read"):/custom/eplan/aufmass_thirdparty.php?socid=__ID__', // Am KUNDEN setzt den Reiter die Hook-Klasse (nur bei vorhandenen Auftraegen —
// ohne Auftrag gibt es nichts zu vermessen). Der Reiter am AUFTRAG bleibt fest.
); );
// Rechte // Rechte