Phase 5 complete — CPT carei_reservation z automatycznym zapisem, lista z kolumnami i filtrem statusu, meta box szczegółów, system statusów nowe/przeczytane/zrealizowane, auto-mark-read. Milestone v0.1 Formularz Rezerwacji MVP — all 5 phases complete. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
275 lines
11 KiB
Markdown
275 lines
11 KiB
Markdown
---
|
|
phase: 05-admin-panel
|
|
plan: 01
|
|
type: execute
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified:
|
|
- wp-content/plugins/carei-reservation/includes/class-admin-panel.php
|
|
- wp-content/plugins/carei-reservation/includes/class-rest-proxy.php
|
|
- wp-content/plugins/carei-reservation/carei-reservation.php
|
|
autonomous: false
|
|
---
|
|
|
|
<objective>
|
|
## Goal
|
|
Admin panel w wp-admin do przeglądania rezerwacji: Custom Post Type `carei_reservation`, automatyczny zapis przy udanej rezerwacji, lista z kolumnami i filtrami, podgląd szczegółów, statusy (nowe/przeczytane/zrealizowane).
|
|
|
|
## Purpose
|
|
Właściciel firmy musi mieć przegląd wszystkich rezerwacji złożonych przez formularz — bez logowania do panelu Softra. Dane zapisane w WordPress = szybki podgląd, filtrowanie, zmiana statusu.
|
|
|
|
## Output
|
|
- Nowy plik: `includes/class-admin-panel.php` (CPT, kolumny, meta box, statusy)
|
|
- Zmodyfikowany: `includes/class-rest-proxy.php` (zapis rezerwacji po sukcesie)
|
|
- Zmodyfikowany: `carei-reservation.php` (include nowej klasy)
|
|
</objective>
|
|
|
|
<context>
|
|
## Project Context
|
|
@.paul/PROJECT.md
|
|
@.paul/ROADMAP.md
|
|
@.paul/STATE.md
|
|
|
|
## Prior Work
|
|
@.paul/phases/03-form-submit-booking/03-01-SUMMARY.md
|
|
- Booking flow: customer/add → pricingSummary → makebooking → confirm
|
|
- Dane zbierane: segment, daty, oddział, extras, imię, nazwisko, adres, email, telefon, PESEL, wiadomość
|
|
- Po sukcesie: reservationId + reservationNo z API
|
|
|
|
## Source Files
|
|
@wp-content/plugins/carei-reservation/carei-reservation.php
|
|
@wp-content/plugins/carei-reservation/includes/class-rest-proxy.php
|
|
</context>
|
|
|
|
<acceptance_criteria>
|
|
|
|
## AC-1: CPT carei_reservation zarejestrowany
|
|
```gherkin
|
|
Given plugin jest aktywny
|
|
When otworzę wp-admin
|
|
Then w menu bocznym widzę "Rezerwacje" z ikoną dashicons-car
|
|
And CPT nie jest publiczny (brak na frontendzie)
|
|
And supports: title (auto-generowany, nie edytowalny)
|
|
```
|
|
|
|
## AC-2: Rezerwacja zapisuje się automatycznie po sukcesie
|
|
```gherkin
|
|
Given użytkownik wypełnił formularz i potwierdził rezerwację
|
|
When API makebooking + confirm zwraca sukces
|
|
Then w wp-admin pojawia się nowy wpis z danymi rezerwacji
|
|
And tytuł: "Rezerwacja #[reservationNo] — [Imię Nazwisko]"
|
|
And wszystkie dane formularza zapisane w post_meta
|
|
And status: "nowe"
|
|
```
|
|
|
|
## AC-3: Lista rezerwacji z kolumnami
|
|
```gherkin
|
|
Given jestem w wp-admin → Rezerwacje
|
|
When widzę listę wpisów
|
|
Then kolumny: Nr rezerwacji | Klient | Segment | Daty | Oddział | Status | Data
|
|
And kolumna Status pokazuje kolorowy badge (nowe=niebieski, przeczytane=żółty, zrealizowane=zielony)
|
|
And mogę sortować po dacie
|
|
And mogę filtrować po statusie (dropdown nad listą)
|
|
```
|
|
|
|
## AC-4: Podgląd szczegółów rezerwacji
|
|
```gherkin
|
|
Given kliknę na rezerwację w liście
|
|
When otwiera się edycja wpisu
|
|
Then widzę meta box "Szczegóły rezerwacji" z tabelą:
|
|
- Nr rezerwacji, ID klienta Softra
|
|
- Segment, daty od-do, oddział odbioru, oddział zwrotu
|
|
- Imię, nazwisko, email, telefon, PESEL, adres
|
|
- Wybrane opcje dodatkowe
|
|
- Wiadomość klienta
|
|
And widzę dropdown do zmiany statusu (nowe → przeczytane → zrealizowane)
|
|
And status zmienia się po kliknięciu "Zaktualizuj"
|
|
```
|
|
|
|
## AC-5: Przy otwarciu rezerwacji status zmienia się na "przeczytane"
|
|
```gherkin
|
|
Given rezerwacja ma status "nowe"
|
|
When otwieram ją w wp-admin
|
|
Then status automatycznie zmienia się na "przeczytane"
|
|
And badge w liście aktualizuje się
|
|
```
|
|
|
|
</acceptance_criteria>
|
|
|
|
<tasks>
|
|
|
|
<task type="auto">
|
|
<name>Task 1: CPT registration + admin panel class</name>
|
|
<files>wp-content/plugins/carei-reservation/includes/class-admin-panel.php, wp-content/plugins/carei-reservation/carei-reservation.php</files>
|
|
<action>
|
|
1. **Utwórz `includes/class-admin-panel.php`:**
|
|
|
|
Klasa `Carei_Admin_Panel` z metodami:
|
|
|
|
a) `register_post_type()` — hook na `init`:
|
|
- CPT: `carei_reservation`
|
|
- label: "Rezerwacje" / "Rezerwacja"
|
|
- menu_icon: `dashicons-car`
|
|
- public: false, show_ui: true, show_in_menu: true
|
|
- supports: `['title']` (title auto-generowany)
|
|
- capability_type: 'post'
|
|
- menu_position: 26 (pod Komentarze)
|
|
|
|
b) `register_statuses()` — custom taxonomy NIE jest potrzebna, użyj post_meta `_carei_status` z wartościami: `nowe`, `przeczytane`, `zrealizowane`
|
|
|
|
c) `add_admin_columns($columns)` — hook `manage_carei_reservation_posts_columns`:
|
|
- Kolumny: cb, reservation_no, client, segment, dates, branch, status, date
|
|
- Usuń domyślny title
|
|
|
|
d) `render_admin_column($column, $post_id)` — hook `manage_carei_reservation_posts_custom_column`:
|
|
- reservation_no: get_post_meta `_carei_reservation_no`
|
|
- client: `_carei_first_name` + `_carei_last_name`
|
|
- segment: `_carei_segment`
|
|
- dates: `_carei_date_from` + `_carei_date_to` (format: d.m.Y H:i)
|
|
- branch: `_carei_pickup_branch`
|
|
- status: badge z kolorem (nowe=#2F2482, przeczytane=#f59e0b, zrealizowane=#22c55e)
|
|
|
|
e) `add_status_filter()` — hook `restrict_manage_posts`:
|
|
- Dropdown filtra statusu nad listą
|
|
- Opcje: Wszystkie, Nowe, Przeczytane, Zrealizowane
|
|
|
|
f) `filter_by_status($query)` — hook `pre_get_posts`:
|
|
- Filtruj po `_carei_status` meta_query
|
|
|
|
g) `add_meta_box()` — hook `add_meta_boxes`:
|
|
- Meta box "Szczegóły rezerwacji" w edycji wpisu
|
|
- Tabela z wszystkimi danymi
|
|
- Dropdown statusu z save
|
|
|
|
h) `save_meta_box($post_id)` — hook `save_post_carei_reservation`:
|
|
- Zapisz wybrany status
|
|
|
|
i) `auto_mark_read($post_id)` — hook `edit_form_after_title` lub `admin_head`:
|
|
- Jeśli status == 'nowe' i jesteśmy na ekranie edycji → zmień na 'przeczytane'
|
|
|
|
j) **Inline CSS** dla badge'ów statusu i meta box — dodaj przez `admin_head` hook, scoped do CPT screen
|
|
|
|
2. **Zmodyfikuj `carei-reservation.php`:**
|
|
- Dodaj `require_once` dla nowej klasy
|
|
- Zainicjalizuj `new Carei_Admin_Panel()` w `plugins_loaded`
|
|
|
|
Avoid: Nie twórz oddzielnych template files. Wszystko w jednej klasie. Nie dodawaj custom taxonomy — meta jest wystarczające.
|
|
</action>
|
|
<verify>
|
|
- Otwórz wp-admin → "Rezerwacje" widoczne w menu
|
|
- Lista pusta, kolumny widoczne
|
|
- Filtr statusu nad listą
|
|
</verify>
|
|
<done>AC-1, AC-3, AC-4, AC-5 satisfied: CPT zarejestrowany, kolumny, meta box, auto-read</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 2: Zapis rezerwacji po sukcesie booking</name>
|
|
<files>wp-content/plugins/carei-reservation/includes/class-rest-proxy.php</files>
|
|
<action>
|
|
1. **W `class-rest-proxy.php`**, w callback dla `/booking` endpoint:
|
|
- Po udanym `make_booking()` i `confirm_booking()` (jeśli confirm jest w tym samym request) LUB:
|
|
- Lepiej: dodaj nowy statyczny helper `Carei_Admin_Panel::save_reservation($data, $result)`
|
|
|
|
2. **W callback `/booking`:**
|
|
- Po `$result = $api->make_booking($body)` z sukcesem:
|
|
- Wywołaj `Carei_Admin_Panel::save_reservation($body, $result)`
|
|
|
|
3. **Metoda `save_reservation($booking_data, $api_result)`:**
|
|
- `wp_insert_post()` z:
|
|
- post_type: `carei_reservation`
|
|
- post_title: `Rezerwacja #{reservationNo} — {firstName} {lastName}`
|
|
- post_status: `publish`
|
|
- `update_post_meta()` dla:
|
|
- `_carei_reservation_no` ← reservationNo
|
|
- `_carei_reservation_id` ← reservationId
|
|
- `_carei_customer_id` ← customerId
|
|
- `_carei_segment` ← carParameters.categoryName
|
|
- `_carei_date_from` ← dateFrom
|
|
- `_carei_date_to` ← dateTo
|
|
- `_carei_pickup_branch` ← pickUpLocation.branchName
|
|
- `_carei_return_branch` ← returnLocation.branchName
|
|
- `_carei_first_name` ← drivers[0].firstName (lub z booking_data)
|
|
- `_carei_last_name` ← drivers[0].lastName
|
|
- `_carei_email` ← drivers[0].email
|
|
- `_carei_phone` ← drivers[0].phone
|
|
- `_carei_pesel` ← drivers[0].pesel
|
|
- `_carei_address` ← JSON encode drivers[0].address
|
|
- `_carei_extras` ← JSON encode priceItems
|
|
- `_carei_comments` ← comments
|
|
- `_carei_status` ← 'nowe'
|
|
- `_carei_raw_response` ← JSON encode api_result (backup)
|
|
|
|
4. **Error handling:** Jeśli wp_insert_post() fail, loguj do error_log ale NIE blokuj response do usera (rezerwacja już w Softra jest OK).
|
|
|
|
Avoid: Nie modyfikuj flow rezerwacji. Zapis jest fire-and-forget — nigdy nie blokuje odpowiedzi do klienta.
|
|
</action>
|
|
<verify>
|
|
- Złóż testową rezerwację przez formularz
|
|
- Sprawdź wp-admin → Rezerwacje → nowy wpis z danymi
|
|
- Kliknij wpis → meta box ze szczegółami
|
|
</verify>
|
|
<done>AC-2 satisfied: rezerwacja zapisuje się automatycznie po sukcesie</done>
|
|
</task>
|
|
|
|
<task type="checkpoint:human-verify" gate="blocking">
|
|
<what-built>Admin panel rezerwacji w wp-admin: CPT, kolumny, filtr statusu, meta box szczegółów, auto-zapis po rezerwacji, auto-mark-read</what-built>
|
|
<how-to-verify>
|
|
1. Otwórz wp-admin na carei.pagedev.pl
|
|
2. W menu bocznym: "Rezerwacje" z ikoną samochodu
|
|
3. Złóż rezerwację przez formularz na frontendzie
|
|
4. Wróć do wp-admin → Rezerwacje → nowy wpis ze statusem "nowe" (niebieski badge)
|
|
5. Kolumny: Nr rezerwacji, Klient, Segment, Daty, Oddział, Status, Data
|
|
6. Filtr statusu nad listą (dropdown)
|
|
7. Kliknij wpis → meta box "Szczegóły rezerwacji" z pełnymi danymi
|
|
8. Status zmienił się na "przeczytane" (żółty)
|
|
9. Zmień status na "zrealizowane" → Zaktualizuj → zielony badge
|
|
</how-to-verify>
|
|
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
|
|
</task>
|
|
|
|
</tasks>
|
|
|
|
<boundaries>
|
|
|
|
## DO NOT CHANGE
|
|
- wp-content/plugins/carei-reservation/assets/js/carei-reservation.js (Phase 4 stable)
|
|
- wp-content/plugins/carei-reservation/assets/css/carei-reservation.css (Phase 4 stable)
|
|
- wp-content/plugins/carei-reservation/includes/class-elementor-widget.php (Phase 4 stable)
|
|
- wp-content/plugins/carei-reservation/includes/class-softra-api.php (API proxy stable)
|
|
- .env (credentials)
|
|
|
|
## SCOPE LIMITS
|
|
- Nie dodawaj eksportu CSV/PDF (przyszły feature)
|
|
- Nie dodawaj email notyfikacji (zależy od Softra)
|
|
- Nie modyfikuj frontend formularza
|
|
- Nie dodawaj REST API endpoints dla admin panelu (nie potrzebne — natywny WP admin)
|
|
- Nie twórz custom database table — CPT + post_meta wystarczy dla MVP
|
|
|
|
</boundaries>
|
|
|
|
<verification>
|
|
Before declaring plan complete:
|
|
- [ ] CPT `carei_reservation` zarejestrowany w wp-admin
|
|
- [ ] Menu "Rezerwacje" widoczne z ikoną
|
|
- [ ] Rezerwacja zapisuje się po sukcesie booking
|
|
- [ ] Lista: kolumny Nr, Klient, Segment, Daty, Oddział, Status, Data
|
|
- [ ] Filtr statusu działa
|
|
- [ ] Meta box ze wszystkimi danymi
|
|
- [ ] Auto-mark-read przy otwarciu
|
|
- [ ] Zmiana statusu przez dropdown + save
|
|
- [ ] Badge kolory: nowe=niebieski, przeczytane=żółty, zrealizowane=zielony
|
|
- [ ] Brak regresji w booking flow na frontendzie
|
|
</verification>
|
|
|
|
<success_criteria>
|
|
- All 5 acceptance criteria met
|
|
- All verification checks pass
|
|
- No regressions in frontend booking flow
|
|
- Human verification approved on carei.pagedev.pl
|
|
</success_criteria>
|
|
|
|
<output>
|
|
After completion, create `.paul/phases/05-admin-panel/05-01-SUMMARY.md`
|
|
</output>
|