fix: Aufmaß-Tab zeigt nur das mit dem Auftrag verknüpfte Aufmaß [deploy]
All checks were successful
Deploy Eplan / deploy (push) Successful in 14s
All checks were successful
Deploy Eplan / deploy (push) Successful in 14s
Statt aller ElektroPlan-Projekte wird über die Backend-Verknüpfung
(Auftrag→Projekt, /api/dolibarr/auftraege/{id}/projekt) nur das zu diesem
Auftrag gehörende Aufmaß geladen — inkl. Räume-Anzahl, Gesamtfläche und
Quelle (Baustelle/Editor). Behebt den TODO-Platzhalter, der projektfremde
Aufmaße anzeigte.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
dae8a2d823
commit
9a830f1397
1 changed files with 66 additions and 34 deletions
|
|
@ -93,45 +93,77 @@ if (!empty($pwa_url)) {
|
||||||
print '</div>';
|
print '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verknüpfte Aufmaß-Daten (Platzhalter für Backend-Integration)
|
// Aufmaß-Daten aus dem ElektroPlan-Backend laden — nur das mit DIESEM Auftrag
|
||||||
print '<table class="noborder centpercent" style="margin-top: 16px;">';
|
// verknüpfte Projekt (über die Verknüpfungstabelle im Backend).
|
||||||
print '<tr class="liste_titre">';
|
$api_url = rtrim(getDolGlobalString('EPLAN_PWA_URL'), '/');
|
||||||
print '<td>Grundriss</td><td>Etage</td><td>Räume</td><td>Fläche</td><td>Erstellt</td><td></td>';
|
$projekt = null;
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
// Aufmaß-Daten aus dem ElektroPlan-Backend laden
|
|
||||||
$api_url = getDolGlobalString('EPLAN_PWA_URL');
|
|
||||||
$raeume = array();
|
$raeume = array();
|
||||||
if (!empty($api_url)) {
|
if (!empty($api_url)) {
|
||||||
$ch = curl_init($api_url.'/api/projekte/');
|
// Kleiner GET-Helfer: liefert dekodiertes JSON-Array oder null
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
$eplan_get = function ($pfad) use ($api_url) {
|
||||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
$ch = curl_init($api_url.$pfad);
|
||||||
$response = curl_exec($ch);
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
curl_close($ch);
|
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
||||||
if ($response) {
|
$resp = curl_exec($ch);
|
||||||
$projekte = json_decode($response, true);
|
$code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
if (is_array($projekte)) {
|
curl_close($ch);
|
||||||
// TODO: Filter nach dolibarr_auftrag_id wenn Backend das unterstützt
|
if ($resp === false || $code < 200 || $code >= 300) return null;
|
||||||
foreach ($projekte as $p) {
|
$daten = json_decode($resp, true);
|
||||||
print '<tr class="oddeven">';
|
return is_array($daten) ? $daten : null;
|
||||||
print '<td>'.dol_escape_htmltag($p['name'] ?? '-').'</td>';
|
};
|
||||||
print '<td>-</td>';
|
|
||||||
print '<td>-</td>';
|
// Auftrag → projekt_id auflösen
|
||||||
print '<td>-</td>';
|
$verkn = $eplan_get('/api/dolibarr/auftraege/'.((int) $object->id).'/projekt');
|
||||||
print '<td>'.dol_print_date(strtotime($p['erstellt'] ?? ''), 'day').'</td>';
|
$projekt_id = $verkn['projekt_id'] ?? null;
|
||||||
print '<td class="right">';
|
if (!empty($projekt_id)) {
|
||||||
if (!empty($pwa_url)) {
|
$projekt = $eplan_get('/api/projekte/'.rawurlencode($projekt_id));
|
||||||
print '<a href="'.dol_escape_htmltag($pwa_url.'/?projekt='.$p['id']).'" target="_blank" class="butAction butActionSmall">Öffnen</a>';
|
$raeume = $eplan_get('/api/projekte/'.rawurlencode($projekt_id).'/raeume');
|
||||||
}
|
if (!is_array($raeume)) $raeume = array();
|
||||||
print '</td>';
|
|
||||||
print '</tr>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (empty($raeume) && empty($projekte)) {
|
|
||||||
|
print '<table class="noborder centpercent" style="margin-top: 16px;">';
|
||||||
|
print '<tr class="liste_titre">';
|
||||||
|
print '<td>Grundriss</td><td class="center">Räume</td><td class="right">Fläche</td><td>Quelle</td><td>Erstellt</td><td></td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
|
if (!empty($projekt)) {
|
||||||
|
// Gesamtfläche + Quellen aus den Räumen aggregieren
|
||||||
|
$flaeche = 0.0;
|
||||||
|
$quellen = array();
|
||||||
|
foreach ($raeume as $r) {
|
||||||
|
$flaeche += (float) ($r['flaeche_m2'] ?? 0);
|
||||||
|
$q = $r['quelle'] ?? '';
|
||||||
|
if ($q !== '' && !in_array($q, $quellen, true)) $quellen[] = $q;
|
||||||
|
}
|
||||||
|
$quelleLabel = empty($quellen) ? '-' : implode(', ', array_map(function ($q) {
|
||||||
|
return $q === 'aufmass' ? 'Baustelle' : ($q === 'editor' ? 'Editor' : $q);
|
||||||
|
}, $quellen));
|
||||||
|
|
||||||
|
// Öffnen-Link mit Auftrags-Kontext → PWA lädt das verknüpfte Projekt automatisch
|
||||||
|
$open_link = $pwa_url . '/?auftrag=' . urlencode($object->ref)
|
||||||
|
. '&kunde=' . urlencode($object->thirdparty->name ?? '')
|
||||||
|
. '&auftrag_id=' . ((int) $object->id);
|
||||||
|
|
||||||
|
print '<tr class="oddeven">';
|
||||||
|
print '<td>'.dol_escape_htmltag($projekt['name'] ?? '-').'</td>';
|
||||||
|
print '<td class="center">'.count($raeume).'</td>';
|
||||||
|
print '<td class="right">'.($flaeche > 0 ? price($flaeche, 0, '', 0, 2).' m²' : '-').'</td>';
|
||||||
|
print '<td>'.dol_escape_htmltag($quelleLabel).'</td>';
|
||||||
|
print '<td>'.dol_print_date(strtotime($projekt['geaendert'] ?? $projekt['erstellt'] ?? ''), 'dayhour').'</td>';
|
||||||
|
print '<td class="right">';
|
||||||
|
if (!empty($pwa_url)) {
|
||||||
|
print '<a href="'.dol_escape_htmltag($open_link).'" target="_blank" rel="noopener" class="butAction butActionSmall">Öffnen</a>';
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
} else {
|
||||||
print '<tr class="oddeven"><td colspan="6" class="opacitymedium" style="text-align: center; padding: 20px;">';
|
print '<tr class="oddeven"><td colspan="6" class="opacitymedium" style="text-align: center; padding: 20px;">';
|
||||||
print 'Noch keine Aufmaße verknüpft. Starte ein neues Aufmaß über den Button oben.';
|
if (empty($api_url)) {
|
||||||
|
print 'ElektroPlan-Backend nicht erreichbar (PWA-URL nicht konfiguriert).';
|
||||||
|
} else {
|
||||||
|
print 'Noch kein Aufmaß mit diesem Auftrag verknüpft. Starte ein neues Aufmaß über den Button oben.';
|
||||||
|
}
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue