Files
wyszynskiego12.pagedev.pl/docs/jawnosc-cen.md
Jacek Pyziak 972c69b136 feat(v0.1): historia cen + jawnosc cen — milestone Initial Release
Historia cen:
- Tabela wp_price_history z WP Cronem dziennym (snapshot cen)
- AJAX endpoint apartamenty_get_price_history (zabezpieczony nonce)
- Popup "Historia cen" w widgecie — vanilla JS, modal zgodny z projektem

Jawnosc cen:
- Endpointy /ceny-mieszkan.xml + /dane-gov-pl.xml (XSD-compliant)
- Pliki MD5 dla obu XML
- Strona admina: Narzedzia -> Jawnosc Cen z URL-ami do Ministerstwa
- Transient cache 1h z inwalidacja przez cron

Dokumentacja: docs/readme.md + docs/jawnosc-cen.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 15:40:29 +01:00

143 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Jawność cen — dokumentacja
## Co zostało zbudowane
Cztery publiczne endpointy HTTP oraz strona administracyjna, spełniające wymóg ustawy o jawności cen nieruchomości.
### Endpointy
| URL | Opis |
|-----|------|
| `/ceny-mieszkan.xml` | XML z cenami wszystkich lokali + historia zmian z bazy danych |
| `/ceny-mieszkan.md5` | Hash MD5 powyższego pliku XML (32-znakowy lowercase hex) |
| `/dane-gov-pl.xml` | Katalog zgodny z XSD portalu dane.gov.pl, wskazujący na plik cen |
| `/dane-gov-pl.md5` | Hash MD5 katalogu |
Wszystkie endpointy są publicznie dostępne bez logowania.
### Strona administracyjna
**wp-admin → Narzędzia → Jawność Cen**
Pokazuje oba URL-e do zgłoszenia do Ministerstwa z przyciskami „Kopiuj URL" i „Otwórz XML".
---
## Jak to działa
### Plik cen (`/ceny-mieszkan.xml`)
- Pobiera wszystkie opublikowane posty typu `apartamenty`
- Dla każdego lokalu odczytuje pola ACF: `information_type`, `information_floor`, `information_floor_space`, `information_price`, `information_price_m2`, `information_status`
- Dołącza historię cen z tabeli `wp_price_history` (ta sama tabela co cron dzienny)
- Wynik cachowany w transiencie WordPress na **1 godzinę**
- Cache jest automatycznie czyszczony przy każdym uruchomieniu crona dziennego
Struktura XML:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<lokale inwestycja="Wyszyńskiego 12" generowany="2026-03-12T10:00:00+01:00">
<lokal id="123">
<nazwa>A1 Lokal 101</nazwa>
<typ>mieszkanie</typ>
<pietro>1</pietro>
<powierzchnia>35,68</powierzchnia>
<status>dostępny</status>
<cena_brutto>677 920</cena_brutto>
<cena_za_m2>19 000</cena_za_m2>
<data_aktualizacji>2026-03-12</data_aktualizacji>
<historia_cen>
<zmiana data="2026-03-12">
<cena_brutto>677 920</cena_brutto>
<cena_za_m2>19 000</cena_za_m2>
</zmiana>
</historia_cen>
</lokal>
</lokale>
```
### Katalog dane.gov.pl (`/dane-gov-pl.xml`)
Statyczny XML generowany dynamicznie — URL zasobu pobierany przez `home_url()`, data przez `date()`. Zgodny z XSD `otwarte_dane_latest.xsd` portalu dane.gov.pl.
### Kod źródłowy
Plik: `wp-content/plugins/elementor-addon/elementor-addon.php`
| Funkcja | Opis |
|---------|------|
| `apartamenty_xml_rewrite_rules()` | Rejestruje reguły URL dla endpointów |
| `apartamenty_xml_query_vars()` | Dodaje query vars do WordPress |
| `apartamenty_generate_price_xml()` | Generuje XML cen z cachowaniem |
| `apartamenty_generate_datagov_xml()` | Generuje XML katalogu dane.gov.pl |
| `apartamenty_xml_template_redirect()` | Obsługuje żądania HTTP i wysyła odpowiedź |
| `apartamenty_jawnosc_cen_menu()` | Rejestruje stronę w menu Narzędzia |
| `apartamenty_jawnosc_cen_page()` | Renderuje stronę administracyjną |
---
## Co musi zrobić Klient
### Krok 1: Flush rewrite rules (jednorazowo po wdrożeniu)
Po każdym wdrożeniu zmian w pluginie należy odświeżyć reguły permalink:
**wp-admin → Ustawienia → Bezpośrednie odnośniki → kliknij „Zapisz zmiany"**
Bez tego kroku endpointy XML zwracają błąd 404.
### Krok 2: Zgłoszenie do portalu dane.gov.pl
1. Zaloguj się na [dane.gov.pl](https://dane.gov.pl) (konto instytucjonalne dewelopera lub pełnomocnika)
2. W panelu wydawcy wybierz „Dodaj zbiór danych" lub „Zasilanie automatyczne (harvester)"
3. Podaj URL katalogu:
```
https://wyszynskiego12.pagedev.pl/dane-gov-pl.xml
```
4. Portal będzie automatycznie pobierał ten plik (codziennie) i aktualizował dane w rejestrze
> Jeśli portal dane.gov.pl wymaga wcześniejszej rejestracji instytucji — należy ją przeprowadzić osobno. Kontakt: **kontakt@dane.gov.pl**
### Krok 3 (opcjonalnie): Weryfikacja endpointów przed zgłoszeniem
Przed podaniem URL-a do Ministerstwa warto sprawdzić każdy endpoint ręcznie:
| URL | Oczekiwany wynik |
|-----|-----------------|
| `/ceny-mieszkan.xml` | XML z listą lokali, Content-Type: application/xml |
| `/ceny-mieszkan.md5` | 32-znakowy ciąg liter i cyfr, np. `a3f2b1c9...` |
| `/dane-gov-pl.xml` | XML z elementem `<datasets>`, URL w `<resource>` wskazuje na `/ceny-mieszkan.xml` |
| `/dane-gov-pl.md5` | 32-znakowy ciąg liter i cyfr |
---
## Aktualizacja danych
Dane w pliku XML są aktualizowane **automatycznie**:
- Ceny pobierane są z pól ACF w WordPress — wystarczy zaktualizować pole `information_price` w edytorze posta, a nowa cena pojawi się w XML po max. 1 godzinie (czas życia cache)
- Historia cen zapisywana jest codziennie przez WP Cron (szczegóły w `docs/readme.md`)
- Cache XML czyszczony jest przy każdym uruchomieniu crona
**Ręczne wymuszenie odświeżenia XML** (np. po pilnej zmianie ceny):
Przez WP-CLI (SSH):
```bash
wp transient delete apartamenty_price_xml_cache
```
Lub przez phpMyAdmin / SQL:
```sql
DELETE FROM wp_options WHERE option_name = '_transient_apartamenty_price_xml_cache';
DELETE FROM wp_options WHERE option_name = '_transient_timeout_apartamenty_price_xml_cache';
```
---
## Uwagi techniczne
- Endpointy nie wymagają żadnej konfiguracji po stronie serwera (nginx/Apache) — działają przez mechanizm rewrite rules WordPress
- XML generowany jest jako czysty string PHP z `htmlspecialchars(ENT_XML1)` — bezpieczny dla znaków specjalnych w nazwach lokali
- Katalog dane.gov.pl zawiera hardcodowane dane inwestycji (Wyszyńskiego 12) — jeśli dane inwestycji się zmienią, należy zaktualizować funkcję `apartamenty_generate_datagov_xml()` w pluginie