# 2026-05-06 ## Co zrobiono - [Phase 9, Plan 01] UX/UI polish kalendarza: skos 45° na pierwszym/ostatnim dniu rezerwacji, ciemne ramki dni, paleta widgetu dopasowana do brandu strony (granat #0e2036, czerwień #bc1834) - Edge detection po stronie klienta — porównanie sąsiadujących dni po booking_id+status, klasy `yacht-day-{booked|blocked}-{start|end|mid|single}` - Gradient 135° na obu skrajnych dniach (parallelogram przez wiersz), single-day blokada renderowana jako pełen booked - CSS variables `--yacht-available-bg` / `--yacht-booked-bg` ustawiane z JS na wrapperze — reuse w gradientach + legendzie - Nagłówki kolumn FullCalendar w granacie, ramki przez `--fc-border-color: #0e2036` + override 7 selektorów - Cyfry dni `#021526` (past `#6c757d`) — przebicie globalnej reguły `body a:not([href])` - Legenda rozszerzona o 3-ci swatch „Dzień odbioru / zwrotu" z gradientem - Helper `test-add-booking.php` (token-protected, akcje add/list/remove) do smoke testu — DO USUNIĘCIA z FTP po testach - [Phase 9, Plan 02] Globalna synchronizacja iCal — jeden wspólny Google Calendar dla całej floty z podziałem po prefiksie nazwy jachtu w tytule eventu - Globalny iCal Export feed (`/yacht-ical-global/{token}.ics`) — wszystkie rezerwacje w jednym pliku, każdy event z prefiksem `"{nazwa_jachtu} - {klient}"`, anti-loop (pomija events z source `ical_import_global`) - Globalny iCal Import URL — pobiera kalendarz Google admina, parser dopasowuje prefiks przed `" - "` (mb_* dla polskich znaków, case-insensitive) do `post_title` lub `_yacht_gcal_alias` (priorytet alias) - Eventy bez separatora lub bez dopasowanego jachtu — ignorowane (logowane). Stale cleanup usuwa booking gdy event zniknął z GCal - Cron godzinny `yacht_booking_ical_global_import` + manualny przycisk "Importuj teraz" - Pole `_yacht_gcal_alias` w yacht-edit (krótki alias, np. "Maja" zamiast "Marina Maja Sailing 35") - Settings UI: nowa sekcja "Globalna synchronizacja iCal" z export URL (kopiuj + regeneracja tokenu), import URL, instrukcja - Per-yacht feedy iCal i OAuth push pozostają jako kompatybilność wsteczna (out of scope ich sprzątania) - [Phase 9, Plan 03] Cleanup OAuth + per-yacht iCal — plugin sprowadzony do JEDNEGO mechanizmu sync (globalny iCal) - Usunięte 3 pliki OAuth (`integrations/google-calendar/class-{sync-controller,gcal-service,oauth-handler}.php`) + cały katalog - Wycięte z bootstrap: require + setup_cron + clear_cron Sync_Controller (yacht-booking-system.php, class-yacht-booking.php) - Wycięte z admin: cała sekcja UI OAuth (Client ID/Secret, "Połącz", "Synchronizuj teraz", instrukcja), `handle_oauth_callback`, `save_gcal_credentials`, callback/disconnect/credentials w `process_settings_save`, notice connected/disconnected - Wycięte per-yacht iCal: `IMPORT_SOURCE`, `run_import`, `import_for_yacht`, `get/set_import_url`, `get_existing_import_map`, `upsert_booking`, `get_last_import_time`, cron `yacht_booking_ical_import`, rewrite rule `^yacht-ical/(\d+)/...`, `output_ics`, `get_feed_token`, `regenerate_token`, `get_feed_url` - Wycięte z yacht-edit: pola "Google Calendar ID", "iCal Import URL", "iCal Feed URL". Pozostaje tylko Alias. - Wycięte z yacht-list-table: kolumna "Google Calendar" - Yacht class: usunięte `get_gcal_id()`, `update_gcal_id()` - Cleanup migration w `Installer::migrate()` — version-gated (idempotent), kasuje 4 stale meta keys, 6 stale options OAuth, bookings z source `ical_import`, 5 stale cron hooków. "Po cichu" — bez admin notice - uninstall.php zaktualizowany o globalne iCal opcje + defensywne legacy gcal_* delete ## Zmienione pliki - `wp-content/plugins/yacht-booking-system/frontend/assets/js/calendar.js` - `wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss` - `wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css` - `wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget.php` - `test-add-booking.php` (nowy, helper testowy) - `.paul/phases/09-finalizacja/09-01-PLAN.md` (nowy) - `.paul/phases/09-finalizacja/09-01-SUMMARY.md` (nowy) - `.paul/phases/09-finalizacja/09-02-PLAN.md` (nowy) - `.paul/phases/09-finalizacja/09-02-SUMMARY.md` (nowy) - `.paul/phases/09-finalizacja/09-03-PLAN.md` (nowy) - `.paul/phases/09-finalizacja/09-03-SUMMARY.md` (nowy) - `wp-content/plugins/yacht-booking-system/integrations/google-calendar/class-sync-controller.php` (USUNIĘTY) - `wp-content/plugins/yacht-booking-system/integrations/google-calendar/class-gcal-service.php` (USUNIĘTY) - `wp-content/plugins/yacht-booking-system/integrations/google-calendar/class-oauth-handler.php` (USUNIĘTY) - `wp-content/plugins/yacht-booking-system/yacht-booking-system.php` - `wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php` - `wp-content/plugins/yacht-booking-system/integrations/ical/class-ical-feed.php` - `wp-content/plugins/yacht-booking-system/integrations/ical/class-ical-import.php` - `wp-content/plugins/yacht-booking-system/includes/class-yacht.php` - `wp-content/plugins/yacht-booking-system/includes/class-installer.php` - `wp-content/plugins/yacht-booking-system/admin/class-admin.php` - `wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php` - `wp-content/plugins/yacht-booking-system/admin/class-yacht-list-table.php` - `wp-content/plugins/yacht-booking-system/uninstall.php` - `.paul/STATE.md` - `.paul/ROADMAP.md`