---
phase: 03-miejsca-postojowe
plan: 01
subsystem: ui, api, database
tags: [elementor, acf, wp-cron, xml, ajax, parking]

requires:
  - phase: 01-historia-cen
    provides: price_history table, popup pattern, AJAX pattern, XML endpoint
  - phase: 02-jawnosc-cen
    provides: XML export structure, dane.gov.pl integration
provides:
  - Elementor widget "Miejsca Postojowe" with price display and history popup
  - wp_parking_price_history DB table
  - Daily cron recording parking prices
  - AJAX endpoint for parking price history
  - XML export extended with parking spots
affects: []

tech-stack:
  added: []
  patterns: [ACF group field access pattern]

key-files:
  created:
    - wp-content/plugins/elementor-addon/widgets/parking-spots.php
  modified:
    - wp-content/plugins/elementor-addon/elementor-addon.php
    - wp-content/plugins/elementor-addon/assets/js/main.js
    - wp-content/plugins/elementor-addon/assets/css/main.css

key-decisions:
  - "ACF groups: pola cen w grupach, nie flat — get_field('grupa', 'option')['pole']"
  - "Osobna tabela wp_parking_price_history zamiast rozszerzania wp_price_history"
  - "Cena m2 ukryta w widgecie na życzenie użytkownika (dane nadal w cronie/XML)"
  - "Layout bez ramek, kolumnowy zamiast grid 2-kolumnowego"

patterns-established:
  - "ACF group field access: get_field('group_name', 'option')['group_name_field']"
  - "Parking popup reuse: fallback overlay usuwany jeśli apartamentowy istnieje"

duration: ~30min
completed: 2026-03-25
---

# Phase 3 Plan 01: Miejsca Postojowe Summary

**Widget Elementor wyswietlajacy ceny miejsc postojowych (zwykle/rodzinne) z historia cen, cron i XML export**

## Performance

| Metric | Value |
|--------|-------|
| Duration | ~30min |
| Completed | 2026-03-25 |
| Tasks | 2 auto + 2 checkpoints |
| Files modified | 4 (1 new, 3 modified) |

## Acceptance Criteria Results

| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Widget wyswietla ceny parkingowe | Pass | Dwa typy z cenami z ACF grup, layout kolumnowy |
| AC-2: Popup historia cen dziala | Pass | Reuse popup apartamentow, AJAX endpoint dziala |
| AC-3: Cron zapisuje ceny codziennie | Pass | INSERT IGNORE do wp_parking_price_history |
| AC-4: XML export zawiera miejsca postojowe | Pass | Sekcja <miejsca_postojowe> w /ceny-mieszkan.xml |

## Accomplishments

- Widget "Miejsca Postojowe" w Elementorze — 2 karty (zwykle/rodzinne) z ceną i przyciskiem historia cen
- Tabela wp_parking_price_history z codziennym zapisem cen przez WP Cron
- AJAX endpoint parking_get_price_history z popupem reusujacym overlay apartamentow
- XML /ceny-mieszkan.xml rozszerzony o sekcje <miejsca_postojowe> z historia

## Files Created/Modified

| File | Change | Purpose |
|------|--------|---------|
| `widgets/parking-spots.php` | Created | Elementor widget rendering parking spot cards |
| `elementor-addon.php` | Modified | DB table, cron extension, AJAX endpoint, XML export |
| `assets/js/main.js` | Modified | Parking price history click handler + AJAX |
| `assets/css/main.css` | Modified | Parking widget styles (no border, column layout) |

## Decisions Made

| Decision | Rationale | Impact |
|----------|-----------|--------|
| Osobna tabela wp_parking_price_history | Parking to opcje ACF, nie CPT — inna struktura (parking_type vs post_id) | Czysta separacja, brak zmian w istniejącej tabeli |
| ACF group access pattern | Pola cen są w grupach ACF, nie flat | Wymaga get_field('grupa', 'option')['pole'] |
| Ukrycie ceny m2 w widgecie | Request użytkownika — uproszczony wygląd | Dane m2 nadal w cronie i XML |
| Layout bez ramek, kolumnowy | Request użytkownika — bliższy designowi Figma | Prostszy CSS |

## Deviations from Plan

### Summary

| Type | Count | Impact |
|------|-------|--------|
| User-requested changes | 2 | Design adjustments, no functional impact |
| Auto-fixed | 1 | ACF group access pattern |

**Total impact:** Essential fixes + design preferences, no scope creep

### Details

1. **ACF group fields** — Plan zakladal flat access (get_field('pole', 'option')). Odkryto ze pola sa w grupach ACF. Naprawione na get_field('grupa', 'option')['pole'].

2. **Ukrycie ceny m2** — User request. Usunieto z HTML widgetu, dane nadal zapisywane.

3. **Layout bez ramek, kolumnowy** — User request. Zmieniono z grid 2-kolumnowego z ramkami na flex column bez ramek.

## Issues Encountered

| Issue | Resolution |
|-------|------------|
| Figma MCP niedostępny (oryginalny plik) | User udostępnił kopię, pobrano screenshot Frame 16 |
| Ceny nie wyświetlały się po wdrożeniu | ACF pola w grupach — naprawiony pattern dostępu |

## Next Phase Readiness

**Ready:**
- Milestone v0.2 Miejsca Postojowe kompletny (1 faza, 1 plan)
- Wszystkie AC spełnione

**Concerns:**
- WP Cron pseudocron — na produkcji zalecany systemowy cron
- Cena m2 ukryta — może wymagać przywrócenia w przyszłości

**Blockers:**
- None

---
*Phase: 03-miejsca-postojowe, Plan: 01*
*Completed: 2026-03-25*
