- Panel admina (wp-admin > Rezerwacje > Pakiety ochronne) do zarzadzania nazwami, cenami za dobe, aktywnoscia i opisami pakietow SOFT i PREMIUM (zapis w wp_options carei_protection_packages) - REST endpoint GET /carei/v1/protection-packages zwracajacy aktywne pakiety - Radio cards SOFT/PREMIUM w modalu rezerwacji nad pozycjami "Pakiety ochronne" z API (osobne zrodlo danych, separator wizualny) - Radio z deselect (klik zaznaczonego odznacza), natywny input z accent-color - Pakiet NIE wysylany w priceItems Softra (powodowalo HTTP 400) - zamiast tego doklejany do comments booking i zapisywany w _carei_protection_package meta - Summary frontend dokorysowuje wiersz pakietu w tabeli cen i dolicza do total gross (grandGross = softraGross + protectionTotal) - Plan 13-01 oznaczony jako superseded (klient zmienil zrodlo danych) - Phase 13 Complete, Milestone v0.5 Complete Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
10 KiB
10 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, started, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | started | completed | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13-protection-packages | 02 | ui |
|
|
|
|
|
|
|
|
~3h | 2026-04-20T12:00:00Z | 2026-04-20T15:30:00Z |
Phase 13 Plan 02: Pakiety ochronne SOFT+PREMIUM — Summary
Dwa pakiety ochronne z ceną/doba zarządzane w panelu WP (wp_options), renderowane jako radio cards w modalu nad opcjami API, doliczane lokalnie w summary i przesyłane do Softra przez comments + lokalny meta CPT.
Performance
| Metric | Value |
|---|---|
| Duration | ~3h |
| Started | 2026-04-20T12:00:00Z |
| Completed | 2026-04-20T15:30:00Z |
| Tasks | 3 auto + 1 checkpoint (human-verify approved) |
| Files modified | 5 |
Acceptance Criteria Results
| Criterion | Status | Notes |
|---|---|---|
| AC-1: Panel administratora — konfiguracja pakietów | ✅ Pass | Submenu "Pakiety ochronne" w edit.php?post_type=carei_reservation, formularz z nazwą/ceną/aktywnym/opisem dla SOFT+PREMIUM, zapis w carei_protection_packages |
| AC-2: Endpoint REST z danymi pakietów | ✅ Pass | GET /wp-json/carei/v1/protection-packages zwraca {soft, premium} z filtrem active=true |
| AC-3: Render kafelków z separatorem | ✅ Pass | #carei-protection-packages-container nad #carei-insurance-container, .carei-form__protection-divider oddziela wizualnie |
| AC-4: Wybór i dynamiczne przeliczanie | ✅ Pass (zmieniono UX) | Radio z deselect działa; sumowanie × days wyłączone w kafelku (decyzja UX z klientem — tylko "X zł/doba" szare po prawej, total dopiero w summary) |
| AC-5: Pakiet w booking submission i CPT | ✅ Pass (rozwiązanie hybrydowe) | Pakiet w comments booking + protectionPackage w payloadzie + _carei_protection_package meta CPT + wiersz w summary overlay (details list + price table + totals) |
Accomplishments
- Zarządzanie niezależne od Softra — admin może zmieniać ceny pakietów bez dotykania API wynajmowanego przez zewnętrznego dostawcę
- Rozwiązanie konfliktu API — po pierwszej próbie wysłania pakietów jako
priceItemsSoftra zwracała HTTP 400; refactor w locie: pakiet wyłączony z priceItems, doklejony do comments + zobaczony w summary po stronie frontu - Spójność wizualna — kafelki pakietów identyczne stylem z
.carei-form__extra-card(nazwa blue, cena szara po prawej, bold, natywny radio z accent-color) - Pełny cykl życia rezerwacji — pakiet od momentu wyboru (radio) → comments Softra → CPT meta → meta box admina → wyświetlenie w formacie "nazwa — cena/doba × dni = total"
Files Created/Modified
| File | Change | Purpose |
|---|---|---|
.paul/phases/13-protection-packages/13-02-PLAN.md |
Created | Plan zastępujący 13-01 (nowe założenia klienta) |
.paul/phases/13-protection-packages/13-02-SUMMARY.md |
Created | Ten dokument |
wp-content/plugins/carei-reservation/includes/class-admin-panel.php |
Modified | Submenu page, handler POST, get_protection_packages() static, rozszerzenie save_reservation() o protection_package meta, wiersz w meta boxie |
wp-content/plugins/carei-reservation/includes/class-rest-proxy.php |
Modified | Rejestracja GET /protection-packages, callback get_protection_packages() z filtrem active |
wp-content/plugins/carei-reservation/includes/class-elementor-widget.php |
Modified | Nowy #carei-protection-packages-container + .carei-form__protection-divider nad #carei-insurance-container |
wp-content/plugins/carei-reservation/assets/js/carei-reservation.js |
Modified | protectionPackages state, loadProtectionPackages(), renderProtectionPackages() z radio + deselect, getSelectedProtectionPayload(), buildBookingComments(), integracja w showSummaryOverlay (details + table + totals) |
wp-content/plugins/carei-reservation/assets/css/carei-reservation.css |
Modified | Style kafelków pakietów (flex row, name blue, price gray right, radio 16×16 accent-color, separator dashed), mobile stack |
Decisions Made
| Decision | Rationale | Impact |
|---|---|---|
| Pakiet NIE w priceItems Softra | HTTP 400 przy próbie wysłania fałszywego ID — Softra waliduje wobec swojej bazy | Wymagane osobne kanały: comments (widoczne pracownikom wypożyczalni), protectionPackage payload (zapis WP), summary UI (widoczne klientowi) |
| UX: brak totala × days w kafelku | Klient poprosił o spójność z extras (tylko "X zł/doba" szary po prawej), total dopiero w summary | Prostszy kafelek, updateProtectionTotals() usunięty jako martwy kod, listenery dat oczyszczone |
| Native radio + accent-color | Spójne z reszta formularza, user prosił o widoczny wybór | Minimalny CSS, natywna accessibility, JS tylko dla deselect |
| Plan 13-01 superseded zamiast skasowany | Historia decyzji klienta zachowana dla przyszłego audytu | 13-01-PLAN.md pozostaje w repo z notatką supersession w ROADMAP |
Deviations from Plan
Summary
| Type | Count | Impact |
|---|---|---|
| Auto-fixed | 2 | Konieczne korekty po błędach runtime |
| Scope additions | 1 | Feedback UX w trakcie: prostszy kafelek |
| Deferred | 0 | — |
Total impact: Wszystkie deviations wynikły z feedback usera w trakcie APPLY (3 iteracje UI + 1 fix błędu API). Żadna nie wychodziła poza cel planu.
Auto-fixed Issues
1. [API] HTTP 400 z Softra przy wysyłaniu pakietu jako priceItem
- Found during: Task 3 (frontend JS) po wdrożeniu i kliknięciu "Pokaż podsumowanie"
- Issue:
priceItemszawierałid: 'protection_soft'— Softra nie zna tego ID i zwracała 400 Bad Request - Fix: Usunięto pakiet z
getSelectedExtrasForApi(), dodano jako osobną linię wcommentsbooking (buildBookingComments()) oraz jako wiersz w summary frontend (details list + price table + totals), grandGross = softraGross + protectionTotal - Files:
carei-reservation.js - Verification: User potwierdził brak błędu + widoczność pakietu w summary
2. [UX] Pakiet niewidoczny w liście "Wybrane opcje" summary
- Found during: Weryfikacja po fixie HTTP 400
- Issue:
summaryDetailsiterował poselectedExtraszgetSelectedExtrasForApi(), który nie zawiera już pakietu - Fix: Dodany warunkowy wiersz w liście używający
getSelectedProtectionPayload()z formatem analogicznym do extras (X zł/doba × N = total zł) - Files:
carei-reservation.js - Verification: User potwierdził widoczność
Scope Additions
1. [UX] Uproszczenie kafelka (usunięcie total × days z popupu)
- User request podczas APPLY: "pokazuj tak jak ceny pozostałych elementów, czyli po prawej wszystko szarym kolorem i bez sumowania za liczbę dni, to dopiero w kolejnym widoku podsumowania"
- Efekt:
updateProtectionTotals()usunięte jako martwy kod, listenery dat oczyszczone, CSS kafelków dostosowany do wzorca.carei-form__extra-card
Deferred Items
None.
Issues Encountered
| Issue | Resolution |
|---|---|
| Softra HTTP 400 | Refactor w locie — pakiet wyłączony z priceItems, dostarczany przez comments + meta + summary UI (patrz Auto-fixed #1) |
| Radio niewidoczny (pierwotnie hidden) | User request: "brakuje checkboxa wyboru wersji ubezpieczenia" → native radio w row z accent-color |
| Cena nie pogrubiona | User request → usunięcie override font-weight: 400 na .carei-form__protection-package__price strong |
Next Phase Readiness
Ready:
- Milestone v0.5 zamykany (Phase 13 ✅ + Phase 14 ✅ = 100%)
- Wzorzec "WP-managed dane + REST public endpoint + integracja z summary" gotowy do reuse w kolejnych niezależnych od Softra customizacjach
- Admin ma pełną kontrolę nad cenami bez wymagań modyfikacji Softra
Concerns:
- VAT dla pakietu traktowany jako brutto bez rozbicia netto/VAT — wystarczy dla MVP, ale jeśli klient będzie wymagał księgowego rozbicia, trzeba dodać
vatRatew adminie i kalkulację - Comments Softra ma limit długości nieznany — w przyszłości rozważyć dedykowany field w integracji, jeśli Softra doda taki
Blockers:
- None
Phase: 13-protection-packages, Plan: 02 Completed: 2026-04-20