# 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 | | | 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.**