shop-old/web/intelectra_shop/php/intelectra_item_additional.inc.php
2026-04-20 01:03:43 +02:00

240 lines
8.5 KiB
PHP

<?php
// get for intelectra geraetezuordnung
/*if ($obj->attribute_17 != '') {
$sql = "SELECT * FROM import_geraetezuordnung WHERE anr='".$obj->attribute_17."'";
$result = $this->db->query($sql);
}
else {
$sql = "SELECT * FROM import_geraetezuordnung WHERE anr='".$obj->number."'";
$result = $this->db->query($sql);
}*/
$result = null;
// COMMENTED OUT - Wrong mapping logic
/*if (strlen($obj->number) == 8) {
$sql = "SELECT g.*
FROM krempl_geraete_22 g
INNER JOIN krempl_artikelgeraet_22 ag ON g.id = ag.geraet
INNER JOIN krempl_passendwie pw ON ag.ersatzteil = pw.id
INNER JOIN items i ON pw.navisionid = i.krempl_id
WHERE i.number = ".$this->db->real_escape_string($obj->number).";";
$result = $this->db->query($sql);
}*/
// ORIGINAL MONSTER-SQL (PERFORMANCE-KILLER!)
// 4-fach JOIN über 1.3M Zeilen krempl_artikelgeraet_22 = HORROR!
/*
ORIGINAL MONSTER-QUERY - AUSKOMMENTIERT FÜR STEP-BY-STEP ZERLEGUNG:
SELECT g.*
FROM krempl_geraete_22 g -- Gerätedaten (Ziel)
INNER JOIN krempl_artikelgeraet_22 ag ON g.id = ag.geraet -- 1.3M ROWS N:M Mapping!
INNER JOIN krempl_passendwie pw ON ag.ersatzteil = pw.id -- Ersatzteil-Mapping
INNER JOIN items i ON ( -- Item-Verknüpfung
pw.navisionid = i.attribute_7 -- Legacy Items
OR (LENGTH(i.number) >= 8 AND pw.navisionid = i.number) -- Moderne Items
)
WHERE i.number = obj->number
LOGIK:
1. Items (i) → finde Ersatzteile über attribute_7 oder number
2. Ersatzteile (pw) → finde krempl_artikelgeraet_22 Mappings
3. Mappings (ag) → finde passende Geräte
4. Geräte (g) → liefere Gerätedaten
*/
// STEP-BY-STEP ZERLEGUNG (Performance-Optimiert):
// FIX: Läuft für number >= 8 ODER wenn attribute_7 vorhanden (Legacy-Artikel)
if (strlen($obj->number) >= 8 || !empty($obj->attribute_7)) {
// STEP 1: Finde Ersatzteil-IDs für dieses Item
$ersatzteil_ids = array();
// Query 1A: Legacy Items (über attribute_7)
if (!empty($obj->attribute_7)) {
$sql1a = "SELECT id FROM krempl_passendwie WHERE navisionid = ".$this->db->real_escape_string($obj->attribute_7);
$result1a = $this->db->query($sql1a);
if ($result1a) {
while ($row = $result1a->fetch_assoc()) {
$ersatzteil_ids[] = $row['id'];
}
}
}
// Query 1B: Moderne Items (über number, wenn >= 8 Zeichen)
$sql1b = "SELECT id FROM krempl_passendwie WHERE navisionid = ".$this->db->real_escape_string($obj->number);
$result1b = $this->db->query($sql1b);
if ($result1b) {
while ($row = $result1b->fetch_assoc()) {
$ersatzteil_ids[] = $row['id'];
}
}
// STEP 2: Finde Geräte-IDs für diese Ersatzteile
$geraet_ids = array();
if (!empty($ersatzteil_ids)) {
$ersatzteil_list = implode(',', array_map('intval', $ersatzteil_ids));
$sql2 = "SELECT DISTINCT geraet FROM krempl_artikelgeraet_22 WHERE ersatzteil IN ($ersatzteil_list)";
$result2 = $this->db->query($sql2);
if ($result2) {
while ($row = $result2->fetch_assoc()) {
$geraet_ids[] = $row['geraet'];
}
}
}
// STEP 3: Hole finale Gerätedaten
$result = false;
if (!empty($geraet_ids)) {
$geraet_list = implode(',', array_map('intval', $geraet_ids));
$sql3 = "SELECT * FROM krempl_geraete_22 WHERE id IN ($geraet_list)";
$result = $this->db->query($sql3);
if (!$result) {
$result = false; // Explizit setzen für Fallback
}
} else {
$result = false; // Explizit setzen für Fallback
}
}
if (!empty($obj->krempl_id) && (!isset($result) || !$result || $result->num_rows < 1)) {
$sql = "SELECT * FROM krempl_artikelgeraet_22 ka
left join krempl_geraete_22 kg on kg.id=ka.geraet
WHERE ka.ersatzteil=".$this->db->real_escape_string($obj->krempl_id)." AND not isnull(nr)";
$result = $this->db->query($sql);
}
$obj->geraetezuordnung = array();
if ($result) {
while ($obj1 = $result->fetch_object()) {
$obj->geraetezuordnung[] = $obj1;
}
}
// get parent warengruppe
$sql = "select i.name, s.name, s2.name as wg from items i
left join item_structure_assign isa on isa.item_id=i.id
left join structure s on s.id=isa.structure_id
left join structure s2 on s2.id=s.parent_id
where i.id=".$obj->id.' AND s.active=1 LIMIT 1';
$result = $this->db->query($sql);
$parent_warengruppe = '';
if ($result) {
while ($obj1 = $result->fetch_object()) {
$parent_warengruppe = $obj1->wg;
}
}
$table_data = array();
foreach ($obj->geraetezuordnung as $geraet) {
$nr1 = str_replace('#', '', $geraet->nr);
$nr1 = str_replace('_', ' ', $nr1);
$nr2 = str_replace('#', '', $geraet->produktionsstart);
$nr2 = str_replace('_', ' ', $nr2);
$nr3 = str_replace('#', '', $geraet->produktionsende);
$nr3 = str_replace('_', ' ', $nr3);
$nr3 = empty($nr3) ? "" : " - ".$nr3;
$nr2 = $nr2.$nr3;
$bezeichnungoriginal = str_replace('#', '', $geraet->bezeichnungoriginal);
$bezeichnungoriginal = str_replace('_', ' ', $bezeichnungoriginal);
$bezeichnungoriginal = preg_replace('/\r\n|\n|\r/', '', $bezeichnungoriginal);
// Überprüfe, ob $bezeichnungoriginal leer ist, und verwende $geraet->modellBezeichnung falls ja
if (empty($bezeichnungoriginal) && !empty($geraet->modellBezeichnung)) {
$bezeichnungoriginal = str_replace('#', '', $geraet->modellBezeichnung);
$bezeichnungoriginal = str_replace('_', ' ', $bezeichnungoriginal);// Ersetze durch modellBezeichnung
} elseif (empty($bezeichnungoriginal)) {
$bezeichnungoriginal = "-"; // Oder einen Platzhalter, wenn auch modellBezeichnung leer ist
}
$einkaufsmoeglichkeitencached = $nr1." ".$nr2;
$table_data[$einkaufsmoeglichkeitencached][$bezeichnungoriginal][] = array($nr1, $nr2);
}
/* $html = '<table border="0" cellpadding="2" cellspacing="0">';
foreach ($table_data as $key => $marken) {
$y = 0;
$html .= '<tr class="intelectra_item_table_header"><td colspan="3"><h4><b>'.$obj->name.' passend zu '.$key.' '.$parent_warengruppe.'</b></h4></tr>';
$html .= '<tr class="intelectra_item_table_header"><td>Ger&auml;te-/Modellbezeichnung</td><td>E-, Service-, Produktions- oder Hauptnummer</td><td>Zusatz-, F- oder Seriennummer oder Fertigungsdatum</td></tr>';
foreach ($marken as $geraet => $nummern) {
$color = 'intelectra_table_row1';
if ($y % 2 == 1) {
$color = 'intelectra_table_row2';
}
$z = 0;
foreach ($nummern as $nummer) {
if ($z == 0) {
$html .= '<tr class="'.$color.'"><td>'.$geraet.'</td><td>'.$nummer[0].'</td><td>'.$nummer[1].'</td></tr>';
} else {
$html .= '<tr class="'.$color.'"><td>&nbsp;</td><td>'.$nummer[0].'</td><td>'.$nummer[1].'</td></tr>';
}
$z++;
}
$y++;
}
}
$html .= '</table>'; */
$html = '<div class="tba_container">';
foreach ($table_data as $key => $marken) {
$y = 0;
// Eine einzige Überschrift pro Artikel
if ($y == 0) {
$html .= '<div class="tba_section">';
$html .= '<div class="tba_header"><h4><b>'.$obj->name.' passend zu '.$key.' '.$parent_warengruppe.'</b></h4></div>';
$html .= '<div class="tba_grid_header">';
$html .= '<div class="tba_col">Geräte-/Modellbezeichnung</div>';
$html .= '<div class="tba_col">E-, Service-, Produktions- oder Hauptnummer</div>';
$html .= '<div class="tba_col">Zusatz-, F- oder Seriennummer oder Fertigungsdatum</div>';
$html .= '</div>'; // Header-Ende
}
foreach ($marken as $geraet => $nummern) {
$colorClass = ($y % 2 == 1) ? 'tba_row_odd' : 'tba_row_even';
$z = 0;
foreach ($nummern as $nummer) {
$html .= '<div class="tba_grid ' . $colorClass . '">';
if ($z == 0) {
$html .= '<div class="tba_col">'.$geraet.'</div>';
} else {
$html .= '<div class="tba_col">&nbsp;</div>';
}
$html .= '<div class="tba_col mitlink"><a href="#" class="geraete-link" data-nr="'.htmlentities($nummer[0]).'">'.htmlentities($nummer[0]).'</a></div>';
$html .= '<div class="tba_col">'.$nummer[1].'</div>';
$html .= '</div>'; // Zeile Ende
$z++;
}
$y++;
}
$html .= '</div>'; // Section Ende
}
$html .= '</div>'; // Container Ende
$shopArticle->geraetezuordnung = $html;
$int = $this->createIntWithTableData($html);
// base price calc
if ($obj->attribute_11 && $obj->attribute_15) {
$obj->sample_unit = $obj->attribute_15;
if (strstr($obj->sample_unit, '100')) {
$obj->sample_price = $obj->shop_price_1 / ($obj->attribute_11 * 10);
} else {
$obj->sample_price = $obj->shop_price_1 / $obj->attribute_11;
}
}