4.2 KiB
4.2 KiB
Modyfikacje modułu empikmarketplace
Data modyfikacji: 2026-03-11
Problem
Moduł empikmarketplace przy nieudanym imporcie zamówienia z EMPIK do PrestaShop powodował:
- Brak powiadomienia o błędzie — nikt nie wiedział, że zamówienie nie przeszło
- 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:
use Mail;
Dodana stała z adresem email do powiadomień:
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:
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ń:
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:
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:
- Dodać
use Mail;do importów wOrderProcessor.php - Dodać stałą
ERROR_NOTIFICATION_EMAIL - Zmodyfikować metodę
import()zgodnie z powyższym kodem - Dodać metody
resetOrderAutoIncrement()isendFailureNotification() - Skopiować szablony emaili do
mails/pl/