# Modyfikacje modułu empikmarketplace Data modyfikacji: 2026-03-11 ## Problem Moduł empikmarketplace przy nieudanym imporcie zamówienia z EMPIK do PrestaShop powodował: 1. Brak powiadomienia o błędzie — nikt nie wiedział, że zamówienie nie przeszło 2. Dziury w numeracji zamówień (`id_order`) — MySQL AUTO_INCREMENT nie cofa się po ROLLBACK transakcji ## Zmodyfikowane pliki ### `src/Processor/OrderProcessor.php` Dodany import `Mail` na górze pliku: ```php use Mail; ``` Dodana stała z adresem email do powiadomień: ```php class OrderProcessor { const CODE_WAITING_ACCEPTANCE = 'WAITING_ACCEPTANCE'; const CODE_SHIPPING = 'SHIPPING'; const ERROR_NOTIFICATION_EMAIL = 'jacek.pyziak@project-pro.pl'; ``` Zmodyfikowana metoda `import()` — dodano wywołanie resetu AUTO_INCREMENT i wysyłki emaila w bloku catch: ```php protected function import(EmpikOrderWrapper $empikOrder) { try { Db::getInstance()->execute('START TRANSACTION'); $this->orderFulfiller->fulfill($empikOrder); Db::getInstance()->execute('COMMIT'); } catch (Exception $e) { Db::getInstance()->execute('ROLLBACK'); $this->resetOrderAutoIncrement(); $data = $empikOrder->getData(); $empikOrderId = isset($data['order_id']) ? $data['order_id'] : 'unknown'; $errorMsg = sprintf('Error importing EMPIK order [%s]: %s', $empikOrderId, $e->getMessage()); $this->logger->logError($errorMsg); $this->sendFailureNotification($empikOrderId, $e); } } ``` Dodana metoda `resetOrderAutoIncrement()` — zapobiega dziurom w numeracji zamówień: ```php protected function resetOrderAutoIncrement() { try { $lastId = (int) Db::getInstance()->getValue( 'SELECT MAX(id_order) FROM ' . _DB_PREFIX_ . 'orders' ); Db::getInstance()->execute( 'ALTER TABLE ' . _DB_PREFIX_ . 'orders AUTO_INCREMENT = ' . ($lastId + 1) ); } catch (Exception $e) { $this->logger->logError(sprintf('Error resetting AUTO_INCREMENT: %s', $e->getMessage())); } } ``` Dodana metoda `sendFailureNotification()` — wysyła email z informacją o błędzie: ```php protected function sendFailureNotification($empikOrderId, Exception $exception) { try { $shopName = Configuration::get('PS_SHOP_NAME'); $subject = sprintf('[%s] Błąd importu zamówienia EMPIK: %s', $shopName, $empikOrderId); $body = sprintf( "Zamówienie EMPIK: %s\nData: %s\nBłąd: %s\n\nStack trace:\n%s", $empikOrderId, date('Y-m-d H:i:s'), $exception->getMessage(), $exception->getTraceAsString() ); Mail::send( (int) Configuration::get('PS_LANG_DEFAULT'), 'empik_import_error', $subject, [ '{empik_order_id}' => $empikOrderId, '{error_message}' => $exception->getMessage(), '{error_date}' => date('Y-m-d H:i:s'), '{stack_trace}' => nl2br($exception->getTraceAsString()), ], self::ERROR_NOTIFICATION_EMAIL, null, Configuration::get('PS_SHOP_EMAIL'), $shopName, null, null, _PS_MODULE_DIR_ . 'empikmarketplace/mails/' ); } catch (Exception $e) { $this->logger->logError(sprintf('Error sending failure notification email: %s', $e->getMessage())); } } ``` ## Dodane pliki ### `mails/pl/empik_import_error.html` Szablon HTML emaila z powiadomieniem o błędzie. Zawiera placeholdery: - `{empik_order_id}` — ID zamówienia EMPIK - `{error_date}` — data błędu - `{error_message}` — komunikat błędu - `{stack_trace}` — stack trace wyjątku ### `mails/pl/empik_import_error.txt` Wersja tekstowa tego samego szablonu (wymagana przez PrestaShop `Mail::send()`). ## Po aktualizacji modułu Jeśli moduł empikmarketplace zostanie zaktualizowany, powyższe zmiany zostaną nadpisane. Należy ponownie: 1. Dodać `use Mail;` do importów w `OrderProcessor.php` 2. Dodać stałą `ERROR_NOTIFICATION_EMAIL` 3. Zmodyfikować metodę `import()` zgodnie z powyższym kodem 4. Dodać metody `resetOrderAutoIncrement()` i `sendFailureNotification()` 5. Skopiować szablony emaili do `mails/pl/`