252 lines
9.1 KiB
PHP
252 lines
9.1 KiB
PHP
<?php
|
|
/**
|
|
* ItemDatabase - Saubere DB-Abfragen für Items
|
|
* Komplett neu geschrieben nach Auto-Refactoring-Chaos
|
|
*/
|
|
|
|
class ItemDatabase {
|
|
private $db;
|
|
private $base_object;
|
|
|
|
public function __construct($base_object) {
|
|
$this->base_object = $base_object;
|
|
$this->db = $base_object->db;
|
|
}
|
|
|
|
/**
|
|
* Holt Basis-Item-Daten
|
|
*/
|
|
public function getItemData($item_id) {
|
|
$sql = "SELECT * FROM items WHERE id = " . intval($item_id);
|
|
$result = $this->db->query($sql);
|
|
return $result ? $result->fetch_object() : false;
|
|
}
|
|
|
|
/**
|
|
* Holt Herstellerinformationen
|
|
*/
|
|
public function getManufacturerInfo($vendor_id) {
|
|
if (!$vendor_id) return [];
|
|
|
|
$sql = "SELECT * FROM herstellerinformationen WHERE id = ?";
|
|
$stmt = $this->db->prepare($sql);
|
|
|
|
if ($stmt) {
|
|
$vendor_id_int = intval($vendor_id);
|
|
$stmt->bind_param("i", $vendor_id_int);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
return $result->fetch_assoc() ?: [];
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Holt Admin User Daten
|
|
*/
|
|
public function getAdminUser($user_id) {
|
|
if (!$user_id) return null;
|
|
|
|
$sql = "SELECT * FROM customers WHERE id = " . intval($user_id);
|
|
$result = $this->db->query($sql);
|
|
return $result ? $result->fetch_object() : null;
|
|
}
|
|
|
|
/**
|
|
* Holt Sicherheitshinweise (REAKTIVIERT + FALLBACK)
|
|
* Übertragen aus item.class.php Zeile 885-936
|
|
* PRIORITÄT 1: attribute_5 (manuell)
|
|
* PRIORITÄT 2: attribute_7 (Navision-Automatik)
|
|
*/
|
|
public function getSecurityWarnings($navision_id, $manual_warning_ids = null) {
|
|
$warnings = [];
|
|
$documents = [];
|
|
|
|
// PRIORITÄT 1: Manuelle Warning-IDs aus attribute_5 (für alte Artikel)
|
|
if (!empty($manual_warning_ids) && preg_match('/^[\d,\s]+$/', $manual_warning_ids)) {
|
|
// SPECIAL CASE: warning_id 199 = Allgemeine Sicherheitsdokumente
|
|
if (trim($manual_warning_ids) == '199') {
|
|
// Lade das PDF aus sicherheitshinweis.bild für warning_id 199
|
|
$sql = "SELECT bild, name FROM sicherheitshinweis WHERE warning_id = 199";
|
|
$result = $this->db->query($sql);
|
|
|
|
if ($result && $row = $result->fetch_assoc()) {
|
|
if (!empty($row['bild'])) {
|
|
$documents[] = [
|
|
'file_name' => $row['bild'] . '.pdf',
|
|
'label' => $row['name'] ?? 'Allgemeine Sicherheitshinweise'
|
|
];
|
|
}
|
|
}
|
|
|
|
return [
|
|
'warnings' => [],
|
|
'documents' => $documents,
|
|
'source' => 'manual_attribute_5_document_199'
|
|
];
|
|
}
|
|
|
|
// Normale Warning-IDs (1-90): Nur Symbole, keine Dokumente
|
|
$warnings = $this->loadWarnings($manual_warning_ids);
|
|
return [
|
|
'warnings' => $warnings,
|
|
'documents' => [],
|
|
'source' => 'manual_attribute_5'
|
|
];
|
|
}
|
|
|
|
// PRIORITÄT 2: Automatische Navision-Logik aus attribute_7
|
|
if (!empty($navision_id)) {
|
|
$sql = "SELECT * FROM sicherheitshinweis_item WHERE navision_id = ?";
|
|
$stmt = $this->db->prepare($sql);
|
|
|
|
if ($stmt) {
|
|
$stmt->bind_param("s", $navision_id);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
$warningDocsList = $result->fetch_assoc();
|
|
|
|
if ($warningDocsList) {
|
|
// Sicherheitswarnungen laden
|
|
$warningIdsList = $warningDocsList['warning_ids'] ?? null;
|
|
$warnings = $this->loadWarnings($warningIdsList);
|
|
|
|
// Dokumente laden
|
|
$documentColumns = [
|
|
'Bedienungsanleitung' => 'Allg. Sicherheitshinweise',
|
|
'EU_Datenblatt' => 'EU-Datenblatt',
|
|
'Energielabel' => 'Energielabel',
|
|
'Produktdatenblatt' => 'Produktdatenblatt',
|
|
'Sicherheitsdatenblatt' => 'Sicherheitsdatenblatt',
|
|
'Zertifikat' => 'Zertifikat',
|
|
'null_feld' => 'Allg. Sicherheitshinweise'
|
|
];
|
|
|
|
foreach ($documentColumns as $column => $label) {
|
|
if (!empty($warningDocsList[$column])) {
|
|
$pdfs = explode(',', $warningDocsList[$column]);
|
|
$pdfs = array_map('trim', $pdfs);
|
|
$pdfs = array_map(fn($pdf) => trim($pdf, '"'), $pdfs);
|
|
foreach ($pdfs as $pdf) {
|
|
if (!empty($pdf)) {
|
|
$documents[] = [
|
|
'file_name' => $pdf,
|
|
'label' => $label
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return [
|
|
'warnings' => $warnings,
|
|
'documents' => $documents,
|
|
'source' => !empty($navision_id) ? 'navision_attribute_7' : 'empty'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Lädt Sicherheitswarnungen basierend auf IDs
|
|
* Übertragen aus item.class.php loadWarnings()
|
|
*/
|
|
private function loadWarnings($warningIdsList) {
|
|
$articleWarnings = [];
|
|
|
|
if ($warningIdsList) {
|
|
$ids = explode(',', $warningIdsList);
|
|
$ids = array_map('trim', $ids);
|
|
$ids = array_filter($ids, 'is_numeric');
|
|
|
|
if (!empty($ids)) {
|
|
$placeholders = implode(',', array_fill(0, count($ids), '?'));
|
|
|
|
$sqlWarn = "
|
|
SELECT warning_id, name, beschreibung, bild, bildnr, bilddateiname
|
|
FROM sicherheitshinweis
|
|
WHERE warning_id IN ($placeholders)
|
|
ORDER BY warning_id
|
|
";
|
|
$stmtWarn = $this->db->prepare($sqlWarn);
|
|
|
|
if ($stmtWarn) {
|
|
$types = str_repeat('i', count($ids));
|
|
$stmtWarn->bind_param($types, ...$ids);
|
|
$stmtWarn->execute();
|
|
$resultWarn = $stmtWarn->get_result();
|
|
$articleWarnings = $resultWarn->fetch_all(MYSQLI_ASSOC);
|
|
|
|
// Bild-Dateinamen generieren
|
|
foreach ($articleWarnings as &$warning) {
|
|
$warning['image_filename'] = $this->generateImageFileName($warning);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $articleWarnings;
|
|
}
|
|
|
|
/**
|
|
* Generiert Bild-Dateinamen für Sicherheitshinweise
|
|
* Übertragen aus item.class.php generateImageFileName()
|
|
*/
|
|
private function generateImageFileName($warning) {
|
|
// Verwende "bilddateiname", wenn vorhanden
|
|
if (!empty($warning['bilddateiname'])) {
|
|
return $warning['bilddateiname'];
|
|
}
|
|
|
|
// Verwende "bildnr", wenn vorhanden
|
|
if (!empty($warning['bildnr'])) {
|
|
return $warning['bildnr'] . ".gif";
|
|
}
|
|
|
|
// Generiere basierend auf der Bildnummer
|
|
if (!empty($warning['bild'])) {
|
|
$baseName = "ISO_7010_";
|
|
$suffix = ".svg";
|
|
|
|
// Extrahiere die letzten 3 Ziffern der Bildnummer
|
|
$imageFileId = substr($warning['bild'], -4);
|
|
|
|
return $baseName . $imageFileId . $suffix;
|
|
}
|
|
|
|
// Kein Bild verfügbar
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Performance-Debug - DIREKT AUF SEITE ausgeben
|
|
*/
|
|
public function debugItemPerformance($item_id) {
|
|
echo "<div style='background:yellow;padding:10px;margin:10px;border:2px solid red;'>";
|
|
echo "<h2>🔍 PERFORMANCE DEBUG für Item $item_id</h2>";
|
|
|
|
$this->benchmarkQuery("SELECT * FROM items WHERE id = $item_id", "1. Base Item Data");
|
|
$this->benchmarkQuery("SELECT * FROM item_files WHERE item_id = $item_id", "2. Files");
|
|
$this->benchmarkQuery("SELECT * FROM customers WHERE id = 1", "3. Test Admin User");
|
|
|
|
echo "<strong>✅ PERFORMANCE DEBUG ABGESCHLOSSEN</strong>";
|
|
echo "</div>";
|
|
}
|
|
|
|
/**
|
|
* Benchmark eine einzelne Abfrage - DIREKT AUF SEITE
|
|
*/
|
|
public function benchmarkQuery($sql, $description = '') {
|
|
$start = microtime(true);
|
|
$result = $this->db->query($sql);
|
|
$end = microtime(true);
|
|
$time = round(($end - $start) * 1000, 2);
|
|
|
|
echo "<p><strong>$description:</strong> {$time}ms<br>";
|
|
echo "<code>$sql</code></p>";
|
|
|
|
return $result;
|
|
}
|
|
} |