update empik
This commit is contained in:
187
docs/empik.md
187
docs/empik.md
@@ -1,134 +1,85 @@
|
||||
# Modyfikacje modułu empikmarketplace
|
||||
# Modyfikacje modulu empikmarketplace
|
||||
|
||||
Data modyfikacji: 2026-03-11
|
||||
## 2026-03-11 - powiadomienia i AUTO_INCREMENT
|
||||
|
||||
## Problem
|
||||
### Problem
|
||||
Przy nieudanym imporcie zamowienia z EMPIK do PrestaShop:
|
||||
1. Nie bylo powiadomienia email o bledzie importu.
|
||||
2. Powstawaly dziury w numeracji zamowien (`id_order`) po `ROLLBACK`.
|
||||
|
||||
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
|
||||
|
||||
## Zmodyfikowane pliki
|
||||
#### `src/Processor/OrderProcessor.php`
|
||||
- Dodano `use Mail;`.
|
||||
- Dodano stala `ERROR_NOTIFICATION_EMAIL`.
|
||||
- W `import()` po bledzie dodano:
|
||||
- `ROLLBACK`,
|
||||
- `resetOrderAutoIncrement()`,
|
||||
- log bledu,
|
||||
- `sendFailureNotification(...)`.
|
||||
- Dodano metode `resetOrderAutoIncrement()`.
|
||||
- Dodano metode `sendFailureNotification()`.
|
||||
|
||||
### `src/Processor/OrderProcessor.php`
|
||||
#### `mails/pl/empik_import_error.html`
|
||||
- Dodany szablon HTML maila z placeholderami:
|
||||
- `{empik_order_id}`
|
||||
- `{error_date}`
|
||||
- `{error_message}`
|
||||
- `{stack_trace}`
|
||||
|
||||
Dodany import `Mail` na górze pliku:
|
||||
#### `mails/pl/empik_import_error.txt`
|
||||
- Dodana tekstowa wersja szablonu maila.
|
||||
|
||||
```php
|
||||
use Mail;
|
||||
```
|
||||
## 2026-03-15 - dokladniejsza diagnoza blednych zamowien
|
||||
|
||||
Dodana stała z adresem email do powiadomień:
|
||||
### Cel
|
||||
W mailu z bledem importu bylo widac tylko ogolny komunikat:
|
||||
`Invalid order data for order: ...`.
|
||||
Brakowalo informacji, ktore pole w danych zamowienia bylo niepoprawne.
|
||||
|
||||
```php
|
||||
class OrderProcessor
|
||||
{
|
||||
const CODE_WAITING_ACCEPTANCE = 'WAITING_ACCEPTANCE';
|
||||
const CODE_SHIPPING = 'SHIPPING';
|
||||
const ERROR_NOTIFICATION_EMAIL = 'jacek.pyziak@project-pro.pl';
|
||||
```
|
||||
### Zmodyfikowane pliki
|
||||
|
||||
Zmodyfikowana metoda `import()` — dodano wywołanie resetu AUTO_INCREMENT i wysyłki emaila w bloku catch:
|
||||
#### `src/OrderFulfiller/OrderFulfiller.php`
|
||||
- Rozszerzono walidacje w `validate($data)`.
|
||||
- Zamiast jednego ogolnego bledu zbierana jest lista konkretnych problemow, np.:
|
||||
- oba adresy puste: `customer.shipping_address` i `customer.billing_address`,
|
||||
- puste `order_id`,
|
||||
- puste `order_lines`,
|
||||
- puste `order_state`,
|
||||
- puste `total_price`.
|
||||
- Rzucany wyjatek zawiera teraz liste tych bledow (`Validation errors: ...`).
|
||||
|
||||
```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();
|
||||
#### `src/Processor/OrderProcessor.php`
|
||||
- W `import()` do `sendFailureNotification(...)` przekazywany jest payload zamowienia (`$data`).
|
||||
- `sendFailureNotification(...)` przyjmuje teraz trzeci argument: `array $orderData = []`.
|
||||
- Dodano metode `buildOrderContext(array $orderData)` budujaca skrot payloadu do maila:
|
||||
- `order_id`
|
||||
- `order_state`
|
||||
- `total_price`
|
||||
- `shipping_price`
|
||||
- `order_lines_count`
|
||||
- `has_shipping_address`
|
||||
- `has_billing_address`
|
||||
- Do placeholderow maila dodano:
|
||||
- `{order_context}`
|
||||
- `{order_context_html}`
|
||||
|
||||
$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);
|
||||
}
|
||||
}
|
||||
```
|
||||
#### `mails/pl/empik_import_error.html`
|
||||
- Dodano sekcje `Szczegoly zamowienia` z placeholderem `{order_context_html}`.
|
||||
|
||||
Dodana metoda `resetOrderAutoIncrement()` — zapobiega dziurom w numeracji zamówień:
|
||||
#### `mails/pl/empik_import_error.txt`
|
||||
- Dodano sekcje `Szczegoly zamowienia` z placeholderem `{order_context}`.
|
||||
|
||||
```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()));
|
||||
}
|
||||
}
|
||||
```
|
||||
### Efekt
|
||||
Kolejny mail z nieudanym importem pokazuje:
|
||||
1. konkretny powod walidacji,
|
||||
2. skrot kluczowych pol payloadu zamowienia,
|
||||
3. stack trace.
|
||||
|
||||
Dodana metoda `sendFailureNotification()` — wysyła email z informacją o błędzie:
|
||||
To powinno wystarczyc do szybkiej diagnozy, co bylo nie tak w danych zamowienia z EMPIK.
|
||||
|
||||
```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/`
|
||||
## Po aktualizacji modulu
|
||||
Jesli modul `empikmarketplace` zostanie zaktualizowany i nadpisze zmiany, trzeba ponownie naniesc modyfikacje:
|
||||
1. `OrderProcessor.php` (import, auto-increment, powiadomienia, `buildOrderContext`).
|
||||
2. `OrderFulfiller.php` (rozszerzona walidacja i szczegolowe komunikaty).
|
||||
3. Szablony maili `mails/pl/empik_import_error.html` i `mails/pl/empik_import_error.txt`.
|
||||
|
||||
Reference in New Issue
Block a user