diff --git a/import-products.php b/import-products.php index d9c8c51b..884826e1 100644 --- a/import-products.php +++ b/import-products.php @@ -2,6 +2,9 @@ // URL do pliku XML: // https://sollux-lighting.com/product_feed/sollux/XML_polski_PLN_wszystkie_vip.xml +// START POMIARU CAŁEGO SKRYPTU +$scriptStartTime = microtime(true); + // Załaduj konfigurację PrestaShop include(dirname(__FILE__).'/config/config.inc.php'); include(dirname(__FILE__).'/init.php'); @@ -13,17 +16,24 @@ $context = Context::getContext(); // ============================================ // ID Producenta (Sollux Lighting) - podaj ID z PrestaShop -$configManufacturerId = 1; +$configManufacturerId = 198; -// ID Grupy Podatkowej (np. dla 23% VAT) - sprawdź w Lokalizacja > Podatki > Reguły podatkowe +// ID Grupy Podatkowej (np. dla 23% VAT) $configTaxRulesGroupId = 1; -// ID Kategorii domyślnej, do której mają trafić produkty (np. "Kinkiety" lub ogólna) -$configDefaultCategoryId = 12; +// ID Kategorii domyślnej, do której mają trafić produkty +$configDefaultCategoryId = 1072; // Czy włączyć produkt po imporcie? $configActive = 1; +// --- KONFIGURACJA CECHY (FEATURE) --- +// ID Cechy do przypisania (np. 20) +$configFeatureId = 20; + +// ID Wartości Cechy do przypisania (np. 19002) +$configFeatureValueId = 19002; + // ============================================ // Sprawdzenie trybu działania @@ -38,13 +48,21 @@ if (!$modeAdd && !$modeUpdate && !$modeSynch) { // Plik logu $logFile = __DIR__ . '/sollux_import_log.csv'; -// Wczytanie XML +// MIERZENIE: Ładowanie XML +$tXmlStart = microtime(true); $xmlUrl = 'https://sollux-lighting.com/product_feed/sollux/XML_polski_PLN_wszystkie_vip.xml'; $xml = simplexml_load_file($xmlUrl) or die("Error: Cannot create object from XML"); +$tXmlEnd = microtime(true); +$tXmlDuration = $tXmlEnd - $tXmlStart; // Czas parsowania XML // === FUNKCJE POMOCNICZE === +// Formatowanie czasu do wyświetlania +function formatTime($time) { + return number_format($time, 4) . ' s'; +} + // Tworzenie pola multilang (wymagane przez Prestę) function createMultiLangField($field) { $languages = Language::getLanguages(false); @@ -193,13 +211,12 @@ if ($modeSynch) { $db->execute('INSERT IGNORE INTO `'._DB_PREFIX_.'sollux_temp` (`sku`) VALUES '.implode(',', $sqlValues)); } - // Wyłącz produkty, których nie ma w XML a są w bazie (i są powiązane z tym producentem, opcjonalnie) - // Zakładamy, że sprawdzamy tylko produkty, które mają SKU. + // Wyłącz produkty, których nie ma w XML a są w bazie $sqlDisable = 'UPDATE `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'sollux_temp` t ON p.reference = t.sku SET p.active = 0 WHERE t.sku IS NULL - AND p.id_manufacturer = '.(int)$configManufacturerId; // Bezpiecznik: wyłączamy tylko produkty tego producenta + AND p.id_manufacturer = '.(int)$configManufacturerId; $db->execute($sqlDisable); echo "
Wyłączono produkty niedostępne w feedzie.
"; @@ -215,7 +232,9 @@ if ($modeSynch) { // Posprzątaj $db->execute('DROP TABLE `'._DB_PREFIX_.'sollux_temp`'); - echo 'Zakończono synchronizację.
'; + + $totalTime = microtime(true) - $scriptStartTime; + echo 'Zakończono synchronizację. Całkowity czas: '.formatTime($totalTime).'
'; exit; } @@ -225,12 +244,12 @@ if ($modeUpdate) { $today = date('Y-m-d'); $updatedCount = 0; - // Wczytaj log, aby nie aktualizować tego samego produktu wielokrotnie tego samego dnia + // Wczytaj log $processedSkus = []; if (file_exists($logFile)) { $lines = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { - $data = explode(';', $line); // Date;SKU + $data = explode(';', $line); if (isset($data[0]) && $data[0] == $today && isset($data[1])) { $processedSkus[trim($data[1])] = true; } @@ -243,39 +262,43 @@ if ($modeUpdate) { $sku = trim((string)$productNode->sku); if (empty($sku)) continue; - // Jeśli już zrobiony dzisiaj - pomiń if (isset($processedSkus[$sku])) continue; + // MIERZENIE: Szukanie produktu + $tStartCheck = microtime(true); $product = findProductByReference($sku); + $tCheckDuration = microtime(true) - $tStartCheck; + if (!$product) { - // Produkt nie istnieje w bazie - w trybie update pomijamy continue; } - // --- Aktualizacja Ceny --- + // MIERZENIE: Update produktu + $tStartUpdate = microtime(true); $priceGross = parsePrice($productNode->cena_detaliczna_brutto_pln); - $priceNet = Tools::ps_round($priceGross / 1.23, 6); // Zakładamy 23% VAT od brutto + $priceNet = Tools::ps_round($priceGross / 1.23, 6); $product->price = $priceNet; - $product->active = 1; // Przywracamy aktywność przy update + $product->active = 1; - // --- Aktualizacja Stanu (Domyślnie 100 jeśli jest w pliku) --- - // XML nie ma pola "qty", ale ma "paczkomat" i "orientacyjny czas". - // Zakładamy: jest w XML = dostępny. StockAvailable::setQuantity($product->id, 0, 100); $product->update(); + $tUpdateDuration = microtime(true) - $tStartUpdate; // Logowanie file_put_contents($logFile, $today.';'.$sku.PHP_EOL, FILE_APPEND); echo "Zaktualizowano: $sku (Cena netto: $priceNet)
"; - $updatedCount++; - // Aktualizujemy 1 produkt na wywołanie, żeby nie przekroczyć czasu wykonywania? - // W poprzednim skrypcie był break. Jeśli masz crona co minutę, odkomentuj break. - // Jeśli odpalasz ręcznie w przeglądarce, break spowoduje konieczność ciągłego odświeżania. - // Zostawiam break dla bezpieczeństwa, odświeżaj stronę (meta reload na dole). + // RAPORT UPDATE + echo 'Dodano produkt: " . $product->name[Context::getContext()->language->id] . " ($sku)
"; + + // --- RAPORT WYDAJNOŚCI --- + $totalProductTime = microtime(true) - $tStartCheck; // Czas od sprawdzenia do końca zdjęć + + echo 'Błąd podczas dodawania produktu: $sku
";