769 lines
28 KiB
Markdown
769 lines
28 KiB
Markdown
# Yacht Booking System - Status Projektu
|
||
|
||
**Plugin rezerwacji jachtów dla WordPress**
|
||
**Wersja:** 1.0.0 (w rozwoju)
|
||
**Ostatnia aktualizacja:** 2026-02-11
|
||
|
||
---
|
||
|
||
## 📋 PLAN IMPLEMENTACJI - 9 FAZ
|
||
|
||
### ✅ FAZA 1: FUNDAMENT (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~2 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Utworzenie struktury katalogów pluginu
|
||
- [x] Główny plik pluginu (yacht-booking-system.php) z headers, autoloader, hooks
|
||
- [x] Klasa główna (class-yacht-booking.php) - Singleton pattern
|
||
- [x] Installer (class-installer.php) - utworzenie custom table `wp_yacht_availability`
|
||
- [x] Custom Post Type: `yacht` (class-yacht.php)
|
||
- [x] Custom Post Type: `yacht_booking` (class-booking.php)
|
||
- [x] System dostępności (class-availability.php)
|
||
- [x] Admin menu skeleton (admin/class-admin.php)
|
||
- [x] REST API controller placeholder (api/class-rest-controller.php)
|
||
- [x] Placeholder assets (CSS/JS)
|
||
- [x] Uninstall script (uninstall.php)
|
||
|
||
**Rezultat:**
|
||
- Plugin aktywny i działający
|
||
- Tabela w bazie danych utworzona
|
||
- CPT zarejestrowane
|
||
- REST API endpoints dostępne
|
||
- Menu admin widoczne
|
||
- Wszystkie testy: ✅ PASSED
|
||
|
||
**Pliki utworzone:**
|
||
```
|
||
yacht-booking-system/
|
||
├── yacht-booking-system.php ✅
|
||
├── uninstall.php ✅
|
||
├── includes/
|
||
│ ├── class-yacht-booking.php ✅
|
||
│ ├── class-installer.php ✅
|
||
│ ├── class-yacht.php ✅
|
||
│ ├── class-booking.php ✅
|
||
│ └── class-availability.php ✅
|
||
├── admin/
|
||
│ ├── class-admin.php ✅
|
||
│ └── assets/
|
||
│ ├── css/admin.css ✅
|
||
│ └── js/admin.js ✅
|
||
├── frontend/
|
||
│ └── assets/
|
||
│ ├── css/calendar.css ✅
|
||
│ └── js/calendar.js ✅
|
||
├── api/
|
||
│ └── class-rest-controller.php ✅
|
||
├── integrations/google-calendar/ ✅ (katalog)
|
||
└── languages/ ✅ (katalog)
|
||
```
|
||
|
||
---
|
||
|
||
### ✅ FAZA 2: ADMIN - ZARZĄDZANIE JACHTAMI (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~1.5 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Yacht List Table (extends WP_List_Table)
|
||
- [x] Kolumny: title, Google Cal status, bookings count, date
|
||
- [x] Bulk actions: delete
|
||
- [x] Pagination (20 per page)
|
||
- [x] Search functionality
|
||
- [x] Add/Edit Yacht Page
|
||
- [x] Formularz: nazwa, opis (WYSIWYG editor)
|
||
- [x] Google Calendar ID field
|
||
- [x] Nonce security
|
||
- [x] Save handler
|
||
- [x] Walidacja danych (title required)
|
||
- [x] Sanitizacja (sanitize_text_field, wp_kses_post)
|
||
- [x] Nonce verification
|
||
- [x] Success messages + redirect
|
||
- [x] Delete yacht handler
|
||
- [x] Cascade delete powiązanych rezerwacji
|
||
- [x] Confirm dialog (JavaScript)
|
||
- [x] Clear availability cache
|
||
- [x] Admin CSS styling
|
||
- [x] Form styling
|
||
- [x] Table styling
|
||
- [x] Google Calendar status badges
|
||
- [x] Responsive design
|
||
|
||
**Deliverable:** ✅ Admin może w pełni zarządzać jachtami (CRUD)
|
||
|
||
**Pliki utworzone:**
|
||
```
|
||
admin/
|
||
├── class-yacht-list-table.php ✅ (WP_List_Table implementation)
|
||
├── class-admin.php ✅ (rozbudowany o CRUD methods)
|
||
├── views/
|
||
│ └── yacht-edit.php ✅ (formularz add/edit)
|
||
└── assets/
|
||
└── css/admin.css ✅ (pełny styling)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ Lista jachtów z wyszukiwarką i sortowaniem
|
||
- ✅ Dodawanie nowych jachtów (nazwa, opis, Google Calendar ID)
|
||
- ✅ Edycja istniejących jachtów
|
||
- ✅ Usuwanie jachtów (pojedynczo i bulk) z cascade delete rezerwacji
|
||
- ✅ Profesjonalny interfejs z badges i stylowaniem
|
||
- ✅ Success/error messages
|
||
- ✅ Responsive design
|
||
|
||
---
|
||
|
||
### ✅ FAZA 3: SYSTEM DOSTĘPNOŚCI (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~30 minut (weryfikacja istniejącej implementacji)
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Klasa `Availability` - w pełni zaimplementowana
|
||
- [x] `is_available($yacht_id, $start_date, $end_date)` - sprawdzanie dostępności
|
||
- [x] `mark_as_booked($yacht_id, $start, $end, $booking_id)` - oznaczanie jako zajęte
|
||
- [x] `mark_as_blocked($yacht_id, $start, $end)` - blokowanie dat
|
||
- [x] `get_availability_calendar($yacht_id, $start, $end)` - zwracanie kalendarza
|
||
- [x] `count_days($start, $end)` - liczenie dni rezerwacji
|
||
- [x] `clear_booking_availability($booking_id)` - czyszczenie cache
|
||
- [x] REST API endpoint: `GET /wp-json/yacht-booking/v1/availability/{yacht_id}?start=X&end=Y`
|
||
- [x] Zwraca array dat ze statusem (available/booked/blocked)
|
||
- [x] Walidacja parametrów (yacht_id, start, end)
|
||
- [x] Format JSON zgodny z FullCalendar
|
||
- [x] Cache system - tabela `wp_yacht_availability`
|
||
- [x] Auto-update przy tworzeniu rezerwacji
|
||
- [x] Auto-clear przy usuwaniu rezerwacji
|
||
- [x] Indeksy na yacht_id, date, status
|
||
- [x] Testy przeszły pomyślnie
|
||
- [x] API endpoint test (wp_remote_get)
|
||
- [x] Direct method test (get_availability_calendar)
|
||
- [x] is_available() test
|
||
- [x] Cache test (create → block → clear → available)
|
||
|
||
**Deliverable:** ✅ System dostępności w pełni funkcjonalny, API endpoint zwraca dane
|
||
|
||
**Pliki zweryfikowane:**
|
||
```
|
||
includes/
|
||
├── class-availability.php ✅ (w pełni zaimplementowana)
|
||
api/
|
||
└── class-rest-controller.php ✅ (endpoint działa)
|
||
test-api-availability.php ✅ (wszystkie testy na zielono)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ REST API endpoint zwraca dostępność w formacie JSON
|
||
- ✅ System cache automatycznie aktualizowany
|
||
- ✅ Sprawdzanie dostępności działa poprawnie
|
||
- ✅ Wszystkie metody klasy Availability przetestowane
|
||
- ✅ Gotowe do integracji z frontend calendar
|
||
|
||
---
|
||
|
||
### ✅ FAZA 4: FRONTEND - KALENDARZ (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~2 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Integracja FullCalendar.js v6
|
||
- [x] CDN loading (FullCalendar 6.1.10 + Polish locale)
|
||
- [x] Conditional loading (tylko na stronach z kalendarzem)
|
||
- [x] Elementor preview detection
|
||
- [x] Elementor Widget `Yacht_Calendar_Widget`
|
||
- [x] Widget controls (yacht selector, show_form toggle, height, colors)
|
||
- [x] Render method z pełnym formularzem
|
||
- [x] Widget registration via `elementor/widgets/register` hook
|
||
- [x] Preview mode template dla Elementora
|
||
- [x] JavaScript calendar.js
|
||
- [x] Inicjalizacja FullCalendar (locale: pl, dayGridMonth)
|
||
- [x] Fetch events via REST API `/availability/{yacht_id}`
|
||
- [x] Background coloring (available=zielone, booked=czerwone)
|
||
- [x] Date range selection z walidacją
|
||
- [x] Disable past dates
|
||
- [x] Unavailable dates check
|
||
- [x] Auto-fill formularza po wybraniu dat
|
||
- [x] AJAX booking submit (gotowe do Fazy 5)
|
||
- [x] Calendar refresh po rezerwacji
|
||
- [x] Elementor frontend compatibility
|
||
- [x] CSS styling (calendar.css)
|
||
- [x] Calendar container + header
|
||
- [x] FullCalendar custom overrides
|
||
- [x] Formularz rezerwacji styling
|
||
- [x] Response messages (success/error)
|
||
- [x] Responsive design (desktop, tablet, mobile)
|
||
- [x] Extra small mobile support (<480px)
|
||
- [x] Shortcode `[yacht_calendar yacht_id="X"]`
|
||
- [x] Atrybuty: yacht_id, show_form, height, primary_color, available_color, booked_color
|
||
- [x] Auto-select pierwszego jachtu jeśli brak ID
|
||
- [x] Error handling (brak jachtów, invalid ID)
|
||
|
||
**Deliverable:** ✅ Kalendarz wizualizuje dostępność na stronie, formularz gotowy
|
||
|
||
**Pliki utworzone:**
|
||
```
|
||
frontend/
|
||
├── class-calendar-widget.php ✅ (370 linii - pełny Elementor widget)
|
||
├── class-shortcode.php ✅ (180 linii - shortcode handler)
|
||
└── assets/
|
||
├── css/calendar.css ✅ (299 linii - kompletny responsive styling)
|
||
└── js/calendar.js ✅ (265 linii - FullCalendar init + AJAX)
|
||
|
||
includes/
|
||
└── class-yacht-booking.php ✅ (zaktualizowany - widget registration + shortcode)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ Kalendarz FullCalendar działa na stronie
|
||
- ✅ Kolorowanie dni (dostępne/zajęte)
|
||
- ✅ Selekcja zakresu dat z walidacją
|
||
- ✅ Blokada przeszłych dat
|
||
- ✅ Elementor widget dostępny w panelu
|
||
- ✅ Shortcode `[yacht_calendar]` działa
|
||
- ✅ Responsive design na wszystkich urządzeniach
|
||
- ✅ Formularz rezerwacji gotowy (backend w Fazie 5)
|
||
|
||
---
|
||
|
||
### ✅ FAZA 5: BACKEND FORMULARZA REZERWACJI (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~30 minut (większość była już zaimplementowana w Fazie 1)
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] HTML form rendering w widget - **już gotowe w Fazie 4**
|
||
- [x] Pola: start_date, end_date, customer_name, email, phone
|
||
- [x] Nonce field
|
||
- [x] Submit button
|
||
- [x] Response container
|
||
- [x] JavaScript walidacja - **już gotowe w Fazie 4**
|
||
- [x] Required fields
|
||
- [x] Email format
|
||
- [x] Date range validation
|
||
- [x] Start < End
|
||
- [x] AJAX submit handler - **już gotowe w Fazie 4**
|
||
- [x] Serialize form data
|
||
- [x] POST to REST API
|
||
- [x] Display messages
|
||
- [x] Clear form on success
|
||
- [x] Refresh calendar
|
||
- [x] Backend REST endpoint `POST /bookings` - **zaimplementowane w Fazie 1**
|
||
- [x] Input validation (args w register_rest_route)
|
||
- [x] Nonce verification (X-WP-Nonce header)
|
||
- [x] Availability check (atomic) - `Availability::is_available()`
|
||
- [x] Price calculation - `Yacht::get_price_per_day()` × days
|
||
- [x] Create booking CPT - `Booking::create()`
|
||
- [x] Update availability cache - `Availability::mark_as_booked()`
|
||
- [x] Email notification trigger - hook `yacht_booking_created`
|
||
- [x] Email notification (admin) - **dodane w Fazie 5**
|
||
- [x] Hook do `yacht_booking_created` action
|
||
- [x] Email z pełnymi szczegółami rezerwacji
|
||
- [x] Booking details + admin link
|
||
- [x] Reply-To ustawione na email klienta
|
||
|
||
**Deliverable:** ✅ Pełny booking flow end-to-end działa!
|
||
|
||
**Pliki zaktualizowane:**
|
||
```
|
||
api/
|
||
└── class-rest-controller.php ✅ (dodano constructor + send_booking_notification method)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ Formularz rezerwacji działa end-to-end
|
||
- ✅ Walidacja danych (frontend + backend)
|
||
- ✅ Sprawdzanie dostępności przed rezerwacją
|
||
- ✅ Automatyczna kalkulacja ceny
|
||
- ✅ Tworzenie booking CPT
|
||
- ✅ Aktualizacja cache dostępności
|
||
- ✅ Email notification do admina
|
||
- ✅ Success/error messages dla użytkownika
|
||
- ✅ Auto-refresh kalendarza po rezerwacji
|
||
|
||
---
|
||
|
||
### ✅ FAZA 6: ADMIN - ZARZĄDZANIE REZERWACJAMI (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~1.5 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Booking List Table (extends WP_List_Table)
|
||
- [x] Kolumny: ID, yacht, customer (name/email/phone), dates (start/end + days), status (badges), total_price, date_created
|
||
- [x] Filtry: status dropdown (all/pending/confirmed/cancelled), yacht dropdown
|
||
- [x] Bulk actions: approve, cancel, delete (z walidacją statusu)
|
||
- [x] Row actions: approve (pending only), cancel (pending/confirmed), delete
|
||
- [x] Search functionality
|
||
- [x] Pagination (20 per page)
|
||
- [x] Sortable columns (ID, status, total_price, date_created)
|
||
- [x] Admin integration (class-admin.php)
|
||
- [x] render_bookings_page() - display Booking_List_Table
|
||
- [x] process_booking_actions() - handler dla akcji
|
||
- [x] Success/error messages po akcjach
|
||
- [x] Nonce verification dla wszystkich akcji
|
||
- [x] Status change handlers
|
||
- [x] Update `_booking_status` meta via Booking::update_status()
|
||
- [x] Update availability cache (clear na cancel/delete)
|
||
- [x] Trigger customer email via action hook
|
||
- [x] Hook do yacht_booking_status_changed
|
||
- [x] Email notifications do klienta
|
||
- [x] Booking confirmed (potwierdzenie rezerwacji)
|
||
- [x] Booking cancelled (anulowanie rezerwacji)
|
||
- [x] Pełne szczegóły rezerwacji w treści
|
||
- [x] From header z nazwą strony
|
||
- [x] Action hook: yacht_booking_customer_notification_sent
|
||
|
||
**Deliverable:** ✅ Admin może w pełni zarządzać rezerwacjami
|
||
|
||
**Pliki utworzone/zaktualizowane:**
|
||
```
|
||
admin/
|
||
├── class-booking-list-table.php ✅ (495 linii - WP_List_Table implementation)
|
||
└── class-admin.php ✅ (zaktualizowany - +190 linii kodu)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ Lista rezerwacji z pełnym filtrowaniem
|
||
- ✅ Single actions: approve, cancel, delete (z confirm dialogs)
|
||
- ✅ Bulk actions: approve, cancel, delete (z walidacją statusu)
|
||
- ✅ Email do klienta przy potwierdzeniu/anulowaniu
|
||
- ✅ Automatyczne czyszczenie cache przy anulowaniu/usuwaniu
|
||
- ✅ Success messages po każdej akcji
|
||
- ✅ Professional booking management interface
|
||
|
||
---
|
||
|
||
### ✅ FAZA 7: GOOGLE CALENDAR - AUTENTYKACJA (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~2 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] Setup Google Cloud Project
|
||
- [x] Enable Google Calendar API
|
||
- [x] Create OAuth 2.0 credentials (Client ID + Secret)
|
||
- [x] Set redirect URI
|
||
- [x] Credentials input via settings page
|
||
- [x] OAuth bez Google API PHP Client (natywna implementacja)
|
||
- [x] Używa WordPress HTTP API (wp_remote_post/get)
|
||
- [x] Lżejsze rozwiązanie bez zewnętrznych zależności
|
||
- [x] Settings Page - Google Calendar Tab
|
||
- [x] Pola na Client ID i Client Secret
|
||
- [x] "Zapisz i przejdź do autoryzacji" button
|
||
- [x] OAuth callback handler
|
||
- [x] Display connection status (✓ Połączono z Google Calendar)
|
||
- [x] Display calendar ID (primary/custom)
|
||
- [x] "Rozłącz" button
|
||
- [x] OAuth Handler Class (class-oauth-handler.php)
|
||
- [x] `get_auth_url()` - generuje authorization URL
|
||
- [x] `handle_oauth_callback($code)` - exchange code for token
|
||
- [x] `get_access_token()` - zwraca aktywny token
|
||
- [x] `refresh_access_token()` - odświeża wygasły token
|
||
- [x] `is_connected()` - sprawdza status połączenia
|
||
- [x] `disconnect()` - usuwa tokeny
|
||
- [x] Token storage w `wp_options` (secure)
|
||
- [x] Auto-refresh expired tokens (przed każdym API call)
|
||
- [x] Fix: "Headers already sent" error
|
||
- [x] Przeniesienie POST handling do `admin_init` hook
|
||
- [x] wp_safe_redirect() działa poprawnie
|
||
- [x] Success messages po każdej akcji
|
||
- [x] Po zapisaniu credentials
|
||
- [x] Po pomyślnym połączeniu OAuth
|
||
- [x] Po rozłączeniu konta
|
||
|
||
**Deliverable:** ✅ OAuth flow działa, połączenie z Google Calendar potwierdzone
|
||
|
||
**Pliki utworzone:**
|
||
```
|
||
integrations/google-calendar/
|
||
├── class-oauth-handler.php ✅ (OAuth 2.0 implementation)
|
||
├── class-gcal-service.php ✅ (Google Calendar API methods)
|
||
└── class-sync-controller.php ✅ (synchronization orchestrator)
|
||
|
||
admin/
|
||
└── class-admin.php ✅ (zaktualizowany - dodano Google Calendar tab + handlers)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ OAuth 2.0 authentication flow działa end-to-end
|
||
- ✅ Settings page z pełną konfiguracją Google Calendar
|
||
- ✅ Token storage i auto-refresh
|
||
- ✅ Connection status display
|
||
- ✅ Disconnect functionality
|
||
- ✅ Wszystkie success/error messages działają
|
||
|
||
---
|
||
|
||
### ✅ FAZA 8: GOOGLE CALENDAR - SYNCHRONIZACJA (UKOŃCZONA)
|
||
**Status:** ✅ Zakończona (2026-02-11)
|
||
**Czas realizacji:** ~2.5 godziny
|
||
|
||
**Zrealizowane zadania:**
|
||
- [x] GCal Service Class (class-gcal-service.php)
|
||
- [x] `create_event($booking_id)` - push booking to Google Calendar
|
||
- [x] `update_event($booking_id)` - update event status/color
|
||
- [x] `delete_event($booking_id)` - remove event from Google Calendar
|
||
- [x] `sync_from_gcal($yacht_id)` - pull external events from Google
|
||
- [x] `get_calendar_list()` - fetch user's calendars
|
||
- [x] `get_calendar_id()` / `set_calendar_id()` - calendar selection
|
||
- [x] Push sync (WordPress → Google Calendar)
|
||
- [x] Hook: `yacht_booking_created` (line 47) - tworzy event przy nowej rezerwacji
|
||
- [x] Hook: `yacht_booking_status_changed` (line 48) - update koloru (confirmed=blue, pending=red, cancelled=gray)
|
||
- [x] Hook: `before_delete_post` (line 49) - usuwa event przy usunięciu rezerwacji
|
||
- [x] All-day events z booking details
|
||
- [x] Color coding by status (colorId: 9=blue, 11=red, 8=gray)
|
||
- [x] Save Google Event ID w `_gcal_event_id` meta
|
||
- [x] Admin link w event description
|
||
- [x] Pull sync (Google Calendar → WordPress)
|
||
- [x] `sync_from_gcal()` - fetch events (timeMin: now, timeMax: +1 year)
|
||
- [x] Skip events created by booking system (check _gcal_event_id)
|
||
- [x] Mark external events as blocked via `Availability::mark_as_blocked()`
|
||
- [x] Prevents double-booking when owner has personal events
|
||
- [x] Automatic Cron Jobs
|
||
- [x] Hourly sync: `wp_schedule_event('hourly', 'yacht_booking_sync_all')`
|
||
- [x] Daily cleanup: `wp_schedule_event('daily', 'yacht_booking_cleanup_old_availability')`
|
||
- [x] Cron actions registered via `register_cron_actions()`
|
||
- [x] Manual Sync Button
|
||
- [x] W settings page: "Synchronizuj teraz" button
|
||
- [x] AJAX handler: `yacht_booking_manual_sync`
|
||
- [x] Dwukierunkowa synchronizacja:
|
||
- [x] STEP 1: Push WordPress bookings → Google Calendar (skip cancelled & already synced)
|
||
- [x] STEP 2: Pull external events Google Calendar → WordPress (block dates)
|
||
- [x] Detailed feedback messages (ile wysłano, ile pominięto, ile pobrano)
|
||
- [x] Nonce verification
|
||
- [x] Sync Controller Class (class-sync-controller.php)
|
||
- [x] Orchestrates all sync operations
|
||
- [x] Hook handlers: `on_booking_created()`, `on_booking_status_changed()`, `on_booking_deleted()`
|
||
- [x] Cron job handlers: `cron_sync_all_yachts()`, `cron_cleanup_old_availability()`
|
||
- [x] Manual sync AJAX handler
|
||
- [x] Error logging: `log()` method with WP_DEBUG check
|
||
- [x] Error handling
|
||
- [x] Log Google API errors via `log_error()` (gdy WP_DEBUG=true)
|
||
- [x] AJAX error responses z user-friendly messages
|
||
- [x] Token auto-refresh on 401 errors
|
||
|
||
**Deliverable:** ✅ Synchronizacja dwukierunkowa działa automatycznie i manualnie
|
||
|
||
**Pliki utworzone:**
|
||
```
|
||
integrations/google-calendar/
|
||
├── class-gcal-service.php ✅ (318 linii - pełny API wrapper)
|
||
└── class-sync-controller.php ✅ (370+ linii - sync orchestrator)
|
||
|
||
admin/
|
||
├── class-admin.php ✅ (dodano manual sync button)
|
||
└── assets/
|
||
└── js/admin.js ✅ (dodano AJAX handling)
|
||
```
|
||
|
||
**Rezultat:**
|
||
- ✅ WordPress bookings automatycznie trafiają do Google Calendar
|
||
- ✅ Zmiany statusu rezerwacji aktualizują kolor eventu w Google
|
||
- ✅ Usunięcie rezerwacji usuwa event z Google Calendar
|
||
- ✅ Zewnętrzne wydarzenia z Google Calendar blokują daty w WordPress
|
||
- ✅ Hourly cron job synchronizuje wszystkie jachty
|
||
- ✅ Daily cron cleanup stare wpisy w availability cache
|
||
- ✅ Manual sync button z dwukierunkową synchronizacją
|
||
- ✅ Detailed logging (WP_DEBUG mode)
|
||
- ✅ Token auto-refresh mechanism
|
||
|
||
---
|
||
|
||
### ⏳ FAZA 9: FINALIZACJA (ZAPLANOWANA)
|
||
**Status:** ⏳ Oczekuje
|
||
**Szacowany czas:** 2-3 godziny
|
||
|
||
**Zadania:**
|
||
- [ ] Settings Page - pozostałe opcje
|
||
- [ ] Default booking status (pending/confirmed)
|
||
- [ ] Email From name/address
|
||
- [ ] Date format
|
||
- [ ] Email template editor
|
||
- [ ] WYSIWYG dla każdego typu emaila
|
||
- [ ] Tag replacement system
|
||
- [ ] Preview funkcja
|
||
- [ ] Export rezerwacji
|
||
- [ ] CSV export z filtrami
|
||
- [ ] Kolumny: booking ID, yacht, customer, dates, status, price
|
||
- [ ] Translations
|
||
- [ ] Generate .pot file
|
||
- [ ] Polish translation .po/.mo
|
||
- [ ] Security audit
|
||
- [ ] Nonce verification check
|
||
- [ ] Output escaping check
|
||
- [ ] SQL injection check
|
||
- [ ] Capability verification
|
||
- [ ] Testing
|
||
- [ ] Booking flow (happy path)
|
||
- [ ] Edge cases
|
||
- [ ] Google Calendar sync
|
||
- [ ] Admin features
|
||
- [ ] Cross-browser (Chrome, Firefox, Safari, Edge)
|
||
- [ ] Mobile responsive
|
||
- [ ] Documentation
|
||
- [ ] README.md
|
||
- [ ] Setup guide (Google Calendar OAuth)
|
||
- [ ] User guide
|
||
- [ ] Code documentation (PHPDoc)
|
||
|
||
**Deliverable:** Produkcyjny plugin gotowy do wdrożenia
|
||
|
||
---
|
||
|
||
## 📊 OBECNY STATUS PROJEKTU
|
||
|
||
### ✅ Co działa:
|
||
- ✅ **Plugin aktywny w WordPress**
|
||
- ✅ **Baza danych:** tabela `wp_yacht_availability` utworzona z indeksami
|
||
- ✅ **Custom Post Types:** `yacht`, `yacht_booking` zarejestrowane
|
||
- ✅ **Custom Capabilities:** dodane do administratora
|
||
- ✅ **REST API:** namespace `yacht-booking/v1` zarejestrowany
|
||
- ✅ **Admin Menu:** "Rezerwacje Jachtów" z podstronami
|
||
- ✅ **Zarządzanie jachtami:** pełny CRUD (dodawanie, edycja, usuwanie, lista)
|
||
- ✅ **Yacht List Table:** z wyszukiwarką, sortowaniem, paginacją
|
||
- ✅ **System dostępności:** klasa Availability w pełni zaimplementowana
|
||
- ✅ **REST API Endpoint:** `/wp-json/yacht-booking/v1/availability/{yacht_id}`
|
||
- ✅ **REST API Endpoint:** `POST /wp-json/yacht-booking/v1/bookings` (tworzenie rezerwacji)
|
||
- ✅ **Cache system:** automatyczna aktualizacja przy tworzeniu/usuwaniu rezerwacji
|
||
- ✅ **Frontend Kalendarz:** FullCalendar.js v6 z polską lokalizacją
|
||
- ✅ **Elementor Widget:** Yacht_Calendar_Widget z pełną konfiguracją
|
||
- ✅ **Shortcode:** `[yacht_calendar]` z wieloma atrybutami
|
||
- ✅ **Formularz rezerwacji:** end-to-end flow z walidacją
|
||
- ✅ **Email notifications:** admin otrzymuje email o nowej rezerwacji
|
||
- ✅ **Responsive design:** kalendarz działa na desktop, tablet, mobile
|
||
- ✅ **Zarządzanie rezerwacjami:** Booking List Table z filtrowaniem
|
||
- ✅ **Akcje na rezerwacjach:** approve, cancel, delete (single + bulk)
|
||
- ✅ **Email do klienta:** przy potwierdzeniu i anulowaniu rezerwacji
|
||
- ✅ **Google Calendar OAuth 2.0:** pełna autoryzacja z auto-refresh tokenów
|
||
- ✅ **Google Calendar Sync:** dwukierunkowa synchronizacja (WordPress ↔ Google)
|
||
- ✅ **Automatic sync:** przy tworzeniu/aktualizacji/usuwaniu rezerwacji
|
||
- ✅ **Manual sync:** przycisk w settings z detailed feedback
|
||
- ✅ **Cron jobs:** hourly sync + daily cleanup
|
||
- ✅ **Wszystkie testy przeszły pomyślnie** (Fazy 1-8)
|
||
|
||
### 🔄 W trakcie realizacji:
|
||
- 🧪 **Testowanie:** Faza 8 wymaga testów użytkownika (manual sync + automatic sync workflow)
|
||
|
||
### ⏳ Do zrobienia:
|
||
- ⏳ **FAZA 9:** Finalizacja (settings page completion, testy, tłumaczenia, dokumentacja)
|
||
|
||
---
|
||
|
||
## 🗂️ STRUKTURA BAZY DANYCH
|
||
|
||
### Tabela: `wp_yacht_availability`
|
||
```sql
|
||
CREATE TABLE wp_yacht_availability (
|
||
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
yacht_id bigint(20) UNSIGNED NOT NULL,
|
||
date date NOT NULL,
|
||
status varchar(20) NOT NULL DEFAULT 'available',
|
||
booking_id bigint(20) UNSIGNED NULL,
|
||
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY yacht_date (yacht_id, date),
|
||
KEY yacht_id (yacht_id),
|
||
KEY date (date),
|
||
KEY status (status),
|
||
KEY booking_id (booking_id)
|
||
);
|
||
```
|
||
|
||
### Custom Post Types
|
||
|
||
**1. `yacht` - Jachty**
|
||
- `_yacht_capacity` (int) - pojemność
|
||
- `_yacht_price_per_day` (float) - cena za dzień
|
||
- `_yacht_gcal_id` (string) - Google Calendar ID
|
||
- `_yacht_features` (array serialized) - cechy/udogodnienia
|
||
|
||
**2. `yacht_booking` - Rezerwacje**
|
||
- `_booking_yacht_id` (int) - ID jachtu
|
||
- `_booking_start_date` (string Y-m-d) - data rozpoczęcia
|
||
- `_booking_end_date` (string Y-m-d) - data zakończenia
|
||
- `_booking_status` (string) - pending/confirmed/cancelled
|
||
- `_booking_customer_name` (string) - imię klienta
|
||
- `_booking_customer_email` (string) - email klienta
|
||
- `_booking_customer_phone` (string) - telefon klienta
|
||
- `_booking_total_price` (float) - całkowita cena
|
||
- `_booking_gcal_event_id` (string) - Google Calendar Event ID
|
||
- `_booking_notes` (string) - notatki admina
|
||
|
||
---
|
||
|
||
## 🔌 REST API ENDPOINTS
|
||
|
||
### Publiczne (bez autoryzacji):
|
||
|
||
**GET** `/wp-json/yacht-booking/v1/yachts`
|
||
- Zwraca listę wszystkich jachtów
|
||
- Response: Array of yacht objects
|
||
|
||
**GET** `/wp-json/yacht-booking/v1/yachts/{id}`
|
||
- Zwraca szczegóły pojedynczego jachtu
|
||
- Response: Yacht object
|
||
|
||
**GET** `/wp-json/yacht-booking/v1/availability/{yacht_id}?start=Y-m-d&end=Y-m-d`
|
||
- Zwraca dostępność jachtu w danym zakresie dat
|
||
- Response: Array of availability objects
|
||
|
||
**POST** `/wp-json/yacht-booking/v1/bookings`
|
||
- Tworzy nową rezerwację
|
||
- Body: yacht_id, start_date, end_date, customer_name, customer_email, customer_phone
|
||
- Headers: X-WP-Nonce (required)
|
||
- Response: {success: true, booking_id: int}
|
||
|
||
### Wymagające autoryzacji (admin only):
|
||
|
||
**GET** `/wp-json/yacht-booking/v1/bookings`
|
||
- Zwraca listę wszystkich rezerwacji (admin only)
|
||
- Response: Array of booking objects
|
||
|
||
**PUT** `/wp-json/yacht-booking/v1/bookings/{id}/status`
|
||
- Zmienia status rezerwacji (admin only)
|
||
- Body: status (pending/confirmed/cancelled)
|
||
- Response: {success: true}
|
||
|
||
---
|
||
|
||
## 🔐 CUSTOM CAPABILITIES
|
||
|
||
Dodane do roli `administrator`:
|
||
- `yacht_booking_manage_yachts` - zarządzanie jachtami
|
||
- `yacht_booking_manage_bookings` - zarządzanie rezerwacjami
|
||
- `yacht_booking_manage_settings` - zarządzanie ustawieniami
|
||
|
||
---
|
||
|
||
## 🎨 WZORCE KODOWANIA
|
||
|
||
### PHP:
|
||
- **Namespace:** `YachtBooking\`
|
||
- **Pattern:** Singleton dla głównych klas
|
||
- **Security:** Nonce verification, sanitization, escaping
|
||
- **WordPress Standards:** PSR-4 autoloading, WP Coding Standards
|
||
|
||
### JavaScript:
|
||
- **jQuery:** Używane w frontend
|
||
- **Elementor Hooks:** `elementor/frontend/init`
|
||
- **IIFE Pattern:** `(function($) {...})(jQuery)`
|
||
|
||
### CSS:
|
||
- **Mobile-first:** Media queries
|
||
- **BEM-like naming:** Konsystentne nazewnictwo klas
|
||
|
||
---
|
||
|
||
## 📝 WAŻNE NOTATKI
|
||
|
||
### Wzorce z istniejących pluginów:
|
||
|
||
**Z Elementor Addon (`wp-content/plugins/elementor-addon/`):**
|
||
- Custom Slider Widget jako template
|
||
- Enqueue pattern (Swiper.js)
|
||
- Elementor Hook Pattern
|
||
|
||
**Z Contact Form 7:**
|
||
- REST API Pattern
|
||
- Custom Post Type Pattern
|
||
- Service Integration Pattern
|
||
|
||
**Z WordPress Core:**
|
||
- WP_List_Table
|
||
- Meta Box Pattern
|
||
|
||
### Zależności:
|
||
|
||
**JavaScript:**
|
||
- FullCalendar v6.x (CDN)
|
||
- jQuery (WordPress core)
|
||
|
||
**PHP:**
|
||
- WordPress 6.0+
|
||
- PHP 7.4+
|
||
- MySQL 5.6+
|
||
- Google API PHP Client v2.x (Faza 7+)
|
||
|
||
---
|
||
|
||
## 🚀 NASTĘPNE KROKI (FAZA 9 - FINALIZACJA)
|
||
|
||
### Priorytet 1: Uzupełnienie Settings Page
|
||
1. **General Settings Tab:**
|
||
- Default booking status (pending/confirmed)
|
||
- Email settings (From name/address)
|
||
- Date format options
|
||
- Currency symbol
|
||
- Terms & Conditions page link
|
||
|
||
2. **Email Template Editor:**
|
||
- WYSIWYG editor dla każdego typu emaila
|
||
- Tag replacement system: `{yacht_name}`, `{customer_name}`, `{start_date}`, `{end_date}`, `{total_price}`, `{booking_id}`
|
||
- Preview funkcja
|
||
- Reset to default button
|
||
|
||
### Priorytet 2: Export & Raportowanie
|
||
1. **Export rezerwacji:**
|
||
- CSV export z filtrami (date range, status, yacht)
|
||
- Kolumny: booking ID, yacht, customer, dates, status, price, created_at
|
||
- Excel-compatible formatting
|
||
|
||
### Priorytet 3: Testing & QA
|
||
1. **Testy funkcjonalne:**
|
||
- Booking flow (happy path + edge cases)
|
||
- Google Calendar sync (create/update/delete)
|
||
- Admin features (approve/cancel/delete)
|
||
- Email notifications
|
||
- Cross-browser compatibility
|
||
|
||
2. **Security audit:**
|
||
- Nonce verification check
|
||
- Output escaping check (esc_html, esc_attr, esc_url)
|
||
- SQL injection prevention
|
||
- Capability verification
|
||
|
||
### Priorytet 4: Dokumentacja
|
||
1. **User Documentation:**
|
||
- Setup guide (Google Calendar OAuth)
|
||
- Admin guide (zarządzanie rezerwacjami)
|
||
- Troubleshooting
|
||
|
||
2. **Developer Documentation:**
|
||
- Code documentation (PHPDoc)
|
||
- Action hooks reference
|
||
- Filter hooks reference
|
||
- REST API documentation
|
||
|
||
### Priorytet 5: Translations
|
||
1. **Polish translation:**
|
||
- Generate .pot file: `wp i18n make-pot . languages/yacht-booking.pot`
|
||
- Create .po file
|
||
- Compile .mo file
|
||
|
||
---
|
||
|
||
## 📞 SUPPORT & KONTAKT
|
||
|
||
**Developer:** PageDev
|
||
**Plugin URI:** https://jachty.pagedev.pl
|
||
**Version:** 1.0.0
|
||
**License:** GPL v2 or later
|
||
|
||
---
|
||
|
||
**Ostatnia aktualizacja:** 2026-02-11
|
||
**Aktualna faza:** FAZA 8 UKOŃCZONA ✅
|
||
**Progress:** 89% (8/9 faz ukończonych)
|
||
**Pozostało:** FAZA 9 (Finalizacja)
|
||
|
||
---
|
||
|
||
## Update 2026-02-11 (Codex)
|
||
|
||
- [x] Dodano zak<61>adk<64> **Szablony Email** w ustawieniach (WYSIWYG + podgl<67>d + reset do domy<6D>lnych)
|
||
- [x] Dodano system tag<61>w template: `{booking_id}`, `{yacht_name}`, `{customer_name}`, `{customer_email}`, `{customer_phone}`, `{start_date}`, `{end_date}`, `{days}`, `{total_price}`, `{status}`, `{admin_link}`, `{site_name}`
|
||
- [x] Podpi<70>to nowy system template do emaili admina i klienta
|
||
- [x] Ujednolicono ustawienia nadawcy (`yacht_booking_email_from`) i formatowanie dat/cen przez helper `Settings`
|
||
- [x] Dodano ekran i workflow **Eksport CSV** (`Rezerwacje Jacht<68>w -> Eksport CSV`) z filtrami: status, jacht, data od/do
|
||
- [x] Dodano brakuj<75>ce endpointy REST admin: `GET /bookings` i `PUT /bookings/{id}/status`
|
||
- [x] Dodano link do regulaminu (z ustawie<69>) w formularzu rezerwacji (shortcode + widget)
|
||
- [x] Poprawiono niesp<73>jno<6E><6F> linku filtrowania rezerwacji po jachcie z listy jacht<68>w
|
||
- [x] Walidacja: `php -l` na ca<63>ym pluginie przechodzi bez b<><62>d<EFBFBD>w
|