---
phase: 03-cookie-consent
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- libraries/CookieNoticePro/cookienoticepro.script.js
- libraries/CookieNoticePro/cookienoticepro.style.css
- templates/site/layout-logged.php
autonomous: false
delegation: off
---
## Goal
Wdrożyć baner zgody na cookies (CookieNoticePro) z Google Consent Mode v2, naprawić błąd `analytics_storage: 'granted'` w bibliotece oraz dodać domyślną inicjalizację consent mode przed snippetem GTM.
## Purpose
Wymaganie RODO — serwis musi uzyskać zgodę użytkownika przed uruchomieniem trackerów analitycznych i marketingowych. Google Consent Mode v2 zapewnia zgodność z wymaganiami Google (od marca 2024) i zachowanie modelowanych danych konwersji nawet przy braku zgody.
## Output
- `libraries/CookieNoticePro/cookienoticepro.script.js` — zkopiony z pomysloweprezenty.pl i naprawiony (linia ~351: `'granted'` → `'denied'`)
- `libraries/CookieNoticePro/cookienoticepro.style.css` — zkopiony z pomysloweprezenty.pl
- `templates/site/layout-logged.php` — consent mode v2 default init przed GTM, załadowane CSS/JS banera, wywołanie `$.cookieNoticePro()`
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Source Files
@templates/site/layout-logged.php
## Biblioteka źródłowa (pomysloweprezenty.pl)
Pliki do skopiowania:
- `c:\visual studio code\projekty\pomysloweprezenty.pl\libraries\CookieNoticePro\cookienoticepro.script.js`
- `c:\visual studio code\projekty\pomysloweprezenty.pl\libraries\CookieNoticePro\cookienoticepro.style.css`
## AC-1: Consent Mode v2 default init przed GTM
```gherkin
Given layout-logged.php jest renderowany w przeglądarce
When strona się ładuje
Then w , PRZED snippetem GTM, znajduje się blok gtag('consent','default',{...}) ustawiający wszystkie storage na 'denied'
```
## AC-2: Baner cookies wyświetla się przy pierwszej wizycie
```gherkin
Given użytkownik odwiedza serwis po raz pierwszy (brak cookie COOKIE_CONSENT)
When strona się załaduje
Then pojawia się baner CookieNoticePro z przyciskami akceptacji/odrzucenia/dostosowania
```
## AC-3: Naprawa błędu analytics_storage denied
```gherkin
Given użytkownik odwiedza serwis i wybiera "Odrzuć" lub wyłącza analytics w ustawieniach
When biblioteka wywołuje googleConsentModeHandler()
Then gtag('consent','update') wysyła {'analytics_storage': 'denied'} (nie 'granted')
```
## AC-4: Akceptacja cookies uruchamia gtag update z 'granted'
```gherkin
Given użytkownik wybrał akceptację wszystkich cookies
When biblioteka wywołuje googleConsentModeHandler()
Then gtag('consent','update') wysyła {'analytics_storage': 'granted'} i {'ad_storage': 'granted', ...}
```
## AC-5: Pliki biblioteki obecne w projekcie
```gherkin
Given wdrożenie jest kompletne
When sprawdzamy strukturę projektu
Then istnieją pliki libraries/CookieNoticePro/cookienoticepro.script.js i cookienoticepro.style.css
```
Task 1: Skopiuj pliki CookieNoticePro i napraw błąd analytics_storagelibraries/CookieNoticePro/cookienoticepro.script.js, libraries/CookieNoticePro/cookienoticepro.style.css
1. Skopiuj oba pliki z `c:\visual studio code\projekty\pomysloweprezenty.pl\libraries\CookieNoticePro\` do `libraries/CookieNoticePro\` w tym projekcie.
2. W `cookienoticepro.script.js`, napraw błąd w funkcji `googleConsentModeHandler` (~linia 351):
- Znajdź blok `else` po `if(preferences.indexOf("analytics") > -1)` — ten blok obsługuje sytuację gdy analytics NIE jest zaakceptowane
- W tym bloku `else`, zmień:
```js
gtag('consent', 'update', {
'analytics_storage': 'granted'
});
```
na:
```js
gtag('consent', 'update', {
'analytics_storage': 'denied'
});
```
- Blok `if` (analytics zaakceptowane, ~linia 341-343) musi pozostać z `'granted'` — nie ruszaj go.
Unikaj: modyfikowania innych fragmentów pliku; zmiany konfiguracji `config {}` (kolory, tekst) — to ustawi się w layout.
Grep w skopiowanym pliku:
- Potwierdź że istnieje dokładnie JEDNO wywołanie `'analytics_storage': 'denied'` w bloku else
- Potwierdź że `'analytics_storage': 'granted'` nadal istnieje w bloku if (analytics accepted)
Komenda: grep -n "analytics_storage" libraries/CookieNoticePro/cookienoticepro.script.js
AC-3, AC-4, AC-5 satisfied: plik skopiowany, błąd naprawiony, 'denied' w else, 'granted' w ifTask 2: Dodaj Consent Mode v2 default init i integruj baner w layout-logged.phptemplates/site/layout-logged.php
W `templates/site/layout-logged.php`:
1. **Consent Mode v2 default — PRZED snippetem GTM** (wstaw przed komentarzem ``):
```html
```
2. **CSS banera** — dodaj do sekcji `` po istniejących linkach CSS (przed zamknięciem ``):
```html
```
3. **JS banera + inicjalizacja** — dodaj przed zamknięciem ``, po istniejącym bloku `
```
Kolejność w `` po zmianie (od góry):
1. Meta tagi
2. Linki CSS (istniejące + nowy CSS banera)
3. jQuery i inne JS
4. **Consent Mode v2 default** ← NOWE (musi być przed GTM)
5. **GTM snippet** ← istniejący (bez zmian)
Unikaj: modyfikowania snippetu GTM; zmiany kolejności istniejących skryptów; dodawania atrybutu `async` lub `defer` do skryptu banera.
Sprawdź w pliku layout-logged.php:
- Blok consent default pojawia się PRZED ``
- `cookienoticepro.style.css` jest linkowany w ``
- `cookienoticepro.script.js` i wywołanie `$.cookieNoticePro()` są przed ``
Komenda: grep -n "Consent Mode\|cookienoticepro\|GTM-TW9WCD9J" templates/site/layout-logged.php
AC-1, AC-2 satisfied: consent default init przed GTM, CSS i JS banera załadowaneBaner CookieNoticePro z Consent Mode v2 zintegrowany w layout-logged.php. Pliki biblioteki w libraries/CookieNoticePro/. Błąd analytics_storage naprawiony.
1. Wyślij pliki na serwer przez FTP (Ctrl+Shift+P → "FTP-kr: Upload")
2. Otwórz https://bilety.brzezovka.pl w trybie incognito (brak cookies)
3. Sprawdź czy pojawia się baner zgody na cookies
4. Otwórz DevTools → Console — sprawdź czy NIE ma błędów JS
5. Otwórz DevTools → Network → filtruj "gtm" — sprawdź czy GTM się ładuje
6. W Console wpisz: `document.cookie` — nie powinno być COOKIE_CONSENT (przed akceptacją)
7. Kliknij "Odrzuć wszystkie" → w DevTools → Application → Cookies sprawdź czy GOOGLE_CONSENT_MODE_ANALYTICS_STORAGE ma wartość false/brak
8. Odśwież stronę — baner NIE powinien się pojawić ponownie (cookie zapamiętane)
9. Kliknij ikonę ciasteczka (minimize) → wybierz "Akceptuj wszystkie" → sprawdź że gtag update wysyła 'granted' (DevTools → Console → wpisz: `dataLayer` i poszukaj consent update)
Wpisz "approved" jeśli baner działa poprawnie, lub opisz problemy do naprawienia
## DO NOT CHANGE
- `templates/tickets/przelewy24.php` — purchase event (Phase 2, nie ruszać)
- `templates/tickets/order-confirm.php` — po czyszczeniu Phase 2
- Snippet GTM w layout-logged.php — tylko kolejność, nie treść
- `config.php` — konfiguracja poza zakresem
## SCOPE LIMITS
- Nie konfiguruj cookienoticepro dla innych layoutów (layout-unlogged.php nie jest używany)
- Nie zmieniaj kolorów/tekstu/języka banera — domyślna konfiguracja z biblioteki jest wystarczająca na start
- Nie dodawaj nowych zależności JS poza biblioteką CookieNoticePro
- Nie wdrażaj server-side consent storage — tylko frontend cookies
Przed ogłoszeniem planu za kompletny:
- [ ] `grep -n "analytics_storage" libraries/CookieNoticePro/cookienoticepro.script.js` → pokazuje 'denied' w else i 'granted' w if
- [ ] `grep -n "consent.*default\|cookienoticepro\|GTM-TW9WCD9J" templates/site/layout-logged.php` → consent default PRZED GTM
- [ ] Baner pojawia się na stronie przy pierwszej wizycie (weryfikacja manualna — checkpoint)
- [ ] Brak błędów JS w konsoli
- [ ] Odrzucenie cookies → analytics_storage pozostaje denied (nie grantowane)
- Pliki CookieNoticePro obecne w libraries/CookieNoticePro/
- Błąd analytics_storage naprawiony (denied zamiast granted w bloku else)
- Consent Mode v2 default init znajduje się przed GTM snippetem w layout-logged.php
- Baner wyświetla się przy pierwszej wizycie i zapamiętuje wybór
- Serwis spełnia wymaganie RODO z PROJECT.md (Must Have: Zgodność z RODO)