Files
interblue.pl/docs/empik.md
2026-03-11 15:52:02 +01:00

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ł:

  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:

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:

  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/