# Changelog
Wszystkie istotne zmiany w tej wtyczce dokumentowane są w tym pliku.
Format oparty na [Keep a Changelog](https://keepachangelog.com/pl/1.0.0/),
wersjonowanie zgodne z [SemVer](https://semver.org/lang/pl/).
## [1.0.14] – 2026-07-31
### Changed
– Moduł wpdesk-integration wymieniony na OFICJALNIE wygenerowany instalatorem `composer create-project wpdesk/wpdesk-sdk wpdesk-integration` (wg instrukcji WP Desk): biblioteka wp-wpdesk-license 4.1.0, unikalny per projekt namespace `FlexibleCurrencySwitcher\Vendor` i unikalny hash autoloadera — zastępuje ręcznie przescope’owaną kopię z 1.0.6/1.0.12.
– Bootstrap integracji: product_id ustawiony na uzgodnione „Flexible Currency Switcher” (instalator wykrył nazwę z nagłówka z sufiksem „for WooCommerce” — skorygowane dla ciągłości z wersją zatwierdzoną przez WP Desk).
– Pierwsza wersja publikowana samodzielnie przez API licencji WP Desk (POST /api/v1/products/{product_id}/upload).
## [1.0.13] – 2026-07-21
### Changed
– **Internacjonalizacja pod dystrybucję na wpdesk.net:** stringi źródłowe w kodzie przełączone z polskiego na ANGIELSKI (122 stringi w PHP + JS edytora bloków + block.json + nagłówek wtyczki); polski przeniesiony do pełnego tłumaczenia `languages/flexible-currency-switcher-pl_PL.po/.mo` (126 wpisów, msgfmt –check czysty) — polscy użytkownicy widzą DOKŁADNIE dotychczasowe teksty, pozostałe języki angielski.
– Tłumaczenia edytora bloków: JSON (JED) dla `pl_PL` + `wp_set_script_translations` dla handle `fcs-switcher-editor`.
– Hardcodowane polskie fallbacki w admin.js („Błąd.”, „Błąd połączenia.”) przeniesione do `wp_localize_script` (tłumaczalne).
– `readme.txt` po angielsku (z sekcją Known limitations); changelog.txt pozostaje po polsku jako dokument wewnętrzny.
– `.pot` regenerowany ze źródeł EN, z wpisami Plugin Name/Description i metadanych bloku (msgctxt).
– Po 3-agentowej weryfikacji tłumaczeń (kompletność / jakość EN / wierność PL): błędy providerów ECB/NBP i statusy kursów przełączone na EN + `__()` (przeciekały po polsku do panelu na anglojęzycznych stronach); ujednolicone nazewnictwo — menu i H1 to teraz „Currency Switcher”/„Flexible Currency Switcher” (nie „Currency Converter”); WP-CLI po angielsku; kilkanaście poprawek idiomatyki EN (m.in. „Ending in .99″, przycisk „Export settings”); Plural-Forms wg konwencji WP (nplurals=3). Finalnie: 135 wpisów w pl_PL.po/.mo, `msgfmt –check` czysty, placeholdery 1:1.
## [1.0.12] – 2026-07-15
### Fixed
– **Fatal error przy jednoczesnej aktywacji dwóch wtyczek z biblioteką wpdesk-integration** (zgłoszone przez WP Desk jako naprawione w ich wpdesk-sdk 2.0.4): kopiowana biblioteka miała identyczny wygenerowany hash klas autoloadera Composera (`ComposerAutoloaderInitd451c…`/`ComposerStaticInitd451c…`) co Woo MailerLite Groups → `Cannot redeclare class` przy aktywacji obu. Hash przemianowany na unikalny per wtyczka (`a8be4f03…`, md5 z centrum-zw/flexible-currency-switcher-wpdesk-integration) w vendor/autoload.php + autoload_real.php + autoload_static.php. Zweryfikowane testem: załadowanie obu autoloaderów w jednym procesie bez fatala, obie biblioteki (scoped namespace’y ML i FCS) niezależnie sprawne. UWAGA: to samodzielna naprawa równoważna skutkowi — przy dostępie do oficjalnej paczki wpdesk-sdk 2.0.4 zalecana podmiana całego modułu na ich wersję.
## [1.0.11] – 2026-07-14
### Changed
– Autor wtyczki: „WP Desk” → „Centrum ZW” (na prośbę WP Desk: wtyczka nie jest ich oficjalnym produktem; usunięte Plugin URI / Author URI wskazujące wpdesk.net, zaktualizowane Contributors w readme, nagłówki .pot i composer.json). Moduł `wpdesk-integration` (SDK licencji) pozostaje bez zmian — to celowo ich biblioteka.
## [1.0.10] – 2026-06-24
### Changed
– Dokumentacja (readme): znane ograniczenie — progi darmowej wysyłki i min./maks. kwoty kuponu są przeliczane kursem, więc przy ręcznych cenach walutowych produktów (odbiegających od kursu) próg i suma koszyka mogą się rozjechać. Bez zmian w kodzie.
## [1.0.9] – 2026-06-24
### Fixed
– **Sprostowanie do 1.0.8**: poprawka symbolu waluty była wykazana w changelogu 1.0.8, ale NIE weszła do kodu (wykryte w drugiej rundzie audytu). Faktyczny fix jest tutaj: `FCS_Formatting::symbol()` honoruje własny symbol tylko przy aktywnej wtyczce i nigdy dla waluty głównej.
– Końcówki charm przy walucie z `decimals 24h i po cichu unieruchamiał przełącznik); pozostaje walidacja po białej liście; wzorzec jak publiczne endpointy koszykowe Woo. Świadome odstępstwo od checklisty — bez operacji uprzywilejowanych.
– **[Ś] Charm przy cenach < 1**: końcówki ,99/,95/,50/,00 nie są stosowane poniżej 1 jednostki waluty (0,69 € nie staje się 0,99 €).
– **[N] Widget**: respektuje ustawienie „Wygląd" (wcześniej zawsze select).
– **[N] Symbol**: własny symbol nie działa przy wyłączonej wtyczce ani dla waluty głównej.
– **[N] Narzut**: zakres ograniczony do −99…+500%.
– **[N] Import**: pobiera kursy auto od razu (spójnie z zapisem formularza).
– **[N] Duplikat waluty**: pierwsza karta wygrywa, druga nie nadpisuje po cichu.
– **[N] Higiena**: ABSPATH guard w `ExternalIntegration.php`; uninstall czyści `_fcs_prices` i transienty; pliki deweloperskie (composer.json, phpcs.xml.dist, .gitignore) poza ZIP-em produkcyjnym.
### Added
– Publiczne API `fcs_convert_amount()` (surowa konwersja) + filtr `fcs_converted_amount_raw` — dla integracji przeliczających kwoty niebędące cenami (opłaty, rabaty).
– Readme: sekcja „Znane ograniczenia" (fees, filtr cenowy, analityka, komunikaty progu darmowej wysyłki w motywach, wymóg cache).
## [1.0.7] – 2026-06-24
### Fixed
– **Koszty wysyłki nie były przeliczane** (zmieniał się tylko symbol): filtr `woocommerce_package_rates` (koszt + podatki, mnożenie kursem bez zaokrągleń „marketingowych") + `woocommerce_cart_shipping_packages` dodaje walutę do paczki (bust cache stawek w sesji WC).
– **Przełącznik „przyciski" nie działał**: handler JS łapał tylko `.fcs-switcher–links`, a CSS `background: currentColor` czynił tekst aktywnego przycisku niewidocznym.
– **Zapis nadpisywał pobrany kurs**: pole kursu w formularzu miało starą wartość; przy walucie „auto" zapis zachowuje teraz kurs z bazy (kurs jest własnością systemu), a pole jest readonly.
– **Cron resetowany przy każdym zapisie** (`wp_clear_scheduled_hook` bezwarunkowo → pobranie kursu ~60 s po każdym zapisie): teraz tylko `maybe_reschedule()` przy realnej zmianie.
### Changed
– Kursy auto pobierane synchronicznie przy zapisie ustawień (`update_all(true)` z pominięciem rate limitu) — zmiana źródła/narzutu widoczna od razu; przycisk „Pobierz kursy teraz" odświeża pola formularza przez AJAX (bez przeładowania).
– Zapis/import wraca na aktywną zakładkę (ukryte pole `fcs_active_tab` + parametr `tab` w redirect).
– Bramki per waluta działają bez globalnego włącznika `gateway_restrictions` (opcja usunięta z UI i logiki).
– Nowa waluta domyślnie „Aktywna"; notice u góry ustawień wylicza, czego brakuje do działania na froncie; przebudowane opisy przełącznika.
## [1.0.6] – 2026-06-24
### Added
– Moduł `wpdesk-integration` (licencje + aktualizacje z serwera WP Desk): biblioteka wp-wpdesk-license przescope'owana do namespace `Ollimport\FlexibleCurrencySwitcher\Vendor` (brak kolizji klas z innymi wtyczkami WP Desk na tej samej stronie), bootstrap z product_id "Flexible Currency Switcher", ładowany z głównego pliku wtyczki.
– Rate limit na pobieranie kursów z API ECB/NBP: transient `fcs_rates_lock`, min. 60 s między pobraniami (chroni przed spamem przycisku i nakładaniem się cron/CLI/AJAX).
## [1.0.5] – 2026-06-24
### Fixed
– Mylące etykiety pozycji symbolu waluty — wszystkie przykłady pokazywały symbol za kwotą. Teraz jasno: „Przed kwotą (€99)" / „Za kwotą (99€)". Logika `price_format` bez zmian (była poprawna).
## [1.0.4] – 2026-06-24
### Added
– Konfiguracja narzędzi jakości kodu pod CI: `composer.json` (woocommerce/woocommerce-sniffs, php-stubs/woocommerce-stubs) + `phpcs.xml.dist` (ruleset WooCommerce-Core, text domain, prefiksy, minimum WP 6.0 / PHP 7.4) + `.gitignore`.
## [1.0.3] – 2026-06-24
### Added
– Tryb geolokalizacji zgodny z cache pełnych stron: wykrywanie waluty po stronie klienta przez nonce'owany AJAX (`assets/js/geo.js`, endpoint `fcs_detect_currency`), z jednorazowym przeładowaniem.
– Import i eksport konfiguracji walut w formacie JSON (admin-post `fcs_export`/`fcs_import`, nonce + capability, sanityzacja importu).
– Deklaracja kompatybilności WooCommerce `cart_checkout_blocks` (blokowy koszyk/checkout, Store API).
– Plik tłumaczeń `languages/flexible-currency-switcher.pot`.
### Changed
– Nagłówki zgodności: Tested up to 6.8 / WC tested up to 9.8.
## [1.0.2] – 2026-06-23
### Added
– Blok Gutenberga „Przełącznik walut (Flexible)" (`fcs/switcher`, render dynamiczny po stronie serwera) — `FCS_Block`.
– Zgodność z WooCommerce Subscriptions (`FCS_Subscriptions`): odnowienia subskrypcji wymuszają walutę pierwotnego zakupu (cron bez sesji klienta nie spadnie do waluty głównej).
– `FCS_Resolver::reset()` do czyszczenia zapamiętanej waluty requestu.
## [1.0.1] – 2026-06-23
### Added
– Automatyczne kursy ECB i NBP: providery `FCS_ECB_Rate_Provider` / `FCS_NBP_Rate_Provider`, menedżer `FCS_Rates_Manager` z cronem (daily/twicedaily/hourly), ręcznym odświeżaniem AJAX i narzutem %.
– Ręczne ceny walutowe per produkt i wariant (meta `_fcs_prices`) — nadpisują kurs.
– Formatowanie per waluta: własny symbol, pozycja symbolu, liczba miejsc, separatory (`FCS_Formatting`).
– Ograniczanie bramek płatności per waluta.
– Przeliczanie kuponów stałokwotowych (`fixed_cart`/`fixed_product`).
– Przełącznik w trybie „przyciski" oraz pływający przełącznik w stopce.
– Panel administracyjny w zakładkach (Ogólne / Waluty / Auto-kursy / Integracje) ze statusem kursów.
– Komendy WP-CLI: `wp fcs refresh-rates`, `wp fcs status`.
– Hooki aktywacji/dezaktywacji zarządzające zadaniem cron.
### Changed
– Warstwa cenowa uwzględnia stałe ceny walutowe przed zastosowaniem kursu.
## [1.0.0] – 2026-06-23
### Added
– Wybór walut sprzedaży z listy WooCommerce.
– Przypisywanie walut do krajów.
– Kurs (mnożnik) per waluta względem waluty głównej.
– Zaokrąglanie cen per waluta (pełna liczba, końcówki ,99 / ,95).
– Geolokalizacja klienta (WC_Geolocation) do automatycznego doboru waluty.
– Ręczny przełącznik waluty: widget + shortcode `[flexible_currency_switcher]`.
– Publiczne API i filtry do integracji (Flexible Product Fields, Flexible Coupons).
– Interfejs `FCS_Rate_Provider` przygotowany pod automatyczne kursy ECB/NBP.
– Deklaracja kompatybilności z HPOS.