135 lines
4.2 KiB
Markdown
135 lines
4.2 KiB
Markdown
# 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/`
|