shop-old/core/item-db.class.php
2026-04-20 01:03:43 +02:00

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;
}
}