ver. 0.271 - ShopAttribute refactor + update package
This commit is contained in:
@@ -4,6 +4,21 @@ Logi zmian z migracji na Domain-Driven Architecture. Najnowsze na gorze.
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.271 (2026-02-14) - ShopAttribute
|
||||
|
||||
- **ShopAttribute** - migracja `/admin/shop_attribute` na Domain + DI + nowe widoki
|
||||
- NOWE: `Domain\Attribute\AttributeRepository` (`listForAdmin`, `findAttribute`, `saveAttribute`, `deleteAttribute`, `findValues`, `saveValues`, `saveLegacyValues`, `valueDetails`)
|
||||
- NOWE: `admin\Controllers\ShopAttributeController` (DI) z akcjami `list`, `edit`, `save`, `delete`, `values`, `values_save`, `value_row_tpl`
|
||||
- UPDATE: modul `/admin/shop_attribute/*` dziala na `components/table-list` i `components/form-edit`
|
||||
- UPDATE: nowy edytor wartosci cechy (`values-edit`) z walidacja serwerowa i stabilnym `row_key` (bez indeksow do wyboru domyslnej wartosci)
|
||||
- UPDATE: routing i menu admin na kanoniczny URL `/admin/shop_attribute/list/` (bez aliasow legacy)
|
||||
- UPDATE: przepiecie zaleznosci kombinacji produktu (`admin\controls\ShopProduct`, `admin\factory\ShopProduct`, `admin/templates/shop-product/product-combination.php`) na `Domain\Attribute\AttributeRepository` i `shop\ProductAttribute`
|
||||
- CLEANUP: usuniete legacy `autoload/admin/controls/class.ShopAttribute.php`, `autoload/admin/factory/class.ShopAttribute.php`, `autoload/admin/view/class.ShopAttribute.php`, `admin/templates/shop-attribute/_partials/value.php`
|
||||
- TEST: dodane `tests/Unit/Domain/Attribute/AttributeRepositoryTest.php` i `tests/Unit/admin/Controllers/ShopAttributeControllerTest.php`
|
||||
- Testy: **OK (312 tests, 948 assertions)**
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.270 (2026-02-14) - Apilo payment/status sync hardening
|
||||
|
||||
- **Shop/Order + Apilo** - utwardzenie synchronizacji platnosci i statusow zamowien
|
||||
|
||||
@@ -320,6 +320,67 @@ Tlumaczenia kontenerow statycznych (per jezyk).
|
||||
|
||||
**Aktualizacja 2026-02-12 (ver. 0.260):** modul `/admin/articles_archive` korzysta z `Domain\Article\ArticleRepository` (`listArchivedForAdmin`, `restore`, `deletePermanently`) przez `admin\Controllers\ArticlesArchiveController`.
|
||||
|
||||
## pp_shop_attributes
|
||||
Cechy produktu (modul `/admin/shop_attribute`).
|
||||
|
||||
| Kolumna | Opis |
|
||||
|---------|------|
|
||||
| id | PK |
|
||||
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
||||
| type | Typ cechy: 0 = tekst, 1 = kolor, 2 = wzor |
|
||||
| o | Kolejnosc wyswietlania |
|
||||
|
||||
**Uzywane w:** `Domain\Attribute\AttributeRepository`, `admin\Controllers\ShopAttributeController`, `admin\controls\ShopProduct`, `admin\factory\ShopProduct`
|
||||
|
||||
## pp_shop_attributes_langs
|
||||
Tlumaczenia cech produktu (per jezyk).
|
||||
|
||||
| Kolumna | Opis |
|
||||
|---------|------|
|
||||
| id | PK |
|
||||
| attribute_id | FK do pp_shop_attributes |
|
||||
| lang_id | ID jezyka (np. pl, en) |
|
||||
| name | Nazwa cechy |
|
||||
|
||||
**Uzywane w:** `Domain\Attribute\AttributeRepository`, `shop\ProductAttribute`
|
||||
|
||||
## pp_shop_attributes_values
|
||||
Wartosci cech produktu.
|
||||
|
||||
| Kolumna | Opis |
|
||||
|---------|------|
|
||||
| id | PK |
|
||||
| attribute_id | FK do pp_shop_attributes |
|
||||
| is_default | Czy wartosc domyslna dla cechy (0/1) |
|
||||
| impact_on_the_price | Wplyw na cene wariantu (NULL = brak) |
|
||||
|
||||
**Uzywane w:** `Domain\Attribute\AttributeRepository`, `admin\Controllers\ShopAttributeController`, `admin\factory\ShopProduct`
|
||||
|
||||
## pp_shop_attributes_values_langs
|
||||
Tlumaczenia wartosci cech (per jezyk).
|
||||
|
||||
| Kolumna | Opis |
|
||||
|---------|------|
|
||||
| id | PK |
|
||||
| value_id | FK do pp_shop_attributes_values |
|
||||
| lang_id | ID jezyka (np. pl, en) |
|
||||
| name | Nazwa wyswietlana |
|
||||
| value | Wewnetrzna wartosc techniczna (opcjonalna) |
|
||||
|
||||
**Uzywane w:** `Domain\Attribute\AttributeRepository`, `shop\ProductAttribute`
|
||||
|
||||
## pp_shop_products_attributes
|
||||
Powiazanie kombinacji produktow z wartosciami cech.
|
||||
|
||||
| Kolumna | Opis |
|
||||
|---------|------|
|
||||
| product_id | FK do pp_shop_products (kombinacja) |
|
||||
| value_id | FK do pp_shop_attributes_values |
|
||||
|
||||
**Uzywane w:** `Domain\Attribute\AttributeRepository::refreshCombinationPricesForValue()`, `admin\controls\ShopProduct`, `admin\factory\ShopProduct`
|
||||
|
||||
**Aktualizacja 2026-02-14 (ver. 0.271):** modul `/admin/shop_attribute` korzysta z `Domain\Attribute\AttributeRepository` przez `admin\Controllers\ShopAttributeController`. Usunieto legacy klasy `admin\controls\ShopAttribute`, `admin\factory\ShopAttribute`, `admin\view\ShopAttribute`.
|
||||
|
||||
## pp_shop_coupon
|
||||
Kody rabatowe sklepu (modul `/admin/shop_coupon`).
|
||||
|
||||
|
||||
@@ -277,5 +277,13 @@ $quantity = $repository->getQuantity($id);
|
||||
|
||||
Pelna dokumentacja testow: `TESTING.md`
|
||||
|
||||
## Dodatkowa aktualizacja 2026-02-14 (ver. 0.271)
|
||||
- Dodano modul domenowy `Domain/Attribute/AttributeRepository.php`.
|
||||
- Dodano kontroler DI `admin/Controllers/ShopAttributeController.php`.
|
||||
- Modul `/admin/shop_attribute/*` zostal przepiety na nowe widoki (`attributes-list`, `attribute-edit`, `values-edit`).
|
||||
- Usunieto legacy: `autoload/admin/controls/class.ShopAttribute.php`, `autoload/admin/factory/class.ShopAttribute.php`, `autoload/admin/view/class.ShopAttribute.php`, `admin/templates/shop-attribute/_partials/value.php`.
|
||||
- Przepieto zaleznosci kombinacji produktu na `Domain\Attribute\AttributeRepository` i `shop\ProductAttribute`.
|
||||
- Dla `ShopAttribute` routing celowo nie wykonuje fallbacku akcji do legacy kontrolera.
|
||||
|
||||
---
|
||||
*Dokument aktualizowany: 2026-02-14*
|
||||
|
||||
@@ -150,6 +150,7 @@ grep -r "Product::getQuantity" .
|
||||
| 19 | ShopStatuses | 0.267 | listForAdmin, find, save, color picker |
|
||||
| 20 | ShopPaymentMethod | 0.268 | listForAdmin, find, save, allActive, mapowanie Apilo, DI kontroler |
|
||||
| 21 | ShopTransport | 0.269 | listForAdmin, find, save, allActive, allForAdmin, findActiveById, getTransportCost, lowestTransportPrice, getApiloCarrierAccountId, powiazanie z PaymentMethod, DI kontroler |
|
||||
| 22 | ShopAttribute | 0.271 | list/edit/save/delete/values, nowy edytor wartosci, cleanup legacy, przepiecie zaleznosci kombinacji |
|
||||
|
||||
### Product - szczegolowy status
|
||||
- ✅ getQuantity (ver. 0.238)
|
||||
@@ -163,17 +164,15 @@ grep -r "Product::getQuantity" .
|
||||
### 📋 Do zrobienia
|
||||
- Order
|
||||
- Category
|
||||
- ShopAttribute
|
||||
- ShopProduct (factory)
|
||||
|
||||
## Kolejność refaktoryzacji (priorytet)
|
||||
|
||||
1-21: ✅ Cache, Product, Banner, Settings, Dictionaries, ProductArchive, Filemanager, Users, Pages, Integrations, ShopPromotion, ShopCoupon, ShopStatuses, ShopPaymentMethod, ShopTransport
|
||||
1-22: ✅ Cache, Product, Banner, Settings, Dictionaries, ProductArchive, Filemanager, Users, Pages, Integrations, ShopPromotion, ShopCoupon, ShopStatuses, ShopPaymentMethod, ShopTransport, ShopAttribute
|
||||
|
||||
Nastepne:
|
||||
22. **Order**
|
||||
23. **Category**
|
||||
24. **ShopAttribute**
|
||||
23. **Order**
|
||||
24. **Category**
|
||||
|
||||
## Form Edit System
|
||||
|
||||
@@ -270,7 +269,11 @@ tests/
|
||||
│ └── UsersControllerTest.php
|
||||
└── Integration/
|
||||
```
|
||||
**Łącznie: 300 testów, 895 asercji**
|
||||
**Lacznie: 312 testow, 948 asercji**
|
||||
|
||||
Aktualizacja 2026-02-14 (ver. 0.271):
|
||||
- dodano testy `tests/Unit/Domain/Attribute/AttributeRepositoryTest.php`
|
||||
- dodano testy `tests/Unit/admin/Controllers/ShopAttributeControllerTest.php`
|
||||
|
||||
Pelna dokumentacja testow: `TESTING.md`
|
||||
|
||||
|
||||
176
docs/SHOP_ATTRIBUTE_REFACTOR_PLAN.md
Normal file
176
docs/SHOP_ATTRIBUTE_REFACTOR_PLAN.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# Plan Refaktoryzacji - ShopAttribute (`/admin/shop_attribute`)
|
||||
|
||||
Data przygotowania: 2026-02-14
|
||||
Tryb realizacji: Human In The Loop (HITL)
|
||||
Status: Zrealizowano kroki 0-6 (2026-02-14)
|
||||
|
||||
## 1. Cel i zakres
|
||||
|
||||
Celem jest pelna migracja modulu `shop_attribute` z legacy (`admin/controls`, `admin/factory`, `admin/view`, `grid/gridEdit`) na:
|
||||
|
||||
- `Domain/*` (repozytorium + logika zapisu),
|
||||
- `admin/Controllers/*` (DI),
|
||||
- nowe widoki oparte o `components/table-list` i `components/form-edit`,
|
||||
- kanoniczny routing (`list`, `edit`, `save`, `delete`, `values`, `values_save`) z kompatybilnoscia aliasow legacy.
|
||||
|
||||
Zakres obejmuje takze przeglad i przepiecie zaleznosci w innych klasach (admin/front/shop), aby usunac twarde powiazanie ze starym modulem.
|
||||
|
||||
## 2. Stan obecny (baseline)
|
||||
|
||||
### Legacy modułu
|
||||
- `autoload/admin/controls/class.ShopAttribute.php`
|
||||
- `autoload/admin/factory/class.ShopAttribute.php`
|
||||
- `autoload/admin/view/class.ShopAttribute.php`
|
||||
- `admin/templates/shop-attribute/*` (stare `grid` / `gridEdit` + AJAX `attribute_value_tpl`)
|
||||
|
||||
### Zaleznosci poza modulem
|
||||
- `autoload/admin/controls/class.ShopProduct.php` (lista atrybutow do kombinacji)
|
||||
- `admin/templates/shop-product/product-combination.php` (nazwy atrybut/wartosc)
|
||||
- `autoload/admin/factory/class.ShopProduct.php` (m.in. `value_details`, aktualizacja cen kombinacji)
|
||||
- `autoload/front/factory/class.ShopAttribute.php` i `autoload/shop/class.ProductAttribute.php` (odczyt front/shop)
|
||||
- `templates/shop-product/_partial/product-attribute.php`, `autoload/front/factory/class.ShopOrder.php`
|
||||
|
||||
### Ryzyka znalezione w aktualnym UI wartosci
|
||||
- domyslny jezyk w tytule jest hardcoded (`pl`),
|
||||
- wybor domyslnej wartosci oparty o indeksy wierszy (podatne na bledy po usuwaniu),
|
||||
- brak walidacji biznesowej (np. wymagane minimum 1 wartosc i 1 nazwa w jezyku domyslnym),
|
||||
- UX edycji wartosci jest malo czytelny przy duzej liczbie pozycji.
|
||||
|
||||
## 3. Architektura docelowa
|
||||
|
||||
### Nowe klasy
|
||||
- `autoload/Domain/Attribute/AttributeRepository.php`
|
||||
- `autoload/admin/Controllers/ShopAttributeController.php`
|
||||
|
||||
### Nowe widoki
|
||||
- `admin/templates/shop-attribute/attributes-list.php` (nowy `table-list`)
|
||||
- `admin/templates/shop-attribute/attribute-edit.php` (nowy `form-edit`)
|
||||
- `admin/templates/shop-attribute/attribute-values-edit.php` (nowy ekran wartosci)
|
||||
- `admin/templates/shop-attribute/attribute-values-custom-script.php` (logika JS dla wartosci)
|
||||
- `admin/templates/shop-attribute/_partials/value-row.php` (opcjonalny partial pojedynczego wiersza)
|
||||
|
||||
### Routing
|
||||
- kanoniczne:
|
||||
- `/admin/shop_attribute/list/`
|
||||
- `/admin/shop_attribute/edit/id={id}`
|
||||
- `/admin/shop_attribute/save/`
|
||||
- `/admin/shop_attribute/delete/id={id}`
|
||||
- `/admin/shop_attribute/values/id={id}`
|
||||
- `/admin/shop_attribute/values_save/id={id}`
|
||||
- brak aliasow kompatybilnosci legacy (decyzja: URL-e niekanoniczne nie sa utrzymywane)
|
||||
|
||||
## 4. Plan realizacji HITL (krok po kroku)
|
||||
|
||||
## Krok 0 - Freeze i test baseline
|
||||
Zakres:
|
||||
- uruchomienie testow referencyjnych (minimum smoke + wskazane pelne),
|
||||
- zapisanie stanu wyjsciowego i listy plikow modulu.
|
||||
|
||||
Wyjscie:
|
||||
- potwierdzony baseline testow przed zmianami.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- akceptacja startu implementacji po weryfikacji baseline.
|
||||
|
||||
## Krok 1 - Domain Repository (bez zmian UI)
|
||||
Zakres:
|
||||
- utworzenie `AttributeRepository` z metodami admin:
|
||||
- `listForAdmin()`, `findAttribute()`, `saveAttribute()`, `deleteAttribute()`,
|
||||
- `findValues()`, `saveValues()`,
|
||||
- pomocnicze: `getAttributeNameById()`, `getAttributeValueById()`, `getAttributesListForCombinations()`, `valueDetails()`.
|
||||
- normalizacja danych i bezpieczne parsowanie inputow (`switch`, liczby, tablice ID).
|
||||
- centralizacja invalidacji cache/temp po zapisach.
|
||||
|
||||
Wyjscie:
|
||||
- gotowa warstwa domenowa pod kontroler DI.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- review API repozytorium i nazw metod przed podpieciem kontrolera.
|
||||
|
||||
## Krok 2 - Kontroler DI i routing
|
||||
Zakres:
|
||||
- dodanie `ShopAttributeController` (akcje list/edit/save/delete/values/valuesSave),
|
||||
- podpiecie do `admin\Site::$newControllers`,
|
||||
- ustawienie kanonicznych URL bez aliasow legacy,
|
||||
- aktualizacja linku menu do `/admin/shop_attribute/list/`.
|
||||
|
||||
Wyjscie:
|
||||
- modul dziala przez nowy kontroler, bez usuwania legacy w tym kroku.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- potwierdzenie zgodnosci URL i backward compatibility.
|
||||
|
||||
## Krok 3 - Migracja widokow (lista + formularz cechy)
|
||||
Zakres:
|
||||
- przepisanie listy na `components/table-list`,
|
||||
- przepisanie formularza cechy na `components/form-edit`,
|
||||
- utrzymanie obecnej funkcjonalnosci (status, typ, kolejnosc, nazwy per jezyk).
|
||||
|
||||
Wyjscie:
|
||||
- brak zaleznosci od `grid`/`gridEdit` w tych ekranach.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- akceptacja UX i danych na liscie oraz formularzu cechy.
|
||||
|
||||
## Krok 4 - Nowy panel edycji wartosci (UX)
|
||||
Zakres:
|
||||
- przebudowa `values-edit` na bardziej intuicyjny formularz:
|
||||
- jeden czytelny widok tabelaryczny (wiersz = wartosc),
|
||||
- stabilny identyfikator wiersza zamiast indeksu do wyboru wartosci domyslnej,
|
||||
- walidacja: co najmniej 1 wartosc, nazwa w jezyku domyslnym, jedna domyslna wartosc,
|
||||
- jasne komunikaty bledow i podsumowanie zmian.
|
||||
- usuniecie zaleznosci od endpointu `attribute_value_tpl` (lub utrzymanie tylko jako alias fallback).
|
||||
|
||||
Wyjscie:
|
||||
- nowy edytor wartosci odporny na bledy indeksowania i wygodniejszy dla operatora.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- decyzja biznesowa o finalnym UX (wariant A/B ponizej) i akceptacja wygladu.
|
||||
|
||||
### Warianty UX do decyzji
|
||||
- Wariant A (rekomendowany): osobny ekran `values`, ale w nowym ukladzie tabelarycznym + walidacje.
|
||||
- Wariant B: integracja wartosci bezposrednio w `attribute-edit` (mniej klikniec, ale wieksza zlozonosc formularza).
|
||||
|
||||
## Krok 5 - Przepiecie zaleznosci i usuniecie legacy
|
||||
Zakres:
|
||||
- przeszukanie i przepiecie wszystkich uzyc `admin\factory\ShopAttribute` w kodzie admina,
|
||||
- aktualizacja zaleznosci w miejscach zwiazanych z kombinacjami produktu,
|
||||
- usuniecie starych klas:
|
||||
- `autoload/admin/controls/class.ShopAttribute.php`
|
||||
- `autoload/admin/view/class.ShopAttribute.php`
|
||||
- `autoload/admin/factory/class.ShopAttribute.php` (po przepieciu wszystkich odwolan)
|
||||
- cleanup starych szablonow nieuzywanych.
|
||||
|
||||
Wyjscie:
|
||||
- brak runtime zaleznosci od legacy `ShopAttribute`.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- akceptacja listy usuwanych plikow i finalnego cleanupu.
|
||||
|
||||
## Krok 6 - Testy + dokumentacja + release
|
||||
Zakres:
|
||||
- nowe testy:
|
||||
- `tests/Unit/Domain/Attribute/AttributeRepositoryTest.php`
|
||||
- `tests/Unit/admin/Controllers/ShopAttributeControllerTest.php`
|
||||
- uruchomienie regresji (co najmniej testy modułowe + docelowo caly suite),
|
||||
- aktualizacja dokumentacji:
|
||||
- `docs/DATABASE_STRUCTURE.md` (tabele atrybutow),
|
||||
- `docs/PROJECT_STRUCTURE.md`,
|
||||
- `docs/REFACTORING_PLAN.md`,
|
||||
- `docs/CHANGELOG.md`,
|
||||
- `docs/TESTING.md`.
|
||||
|
||||
Wyjscie:
|
||||
- modul gotowy do release, z domknietym testowaniem i dokumentacja.
|
||||
|
||||
Punkt akceptacji HITL:
|
||||
- finalna akceptacja pakietu zmian przed procedura releasowa.
|
||||
|
||||
## 5. Kryteria akceptacji
|
||||
|
||||
- `shop_attribute` dziala przez `ShopAttributeController` + `AttributeRepository`.
|
||||
- Lista i formularze nie korzystaja z `grid/gridEdit`.
|
||||
- Panel wartosci nie opiera domyslnej wartosci na nietrwalych indeksach.
|
||||
- Stare klasy `controls/view/factory` modulu zostaja usuniete po przepieciu zaleznosci.
|
||||
- Testy jednostkowe dla nowego repozytorium i kontrolera przechodza.
|
||||
- Dokumentacja techniczna jest zaktualizowana.
|
||||
@@ -1,4 +1,4 @@
|
||||
# Testowanie shopPRO
|
||||
# Testowanie shopPRO
|
||||
|
||||
## Szybki start
|
||||
|
||||
@@ -36,7 +36,7 @@ Alternatywnie (Git Bash):
|
||||
Ostatnio zweryfikowano: 2026-02-14
|
||||
|
||||
```text
|
||||
OK (300 tests, 895 assertions)
|
||||
OK (312 tests, 948 assertions)
|
||||
```
|
||||
|
||||
## Struktura testow
|
||||
@@ -47,6 +47,7 @@ tests/
|
||||
|-- Unit/
|
||||
| |-- Domain/
|
||||
| | |-- Article/ArticleRepositoryTest.php
|
||||
| | |-- Attribute/AttributeRepositoryTest.php
|
||||
| | |-- Banner/BannerRepositoryTest.php
|
||||
| | |-- Cache/CacheRepositoryTest.php
|
||||
| | |-- Coupon/CouponRepositoryTest.php
|
||||
@@ -66,6 +67,7 @@ tests/
|
||||
| |-- IntegrationsControllerTest.php
|
||||
| |-- ProductArchiveControllerTest.php
|
||||
| |-- SettingsControllerTest.php
|
||||
| |-- ShopAttributeControllerTest.php
|
||||
| |-- ShopCouponControllerTest.php
|
||||
| |-- ShopPaymentMethodControllerTest.php
|
||||
| |-- ShopPromotionControllerTest.php
|
||||
@@ -385,3 +387,14 @@ OK (300 tests, 895 assertions)
|
||||
|
||||
Zmiany testowe 2026-02-14:
|
||||
- brak nowych testow; pelna regresja po zmianach sync Apilo (TPAY -> Apilo) przeszla bez bledow
|
||||
|
||||
## Aktualizacja suite (ShopAttribute refactor, ver. 0.271)
|
||||
Ostatnio zweryfikowano: 2026-02-14
|
||||
|
||||
```text
|
||||
OK (312 tests, 948 assertions)
|
||||
```
|
||||
|
||||
Nowe testy dodane 2026-02-14:
|
||||
- `tests/Unit/Domain/Attribute/AttributeRepositoryTest.php` (5 testow: domyslne dane cechy, whitelist sortowania/paginacji, zapis wartosci i domyslnej, usuwanie pustych tlumaczen, jezyk domyslny)
|
||||
- `tests/Unit/admin/Controllers/ShopAttributeControllerTest.php` (7 testow: kontrakty metod, brak aliasow legacy, return types, DI konstruktora, walidacja `validateValuesRows`)
|
||||
|
||||
Reference in New Issue
Block a user