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>
111 lines
3.1 KiB
PHP
111 lines
3.1 KiB
PHP
<?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;
|
|
}
|
|
}
|