- summaryView(): guard — redirect do istniejacego zamowienia gdy ORDER_SUBMIT_LAST_ORDER_ID w sesji - basketSave(): try-catch wokol createFromBasket(), wyjatki logowane, koszyk zachowany - OrderRepository: usunieto hardkodowane payment_id == 3, uzywana flaga is_cod - PaymentMethodRepository: nowe pole is_cod w normalizacji, save() i forTransport() SQL - ShopPaymentMethodController: switch "Platnosc przy odbiorze" w formularzu edycji - migrations/0.338.sql: ALTER TABLE pp_shop_payment_methods ADD COLUMN is_cod Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
731 lines
29 KiB
Markdown
731 lines
29 KiB
Markdown
# Struktura bazy danych shopPRO
|
|
|
|
Plik aktualizowany na bieżąco przy zmianach w kodzie.
|
|
ORM: Medoo (`$mdb`), prefix tabel: `pp_`
|
|
|
|
## pp_shop_products
|
|
Główna tabela produktów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| parent_id | FK do produktu nadrzędnego (kombinacje) - NULL dla produktów głównych |
|
|
| price_brutto | Cena brutto |
|
|
| price_brutto_promo | Cena promocyjna brutto |
|
|
| quantity | Stan magazynowy |
|
|
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
|
| archive | Archiwum: 1 = zarchiwizowany, 0 = aktywny |
|
|
| promoted | Czy promowany |
|
|
| vat | Stawka VAT |
|
|
| ean | Kod EAN |
|
|
| sku | Kod SKU |
|
|
| apilo_product_id | ID produktu w Apilo |
|
|
| apilo_product_name | Nazwa produktu w Apilo |
|
|
|
|
**Używane w:** `Domain\Product\ProductRepository`, `admin\factory\ShopProduct`, `admin\Controllers\ShopProductController`
|
|
|
|
## pp_shop_products_langs
|
|
Tłumaczenia produktów (per język).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| product_id | FK do pp_shop_products |
|
|
| lang_id | ID języka (np. 'pl') |
|
|
| name | Nazwa produktu |
|
|
|
|
**Używane w:** `Domain\Product\ProductRepository::getName()`
|
|
|
|
## pp_shop_products_images
|
|
Zdjęcia produktów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| product_id | FK do pp_shop_products |
|
|
| src | Ścieżka do pliku |
|
|
| alt | Tekst alternatywny |
|
|
|
|
## pp_shop_products_custom_fields
|
|
Dodatkowe pola produktów (custom fields).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id_additional_field | PK |
|
|
| id_product | FK do pp_shop_products |
|
|
| name | Nazwa pola |
|
|
| type | Typ pola (VARCHAR 30) |
|
|
| is_required | Czy wymagane (0/1) |
|
|
|
|
## pp_shop_products_categories
|
|
Przypisanie produktów do kategorii.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| product_id | FK do pp_shop_products |
|
|
|
|
**Używane w:** `admin\factory\ShopProduct::product_delete()`, `Domain\Product\ProductRepository::getProductsByCategory()`
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.274):** akcje `/admin/shop_product/mass_edit/*` korzystają z `Domain\Product\ProductRepository` przez `admin\Controllers\ShopProductController`.
|
|
|
|
## pp_shop_categories
|
|
Kategorie sklepu.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| parent_id | FK do kategorii nadrzednej (NULL dla root) |
|
|
| status | 1 = aktywna, 0 = nieaktywna |
|
|
| o | Kolejnosc wyswietlania |
|
|
| sort_type | Typ sortowania produktow w kategorii |
|
|
| view_subcategories | Czy wyswietlac podkategorie |
|
|
|
|
**Uzywane w:** `Domain\Category\CategoryRepository`, `admin\Controllers\ShopCategoryController`.
|
|
|
|
## pp_shop_categories_langs
|
|
Tlumaczenia kategorii (per jezyk).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| category_id | FK do pp_shop_categories |
|
|
| lang_id | ID jezyka (np. pl, en) |
|
|
| title | Nazwa kategorii |
|
|
| text | Opis kategorii |
|
|
| text_hidden | Rozwiniecie opisu kategorii |
|
|
| seo_link | Link SEO kategorii |
|
|
| meta_title | Meta title |
|
|
| meta_description | Meta description |
|
|
| meta_keywords | Meta keywords |
|
|
| noindex | Flaga noindex |
|
|
| category_title | Naglowek H1 kategorii |
|
|
| additional_text | Dodatkowy tekst nad lista produktow |
|
|
|
|
**Uzywane w:** `Domain\Category\CategoryRepository`, `admin\Controllers\ShopCategoryController`.
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.275):** modul `/admin/shop_category/*` korzysta z `Domain\Category\CategoryRepository` przez `admin\Controllers\ShopCategoryController`; usunieto legacy `admin\controls/factory/view\ShopCategory`.
|
|
|
|
## pp_shop_orders
|
|
Zamówienia sklepu (źródło danych dla list i szczegółów klientów w panelu admin).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| client_id | FK do `pp_shop_clients` (NULL dla gościa) |
|
|
| client_name | Imię klienta z zamówienia |
|
|
| client_surname | Nazwisko klienta z zamówienia |
|
|
| client_email | E-mail klienta z zamówienia |
|
|
| client_phone | Telefon klienta |
|
|
| client_city | Miasto klienta |
|
|
| summary | Wartość zamówienia |
|
|
| date_order | Data złożenia zamówienia |
|
|
| payment_method | Nazwa metody płatności |
|
|
| transport | Nazwa transportu |
|
|
| message | Wiadomość klienta |
|
|
| updated_at | Data ostatniej modyfikacji (polling API) |
|
|
|
|
**Używane w:** `Domain\Client\ClientRepository::listForAdmin()`, `Domain\Client\ClientRepository::ordersForClient()`, `Domain\Client\ClientRepository::totalsForClient()`, `Domain\Order\OrderRepository::listForApi()`, `Domain\Order\OrderRepository::findForApi()`.
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.274):** moduł `/admin/shop_clients/*` korzysta z `Domain\Client\ClientRepository` przez `admin\Controllers\ShopClientsController`.
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.276):** moduł `/admin/shop_order/*` korzysta z `Domain\Order\OrderRepository` przez `admin\Controllers\ShopOrderController`; usunięto legacy `admin\controls\ShopOrder` i `admin\factory\ShopOrder`.
|
|
|
|
**Aktualizacja 2026-02-17 (ver. 0.290):** frontend `/shop_order/*` korzysta z `Domain\Order\OrderRepository` przez `front\Controllers\ShopOrderController`; usunięto legacy `front\controls\ShopOrder`, `front\factory\ShopOrder`, `front\view\ShopOrder`. Callery (ShopBasketController, ClientRepository, shop\Order, cron-turstmate) przepięte na OrderRepository.
|
|
|
|
## pp_banners
|
|
Banery.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa banera |
|
|
| status | 0/1 |
|
|
| date_start | Data rozpoczęcia |
|
|
| date_end | Data zakończenia |
|
|
| home_page | Czy na stronie głównej 0/1 |
|
|
|
|
**Używane w:** `Domain\Banner\BannerRepository`, `front\Views\Banners`
|
|
|
|
**Aktualizacja 2026-02-16 (ver. 0.281):** metody frontendowe `banners()`, `mainBanner()` dodane do `Domain\Banner\BannerRepository`. Fasady `front\factory\Banners` i `front\view\Banners` deleguja do repo/Views.
|
|
|
|
## pp_banners_langs
|
|
Tłumaczenia banerów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| id_banner | FK do pp_banners |
|
|
| id_lang | ID języka |
|
|
| src | Ścieżka do grafiki |
|
|
| url | URL docelowy |
|
|
| html | Kod HTML |
|
|
| text | Tekst |
|
|
|
|
**Używane w:** `Domain\Banner\BannerRepository`, `front\Views\Banners`
|
|
|
|
## pp_articles
|
|
Artykuły.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| status | -1 = archiwum, 0 = nieaktywny, 1 = aktywny |
|
|
|
|
**Używane w:** `admin\Controllers\ArticlesArchiveController`, `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::listArchivedForAdmin()`
|
|
|
|
## pp_articles_pages
|
|
Strony artykułów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| article_id | FK do pp_articles |
|
|
| page_id | FK do strony (pp_pages) |
|
|
| o | Kolejność |
|
|
|
|
**Używane w:** `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::deleteNonassignedImages()`
|
|
|
|
## pp_articles_langs
|
|
Tłumaczenia artykułów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| article_id | FK do pp_articles |
|
|
| lang_id | ID języka (np. 'pl') |
|
|
| title | Tytuł artykułu |
|
|
| seo_link | Link SEO artykułu |
|
|
|
|
**Używane w:** `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::deleteNonassignedFiles()`
|
|
|
|
## pp_articles_images
|
|
Zdjęcia artykułów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| article_id | FK do pp_articles |
|
|
| src | Ścieżka do pliku |
|
|
| o | Kolejność |
|
|
| id | PK (używane też do sortowania DESC) |
|
|
|
|
**Używane w:** `Domain\Article\ArticleRepository::find()`
|
|
|
|
## pp_articles_files
|
|
Pliki artykułów.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| article_id | FK do pp_articles |
|
|
| src | Ścieżka do pliku |
|
|
| name | Nazwa wyświetlana załącznika (opcjonalna) |
|
|
| to_delete | Flaga miękkiego usuwania (0/1) |
|
|
| o | Kolejność załączników (używana przez sortowanie drag&drop w adminie) |
|
|
|
|
**Używane w:** `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::saveFilesOrder()`
|
|
|
|
## pp_units
|
|
Jednostki/slowniki (np. jednostki produktu).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
|
|
**Używane w:** `Domain\Dictionaries\DictionariesRepository`, `admin\controls\ShopProduct`
|
|
|
|
## pp_units_langs
|
|
Tlumaczenia jednostek (per jezyk).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| unit_id | FK do pp_units |
|
|
| lang_id | ID jezyka (np. 'pl') |
|
|
| text | Nazwa jednostki |
|
|
|
|
**Używane w:** `Domain\Dictionaries\DictionariesRepository`
|
|
|
|
## pp_users
|
|
Uzytkownicy panelu administratora.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| login | Login / e-mail uzytkownika |
|
|
| password | Hash hasla (legacy: md5) |
|
|
| status | Status konta: 1 = aktywny, 0 = zablokowany |
|
|
| admin | Flaga dostepu do panelu admin |
|
|
| error_logged_count | Licznik nieudanych logowan |
|
|
| last_logged | Data ostatniego poprawnego logowania |
|
|
| last_error_logged | Data ostatniej nieudanej proby logowania |
|
|
| twofa_enabled | Czy wlaczone 2FA (0/1) |
|
|
| twofa_email | E-mail do wysylki kodu 2FA |
|
|
| twofa_code_hash | Hash aktualnego kodu 2FA |
|
|
| twofa_expires_at | Data waznosci kodu 2FA |
|
|
| twofa_sent_at | Data ostatniej wysylki kodu 2FA |
|
|
| twofa_failed_attempts | Liczba nieudanych prob 2FA |
|
|
|
|
**Uzywane w:** `Domain\User\UserRepository`, `admin\Controllers\UsersController`, `admin\factory\Users`
|
|
|
|
**Aktualizacja 2026-02-12:** uzycia `pp_users` sa prowadzone przez `Domain\\User\\UserRepository` (legacy `admin\\factory\\Users` usunieto).
|
|
|
|
## pp_langs
|
|
Jezyki panelu i frontendu.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK (2-literowe ID jezyka, np. pl, en) |
|
|
| name | Nazwa jezyka |
|
|
| status | 1 = aktywny, 0 = nieaktywny |
|
|
| start | 1 = domyslny jezyk |
|
|
| o | Kolejnosc |
|
|
|
|
**Uzywane w:** `Domain\\Languages\\LanguagesRepository`, `admin\\Controllers\\LanguagesController`, `front\\factory\\Languages`
|
|
|
|
## pp_langs_translations
|
|
Slownik tlumaczen panelu/frontendu.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| text | Klucz/tekst bazowy |
|
|
| <lang_id> | Kolumny dynamiczne per jezyk (np. pl, en) |
|
|
|
|
**Uzywane w:** `Domain\\Languages\\LanguagesRepository`, `admin\\Controllers\\LanguagesController`, `front\\factory\\Languages`
|
|
|
|
**Aktualizacja 2026-02-12:** modul jezykow i tlumaczen (`pp_langs`, `pp_langs_translations`) obslugiwany przez `Domain\\Languages\\LanguagesRepository`.
|
|
|
|
## pp_layouts
|
|
Szablony layoutow (HTML/CSS/JS + flagi domyslne).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa szablonu |
|
|
| html | Kod HTML |
|
|
| css | Kod CSS |
|
|
| js | Kod JS |
|
|
| m_html | Kod HTML mobilny |
|
|
| m_css | Kod CSS mobilny |
|
|
| m_js | Kod JS mobilny |
|
|
| status | Domyslny layout stron (0/1) |
|
|
| categories_default | Domyslny layout kategorii (0/1) |
|
|
|
|
**Uzywane w:** `Domain\\Layouts\\LayoutsRepository`, `admin\\Controllers\\LayoutsController`, `front\\factory\\Layouts`
|
|
|
|
## pp_layouts_pages
|
|
Przypisanie layoutow do stron CMS.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| layout_id | FK do pp_layouts |
|
|
| page_id | FK do pp_pages |
|
|
|
|
**Uzywane w:** `Domain\\Layouts\\LayoutsRepository`, `front\\factory\\Layouts`
|
|
|
|
## pp_layouts_categories
|
|
Przypisanie layoutow do kategorii sklepu.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| layout_id | FK do pp_layouts |
|
|
| category_id | FK do pp_shop_categories |
|
|
|
|
**Uzywane w:** `Domain\\Layouts\\LayoutsRepository`, `front\\factory\\Layouts`
|
|
|
|
**Aktualizacja 2026-02-12 (ver. 0.256):** modul `/admin/layouts` korzysta z `Domain\\Layouts\\LayoutsRepository` (DI kontroler + fasada legacy).
|
|
|
|
## pp_newsletter
|
|
Adresy e-mail zapisane do newslettera.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| email | Adres e-mail subskrybenta |
|
|
| hash | Hash potwierdzenia/wypisu |
|
|
| status | 1 = potwierdzony, 0 = oczekujacy |
|
|
|
|
**Uzywane w:** `Domain\\Newsletter\\NewsletterRepository`, `front\\Controllers\\NewsletterController`
|
|
|
|
## pp_newsletter_send
|
|
Kolejka wysylki newslettera.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| email | Adres docelowy |
|
|
| dates | Zakres dat artykulow (tekst) |
|
|
| id_template | FK do `pp_newsletter_templates` (NULL gdy brak szablonu) |
|
|
|
|
**Uzywane w:** `Domain\\Newsletter\\NewsletterRepository`
|
|
|
|
## pp_newsletter_templates
|
|
Szablony tresci e-maili (uzytkownik + administracyjne/systemowe).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa/klucz szablonu |
|
|
| text | Tresc HTML szablonu |
|
|
| is_admin | 1 = szablon administracyjny/systemowy, 0 = szablon uzytkownika |
|
|
|
|
**Uzywane w:** `Domain\\Newsletter\\NewsletterRepository`, `admin\\Controllers\\NewsletterController`
|
|
|
|
**Aktualizacja 2026-02-12 (ver. 0.257):** modul `/admin/newsletter` korzysta z `Domain\\Newsletter\\NewsletterRepository` (DI kontroler + fasada legacy).
|
|
|
|
**Aktualizacja 2026-02-16 (ver. 0.279):** `front\\factory\\Newsletter` usunięta — logika przeniesiona do `NewsletterRepository`. Frontend korzysta z `front\\Controllers\\NewsletterController` (DI).
|
|
|
|
## pp_scontainers
|
|
Kontenery statyczne (modul /admin/scontainers).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| status | 1 = aktywny, 0 = nieaktywny |
|
|
| show_title | 1 = pokaz tytul, 0 = ukryj tytul |
|
|
|
|
**Uzywane w:** `Domain\Scontainers\ScontainersRepository`, `admin\Controllers\ScontainersController`, `front\factory\Scontainers`
|
|
|
|
## pp_scontainers_langs
|
|
Tlumaczenia kontenerow statycznych (per jezyk).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| container_id | FK do pp_scontainers |
|
|
| lang_id | ID jezyka (np. pl, en) |
|
|
| title | Tytul kontenera |
|
|
| text | Tresc HTML kontenera |
|
|
|
|
**Uzywane w:** `Domain\Scontainers\ScontainersRepository`, `front\factory\Scontainers`
|
|
|
|
**Aktualizacja 2026-02-12 (ver. 0.259):** modul `/admin/scontainers` korzysta z `Domain\Scontainers\ScontainersRepository` (DI kontroler + fasada legacy).
|
|
|
|
**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`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Kod kuponu (UNIQUE) |
|
|
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
|
| send | Czy kupon zostal wyslany (0/1) |
|
|
| used | Czy kupon zostal wykorzystany (0/1) |
|
|
| date_used | Data wykorzystania kuponu (NULL gdy brak) |
|
|
| used_count | Licznik uzyc kuponu |
|
|
| type | Typ kuponu (obecnie: 1 = rabat procentowy na koszyk) |
|
|
| amount | Wartosc kuponu (np. procent) |
|
|
| one_time | Czy kupon jednorazowy (0/1) |
|
|
| include_discounted_product | Czy obejmuje rowniez produkty przecenione (0/1) |
|
|
| categories | JSON z ID kategorii objetych kuponem (NULL = bez ograniczenia) |
|
|
|
|
**Uzywane w:** `Domain\Coupon\CouponRepository`, `admin\Controllers\ShopCouponController`, `front\Controllers\ShopCouponController`, `shop\Coupon`, `Domain\Order\OrderRepository`
|
|
|
|
**Aktualizacja 2026-02-13 (ver. 0.266):** modul `/admin/shop_coupon` korzysta z `Domain\Coupon\CouponRepository` przez `admin\Controllers\ShopCouponController`. Usunieto legacy klasy `admin\controls\ShopCoupon` i `admin\factory\ShopCoupon`.
|
|
|
|
## pp_shop_promotion
|
|
Promocje sklepu (modul `/admin/shop_promotion`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa promocji |
|
|
| status | Status: 1 = aktywna, 0 = nieaktywna |
|
|
| condition_type | Typ warunku promocji (slownik w `shop\Promotion::$condition_type`) |
|
|
| discount_type | Typ rabatu (slownik w `shop\Promotion::$discount_type`) |
|
|
| amount | Wartosc rabatu (np. procent) |
|
|
| date_from | Data startu promocji (NULL = aktywna od razu) |
|
|
| date_to | Data konca promocji (NULL = bez daty konca) |
|
|
| categories | JSON z ID kategorii grupy I |
|
|
| condition_categories | JSON z ID kategorii grupy II |
|
|
| include_coupon | Czy laczyc z kuponami rabatowymi (0/1) |
|
|
| include_product_promo | Czy uwzgledniac produkty przecenione (0/1) |
|
|
| min_product_count | Minimalna liczba produktow (dla wybranych warunkow) |
|
|
| price_cheapest_product | Cena najtanszego produktu (dla wybranych warunkow) |
|
|
|
|
**Uzywane w:** `Domain\Promotion\PromotionRepository`, `admin\Controllers\ShopPromotionController`, `shop\Promotion`, `front\factory\ShopPromotion`
|
|
|
|
**Aktualizacja 2026-02-13:** modul `/admin/shop_promotion` korzysta z `Domain\Promotion\PromotionRepository` przez `admin\Controllers\ShopPromotionController`. Usunieto legacy klasy `admin\controls\ShopPromotion` i `admin\factory\ShopPromotion`.
|
|
|
|
**Aktualizacja 2026-02-13 (ver. 0.265):** dodano obsluge `date_from` (repozytorium, formularz admin, lista admin, filtr aktywnych promocji na froncie) oraz poprawke zapisu edycji promocji po `id`.
|
|
|
|
## pp_shop_payment_methods
|
|
Metody platnosci sklepu (modul `/admin/shop_payment_method`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa metody platnosci |
|
|
| description | Opis metody platnosci (wyswietlany m.in. w checkout) |
|
|
| status | Status: 1 = aktywna, 0 = nieaktywna |
|
|
| apilo_payment_type_id | ID typu platnosci Apilo (NULL gdy brak mapowania) |
|
|
| min_order_amount | Minimalna kwota zamowienia (DECIMAL(10,2), NULL = brak limitu) |
|
|
| max_order_amount | Maksymalna kwota zamowienia (DECIMAL(10,2), NULL = brak limitu) |
|
|
| is_cod | Platnosc przy odbiorze: 1 = tak, 0 = nie (TINYINT DEFAULT 0) |
|
|
| sellasist_payment_type_id | DEPRECATED (integracja Sellasist usunieta w ver. 0.263) |
|
|
|
|
**Uzywane w:** `Domain\PaymentMethod\PaymentMethodRepository`, `admin\Controllers\ShopPaymentMethodController`, `front\factory\ShopPaymentMethod`, `shop\PaymentMethod`, `admin\controls\ShopTransport`, `cron.php`
|
|
|
|
**Aktualizacja 2026-03-12 (ver. 0.338):** dodano kolumne `is_cod` — flaga platnosci przy odbiorze, zastepuje hardkodowane `payment_id == 3` w `OrderRepository::createFromBasket()`.
|
|
|
|
**Aktualizacja 2026-02-14 (ver. 0.268):** modul `/admin/shop_payment_method` korzysta z `Domain\PaymentMethod\PaymentMethodRepository` przez `admin\Controllers\ShopPaymentMethodController`. Usunieto legacy klasy `admin\controls\ShopPaymentMethod`, `admin\factory\ShopPaymentMethod`, `admin\view\ShopPaymentMethod` oraz widok `admin/templates/shop-payment-method/view-list.php`.
|
|
|
|
**Aktualizacja 2026-02-22 (ver. 0.304):** dodano kolumny `min_order_amount` i `max_order_amount` — konfigurowalne limity kwotowe metod platnosci. Zastapiono hardcoded warunek PayPo (id=6, 40-1000 PLN) generycznym filtrowaniem na froncie.
|
|
|
|
## pp_shop_transports
|
|
Rodzaje transportu sklepu (modul `/admin/shop_transport`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa (systemowa, readonly) |
|
|
| name_visible | Nazwa widoczna dla klienta |
|
|
| description | Opis metody transportu |
|
|
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
|
| cost | Koszt dostawy (PLN) |
|
|
| max_wp | Maksymalna waga paczki (NULL = bez limitu) |
|
|
| default | Domyslna forma dostawy (0/1) |
|
|
| delivery_free | Czy obsluguje darmowa dostawe (0/1) |
|
|
| apilo_carrier_account_id | ID konta przewoznika w Apilo (NULL gdy brak mapowania) |
|
|
| o | Kolejnosc wyswietlania |
|
|
|
|
**Uzywane w:** `Domain\Transport\TransportRepository`, `admin\Controllers\ShopTransportController`, `front\factory\ShopTransport`
|
|
|
|
## pp_shop_transport_payment_methods
|
|
Powiazanie metod transportu z metodami platnosci (tabela lacznikowa).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id_transport | FK do pp_shop_transports |
|
|
| id_payment_method | FK do pp_shop_payment_methods |
|
|
|
|
**Uzywane w:** `Domain\Transport\TransportRepository`, `Domain\PaymentMethod\PaymentMethodRepository::forTransport()`
|
|
|
|
**Aktualizacja 2026-02-14 (ver. 0.269):** modul `/admin/shop_transport` korzysta z `Domain\Transport\TransportRepository` przez `admin\Controllers\ShopTransportController`. Usunieto legacy klasy `admin\controls\ShopTransport`, `admin\view\ShopTransport` oraz widok `admin/templates/shop-transport/view-list.php`.
|
|
|
|
## pp_shop_apilo_settings
|
|
Ustawienia integracji Apilo (key-value).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Klucz ustawienia (np. client-id, access-token) |
|
|
| value | Wartosc ustawienia |
|
|
|
|
**Uzywane w:** `Domain\Integrations\IntegrationsRepository`, `admin\Controllers\IntegrationsController`, `admin\factory\Integrations`
|
|
|
|
## pp_shop_shoppro_settings
|
|
Ustawienia integracji ShopPRO (key-value).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Klucz ustawienia (np. domain, db_name) |
|
|
| value | Wartosc ustawienia |
|
|
|
|
**Uzywane w:** `Domain\Integrations\IntegrationsRepository`, `admin\Controllers\IntegrationsController`, `admin\factory\Integrations`
|
|
|
|
**Aktualizacja 2026-02-13:** modul `/admin/integrations/` korzysta z `Domain\Integrations\IntegrationsRepository` (DI kontroler + fasada legacy). Usunieto integracje Sellasist i Baselinker.
|
|
|
|
## pp_shop_statuses
|
|
Statusy zamowien sklepu (modul `/admin/shop_statuses`). Statusy sa predefiniowane - brak dodawania/usuwania, mozliwa edycja koloru i mapowania Apilo.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK (zaczyna sie od 0!) |
|
|
| status | Nazwa statusu (read-only) |
|
|
| color | Kolor statusu (hex, np. #ff0000) |
|
|
| o | Kolejnosc wyswietlania |
|
|
| apilo_status_id | ID statusu w Apilo (NULL gdy brak mapowania) |
|
|
| baselinker_status_id | DEPRECATED (usuniety w ver. 0.263) |
|
|
| sellasist_status_id | DEPRECATED (usuniety w ver. 0.263) |
|
|
|
|
**Uzywane w:** `Domain\ShopStatus\ShopStatusRepository`, `admin\Controllers\ShopStatusesController`, `front\factory\ShopStatuses`, `shop\Order`, `cron.php`
|
|
|
|
**Aktualizacja 2026-02-14 (ver. 0.267):** modul `/admin/shop_statuses` korzysta z `Domain\ShopStatus\ShopStatusRepository` przez `admin\Controllers\ShopStatusesController`. Usunieto legacy klasy `admin\controls\ShopStatuses` i `admin\factory\ShopStatuses`. `front\factory\ShopStatuses` dziala jako fasada do repozytorium.
|
|
|
|
## pp_shop_product_sets
|
|
Komplety produktow (modul `/admin/shop_product_sets`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa kompletu |
|
|
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
|
|
|
**Uzywane w:** `Domain\ProductSet\ProductSetRepository`, `admin\Controllers\ShopProductSetsController`, `shop\ProductSet`, `shop\Product`
|
|
|
|
## pp_shop_product_sets_products
|
|
Powiazanie kompletow z produktami (tabela lacznikowa).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| set_id | FK do pp_shop_product_sets |
|
|
| product_id | FK do pp_shop_products |
|
|
|
|
**Uzywane w:** `Domain\ProductSet\ProductSetRepository`, `shop\Product`, `front\factory\ShopProduct`, `admin\factory\ShopProduct`
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.272):** modul `/admin/shop_product_sets` korzysta z `Domain\ProductSet\ProductSetRepository` przez `admin\Controllers\ShopProductSetsController`. Usunieto legacy klasy `admin\controls\ShopProductSets` i `admin\factory\ShopProductSet`. `shop\ProductSet` dziala jako fasada do repozytorium.
|
|
|
|
## pp_shop_producer
|
|
Producenci produktow (modul `/admin/shop_producer`).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| name | Nazwa producenta |
|
|
| status | Status: 1 = aktywny, 0 = nieaktywny |
|
|
| img | Sciezka do logo producenta (NULL gdy brak) |
|
|
|
|
**Uzywane w:** `Domain\Producer\ProducerRepository`, `admin\Controllers\ShopProducerController`, `front\Controllers\ShopProducerController`, `shop\Product`
|
|
|
|
## pp_shop_producer_lang
|
|
Tlumaczenia producentow (per jezyk). FK kaskadowe ON DELETE CASCADE.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK |
|
|
| producer_id | FK do pp_shop_producer |
|
|
| lang_id | ID jezyka (np. pl, en) |
|
|
| description | Opis producenta (TEXT) |
|
|
| data | Dane producenta (TEXT, HTML) |
|
|
| meta_title | Meta title SEO (VARCHAR 255) |
|
|
|
|
**Uzywane w:** `Domain\Producer\ProducerRepository`, `shop\Product`
|
|
|
|
**Aktualizacja 2026-02-15 (ver. 0.273):** modul `/admin/shop_producer` korzysta z `Domain\Producer\ProducerRepository` przez `admin\Controllers\ShopProducerController`. Usunieto legacy `admin\controls\ShopProducer` i `admin\factory\ShopProducer`. `shop\Producer` dziala jako fasada do repozytorium.
|
|
|
|
**Aktualizacja 2026-02-17 (ver. 0.291):** frontend `/shop_producer/*` korzysta z `Domain\Producer\ProducerRepository` przez `front\Controllers\ShopProducerController`; usunięto legacy `front\controls\ShopProducer` i `shop\Producer`.
|
|
|
|
## pp_cron_jobs
|
|
Kolejka zadań cron z priorytetami i retry/backoff.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK auto increment |
|
|
| job_type | Typ zadania (VARCHAR 50) — np. apilo_send_order, price_history |
|
|
| status | ENUM: pending, processing, completed, failed, cancelled |
|
|
| priority | TINYINT — niższy = ważniejszy (10=krytyczny, 50=wysoki, 100=normalny, 200=niski) |
|
|
| payload | JSON z danymi zadania (TEXT NULL) |
|
|
| result | JSON z wynikiem (TEXT NULL) |
|
|
| attempts | Liczba prób (SMALLINT) |
|
|
| max_attempts | Maksymalna liczba prób (SMALLINT, domyślnie 10) |
|
|
| last_error | Ostatni błąd (VARCHAR 500) |
|
|
| scheduled_at | Kiedy zadanie ma być uruchomione (DATETIME) |
|
|
| started_at | Kiedy rozpoczęto przetwarzanie (DATETIME NULL) |
|
|
| completed_at | Kiedy zakończono (DATETIME NULL) |
|
|
| created_at | Data utworzenia (DATETIME) |
|
|
| updated_at | Data ostatniej modyfikacji (DATETIME, ON UPDATE) |
|
|
|
|
**Indeksy:** idx_status_priority_scheduled (status, priority, scheduled_at), idx_job_type, idx_status
|
|
|
|
**Używane w:** `Domain\CronJob\CronJobRepository`, `Domain\CronJob\CronJobProcessor`
|
|
|
|
## pp_cron_schedules
|
|
Harmonogram cyklicznych zadań cron.
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | PK auto increment |
|
|
| job_type | Typ zadania (VARCHAR 50, UNIQUE) |
|
|
| interval_seconds | Interwał uruchomienia w sekundach |
|
|
| priority | Priorytet tworzonych zadań (TINYINT) |
|
|
| max_attempts | Maks. prób dla tworzonych zadań (SMALLINT) |
|
|
| payload | Opcjonalny payload JSON (TEXT NULL) |
|
|
| enabled | Czy harmonogram aktywny (TINYINT 1) |
|
|
| last_run_at | Ostatnie uruchomienie (DATETIME NULL) |
|
|
| next_run_at | Następne planowane uruchomienie (DATETIME NULL) |
|
|
| created_at | Data utworzenia (DATETIME) |
|
|
|
|
**Indeksy:** idx_enabled_next_run (enabled, next_run_at)
|
|
|
|
**Używane w:** `Domain\CronJob\CronJobRepository`, `Domain\CronJob\CronJobProcessor`
|
|
|
|
**Dodano w wersji 0.324.**
|
|
|
|
## pp_routes
|
|
Tabela tras URL — mapowanie wzorców URL (regex) na parametry GET. Zastępuje reguły `RewriteRule` w `.htaccess` dla wszystkich URL-i aplikacji: produktów, kategorii, stron, artykułów oraz systemowych (koszyk, logowanie, newsletter, itp.).
|
|
|
|
| Kolumna | Opis |
|
|
|---------|------|
|
|
| id | Klucz główny (AUTO_INCREMENT) |
|
|
| product_id | ID produktu (INT NULL) — wypełnione dla tras produktów |
|
|
| category_id | ID kategorii (INT NULL) — wypełnione dla tras kategorii |
|
|
| page_id | ID strony (INT NULL) — wypełnione dla tras stron |
|
|
| article_id | ID artykułu (INT NULL) — wypełnione dla tras artykułów |
|
|
| type | Typ trasy: NULL = encja (produkt/kategoria/strona/artykuł), `'system'` = trasa systemowa (koszyk, logowanie, newsletter, AJAX moduły, itp.) |
|
|
| lang_id | ID języka (0 dla tras systemowych niezwiązanych z językiem) |
|
|
| pattern | Wyrażenie regularne dopasowywane do REQUEST_URI |
|
|
| destination | Docelowy query string, np. `index.php?category=5&lang=1` |
|
|
|
|
**Mechanizm:** `index.php` ładuje wszystkie trasy (z cache Redis `pp_routes:all`) przed `checkUrlParams()`, dopasowuje `pattern` do ścieżki żądania i ustawia `$_GET` z `destination`. Obsługuje grupy przechwytujące (np. `$1` dla paginacji).
|
|
|
|
**Trasy systemowe:** Przy każdym wywołaniu `Helpers::htacces()` wszystkie rekordy z `type='system'` są usuwane i wstawiane na nowo (32 statycznych + dynamiczne trasy językowe i producentów). Zarządzane automatycznie — nie edytować ręcznie.
|
|
|
|
**Cache:** Redis klucz `pp_routes:all`, TTL 86400s. Invalidowany automatycznie przy każdym wywołaniu `Helpers::htacces()`.
|
|
|
|
**Używane w:** `index.php`, `Shared\Helpers\Helpers::htacces()`, `Domain\Product\ProductRepository`, `Domain\Category\CategoryRepository`, `Domain\Pages\PagesRepository`, `Domain\Article\ArticleRepository`
|
|
|
|
**Dodano w wersji 0.329. Kolumna `type` i trasy systemowe dodane w wersji 0.330.**
|