anzahl, wenn erst der Hersteller geklaert werden muss $v2_marke = isset($_GET['marke']) ? trim($_GET['marke']) : ''; // gewaehlter Hersteller $v2_variants = []; // BSH-Bauzustaende /01 /02 ..., wenn nur der Zeitraum unterscheidet $v2_variant_base = ''; // gemeinsame Typnummer ohne Suffix, z.B. "WT46W560BY" $v2_shopmap = []; // navision_id => Shop-Artikel, fuer die Links an den Chips try { // MySQL wird in beiden Fällen gebraucht (rechte Spalte = Artikel-Suche) $db = new KremplDB(true); if ($search_term !== '') { // Links: Geräte-Suche (PostgreSQL) $start_time = microtime(true); $results = $db->searchGeraete($search_term, 20); if ($show_shop_items) { foreach ($results as &$device) { $device['shop_items'] = $db->getAvailableItemsForGeraet($device['geraet_id'], 200); } unset($device); } $search_time = (microtime(true) - $start_time) * 1000; // Rechts: Artikel-/Ersatzteil-Suche (MySQL) $start_time2 = microtime(true); $item_results = $db->searchItems($search_term, 20); $item_search_time = (microtime(true) - $start_time2) * 1000; // --- Hersteller-Filter (kommt aus der Hersteller-Rueckfrage) --- if ($v2_marke !== '') { $results = array_values(array_filter($results, function ($d) use ($v2_marke) { return isset($d['marke']) && trim($d['marke']) === $v2_marke; })); } // --- Stufe 1: muss erst der Hersteller geklaert werden? --- // Dasselbe Modell laeuft oft unter mehreren Konzern-/Versandhausmarken. Dann haben // alle Top-Treffer denselben Score und denselben Modellnamen -- eine Bestaetigung // waere geraten. Der Hersteller steht dem Kunden aber auf dem Typenschild zur // Verfuegung, also fragen wir zuerst danach. Beispiel MUFF21VLQS: 10x Score 100 // ueber AEG, Electrolux, Frigidaire, Gibson. if (count($results) > 1) { $top_score = (int)$results[0]['score']; $topgroup = array_filter($results, function ($d) use ($top_score) { return (int)$d['score'] === $top_score; }); $brands = []; $models = []; foreach ($topgroup as $d) { $m = trim($d['marke'] ?? ''); if ($m !== '') { $brands[$m] = ($brands[$m] ?? 0) + 1; } $models[mb_strtolower(trim($d['modell_bezeichnung'] ?? ''))] = true; } // Nur fragen, wenn es wirklich EIN Modell bei MEHREREN Marken ist. if (count($brands) > 1 && count($models) === 1) { arsort($brands); $v2_brandpick = $brands; } // --- Stufe 1b: Varianten-Auswahl (BSH-Bauzustaende) --- // SIEMENS/BOSCH haengen "/01", "/02" ... an die Typnummer in nr. Laesst der Kunde // das Suffix weg ("WT46W560BY"), kommen alle Bauzustaende mit gleichem Score // zurueck und unterscheiden sich NUR im Produktionszeitraum. Dann fragen wir // danach, statt zehn optisch identische Zeilen zu zeigen. if (!$v2_brandpick) { $basis = []; foreach ($topgroup as $d) { $n = trim($d['nr'] ?? ''); $basis[($p = strpos($n, '/')) !== false ? substr($n, 0, $p) : $n] = true; } if (count($basis) === 1 && count($topgroup) > 1 && count($brands) <= 1) { $v2_variant_base = (string)array_key_first($basis); // Nur wenn die Treffer wirklich Suffix-Varianten sind, nicht zufaellig // gleichnamige Geraete: mindestens einer muss ein "/" tragen. $has_suffix = false; foreach ($topgroup as $d) { if (strpos((string)($d['nr'] ?? ''), '/') !== false) { $has_suffix = true; break; } } if ($has_suffix) { $det_batch = $db->getGeraetDetailsBatch(array_column($topgroup, 'geraet_id')); foreach ($topgroup as $d) { $det = $det_batch[$d['geraet_id']] ?? []; $v2_variants[] = [ 'nr' => (string)($d['nr'] ?? ''), 'id' => $d['geraet_id'], 'von' => $det['produktionsstart'] ?? '', 'bis' => $det['produktionsende'] ?? '', 'typ_de'=> $det['typ_de'] ?? '', 'marke' => $d['marke'] ?? '', ]; } usort($v2_variants, function ($a, $b) { return strcmp($a['nr'], $b['nr']); }); } } } } // --- Stufe 2: gibt es EINEN klaren Top-Treffer? --- // Nur dann darf man "Das ist dein Geraet" behaupten. Bedingung: Top-Score >= 95 // UND mindestens 10 Punkte Abstand zum Zweiten. Beispiel "Lavatherm 400": 100 vs. 75. // Entfaellt, solange die Hersteller-Frage offen ist. if (!$v2_brandpick && !$v2_variants && count($results) > 0) { $v2_top_score_raw = (int)$results[0]['score']; $v2_second_raw = isset($results[1]) ? (int)$results[1]['score'] : 0; if ($v2_top_score_raw >= 95 && ($v2_top_score_raw - $v2_second_raw) >= 10) { $v2_guided = true; $v2_top_detail = $db->getGeraetDetails($results[0]['geraet_id']); } } // --- Shop-Links fuer die Ersatzteil-Chips --- // Die Chips kommen aus PostgreSQL und kennen nur navision_id. Damit sie -- wie die // Artikel weiter unten -- in den Shop verlinken, wird einmalig gesammelt aufgeloest. // Nur die tatsaechlich gerenderten (max. 10 je Geraet), sonst waeren es Tausende. if ($results) { $nav_ids = []; foreach ($results as $d) { foreach (array_slice($d['ersatzteile'] ?? [], 0, 10) as $p) { if (!empty($p['navision_id'])) { $nav_ids[] = $p['navision_id']; } } } if ($nav_ids) { $v2_shopmap = $db->getShopItemsByNavisionIds($nav_ids); } } } } catch (Exception $e) { $error_message = $e->getMessage(); } ?>