[
  {
    "version": "0.300",
    "date": "21.02.2026",
    "text": "- NEW - System aktualizacji oparty na manifestach JSON (checksum SHA256, backup plików, automatyczny build)\n- NEW - Panel logu aktualizacji w panelu admina"
  },
  {
    "version": "0.299",
    "date": "21.02.2026",
    "text": "- NEW - Ukrywanie/pokazywanie kolumn w tabelach admina (toggle switch + localStorage)"
  },
  {
    "version": "0.298",
    "date": "20.02.2026",
    "text": "- FIX - kilka poprawek po aktualizacji"
  },
  {
    "version": "0.297",
    "date": "19.02.2026",
    "text": "- NEW - REST API produktów (lista, szczegóły, tworzenie, aktualizacja)\n- NEW - Endpoint products z filtrowaniem, sortowaniem i paginacją\n- NEW - Partial update produktów (tylko zmienione pola)"
  },
  {
    "version": "0.296",
    "date": "19.02.2026",
    "text": "- NEW - REST API zamówień dla ordersPRO (lista, szczegóły, zmiana statusu, płatności)\n- NEW - Endpointy słownikowe (statusy, transporty, metody płatności)\n- NEW - Autentykacja API przez X-Api-Key header\n- NEW - Kolumna updated_at w pp_shop_orders (polling zmian)"
  },
  {
    "version": "0.295",
    "date": "19.02.2026",
    "text": "- NEW - Edycja produktów w zamówieniu z panelu admina (dodawanie, usuwanie, zmiana ilości/cen)\n- NEW - Wyszukiwarka produktów AJAX w formularzu edycji zamówienia\n- NEW - Automatyczna korekta stanów magazynowych i przeliczanie kosztu dostawy\n- FIX - Cena promo w zamówieniu = 0 gdy identyczna z ceną bazową"
  },
  {
    "version": "0.294",
    "date": "19.02.2026",
    "text": "- FIX - Code review zakończony (96/96 klas, ~1144 metod): 27 fixów across all layers\n- FIX - Domain: null guard na query()->fetchAll() w 8 repozytoriach, redundancja DI w PromotionRepository\n- FIX - Admin: null safety find() ?: [] w 10 kontrolerach, null guard w App logowaniu/2FA\n- FIX - Front: LayoutEngine undefined $level + $_GET null check, ShopBasketController missing global $lang_id\n- FIX - Shared: Helpers $_GET null check + bug 'png' → 'image/png' (Imagick lossless WebP nigdy nie działał)"
  },
  {
    "version": "0.293",
    "date": "19.02.2026",
    "text": "- FIX - ArticleRepository: SQL injection fix (addslashes→parameterized), uproszczenie articleDetailsFrontend\n- FIX - AttributeRepository: martwy class_exists('\\S') blokowal czyszczenie cache/temp\n- FIX - CategoryRepository: martwy class_exists('\\S') blokowal generowanie linkow SEO kategorii\n- FIX - BannerRepository: parametryzacja dat w SQL + null guard na query()\n- FIX - BasketCalculator: null guard checkProductQuantityInStock + opcjonalne DI params summaryPrice/calculateBasketProductPrice\n- FIX - PromotionRepository: null guard na $basket (produkcyjny fatal error)\n- UPDATE - OrderRepository, ShopBasketController, ajax.php: jawne DI zamiast globals w callerach BasketCalculator"
  },
  {
    "version": "0.292",
    "date": "18.02.2026",
    "text": "- UPDATE - pelna migracja front\\factory\\ do Domain (5 ostatnich klas: ShopProduct, ShopPaymentMethod, ShopPromotion, ShopStatuses, ShopTransport)\n- UPDATE - ProductRepository: ~20 nowych metod frontendowych (cache Redis, lazy loading, SKU/EAN fallback)\n- UPDATE - PromotionRepository: 5 metod aplikowania promocji (applyTypeWholeBasket/CheapestProduct/CategoriesOr/CategoriesAnd/CategoryCondition)\n- UPDATE - TransportRepository: 4 metody frontendowe z cache (transportMethodsFront, transportCostCached, findActiveByIdCached, forPaymentMethod)\n- UPDATE - PaymentMethodRepository: metody frontendowe z Redis cache\n- CLEANUP - usuniety caly folder front\\factory\\ (20 klas zmigrowanych) + 4 inne klasy legacy\n- FIX - broken transports_list() w ajax.php zastapiony nowa metoda forPaymentMethod()\n- UPDATE - front\\controls\\Site przemianowany na front\\App (router, camelCase: checkUrlParams, pageTitle)\n- UPDATE - front\\view\\Site przemianowany na front\\LayoutEngine (layout engine, camelCase: cookieInformation)\n- CLEANUP - usuniete autoload/front/controls/ i autoload/front/view/ (puste foldery + pliki legacy)\n- UPDATE - usuniecie 12 legacy klas z autoload/shop/ (~2363 linii) — pelna migracja na Domain-Driven Architecture\n- UPDATE - class.Order.php: logika Apilo sync i email statusu przeniesiona do OrderAdminService\n- UPDATE - class.Product.php: ~20 metod przeniesionych do ProductRepository, calculate_basket_product_price do BasketCalculator\n- FIX - findCached(): stale Redis cache z obiektami \\shop\\Product powodowal ceny 0,00 zl\n- FIX - szablony: konwersja object access na array access po migracji Product\n- UPDATE - AttributeRepository::getAttributeValueById() — dodano Redis cache\n- CLEANUP - katalog autoload/shop/ pusty, zero referencji \\shop\\ w aktywnym kodzie"
  },
  {
    "version": "0.291",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\controls\\ShopProducer + shop\\Producer do Domain\\Producer\\ProducerRepository + front\\Controllers\\ShopProducerController\n- FIX - bug shop\\Producer::__get() referowal nieistniejace $this->data"
  },
  {
    "version": "0.290",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\factory\\ShopCoupon + front\\controls\\ShopCoupon do Domain\\Coupon\\CouponRepository + front\\Controllers\\ShopCouponController\n- UPDATE - migracja front\\factory\\ShopOrder + front\\controls\\ShopOrder + front\\view\\ShopOrder do Domain\\Order\\OrderRepository + front\\Controllers\\ShopOrderController\n- FIX - kupony jednorazowe nigdy nie byly oznaczane jako uzyte (is_one_time/set_as_used w shop\\Coupon)\n- FIX - webhooks przelewy24/hotpay ujednolicone z tpay (poprawna obsluga Apilo sync)"
  },
  {
    "version": "0.289",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\factory\\ShopCategory + front\\view\\ShopCategory do Domain\\Category\\CategoryRepository + front\\Views\\ShopCategory\n- UPDATE - migracja front\\factory\\ShopClient + front\\view\\ShopClient + front\\controls\\ShopClient do Domain\\Client\\ClientRepository + front\\Views\\ShopClient + front\\Controllers\\ShopClientController\n- FIX - usuniety hardcoded password bypass 'Legia1916' w logowaniu klienta"
  },
  {
    "version": "0.288",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\factory\\ShopBasket do Domain\\Basket\\BasketCalculator (4 metody statyczne)\n- UPDATE - migracja front\\controls\\ShopBasket do front\\Controllers\\ShopBasketController (camelCase, instancyjny)\n- UPDATE - routing snake_case->camelCase w dispatch dla nowych kontrolerow\n- CLEANUP - usunieta klasa cms\\Layout (zastapiona $layoutsRepo->find)\n- CLEANUP - usuniete 3 klasy legacy (front\\factory\\ShopBasket, front\\controls\\ShopBasket, cms\\Layout)"
  },
  {
    "version": "0.287",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\factory\\Scontainers do Domain\\Scontainers\\ScontainersRepository (frontScontainerDetails z Redis cache)\n- UPDATE - migracja front\\factory\\ShopAttribute do Domain\\Attribute\\AttributeRepository (frontAttributeDetails, frontValueDetails z Redis cache)\n- CLEANUP - usuniete 3 klasy legacy (front\\factory\\Scontainers, front\\view\\Scontainers, front\\factory\\ShopAttribute)"
  },
  {
    "version": "0.286",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja front\\factory\\Layouts do Domain\\Layouts\\LayoutsRepository (6 metod frontend z Redis cache)\n- UPDATE - migracja front\\factory\\Menu + front\\factory\\Pages do Domain\\Pages\\PagesRepository (6 metod frontend z Redis cache)\n- UPDATE - migracja front\\view\\Menu do front\\Views\\Menu (nowy namespace)\n- CLEANUP - usuniete 4 klasy legacy + 1 martwy szablon (submenu.php)\n- FIX - null $lang_id przy wczesnym wywolaniu check_url_params()"
  },
  {
    "version": "0.285",
    "date": "17.02.2026",
    "text": "- UPDATE - migracja class.Tpl.php do Shared\\Tpl\\Tpl (~135 plikow przepietych)\n- CLEANUP - usunieta nieuzywana klasa CurlServer (curl.class.php)\n- FIX - thumb.php: naprawa require po migracji Image do Shared namespace\n- FIX - Tpl::render() branch 3: sprawdzal templates_user ale ladowal templates"
  },
  {
    "version": "0.284",
    "date": "16.02.2026",
    "text": "- CLEANUP - usunieta klasa DbModel (base ORM) — logika wbudowana bezposrednio w shop\\Promotion"
  },
  {
    "version": "0.283",
    "date": "16.02.2026",
    "text": "- UPDATE - migracja class.S.php do Shared\\Helpers\\Helpers (~140 plikow przepietych)\n- UPDATE - migracja class.Html.php do Shared\\Html\\Html\n- UPDATE - migracja class.Email.php do Shared\\Email\\Email\n- UPDATE - migracja class.Image.php do Shared\\Image\\ImageManipulator\n- UPDATE - migracja class.Log.php do Shared\\Log\\Log (usunieta — logika przeniesiona)\n- CLEANUP - usunieta class.Mobile_Detect.php (przestarzala detekcja UA)\n- CLEANUP - usunieto 12 nieuzywanych metod z klasy S\n- FIX - array_cartesian_product() — blad iteracji po niezdefiniowanej zmiennej"
  },
  {
    "version": "0.282",
    "date": "16.02.2026",
    "text": "- UPDATE - Cache cleanup: eliminacja legacy class.Cache.php, migracja CacheHandler i RedisConnection do Shared\\Cache namespace\n- UPDATE - 60 odwolan CacheHandler i 12 odwolan RedisConnection przepietych na Shared\\Cache\\\n- UPDATE - 13 metod front\\factory przepietych z \\Cache::fetch/store na CacheHandler (ShopProduct, ShopPaymentMethod, ShopCategory, ShopTransport, ShopAttribute)\n- FIX - naprawione rozbieznosci kluczy cache (random_products, category_name)\n- CLEANUP - usuniete: class.Cache.php, class.CacheHandler.php, class.RedisConnection.php\n- UPDATE - testy: OK (454 tests, 1449 assertions)"
  },
  {
    "version": "0.281",
    "date": "16.02.2026",
    "text": "- UPDATE - migracja Banners frontend: factory + view do Domain/Views (DI)\n- NEW - `front\\Views\\Banners` — czysty VIEW (banners, mainBanner)\n- UPDATE - `BannerRepository` rozszerzony o 2 metody frontendowe (banners, mainBanner) z Redis cache\n- UPDATE - `front\\view\\Site::show()` przepiety na repo + Views\n- CLEANUP - usuniete: front\\factory\\Banners, front\\view\\Banners\n- UPDATE - testy: OK (454 tests, 1449 assertions)"
  },
  {
    "version": "0.280",
    "date": "16.02.2026",
    "text": "- UPDATE - migracja Articles frontend: factory + view + encja do Domain/Views (DI)\n- NEW - `front\\Views\\Articles` — czysty VIEW + utility (renderowanie, generateTableOfContents, generateHeadersIds, getImage)\n- UPDATE - `ArticleRepository` rozszerzony o 8 metod frontendowych (z Redis cache)\n- UPDATE - `front\\view\\Site::show()` — 5 sekcji przepietych na repo + Views\n- UPDATE - `front\\controls\\Site::route()` — single article + page_type switch przepiete na repo + Views\n- UPDATE - 5 szablonow `templates/articles/*` przepietych na `\\front\\Views\\Articles::`\n- CLEANUP - usuniete: `class.Article` (encja + metody statyczne), `front\\factory\\Settings` (fasada)\n- FIX - eliminacja `global $lang` z `articleNoindex()`, eliminacja zaleznosci od `front\\factory\\Pages::page_sort()`\n- UPDATE - testy: `OK (450 tests, 1431 assertions)`"
  },
  {
    "version": "0.279",
    "date": "16.02.2026",
    "text": "- UPDATE - migracja Newsletter frontend: factory + view + controls do Domain/Controllers/Views (DI)\n- UPDATE - nowy namespace `front\\Controllers` z `NewsletterController` (DI via factory closures)\n- UPDATE - nowy namespace `front\\Views` z `Languages` i `Newsletter` (czyste VIEW, statyczne metody)\n- UPDATE - routing frontend: `Site::getControllerFactories()` z fallback na stare kontrolery\n- FIX - `newsletter_unsubscribe()` — poprawiona skladnia medoo `delete()` (2 argumenty zamiast 3)\n- UPDATE - eliminacja fasady `front\\factory\\Languages` — 26 zaleznosci przepietych na `LanguagesRepository`\n- CLEANUP - usuniete: `front\\factory\\Languages`, `front\\factory\\Newsletter`, `front\\view\\Languages`, `front\\view\\Newsletter`, `front\\controls\\Newsletter`\n- UPDATE - testy: `OK (437 tests, 1398 assertions)`"
  },
  {
    "version": "0.278",
    "date": "16.02.2026",
    "text": "- UPDATE - migracja Settings + Languages do wspolnych klas Domain (z cache Redis)\n- FIX - `get_single_settings_value()` — parametr `$param` poprawnie uzywany (wczesniej hardcoded `firm_name`)"
  },
  {
    "version": "0.277",
    "date": "16.02.2026",
    "text": "- NEW - migracja modulu `ShopProduct` (factory) — pelna migracja ~40 metod do `ProductRepository` + ~30 akcji w `ShopProductController`\n- NEW - migracja modulu `Dashboard` do Domain + DI (`DashboardRepository`, `DashboardController`)\n- NEW - migracja modulu `Update` do Domain + DI (`UpdateRepository`, `UpdateController`)\n- UPDATE - klasa `admin\\Site` przemianowana na `admin\\App` (plik `App.php`)\n- UPDATE - refaktoring routingu — usunieto fallback na stare kontrolery, uproszczony routing\n- UPDATE - template `update/main-view.php` — panele zamiast `gridEdit`, `$.confirm()` zamiast `$.prompt()`\n- CLEANUP - usuniete stare foldery: `autoload/admin/controls/`, `autoload/admin/factory/`, `autoload/admin/view/`\n- CLEANUP - usuniete legacy: `class.Dashboard.php` (controls/shop), `class.Update.php` (controls/factory/view), `class.Articles.php` (factory), `class.Page.php` (view), `class.ShopProduct.php` (controls/factory/view)\n- UPDATE - `front\\factory\\Newsletter` przepieta na `ArticleRepository::articlesByDateAdd()`\n- UPDATE - testy: `OK (414 tests, 1335 assertions)`"
  },
  {
    "version": "0.276",
    "date": "15.02.2026",
    "text": "- NEW - migracja modulu `ShopOrder` do architektury Domain + DI (`Domain\\Order\\OrderRepository`, `Domain\\Order\\OrderAdminService`, `admin\\Controllers\\ShopOrderController`)\n- UPDATE - modul `/admin/shop_order/*` przepiety na nowy routing (kanoniczny URL `/admin/shop_order/list/`) i nowe widoki (`orders-list`, `order-details`, `order-edit`)\n- FIX - stabilizacja listy zamowien (`OrderRepository::listForAdmin`) oraz poprawa wygladu tabeli (`components/table-list`, wyrownanie komorek i `text-right`)\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopOrder.php`, `autoload/admin/factory/class.ShopOrder.php`, `admin/templates/shop-order/view-list.php`\n- UPDATE - usunieta fasada `autoload/admin/factory/class.Integrations.php`; wywolania przepiete na `Domain\\Integrations\\IntegrationsRepository`\n- NEW - globalna wyszukiwarka admin (produkty + zamowienia) przy \"Wyczysc cache\" + endpoint `/admin/settings/globalSearchAjax/`\n- FIX - wyszukiwanie po pelnym imieniu i nazwisku w global search\n- UPDATE - testy: `OK (385 tests, 1246 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.276.zip`, `ver_0.276_files.txt`"
  },
  {
    "version": "0.275",
    "date": "15.02.2026",
    "text": "- NEW - migracja modulu `ShopCategory` do architektury Domain + DI (`Domain\\Category\\CategoryRepository`, `admin\\Controllers\\ShopCategoryController`)\n- UPDATE - modul `/admin/shop_category/*` przepiety na nowy routing (kanoniczny URL `/admin/shop_category/list/`) i endpointy AJAX kontrolera (`save_categories_order`, `save_products_order`, `cookie_categories`)\n- UPDATE - widoki `shop-category/*`: wydzielenie skryptow do `*-custom-script.php`, ujednolicone strzalki drzewa (`button + caret + aria-expanded`)\n- UPDATE - przepiecie zaleznosci `ShopProduct` z `admin\\factory\\ShopCategory` na `Domain\\Category\\CategoryRepository`\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopCategory.php`, `autoload/admin/factory/class.ShopCategory.php`, `autoload/admin/view/class.ShopCategory.php`\n- UPDATE - testy: `OK (377 tests, 1197 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.275.zip`, `ver_0.275_files.txt`"
  },
  {
    "version": "0.274",
    "date": "15.02.2026",
    "text": "- NEW - migracja modulu `ShopClients` do architektury Domain + DI (`Domain\\Client\\ClientRepository`, `admin\\Controllers\\ShopClientsController`)\n- UPDATE - modul `/admin/shop_clients/*` przepiety na `components/table-list` (lista klientow i szczegoly zamowien)\n- UPDATE - routing i menu admin przepiete na kanoniczny URL `/admin/shop_clients/list/`\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopClients.php`, `autoload/admin/factory/class.ShopClients.php`\n- UPDATE - testy: `OK (361 tests, 1125 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.274.zip`, `ver_0.274_files.txt`"
  },
  {
    "version": "0.273",
    "date": "15.02.2026",
    "text": "- NEW - migracja `/admin/shop_product/mass_edit/*` do `Domain\\Product\\ProductRepository` + `admin\\Controllers\\ShopProductController` (DI + routing)\n- UPDATE - nowy widok/skrypt masowej edycji (`mass-edit`, `mass-edit-custom-script`) z iCheck i ujednoliconymi strzalkami drzewa\n- FIX - zaznaczanie kategorii w mass-edit nie zaznacza automatycznie produktow na liscie\n- UPDATE - ujednolicenie strzalek/checkboxow w drzewkach: `/admin/pages/list/*` oraz zakladka wyswietlania w `/admin/articles/edit/*`\n- UPDATE - testy: `OK (351 tests, 1091 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.273.zip`, `ver_0.273_files.txt`"
  },
  {
    "version": "0.272",
    "date": "15.02.2026",
    "text": "- NEW - migracja modulu `ShopProductSets` do architektury Domain + DI (`Domain\\ProductSet\\ProductSetRepository`, `admin\\Controllers\\ShopProductSetsController`)\n- UPDATE - modul `/admin/shop_product_sets/*` przepiety z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit` + multi-select Selectize\n- UPDATE - routing i menu admin przepiete na kanoniczny URL `/admin/shop_product_sets/list/`\n- UPDATE - `shop\\ProductSet` przepiety na fasade do `Domain\\ProductSet\\ProductSetRepository`\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopProductSets.php`, `autoload/admin/factory/class.ShopProductSet.php`, `admin/templates/shop-product-sets/view-list.php`, `admin/templates/shop-product-sets/set-edit.php`\n- UPDATE - testy: `OK (324 tests, 1000 assertions)` + nowe pliki testowe `ProductSetRepositoryTest`, `ShopProductSetsControllerTest`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.272.zip`, `ver_0.272_files.txt`"
  },
  {
    "version": "0.271",
    "date": "14.02.2026",
    "text": "- NEW - migracja modulu `ShopAttribute` do architektury Domain + DI (`Domain\\Attribute\\AttributeRepository`, `admin\\Controllers\\ShopAttributeController`)\n- UPDATE - modul `/admin/shop_attribute/*` przepiety z legacy `grid/gridEdit` na `components/table-list`, `components/form-edit` oraz nowy edytor wartosci (`values-edit`)\n- UPDATE - routing i menu admin przepiete na kanoniczny URL `/admin/shop_attribute/list/` (bez aliasow legacy)\n- UPDATE - przepiecie zaleznosci kombinacji produktu: `admin\\controls\\ShopProduct`, `admin\\factory\\ShopProduct`, `admin/templates/shop-product/product-combination.php`\n- CLEANUP - usuniete legacy klasy/pliki: `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`\n- UPDATE - testy: `OK (312 tests, 948 assertions)` + nowe pliki testowe `AttributeRepositoryTest`, `ShopAttributeControllerTest`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.271.zip`, `ver_0.271_files.txt`"
  },
  {
    "version": "0.270",
    "date": "14.02.2026",
    "text": "- FIX - Apilo: `shop\\Order::set_as_paid()` wysyla mapowany typ platnosci Apilo (z `payment_method_id`), zamiast stalego `type = 1`\n- NEW - Apilo: dodana kolejka retry `temp/apilo-sync-queue.json` dla nieudanych syncow platnosci/statusu (chwilowa niedostepnosc API)\n- UPDATE - `cron.php`: automatyczne ponawianie zaleglych syncow przez `Order::process_apilo_sync_queue(10)`\n- UPDATE - debug Apilo: rozszerzone logi odpowiedzi o HTTP code i bledy cURL dla sync platnosci/statusu\n- UPDATE - testy: `OK (300 tests, 895 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.270.zip`, `ver_0.270_files.txt`"
  },
  {
    "version": "0.269",
    "date": "14.02.2026",
    "text": "- NEW - migracja modulu `ShopPaymentMethod` do architektury Domain + DI (`Domain\\PaymentMethod\\PaymentMethodRepository`, `admin\\Controllers\\ShopPaymentMethodController`)\n- UPDATE - modul `/admin/shop_payment_method/*` przepiety z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit` (nowe widoki listy i edycji)\n- UPDATE - przepiecie zaleznosci na nowe repozytorium: `admin\\controls\\ShopTransport`, `front\\factory\\ShopPaymentMethod`, `shop\\PaymentMethod`\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopPaymentMethod.php`, `autoload/admin/factory/class.ShopPaymentMethod.php`, `autoload/admin/view/class.ShopPaymentMethod.php`, `admin/templates/shop-payment-method/view-list.php`\n- UPDATE - Apilo: dodane automatyczne odswiezanie tokenu przed wygasnieciem (`apiloKeepalive`) oraz bardziej szczegolowe komunikaty bledow integracji\n- UPDATE - testy: `OK (280 tests, 828 assertions)` + nowe pliki testowe `PaymentMethodRepositoryTest`, `ShopPaymentMethodControllerTest`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.269.zip`, `ver_0.269_files.txt`"
  },
  {
    "version": "0.268",
    "date": "14.02.2026",
    "text": "- NEW - migracja modulu `ShopStatuses` do architektury Domain + DI (`Domain\\ShopStatus\\ShopStatusRepository`, `admin\\Controllers\\ShopStatusesController`)\n- UPDATE - modul `/admin/shop_statuses/*` przepiety z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit`\n- NEW - nowy typ pola formularza `color` (HTML5 color picker + pole tekstowe zsynchronizowane)\n- UPDATE - `front\\factory\\ShopStatuses` dziala jako fasada do `Domain\\ShopStatus\\ShopStatusRepository`\n- UPDATE - menu admin przepiete na kanoniczny URL `/admin/shop_statuses/list/`\n- CLEANUP - usuniete legacy klasy: `autoload/admin/controls/class.ShopStatuses.php`, `autoload/admin/factory/class.ShopStatuses.php`\n- UPDATE - reorganizacja dokumentacji technicznej: pliki przeniesione do folderu `docs/` i rozbite na mniejsze pliki tematyczne\n- UPDATE - testy: `OK (254 tests, 736 assertions)` + nowe pliki testowe `ShopStatusRepositoryTest`, `ShopStatusesControllerTest`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.268.zip`, `ver_0.268_files.txt`"
  },
  {
    "version": "0.267",
    "date": "13.02.2026",
    "text": "- FIX - front: poprawione dobieranie layoutu dla kategorii/produktu/koszyka i innych stron modułowych (fallback do layoutu domyślnego)\n- FIX - produkt/koszyk: poprawiona obsługa ilości dla kombinacji (stan 0 po dodaniu do koszyka, limit max, odczyt `stock_0_buy`)\n- FIX - produkt: usunięty błąd JS `TypeError: $(...).visible is not a function` (zamiana na `:visible`)\n- FIX - SEO redirecty produktów: blokada konfliktów po kopiowaniu URL oraz utwardzone wykrywanie pętli redirectów (`lang_id` + graf przejść)\n- UPDATE - admin: `input-switch` zapisuje wartość `on` (spójnie z obsługą pól checkbox w formularzach)\n- CLEANUP - usunięte pliki: `apilo-bck`, `geocode-cache.php`\n- UPDATE - testy: `OK (235 tests, 682 assertions)`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.267.zip`, `ver_0.267_files.txt`, `ver_0.267_sql.txt`"
  },
  {
    "version": "0.266",
    "date": "13.02.2026",
    "text": "- NEW - migracja modulu `ShopCoupon` do architektury Domain + DI (`Domain\\Coupon\\CouponRepository`, `admin\\Controllers\\ShopCouponController`)\n- UPDATE - modul `/admin/shop_coupon/*` przepiety z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit`\n- UPDATE - nowe widoki i 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`\n- UPDATE - zachowana kompatybilnosc aliasow legacy akcji (`view_list`, `coupon_edit`, `coupon_save`, `coupon_delete`) w nowym kontrolerze\n- CLEANUP - usuniete legacy klasy/pliki: `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`\n- UPDATE - menu admin wskazuje kanoniczny URL `/admin/shop_coupon/list/`\n- FIX - ujednolicone drzewka (strzalki + focus) i wyglad checkboxow miedzy `/admin/shop_coupon/edit/*` oraz `/admin/layouts/edit/*`\n- UPDATE - testy: `OK (235 tests, 682 assertions)` + nowe pliki testowe `CouponRepositoryTest`, `ShopCouponControllerTest`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.266.zip`, `ver_0.266_files.txt`"
  },
  {
    "version": "0.265",
    "date": "13.02.2026",
    "text": "- UPDATE - modul `/admin/shop_promotion/*`: dodano pole `Data od` (`date_from`) w repozytorium, formularzu i liscie\n- UPDATE - front: `shop\\Promotion::get_active_promotions()` uwzglednia `date_from` (okno aktywnosci od-do)\n- FIX - edycja promocji zapisuje aktualizacje rekordu zamiast tworzenia nowego (`id` przekazywane przez hidden field + fallback z URL)\n- UPDATE - testy: `OK (222 tests, 614 assertions)`"
  },
  {
    "version": "0.264",
    "date": "13.02.2026",
    "text": "- NEW - migracja modulu `ShopPromotion` do architektury Domain + DI (`Domain\\Promotion\\PromotionRepository`, `admin\\Controllers\\ShopPromotionController`)\n- UPDATE - modul `/admin/shop_promotion/*` przepiety z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit`\n- UPDATE - nowe widoki i partiale: `shop-promotion/promotions-list`, `shop-promotion/promotion-edit`, `shop-promotion/promotion-categories-selector`, `shop-promotion/promotion-categories-tree`, `shop-promotion/promotion-edit-custom-script`\n- CLEANUP - usuniete legacy klasy/pliki: `autoload/admin/controls/class.ShopPromotion.php`, `autoload/admin/factory/class.ShopPromotion.php`, `admin/templates/shop-promotion/view-list.php`\n- UPDATE - menu admin wskazuje kanoniczny URL `/admin/shop_promotion/list/`\n- UPDATE - testy: `OK (222 tests, 609 assertions)` + nowe pliki testowe `PromotionRepositoryTest`, `ShopPromotionControllerTest`"
  },
  {
    "version": "0.263",
    "date": "13.02.2026",
    "text": "- NEW - migracja modulu `Integrations` do architektury Domain + DI (`Domain\\Integrations\\IntegrationsRepository`, `admin\\Controllers\\IntegrationsController`)\n- CLEANUP - usunieto integracje Sellasist i Baselinker z calego projektu (kontrolery, factory, szablony, referencje w cron/Order/ShopStatuses/ShopTransport/ShopPaymentMethod/ShopProduct)\n- UPDATE - `admin\\factory\\Integrations` jako fasada delegujaca do repozytorium (tylko Apilo + ShopPRO)\n- FIX - naprawione polskie znaki w `product-edit.php` (usuniety podwojny encoding UTF-8/CP1250)\n- CLEANUP - usuniete pliki: `controls/Integrations`, `controls/Baselinker`, `factory/Baselinker`, `front/factory/Shop`, `shop/ShopStatus`, szablony sellasist/baselinker\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.263.zip`, `ver_0.263_files.txt`"
  },
  {
    "version": "0.262",
    "date": "13.02.2026",
    "text": "- NEW - migracja modulu `Pages` do architektury Domain + DI (`Domain\\Pages\\PagesRepository`, `admin\\Controllers\\PagesController`)\n- UPDATE - widoki `/admin/pages/*` przepiete na nowy routing i komponent `components/form-edit` (menu/page edit)\n- FIX - przywrocony przycisk generowania linku SEO w edycji strony (zakladka SEO, pola jezykowe)\n- FIX - popup potwierdzenia usuwania menu/strony ujednolicony z `table-list-confirm-dialog` + poprawione polskie znaki\n- CLEANUP - usuniete legacy pliki Pages: `admin/ajax/pages.php`, `autoload/admin/controls/class.Pages.php`, `autoload/admin/factory/class.Pages.php`, `autoload/admin/view/class.Pages.php`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.262.zip`, `ver_0.262_files.txt`"
  },
  {
    "version": "0.261",
    "date": "13.02.2026",
    "text": "- UPDATE - finalizacja refaktoryzacji modulu `Articles` (`/admin/articles`) w warstwie Domain + DI\n- UPDATE - nowe akcje AJAX w `admin\\Controllers\\ArticlesController` (m.in. `files_order_save`)\n- UPDATE - sortowanie zalacznikow i zdjec w edycji artykulu (drag&drop + zapis kolejnosci przy pierwszym zapisie)\n- UPDATE - utwardzenie uploadow (wspolny helper `libraries/plupload/upload-common.php`, walidacje i tokeny)\n- FIX - potwierdzenia usuwania zdjec/zalacznikow ujednolicone z widokiem listy (jquery-confirm)\n- CLEANUP - usuniete legacy `admin/ajax/articles.php` i `autoload/admin/view/class.Articles.php`\n- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.261.zip`, `ver_0.261_files.txt`, `ver_0.261_sql.txt`"
  },
  {
    "version": "0.260",
    "date": "12.02.2026",
    "text": "- NEW - migracja modulu `ArticlesArchive` do architektury Domain + DI (`admin\\Controllers\\ArticlesArchiveController`)\n- UPDATE - `Domain\\Article\\ArticleRepository` rozszerzone o metody `listArchivedForAdmin`, `restore`, `deletePermanently`\n- UPDATE - widok `/admin/articles_archive/view_list/` przepiety z legacy `grid` na `components/table-list`\n- UPDATE - routing DI (`admin\\Site`) rozszerzony o modul `ArticlesArchive` + mapowanie akcji `article_restore -> restore`\n- CLEANUP - usuniete legacy klasy `autoload/admin/controls/class.ArticlesArchive.php`, `autoload/admin/factory/class.ArticlesArchive.php`, `autoload/admin/view/class.ArticlesArchive.php`\n- UPDATE - plik do usuniecia dodany w `updates/0.20/ver_0.260_files.txt`"
  },
  {
    "version": "0.259",
    "date": "12.02.2026",
    "text": "- NEW - migracja modulu `Scontainers` do architektury Domain + DI (`Domain\\Scontainers\\ScontainersRepository`, `admin\\Controllers\\ScontainersController`)\n- UPDATE - widoki `/admin/scontainers/*` przepiete z legacy `grid/gridEdit` na `components/table-list` i `components/form-edit`\n- UPDATE - routing DI (`admin\\Site`) rozszerzony o modul `Scontainers` + mapowanie akcji `container_edit/container_save/container_delete`\n- UPDATE - `admin\\factory\\Scontainers` dziala jako fasada do repozytorium (backward compatibility)\n- UPDATE - `front\\factory\\Scontainers` korzysta z `Domain\\Scontainers\\ScontainersRepository`\n- CLEANUP - usuniete legacy klasy `autoload/admin/controls/class.Scontainers.php`, `autoload/admin/view/class.Scontainers.php`\n- UPDATE - plik do usuniecia dodany w `updates/0.20/ver_0.259_files.txt`"
  },
  {
    "version": "0.258",
    "date": "12.02.2026",
    "text": "- UPDATE - modul `Newsletter`: funkcjonalnosc `Wysylka - przygotowanie` zostala tymczasowo wylaczona (menu + akcje `prepare/send/preview`)\n- UPDATE - modul `Newsletter`: lista `Szablony uzytkownika` zostala tymczasowo wylaczona (menu + akcja `email_templates_user`)\n- UPDATE - `NewsletterController`: lista szablonow ograniczona do szablonow administracyjnych (`is_admin = 1`)\n- UPDATE - `email_template_edit` i `template_save` obsluguja tylko szablony administracyjne\n- CLEANUP - usuniete nieuzywane szablony newslettera: `admin/templates/newsletter/prepare.php`, `admin/templates/newsletter/preview.php`, `admin/templates/newsletter/email-templates-user.php`\n- UPDATE - plik do usuniecia dodany w `updates/0.20/ver_0.258_files.txt`"
  },
  {
    "version": "0.257",
    "date": "12.02.2026",
    "text": "- NEW - migracja modulu `Newsletter` do architektury Domain + DI (`Domain\\Newsletter\\NewsletterRepository`, `Domain\\Newsletter\\NewsletterPreviewRenderer`, `admin\\Controllers\\NewsletterController`)\n- UPDATE - widoki `/admin/newsletter/*` przepiete z legacy `grid/gridEdit` na nowe komponenty (`components/table-list`, `components/form-edit`) + nowy endpoint `/admin/newsletter/preview/`\n- UPDATE - routing DI (`admin\\Site`) rozszerzony o moduł `Newsletter`\n- UPDATE - `admin\\factory\\Newsletter` dziala jako fasada do nowego repozytorium (backward compatibility)\n- UPDATE - `front\\factory\\Newsletter` nie korzysta juz z `admin\\view\\Newsletter`\n- CLEANUP - usuniete legacy klasy `autoload/admin/controls/class.Newsletter.php`, `autoload/admin/view/class.Newsletter.php`"
  },
  {
    "version": "0.256",
    "date": "12.02.2026",
    "text": "- NEW - migracja modulu `Layouts` do architektury Domain + DI (`Domain\\Layouts\\LayoutsRepository`, `admin\\Controllers\\LayoutsController`)\n- UPDATE - lista `/admin/layouts/view_list/` przepieta z legacy `grid` na `components/table-list` (filtry, sortowanie, paginacja)\n- UPDATE - `layouts/layout-edit` korzysta z danych z repozytorium (menus/categories), bez wywolan legacy factory w widoku\n- UPDATE - `Domain\\Languages\\LanguagesRepository` rozszerzone o wspolna metode `defaultLanguageId()`\n- UPDATE - `admin\\Controllers\\ArticlesController` pobiera layouty przez `Domain\\Layouts\\LayoutsRepository` (DI)\n- CLEANUP - usuniete legacy klasy `autoload/admin/controls/class.Layouts.php`, `autoload/admin/view/class.Layouts.php`"
  },
  {
    "version": "0.255",
    "date": "12.02.2026",
    "text": "- UPDATE - kontrolery admin `Settings`, `Banners`, `Dictionaries`, `Articles` pobieraja liste jezykow przez `Domain\\Languages\\LanguagesRepository` (DI)\n- UPDATE - routing DI (`admin\\Site`) przekazuje `LanguagesRepository` do kontrolerow `Articles`, `Banners`, `Settings`, `Dictionaries`\n- UPDATE - aktywne legacy odwolania (`admin\\controls`, `admin\\factory\\Shop*`) przepiete z `admin\\factory\\Languages` na `LanguagesRepository`\n- FIX - `autoload/admin/factory/class.Languages.php` uzywa pelnego znacznika PHP (zgodnosc z `short_open_tag=Off`)"
  },
  {
    "version": "0.254",
    "date": "12.02.2026",
    "text": "- UPDATE - modul `Languages` w panelu admin przepiety na `Domain\\Languages\\LanguagesRepository` + `admin\\Controllers\\LanguagesController`\n- UPDATE - migracja widokow languages (`languages-list`, `language-edit`, `translations-list`, `translation-edit`) na `components/table-list` i `components/form-edit`\n- UPDATE - routing DI dla `Languages` w `admin\\Site` oraz kompatybilna fasada `admin\\factory\\Languages` delegujaca do repozytorium\n- UPDATE - naprawiono zapis edycji jezyka (ID jezyka pobierane z URL przy edycji)\n- UPDATE - globalne poprawki UX filtrów w `components/table-list` (kompaktowe kolumny `Aktywny`/`Domyslny`, spacing i pelna szerokosc selecta)\n- CLEANUP - usuniete legacy klasy: `autoload/admin/controls/class.Languages.php`, `autoload/admin/view/class.Languages.php`"
  },
  {
    "version": "0.253",
    "date": "12.02.2026",
    "text": "- UPDATE - modul `Users` w panelu admin w pelni przepiety na `Domain\\User\\UserRepository` + `admin\\Controllers\\UsersController`\n- UPDATE - migracja widokow users z `grid/gridEdit` na nowe komponenty (`components/table-list`, `components/form-edit`)\n- UPDATE - dodana walidacja warunkowa: przy wlaczonym 2FA pole `E-mail do 2FA` jest wymagane\n- UPDATE - globalne ulepszenia `components/table-list` (kompaktowe filtry select/status i odstepy w formularzu paginacji)\n- CLEANUP - usuniete legacy klasy users: `autoload/admin/controls/class.Users.php`, `autoload/admin/factory/class.Users.php`, `autoload/admin/view/class.Users.php`"
  },
  {
    "version": "0.252",
    "date": "10.02.2026",
    "text": "- UPDATE - migracja listy archiwum produktow do nowego komponentu tabeli (`components/table-list`) z filtrowaniem i paginacja\n- UPDATE - banery i archiwum produktow: wydzielenie CSS/JS do osobnych widokow `*-custom-script.php`\n- UPDATE - filemanager przepiety na nowy routing (`admin\\Controllers\\FilemanagerController`)\n- FIX - naprawiono blad `Invalid Key` w widoku filemanagera po refaktoryzacji\n- UPDATE - usunieto legacy klasy i stare szablony (`admin\\controls`, `admin\\view`, `admin/templates/product_archive`)"
  },
  {
    "version": "0.251",
    "date": "09.02.2026",
    "text": "- NEW - migracja modulu Dictionaries do nowej architektury (Domain + admin Controller + DI)\n- UPDATE - lista i formularz Dictionaries przepiete na nowe komponenty (`components/table-list`, `components/form-edit`)\n- UPDATE - dodano globalne ograniczenie szerokosci pierwszej kolumny (Lp.) w `components/table-list`\n- FIX - zapis tlumaczen jednostek obsluguje `lang_id` jako string (`pl`, `en`)\n- UPDATE - usunieto legacy klasy Dictionaries: `admin\\controls`, `admin\\factory`, `front\\factory`\n- UPDATE - przepieto uzycia na `Domain\\Dictionaries\\DictionariesRepository` (`shop-product`, `shop_product` admin)"
  },
  {
    "version": "0.250",
    "date": "",
    "text": "- UPDATE - refaktoryzacja Settings: `Domain\\Settings\\SettingsRepository` ma bezposredni dostep do bazy (bez delegacji do `admin\\factory\\Settings`)\n- UPDATE - przepieto pozostale uzycia `admin\\factory\\Settings` na `Domain\\Settings\\SettingsRepository` (`admin\\controls\\Settings`, `admin\\controls\\Newsletter`, `front\\factory\\Newsletter`)\n- UPDATE - DI dla SettingsController: repozytorium otrzymuje `$mdb` w `admin\\Site`\n- UPDATE - Settings: widok edycji przeniesiony na nowy mechanizm formularza (`FormEditViewModel` + `components/form-edit`) jak w banerach\n- UPDATE - usunieto nieuzywana legacy klase `autoload/admin/factory/class.Settings.php`\n- UPDATE - usunieto legacy fallback kontrolera `autoload/admin/controls/class.Settings.php`\n- UPDATE - usunieto nieuzywana klase widoku `autoload/admin/view/class.Settings.php`"
  },
  {
    "version": "0.249",
    "date": "",
    "text": "- FIX - banner edit: poprawiono zapisywanie danych jezykowych i synchronizacje CKEditor przed zapisem\n- FIX - banner edit: naprawiono hash zakladek (usunieto `undefined` w URL)\n- FIX - filemanager: przywrocono dzialanie popupa wyboru obrazka z banera\n- UPDATE - komunikaty zapisu w nowym formularzu sa wyswietlane w stylu panelu (bez natywnego alertu JS)\n- UPDATE - lista banerow: dodano kolumne miniatury oraz podglad duzego obrazka w popup po najechaniu\n- UPDATE - usunieto nieuzywane legacy klasy banerow: `admin\\view\\Banners`, `admin\\factory\\Banners`"
  },
  {
    "version": "0.248",
    "date": "",
    "text": "- UPDATE - filtry w nowych tabelach dzialaja automatycznie na `onchange`\n- UPDATE - `components/table-list`: auto-submit formularza filtrow po zmianie pola (select, date, text)"
  },
  {
    "version": "0.247",
    "date": "",
    "text": "- UPDATE - nowy dialog potwierdzenia usuwania w `components/table-list` (zamiast natywnego `confirm`)\n- UPDATE - popup usuwania: wiekszy rozmiar i centrowanie na srodku ekranu"
  },
  {
    "version": "0.246",
    "date": "",
    "text": "- UPDATE - migracja listy banerow do nowego mechanizmu tabeli (`components/table-list`, filtrowanie, sortowanie, paginacja)\n- UPDATE - `admin\\Controllers\\BannerController::list()` buduje `PaginatedTableViewModel`\n- UPDATE - `Domain\\Banner\\BannerRepository::listForAdmin()` (bezpieczne filtrowanie i sortowanie)\n- UPDATE - usunieto legacy kontroler `autoload/admin/controls/class.Banners.php`\n- UPDATE - plik do usuniecia dodany w `updates/0.20/ver_0.246_files.txt`"
  },
  {
    "version": "0.245",
    "date": "",
    "text": "- UPDATE - refaktoryzacja listy artykulow: wspolny komponent `admin/templates/components/table-list.php` + `PaginatedTableViewModel`\n- NEW - `admin\\Support\\TableListRequestFactory` (wspolna obsluga filtrow, sortowania i paginacji dla list)\n- UPDATE - `Domain\\Article\\ArticleRepository::listForAdmin()` utwardzone pod katem bezpieczenstwa (whitelist sortowania, bind params, limit per_page)\n- UPDATE - usunieto legacy `browse_list` dla modulu Articles\n- UPDATE - usuniete pliki legacy sa wyszczegolnione w `updates/0.20/ver_0.245_files.txt`\n- FIX - generator `.htaccess` i `libraries/htaccess.conf` (QSA dla `/admin/...`, komentarz niedozwolonych dyrektyw `SetHandler/AddHandler/ForceType`)"
  },
  {
    "version": "0.244",
    "date": "",
    "text": "- UPDATE - refaktoryzacja: article_save przeniesiony do Domain\\Article\\ArticleRepository::save() z prywatnymi helperami\n- UPDATE - refaktoryzacja: article_delete przeniesiony do Domain\\Article\\ArticleRepository::archive()\n- UPDATE - ArticlesController: nowe akcje save() i delete() z DI\n- UPDATE - admin\\factory\\Articles::article_save() i articles_set_archive() delegują do repozytorium (kompatybilność)"
  },
  {
    "version": "0.243",
    "date": "",
    "text": "- UPDATE - refaktoryzacja: cleanup nieprzypisanych plików/zdjęć artykułów przeniesiony do Domain\\Article\\ArticleRepository\n- UPDATE - ArticlesController::edit() używa repozytorium do cleanupu, a admin\\factory\\Articles zachowuje delegowanie (kompatybilność)"
  },
  {
    "version": "0.242",
    "date": "",
    "text": "- NEW - refaktoryzacja: Domain\\Article\\ArticleRepository + migracja article_edit do admin\\Controllers\\ArticlesController (DI)\n- UPDATE - admin\\factory\\Articles::article_details() deleguje do nowego repozytorium (kompatybilność zachowana)\n- UPDATE - metody przejęte przez nowe kontrolery oznaczone jako @deprecated w legacy kontrolerach admin\\controls"
  },
  {
    "version": "0.241",
    "date": "",
    "text": "- NEW - refaktoryzacja: admin\\Controllers\\ProductArchiveController - archiwum produktów z DI\n- NEW - ProductRepository::archive(), unarchive() - operacje archiwizacji w repozytorium\n- FIX - naprawiono SQL w liście archiwum (puste wyszukiwanie filtrowało wszystkie wyniki)\n- FIX - naprawiono brakujący filtr archive = 1 w zapytaniu bez wyszukiwania\n- UPDATE - wyczyszczono szablony archiwum (usunięto zbędne funkcje: apilo, baselinker, duplikowanie)"
  },
  {
    "version": "0.240",
    "date": "",
    "text": "- NEW - refaktoryzacja: Domain\\Settings\\SettingsRepository + admin\\Controllers\\SettingsController (architektura Domain-Driven)\n- NEW - refaktoryzacja: Domain\\Cache\\CacheRepository - czyszczenie cache z obsługą Redis\n- FIX - komunikat potwierdzenia zapisu ustawień w panelu administratora\n- FIX - naprawiono element #content w layoucie admina (powiadomienia grid.js)"
  },
  {
    "version": "0.239",
    "date": "",
    "text": "- NEW - refaktoryzacja: Domain\\Banner\\BannerRepository + admin\\Controllers\\BannerController (pełna migracja kontrolera)\n- NEW - refaktoryzacja: Domain\\Product\\ProductRepository::getPrice(), getName() - migracja kolejnych metod\n- NEW - router admin z obsługą nowych kontrolerów (fallback na stare)\n- UPDATE - shop\\Product::get_product_price(), get_product_name() używają nowego repozytorium (kompatybilność zachowana)"
  },
  {
    "version": "0.238",
    "date": "",
    "text": "- NEW - refaktoryzacja: Domain\\Product\\ProductRepository - pierwsza klasa w nowej architekturze Domain-Driven\n- NEW - Dependency Injection zamiast global variables\n- UPDATE - shop\\Product::get_product_quantity() używa teraz nowego repozytorium (kompatybilność zachowana)"
  },
  {
    "version": "0.237",
    "date": "",
    "text": "- NEW - automatyczne czyszczenie cache produktu po aktualizacji przez CRON (Sellasist, Apilo, Baselinker)\n- UPDATE - przycisk \"Wyczyść cache\" w panelu administratora z obsługą AJAX i komunikatami o postępie"
  },
  {
    "version": "0.236",
    "date": "",
    "text": "- FIX - zabezpieczenie przed duplikatami zamówień w Apilo - automatyczne pobieranie ID zamówienia przy błędzie \"idExternal już wykorzystywany\""
  },
  {
    "version": "0.235",
    "date": "",
    "text": "- FIX - poprawka funkcji aktualizacji"
  },
  {
    "version": "0.234",
    "date": "",
    "text": "- NEW - przycisk zaznaczania zamówienia jako wysłane do trustmate.io"
  },
  {
    "version": "0.232",
    "date": "",
    "text": "- NEW - opcje GPSR"
  },
  {
    "version": "0.231",
    "date": "",
    "text": "- FIX - poprawki bezpieczeństwa + dwuetapowa weryfikacja logowania"
  },
  {
    "version": "0.230",
    "date": "",
    "text": "- FIX - poprawki bezpieczeństwa"
  },
  {
    "version": "0.229",
    "date": "",
    "text": "- NEW - pola dodatkowe z opcją wymagane/niewymagane"
  },
  {
    "version": "0.228",
    "date": "",
    "text": "- NEW - cron do wysyłania zamówień do trustmate.io"
  },
  {
    "version": "0.227",
    "date": "",
    "text": "- NEW - historia kodów rabatowych"
  },
  {
    "version": "0.226",
    "date": "",
    "text": "- NEW - dodanie opcji faktury do zamówienia"
  },
  {
    "version": "0.225",
    "date": "",
    "text": "- NEW - przycisk czyszczenia cache\n- NEW - ponowne wysyłanie zamówienia do apilo"
  },
  {
    "version": "0.224",
    "date": "",
    "text": "- NEW - sortowanie form dostawy"
  },
  {
    "version": "0.223",
    "date": "",
    "text": "- FIX - integracja z Orlen Paczka"
  },
  {
    "version": "0.222",
    "date": "",
    "text": "- NEW - integracja z Orlen Paczka"
  },
  {
    "version": "0.221",
    "date": "",
    "text": "- NEW - Automatyczne przekierowania adresów URL produktów, zmiany w pliku htaccess"
  },
  {
    "version": "0.220",
    "date": "",
    "text": "- NEW - Dodanie możliwości wyświetlenia na strone ostatnio dodane produkty [PRODUKTY_NEW] lub [PRODUKTY_NEW:10].\n- NEW - Dodanie możliwości wyświetlenia na strone popularnych produktów [PRODUKTY_TOP] lub [PRODUKTY_TOP:10]."
  },
  {
    "version": "0.219",
    "date": "",
    "text": "- NEW - Dodanie możliwości zmiany daty w artykułach"
  },
  {
    "version": "0.218",
    "date": "",
    "text": "- NEW - indywidualny kod GTM"
  },
  {
    "version": "0.217",
    "date": "",
    "text": "- NEW - zwiększenie obsługi REDIS"
  },
  {
    "version": "0.216",
    "date": "",
    "text": "- NEW - aktualizacja api i cron (apilo)"
  },
  {
    "version": "0.215",
    "date": "",
    "text": "- FIX - generowanie pliku .htaccess"
  },
  {
    "version": "0.214",
    "date": "",
    "text": "- NEW - dodanie API"
  },
  {
    "version": "0.213",
    "date": "",
    "text": "- FIX - wyliczenie darmowej dostawy"
  },
  {
    "version": "0.212",
    "date": "",
    "text": "- NEW - zmiany w zapisywaniu zamówienia do apilo"
  },
  {
    "version": "0.211",
    "date": "",
    "text": "- NEW - Debugowanie apilo + wyświetlanie podkategorii"
  },
  {
    "version": "0.210",
    "date": "",
    "text": "- NEW - dodatkowe pola w widoku produktów"
  },
  {
    "version": "0.209",
    "date": "",
    "text": "- NEW - zmiany w widoku produktów (panel administratora)"
  },
  {
    "version": "0.208",
    "date": "",
    "text": "- NEW - zmiany w wyszukiwarce produktów"
  },
  {
    "version": "0.204-0.207",
    "date": "",
    "text": "- NEW - htaccess update"
  },
  {
    "version": "0.204-0.206",
    "date": "",
    "text": "- NEW - wysyłanie produktów do apilo"
  },
  {
    "version": "0.203",
    "date": "",
    "text": "- NEW - zmiana sposobu wyliczania cen produkty z dodatkami"
  },
  {
    "version": "0.202",
    "date": "",
    "text": "- NEW - dodano \"główne zdjęcie\" w edycji artykułu"
  },
  {
    "version": "0.201",
    "date": "",
    "text": "- FIX - aktualizacja statusów na podstawie baselinkera"
  },
  {
    "version": "0.200",
    "date": "",
    "text": "- NEW - wysyłanie produktów do baselinker"
  },
  {
    "version": "0.199",
    "date": "",
    "text": "- NEW - usprawnienie edycji danych do XML"
  },
  {
    "version": "0.198",
    "date": "",
    "text": "- NEW - automatyczne generowanie kodów SKU"
  },
  {
    "version": "0.197",
    "date": "",
    "text": "- FIX - poprawki w Dashboard"
  },
  {
    "version": "0.196",
    "date": "",
    "text": "- FIX - integracja z apilo.com"
  },
  {
    "version": "0.195",
    "date": "",
    "text": "- FIX - aktualizacja statusów"
  },
  {
    "version": "0.194",
    "date": "",
    "text": "- UPDATE - integracja apilo"
  },
  {
    "version": "0.193",
    "date": "",
    "text": "- UPDATE - aktualizacja synchronizacji z baselinker"
  },
  {
    "version": "0.192",
    "date": "",
    "text": "- NEW - pobieranie statusów z sellasist"
  },
  {
    "version": "0.191",
    "date": "",
    "text": "- NEW - integracja z selasist"
  },
  {
    "version": "0.190",
    "date": "",
    "text": "- FIX - produkty powiązane"
  },
  {
    "version": "0.189",
    "date": "",
    "text": "- FIX - ceny promocyjne produktów z dodatkiem"
  },
  {
    "version": "0.188",
    "date": "",
    "text": "- NEW - widok listy produktów"
  },
  {
    "version": "0.187",
    "date": "",
    "text": "- FIX - pobieranie cen z APILO"
  },
  {
    "version": "0.186",
    "date": "",
    "text": "- FIX - dodawanie do koszyka tych samych produktów ale z różną personalizacją"
  },
  {
    "version": "0.185",
    "date": "",
    "text": "- FIX - masowa edycja produktów"
  },
  {
    "version": "0.184",
    "date": "",
    "text": "- NEW - druga część integracji z apilo, masowa edycja produktów"
  },
  {
    "version": "0.183",
    "date": "",
    "text": "- NEW - pierwsza część integracji z apilo"
  },
  {
    "version": "0.182",
    "date": "",
    "text": "- FIX - layout"
  },
  {
    "version": "0.181",
    "date": "",
    "text": "- NEW - infinitescroll - opcja włączy/wyłącz"
  },
  {
    "version": "0.180",
    "date": "",
    "text": "- NEW - aktualizacja dashboard"
  },
  {
    "version": "0.179",
    "date": "",
    "text": "- NEW - obsługa EAN"
  },
  {
    "version": "0.177, 0.178",
    "date": "",
    "text": "- FIX - custom_label"
  },
  {
    "version": "0.176",
    "date": "",
    "text": "- NEW - custom_label"
  },
  {
    "version": "0.175",
    "date": "",
    "text": "- NEW - nowe statystyki"
  },
  {
    "version": "0.174",
    "date": "",
    "text": "- FIX - generowanie xml"
  },
  {
    "version": "0.173",
    "date": "",
    "text": "- NEW - duplikowanie produktu wraz z kombinacjami\n- NEW - dodanie przechodzenia pomiędzy zamówienia (poprzednie/następne zamówienie)"
  },
  {
    "version": "0.172",
    "date": "",
    "text": "- FIX - poprawki w Cache"
  },
  {
    "version": "0.171",
    "date": "",
    "text": "- FIX - poprawki w Cache"
  },
  {
    "version": "0.170",
    "date": "",
    "text": "- NEW - usuwanie cache produktu przy zapisie"
  },
  {
    "version": "0.169",
    "date": "",
    "text": "- FIX - poprawki w liście produktów"
  },
  {
    "version": "0.168",
    "date": "",
    "text": "- NEW - archiwum produktów"
  },
  {
    "version": "0.167",
    "date": "",
    "text": "- NEW - dodanie obsługi cen i stanów magazynowych kombinacji produktów"
  },
  {
    "version": "0.166",
    "date": "",
    "text": "- NEW - współpraca z GTM"
  },
  {
    "version": "0.164/5",
    "date": "",
    "text": "- FIX - ukrywanie produktów nieaktywnych"
  },
  {
    "version": "0.163",
    "date": "",
    "text": "- NEW - automatyczne podpowiadanie produktów do zestawu na podstawie wcześniejszych zakupów klientów"
  },
  {
    "version": "0.162",
    "date": "",
    "text": "- NEW - GA4"
  },
  {
    "version": "0.161",
    "date": "",
    "text": "- UPDATE - aktualizacja menu administratora"
  },
  {
    "version": "0.160",
    "date": "",
    "text": "- UPDATE - aktualizacja cron Baselinker\n- NEW - waga i cena jednostkowa produktu"
  },
  {
    "version": "0.159",
    "date": "",
    "text": "- FIX - cron Baselinker"
  },
  {
    "version": "0.158",
    "date": "",
    "text": "- UPDATE - poprawa kolorystyki przycisków"
  },
  {
    "version": "0.157",
    "date": "",
    "text": "- NEW - szybka zmiana statusu produktu"
  },
  {
    "version": "0.156",
    "date": "",
    "text": "- NEW - dodanie szybkiej edycji google xml label"
  },
  {
    "version": "0.155",
    "date": "",
    "text": "- NEW - infinite scroll w widoku kategorii"
  },
  {
    "version": "0.154",
    "date": "",
    "text": "- FIX - atrybuty produktów"
  },
  {
    "version": "0.153",
    "date": "",
    "text": "- FIX - atrybuty produktów"
  },
  {
    "version": "0.152",
    "date": "",
    "text": "- FIX - tematy maili"
  },
  {
    "version": "0.151",
    "date": "",
    "text": "- FIX - tematy maili"
  },
  {
    "version": "0.150",
    "date": "",
    "text": "- NEW - domyślna forma transportu"
  },
  {
    "version": "0.149",
    "date": "",
    "text": "- NEW - tematy maili"
  },
  {
    "version": "0.148",
    "date": "",
    "text": "- FIX - cron-xml"
  },
  {
    "version": "0.147",
    "date": "",
    "text": "- FIX - cron-xml"
  },
  {
    "version": "0.146",
    "date": "",
    "text": "- NEW - cron-xml"
  },
  {
    "version": "0.145",
    "date": "",
    "text": "- NEW - omnibus ready"
  },
  {
    "version": "0.144",
    "date": "",
    "text": "- FIX - usunięcie adresu marianek.pl z kodu"
  },
  {
    "version": "0.143",
    "date": "",
    "text": "- FIX - poprawa generowania plików WEBP"
  },
  {
    "version": "0.142",
    "date": "",
    "text": "- FIX - poprawa adresu strony głównej"
  },
  {
    "version": "0.141",
    "date": "",
    "text": ""
  },
  {
    "version": "0.140",
    "date": "",
    "text": ""
  },
  {
    "version": "0.139",
    "date": "",
    "text": ""
  },
  {
    "version": "0.138",
    "date": "",
    "text": ""
  },
  {
    "version": "0.137",
    "date": "",
    "text": ""
  },
  {
    "version": "0.136",
    "date": "",
    "text": ""
  },
  {
    "version": "0.135",
    "date": "",
    "text": ""
  },
  {
    "version": "0.134",
    "date": "",
    "text": ""
  },
  {
    "version": "0.133",
    "date": "",
    "text": ""
  },
  {
    "version": "0.132",
    "date": "",
    "text": ""
  },
  {
    "version": "0.131",
    "date": "",
    "text": ""
  },
  {
    "version": "0.130",
    "date": "",
    "text": ""
  },
  {
    "version": "0.129",
    "date": "",
    "text": ""
  },
  {
    "version": "0.128",
    "date": "",
    "text": ""
  },
  {
    "version": "0.127",
    "date": "",
    "text": ""
  },
  {
    "version": "0.126",
    "date": "",
    "text": ""
  },
  {
    "version": "0.125",
    "date": "",
    "text": ""
  },
  {
    "version": "0.124",
    "date": "",
    "text": ""
  },
  {
    "version": "0.123",
    "date": "",
    "text": ""
  },
  {
    "version": "0.122",
    "date": "",
    "text": ""
  },
  {
    "version": "0.121",
    "date": "",
    "text": ""
  },
  {
    "version": "0.120",
    "date": "",
    "text": ""
  },
  {
    "version": "0.119",
    "date": "",
    "text": ""
  },
  {
    "version": "0.118",
    "date": "",
    "text": ""
  },
  {
    "version": "0.117",
    "date": "",
    "text": ""
  },
  {
    "version": "0.116",
    "date": "",
    "text": ""
  },
  {
    "version": "0.115",
    "date": "",
    "text": ""
  },
  {
    "version": "0.114",
    "date": "",
    "text": ""
  },
  {
    "version": "0.113",
    "date": "",
    "text": ""
  },
  {
    "version": "0.112",
    "date": "",
    "text": ""
  },
  {
    "version": "0.111",
    "date": "",
    "text": ""
  },
  {
    "version": "0.110",
    "date": "",
    "text": ""
  },
  {
    "version": "0.109",
    "date": "",
    "text": ""
  },
  {
    "version": "0.108",
    "date": "",
    "text": ""
  },
  {
    "version": "0.107",
    "date": "",
    "text": ""
  },
  {
    "version": "0.106",
    "date": "",
    "text": ""
  },
  {
    "version": "0.105",
    "date": "",
    "text": ""
  },
  {
    "version": "0.104",
    "date": "",
    "text": ""
  },
  {
    "version": "0.103",
    "date": "",
    "text": ""
  },
  {
    "version": "0.102",
    "date": "",
    "text": ""
  },
  {
    "version": "0.101",
    "date": "",
    "text": ""
  },
  {
    "version": "0.100",
    "date": "",
    "text": ""
  },
  {
    "version": "0.099",
    "date": "",
    "text": ""
  },
  {
    "version": "0.098",
    "date": "",
    "text": ""
  },
  {
    "version": "0.097",
    "date": "",
    "text": ""
  },
  {
    "version": "0.096",
    "date": "",
    "text": ""
  },
  {
    "version": "0.095",
    "date": "",
    "text": ""
  },
  {
    "version": "0.094",
    "date": "",
    "text": ""
  },
  {
    "version": "0.093",
    "date": "",
    "text": ""
  },
  {
    "version": "0.092",
    "date": "",
    "text": ""
  },
  {
    "version": "0.091",
    "date": "",
    "text": ""
  },
  {
    "version": "0.090",
    "date": "",
    "text": ""
  },
  {
    "version": "0.089",
    "date": "",
    "text": ""
  },
  {
    "version": "0.088",
    "date": "",
    "text": ""
  },
  {
    "version": "0.087",
    "date": "",
    "text": ""
  },
  {
    "version": "0.086",
    "date": "",
    "text": ""
  },
  {
    "version": "0.085",
    "date": "",
    "text": ""
  },
  {
    "version": "0.084",
    "date": "",
    "text": ""
  },
  {
    "version": "0.083",
    "date": "",
    "text": ""
  },
  {
    "version": "0.082",
    "date": "",
    "text": ""
  },
  {
    "version": "0.081",
    "date": "",
    "text": ""
  },
  {
    "version": "0.080",
    "date": "",
    "text": ""
  },
  {
    "version": "0.079",
    "date": "",
    "text": ""
  },
  {
    "version": "0.078",
    "date": "",
    "text": ""
  },
  {
    "version": "0.077",
    "date": "",
    "text": ""
  },
  {
    "version": "0.076",
    "date": "",
    "text": ""
  },
  {
    "version": "0.075",
    "date": "",
    "text": ""
  },
  {
    "version": "0.074",
    "date": "",
    "text": ""
  },
  {
    "version": "0.073",
    "date": "",
    "text": ""
  },
  {
    "version": "0.072",
    "date": "",
    "text": ""
  },
  {
    "version": "0.071",
    "date": "",
    "text": ""
  },
  {
    "version": "0.070",
    "date": "",
    "text": ""
  },
  {
    "version": "0.069",
    "date": "",
    "text": ""
  },
  {
    "version": "0.068",
    "date": "",
    "text": ""
  },
  {
    "version": "0.067",
    "date": "",
    "text": ""
  },
  {
    "version": "0.066",
    "date": "",
    "text": ""
  },
  {
    "version": "0.065",
    "date": "",
    "text": ""
  },
  {
    "version": "0.064",
    "date": "",
    "text": ""
  },
  {
    "version": "0.063",
    "date": "",
    "text": ""
  },
  {
    "version": "0.062",
    "date": "",
    "text": ""
  },
  {
    "version": "0.061",
    "date": "",
    "text": ""
  },
  {
    "version": "0.060",
    "date": "",
    "text": ""
  },
  {
    "version": "0.059",
    "date": "",
    "text": ""
  },
  {
    "version": "0.058",
    "date": "",
    "text": ""
  },
  {
    "version": "0.057",
    "date": "",
    "text": ""
  },
  {
    "version": "0.056",
    "date": "",
    "text": ""
  },
  {
    "version": "0.055",
    "date": "",
    "text": ""
  },
  {
    "version": "0.054",
    "date": "",
    "text": ""
  },
  {
    "version": "0.053",
    "date": "",
    "text": ""
  },
  {
    "version": "0.052",
    "date": "",
    "text": ""
  },
  {
    "version": "0.051",
    "date": "",
    "text": ""
  },
  {
    "version": "0.050",
    "date": "",
    "text": ""
  },
  {
    "version": "0.049",
    "date": "",
    "text": ""
  },
  {
    "version": "0.048",
    "date": "",
    "text": ""
  },
  {
    "version": "0.047",
    "date": "",
    "text": ""
  },
  {
    "version": "0.046",
    "date": "",
    "text": ""
  },
  {
    "version": "0.045",
    "date": "",
    "text": ""
  },
  {
    "version": "0.044",
    "date": "",
    "text": ""
  },
  {
    "version": "0.043",
    "date": "",
    "text": ""
  },
  {
    "version": "0.042",
    "date": "",
    "text": ""
  },
  {
    "version": "0.041",
    "date": "",
    "text": ""
  },
  {
    "version": "0.040",
    "date": "",
    "text": ""
  },
  {
    "version": "0.039",
    "date": "",
    "text": ""
  },
  {
    "version": "0.038",
    "date": "",
    "text": ""
  },
  {
    "version": "0.037",
    "date": "",
    "text": ""
  },
  {
    "version": "0.036",
    "date": "",
    "text": ""
  },
  {
    "version": "0.035",
    "date": "",
    "text": ""
  },
  {
    "version": "0.034",
    "date": "",
    "text": ""
  },
  {
    "version": "0.033",
    "date": "",
    "text": ""
  },
  {
    "version": "0.032",
    "date": "",
    "text": ""
  },
  {
    "version": "0.031",
    "date": "",
    "text": ""
  },
  {
    "version": "0.030",
    "date": "",
    "text": ""
  },
  {
    "version": "0.029",
    "date": "",
    "text": ""
  },
  {
    "version": "0.028",
    "date": "",
    "text": ""
  },
  {
    "version": "0.027",
    "date": "",
    "text": ""
  },
  {
    "version": "0.026",
    "date": "",
    "text": ""
  },
  {
    "version": "0.025",
    "date": "",
    "text": ""
  },
  {
    "version": "0.024",
    "date": "",
    "text": ""
  },
  {
    "version": "0.023",
    "date": "",
    "text": ""
  },
  {
    "version": "0.022",
    "date": "",
    "text": ""
  },
  {
    "version": "0.021",
    "date": "",
    "text": ""
  },
  {
    "version": "0.020",
    "date": "",
    "text": ""
  },
  {
    "version": "0.019",
    "date": "",
    "text": ""
  },
  {
    "version": "0.018",
    "date": "",
    "text": ""
  },
  {
    "version": "0.017",
    "date": "",
    "text": ""
  },
  {
    "version": "0.016",
    "date": "",
    "text": ""
  },
  {
    "version": "0.015",
    "date": "",
    "text": ""
  },
  {
    "version": "0.014",
    "date": "",
    "text": ""
  },
  {
    "version": "0.013",
    "date": "",
    "text": ""
  },
  {
    "version": "0.012",
    "date": "",
    "text": ""
  },
  {
    "version": "0.011",
    "date": "",
    "text": ""
  },
  {
    "version": "0.010",
    "date": "",
    "text": ""
  },
  {
    "version": "0.009",
    "date": "",
    "text": ""
  },
  {
    "version": "0.008",
    "date": "",
    "text": ""
  },
  {
    "version": "0.007",
    "date": "",
    "text": ""
  },
  {
    "version": "0.006",
    "date": "",
    "text": ""
  },
  {
    "version": "0.005",
    "date": "",
    "text": ""
  },
  {
    "version": "0.004",
    "date": "",
    "text": ""
  },
  {
    "version": "0.003",
    "date": "",
    "text": ""
  },
  {
    "version": "0.002",
    "date": "",
    "text": ""
  },
  {
    "version": "0.001",
    "date": "",
    "text": ""
  }
]