refactor(shop-coupon): migrate admin module to DI and release 0.266

This commit is contained in:
2026-02-14 00:05:23 +01:00
parent 46a60f3679
commit 3dad04f927
40 changed files with 1668 additions and 426 deletions

View File

@@ -511,15 +511,15 @@ class BannerController
{
$formHandler = new FormRequestHandler();
$viewModel = $this->buildFormViewModel(); // jak w edit()
$result = $formHandler->handleSubmit($viewModel, $_POST);
if (!$result['success']) {
// Błędy walidacji - zapisane automatycznie do sesji
echo json_encode(['success' => false, 'errors' => $result['errors']]);
exit;
}
// Sukces - persist wyczyszczony automatycznie
$this->repository->save($result['data']);
echo json_encode(['success' => true]);
@@ -782,3 +782,92 @@ Gdy `persist = true`:
- FIX: zapis edycji promocji nie tworzy nowego rekordu (hidden `id` + fallback `id` z URL)
- TEST: rozszerzono `PromotionRepositoryTest` o asercje `date_from`
- Testy po zmianie: **OK (222 tests, 614 assertions)**.
## Plan 2026-02-13 - Refaktoryzacja `/admin/shop_coupon/` (HITL)
- [x] Etap 1 (analiza i kontrakt URL/routingu):
- potwierdzic docelowy kontrakt URL: `/admin/shop_coupon/list/`, `/admin/shop_coupon/edit/`, `/admin/shop_coupon/save/`, `/admin/shop_coupon/delete/`
- decyzja: utrzymujemy aliasy legacy (`view_list`, `coupon_edit`, `coupon_save`, `coupon_delete`) w nowym kontrolerze jako kompatybilnosc wsteczna, przy jednoczesnym przejsciu menu i nowych widokow na URL kanoniczne
- sprawdzic mapowanie modulu `ShopCoupon` w `admin\Site` (DI factory + fallback)
- [x] Etap 2 (Domain):
- dodac `Domain\Coupon\CouponRepository`:
- `listForAdmin(filters, sort, dir, page, perPage)` (whitelist sortowania + paginacja)
- `find(int $id)` (domyslne dane dla nowego formularza)
- `save(array $data): ?int` (insert/update, normalizacja switchy, JSON dla `categories`)
- `delete(int $id): bool`
- `categoriesTree(?int $parentId): array` (drzewo kategorii bez zaleznosci od `admin\factory\ShopCategory`)
- [x] Etap 3 (Admin Controller + routing DI):
- dodac `admin\Controllers\ShopCouponController` z akcjami `list`, `edit`, `save`, `delete`
- przepiac routing DI w `admin\Site::$newControllers` dla modulu `ShopCoupon`
- zachowac obsluge legacy payload `values` JSON i nowego payload `$_POST` z `components/form-edit`
- [x] Etap 4 (widoki):
- przepiac liste z `grid` na `components/table-list` (filtry: nazwa, aktywny, uzyty, wyslany)
- przepiac edycje z `gridEdit` na `components/form-edit`
- dodac partiale drzewa kategorii w module `shop-coupon` (usuniecie zaleznosci od `shop-product/subcategories-list`)
- dodac `shop-coupon/coupon-edit-custom-script.php` (obsluga drzewa kategorii i zachowania formularza)
- [x] Etap 5 (cleanup i zaleznosci):
- usunac legacy po pelnym przepieciu:
- `autoload/admin/controls/class.ShopCoupon.php`
- `autoload/admin/factory/class.ShopCoupon.php`
- `admin/templates/shop-coupon/view-list.php` (wersja grid)
- `admin/templates/shop-coupon/coupon-edit.php` (wersja gridEdit)
- przepiac menu admin na kanoniczny URL `/admin/shop_coupon/list/`
- przeszukac repo i usunac pozostale odwolania do `shop_coupon/view_list` i legacy klas `admin\controls\ShopCoupon`, `admin\factory\ShopCoupon`
- [x] Etap 6 (testy):
- dodac `tests/Unit/Domain/Coupon/CouponRepositoryTest.php`
- dodac `tests/Unit/admin/Controllers/ShopCouponControllerTest.php`
- uruchomic testy modulu + pelny `composer test`
- [x] Etap 7 (dokumentacja i release note):
- zaktualizowac `DATABASE_STRUCTURE.md` (dodac `pp_shop_coupon`)
- zaktualizowac `PROJECT_STRUCTURE.md`
- zaktualizowac `REFACTORING_PLAN.md` (sekcja "Aktualizacja ...")
- zaktualizowac `TESTING.md` (nowy wynik suite + nowe testy)
- dopisac wpis w `updates/changelog.php`
### Tryb HITL dla realizacji
- Po kazdym etapie (1-7) zatrzymanie i krotkie podsumowanie diffu do akceptacji przed kolejnym krokiem.
### Postep 2026-02-13 (ShopCoupon)
- Etap 2 zakonczony:
- NOWE: `autoload/Domain/Coupon/CouponRepository.php`
- Zakres: `listForAdmin`, `find`, `save`, `delete`, `categoriesTree`
- Walidacja: `php -l` OK
- Etap 3 zakonczony:
- NOWE: `autoload/admin/Controllers/ShopCouponController.php`
- UPDATE: `autoload/admin/class.Site.php` - rejestracja DI factory dla modulu `ShopCoupon`
- Kompatybilnosc: dodane aliasy akcji `view_list`, `coupon_edit`, `coupon_save`, `coupon_delete`
- Walidacja: `php -l` OK
- Etap 4 zakonczony:
- NOWE widoki: `admin/templates/shop-coupon/coupons-list.php`, `admin/templates/shop-coupon/coupon-edit-new.php`
- NOWE partiale: `admin/templates/shop-coupon/coupon-categories-selector.php`, `admin/templates/shop-coupon/coupon-categories-tree.php`
- NOWY skrypt: `admin/templates/shop-coupon/coupon-edit-custom-script.php`
- UPDATE: `ShopCouponController::edit()` buduje `FormEditViewModel` (zakladki ustawienia/kategorie)
- Walidacja: `php -l` OK
- Etap 5 zakonczony:
- CLEANUP: usuniete pliki legacy:
- `autoload/admin/controls/class.ShopCoupon.php`
- `autoload/admin/factory/class.ShopCoupon.php`
- `admin/templates/shop-coupon/view-list.php`
- `admin/templates/shop-coupon/coupon-edit.php`
- UPDATE: menu admin (`admin/templates/site/main-layout.php`) wskazuje kanoniczny URL `/admin/shop_coupon/list/`
- WERYFIKACJA: brak odwolan do `shop_coupon/view_list`, `admin\controls\ShopCoupon`, `admin\factory\ShopCoupon` w kodzie
- Etap 6 zakonczony:
- NOWE testy:
- `tests/Unit/Domain/Coupon/CouponRepositoryTest.php` (8 testow)
- `tests/Unit/admin/Controllers/ShopCouponControllerTest.php` (5 testow)
- Test modulu: `OK (8 tests, 49 assertions)`
- Pelny suite: `OK (235 tests, 682 assertions)`
- Etap 7 zakonczony:
- UPDATE: dokumentacja techniczna zaktualizowana (`DATABASE_STRUCTURE.md`, `PROJECT_STRUCTURE.md`, `TESTING.md`)
- UPDATE: dopisany release note w `updates/changelog.php` (ver. 0.266)
## Aktualizacja 2026-02-13 (ver. 0.266)
- **ShopCoupon** - migracja `/admin/shop_coupon` na Domain + DI + nowe widoki
- NOWE: `Domain\Coupon\CouponRepository` (`listForAdmin`, `find`, `save`, `delete`, `categoriesTree`)
- NOWE: `admin\Controllers\ShopCouponController` (DI) z akcjami `list`, `edit`, `save`, `delete`
- UPDATE: kompatybilnosc aliasow legacy (`view_list`, `coupon_edit`, `coupon_save`, `coupon_delete`) obslugiwana przez nowy kontroler
- UPDATE: modul `/admin/shop_coupon/*` dziala na `components/table-list` i `components/form-edit`
- NOWE: widoki/partiale `shop-coupon/coupons-list`, `shop-coupon/coupon-edit-new`, `shop-coupon/coupon-categories-selector`, `shop-coupon/coupon-categories-tree`, `shop-coupon/coupon-edit-custom-script`
- CLEANUP: usuniete legacy `autoload/admin/controls/class.ShopCoupon.php`, `autoload/admin/factory/class.ShopCoupon.php`, `admin/templates/shop-coupon/view-list.php`, `admin/templates/shop-coupon/coupon-edit.php`
- UPDATE: menu admin przepiete na kanoniczny URL `/admin/shop_coupon/list/`
- FIX: po akceptacji HITL ujednolicone UI drzewek i checkboxow miedzy kuponami i layoutami (spojne strzalki, brak nieestetycznego focusu, iCheck dla checkboxow)
- Testy po zmianie: **OK (235 tests, 682 assertions)**.