diff --git a/.paul/STATE.md b/.paul/STATE.md index 04eae4d..80479de 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -2,15 +2,15 @@ ## Current Position -Milestone: (ad-hoc) Products CL1 column swap -Phase: 1 of 1 (Products CL1 Column) — Completed -Plan: 01-01 unified (loop closed) +Milestone: (ad-hoc) Supplemental feed — custom_label_1 +Phase: 2 of 2 (Supplemental Feed CL1) — Completed +Plan: 02-01 unified (loop closed) Status: UNIFY complete -Last activity: 2026-04-22 — Closed loop for plan 01-01 +Last activity: 2026-04-22 — Zamknięto pętlę planu 02-01 Progress: - Milestone: [██████████] 100% -- Phase 1: [██████████] 100% +- Phase 2: [██████████] 100% ## Loop Position @@ -23,8 +23,8 @@ PLAN ──▶ APPLY ──▶ UNIFY Last session: 2026-04-22 Stopped at: Loop closed, pętla gotowa do nowego /paul:plan -Next action: Deploy na adspro.projectpro.pl — uruchom `php install.php` na serwerze (migracja 028) po wgraniu plików przez FTP -Resume file: .paul/phases/01-products-cl1-column/01-01-SUMMARY.md +Next action: Deploy na produkcję już wykonany; w razie kolejnego zadania — `/paul:plan` z opisem +Resume file: .paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md ## Historia zrealizowanych planów @@ -32,8 +32,13 @@ Resume file: .paul/phases/01-products-cl1-column/01-01-SUMMARY.md - 4 pliki zmodyfikowane: migration 028, factory, controller, template - 4 AC spełnione - 2 odchylenia udokumentowane (szerokość kolumny 50→120px, weryfikacja sync GAds) +- `02-01-PLAN.md` — custom_label_1 w supplemental feed TSV (completed 2026-04-22) + - 1 plik zmodyfikowany: autoload/services/class.SupplementalFeed.php (+6/-4) + - 4 AC spełnione + - 0 odchyleń — plan 1:1 ## Notes - PAUL framework działa w trybie ad-hoc (bez pełnej roadmapy/PROJECT.md). +- Łańcuch propagacji `custom_label_1` (UI → DB → feed TSV → GMC) jest teraz kompletny. - Następne zmiany: uruchom `/paul:plan` z opisem kolejnego zadania. diff --git a/.paul/changelog/2026-04-22.md b/.paul/changelog/2026-04-22.md new file mode 100644 index 0000000..d0926fc --- /dev/null +++ b/.paul/changelog/2026-04-22.md @@ -0,0 +1,15 @@ +# 2026-04-22 + +## Co zrobiono + +- [Phase 2, Plan 02-01] Dodano kolumnę `custom_label_1` do supplemental feed TSV w `services\SupplementalFeed::generate_for_client()` +- Rozszerzono SELECT/WHERE o `p.custom_label_1`, nagłówek TSV o `custom_label_1` (pozycja 5 — między `google_product_category` a `custom_label_3`) +- Zaktualizowano pętlę `foreach`: odczyt wartości, warunek pustki i zapis wiersza w `implode` uwzględniają `custom_label_1` +- Brak odchyleń, 4/4 AC spełnione, `php -l` OK, weryfikacja runtime na produkcji potwierdzona przez użytkownika (feed klienta 9) + +## Zmienione pliki + +- `autoload/services/class.SupplementalFeed.php` +- `.paul/phases/02-supplemental-feed-cl1/02-01-PLAN.md` (nowy) +- `.paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md` (nowy) +- `.paul/STATE.md` diff --git a/.paul/docs/API.md b/.paul/docs/API.md new file mode 100644 index 0000000..cce27e0 --- /dev/null +++ b/.paul/docs/API.md @@ -0,0 +1,3 @@ +# API + +> Endpointy, kontrakty request/response, autentykacja. diff --git a/.paul/docs/ARCHITECTURE.md b/.paul/docs/ARCHITECTURE.md new file mode 100644 index 0000000..e76060e --- /dev/null +++ b/.paul/docs/ARCHITECTURE.md @@ -0,0 +1,3 @@ +# ARCHITECTURE + +> Struktura klas, modulow, przeplywow i zaleznosci w projekcie. diff --git a/.paul/docs/DB_SCHEMA.md b/.paul/docs/DB_SCHEMA.md new file mode 100644 index 0000000..737ad36 --- /dev/null +++ b/.paul/docs/DB_SCHEMA.md @@ -0,0 +1,3 @@ +# DB_SCHEMA + +> Schemat bazy danych — tabele, kolumny, FK, indeksy. diff --git a/.paul/docs/DECISIONS.md b/.paul/docs/DECISIONS.md new file mode 100644 index 0000000..59239f4 --- /dev/null +++ b/.paul/docs/DECISIONS.md @@ -0,0 +1,3 @@ +# DECISIONS + +> Kluczowe decyzje techniczne i ich uzasadnienia. diff --git a/.paul/docs/STACK.md b/.paul/docs/STACK.md new file mode 100644 index 0000000..bad9fe6 --- /dev/null +++ b/.paul/docs/STACK.md @@ -0,0 +1,3 @@ +# STACK + +> Stack technologiczny, wersje, zaleznosci, srodowisko. diff --git a/.paul/docs/TECH_CHANGELOG.md b/.paul/docs/TECH_CHANGELOG.md new file mode 100644 index 0000000..861d346 --- /dev/null +++ b/.paul/docs/TECH_CHANGELOG.md @@ -0,0 +1,3 @@ +# TECH_CHANGELOG + +> Chronologiczny log zmian technicznych — co i dlaczego. diff --git a/.paul/docs/TODO.md b/.paul/docs/TODO.md new file mode 100644 index 0000000..e5893db --- /dev/null +++ b/.paul/docs/TODO.md @@ -0,0 +1,3 @@ +# TODO + +> Luzny parking pomyslow, rzeczy do sprawdzenia. diff --git a/.paul/governance/governance_2026-04-22.jsonl b/.paul/governance/governance_2026-04-22.jsonl index b79682a..0540f0b 100644 --- a/.paul/governance/governance_2026-04-22.jsonl +++ b/.paul/governance/governance_2026-04-22.jsonl @@ -30,3 +30,15 @@ {"ts":"2026-04-21T22:37:41Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\01-products-cl1-column\\\\01-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/adsPRO"} {"ts":"2026-04-21T22:37:55Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\01-products-cl1-column\\\\01-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/adsPRO"} {"ts":"2026-04-21T22:38:08Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T07:58:30Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/02-supplemental-feed-cl1\"\",\"description\":\"Create phase directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputEx","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T07:59:22Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\02-supplemental-feed-cl1\\\\02-01-PLAN.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T07:59:37Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:01:10Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\autoload\\\\services\\\\class.SupplementalFeed.php","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:01:20Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\autoload\\\\services\\\\class.SupplementalFeed.php","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:01:27Z","tool":"Bash","cmd":"php -l \"autoload/services/class.SupplementalFeed.php\"\",\"description\":\"PHP syntax check\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in autoload/services/class.SupplementalFeed.ph","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:01:48Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:06:57Z","tool":"Bash","cmd":"git status --short && git diff --stat autoload/services/class.SupplementalFeed.php\",\"description\":\"Check modified files and diff stat\"},\"tool_response\":{\"stdout\":\" M .paul/STATE.md\\n M .pau","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:07:36Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\phases\\\\02-supplemental-feed-cl1\\\\02-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:07:47Z","tool":"Bash","cmd":"mkdir -p \".paul/changelog\"\",\"description\":\"Create changelog directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":true},\"t","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:07:56Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\changelog\\\\2026-04-22.md","cwd":"/c/visual studio code/projekty/adsPRO"} +{"ts":"2026-04-22T08:08:12Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\adsPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/adsPRO"} diff --git a/.paul/phases/02-supplemental-feed-cl1/02-01-PLAN.md b/.paul/phases/02-supplemental-feed-cl1/02-01-PLAN.md new file mode 100644 index 0000000..9755907 --- /dev/null +++ b/.paul/phases/02-supplemental-feed-cl1/02-01-PLAN.md @@ -0,0 +1,164 @@ +--- +phase: 02-supplemental-feed-cl1 +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - autoload/services/class.SupplementalFeed.php +autonomous: true +delegation: off +--- + + +## Goal +Dodać kolumnę `custom_label_1` do generowanego supplemental feeda TSV (np. `feeds/supplemental_9.tsv`), tak aby etykieta ta trafiała do Google Merchant Center razem z pozostałymi custom_labels. + +## Purpose +Plan 01-01 (Phase 1) wprowadził kolumnę `custom_label_1` w tabeli `/products` i w bazie danych (migracja 028), ale `services\SupplementalFeed::generate_for_client()` nie został zaktualizowany — feed TSV nadal eksportuje wyłącznie `custom_label_3` i `custom_label_4`. Skutek: wartości `custom_label_1` ustawione w UI nie są propagowane do Merchant Center, co łamie sens wprowadzenia tej kolumny. + +## Output +Zaktualizowany `autoload/services/class.SupplementalFeed.php` — feed `feeds/supplemental_{client_id}.tsv` zawiera kolumnę `custom_label_1` tuż po `google_product_category` (przed `custom_label_3`), z wartością pobraną z `products.custom_label_1`. + + + +## Project Context +@.paul/PROJECT.md +@.paul/ROADMAP.md +@.paul/STATE.md + +## Prior Work +@.paul/phases/01-products-cl1-column/01-01-SUMMARY.md +# Phase 1 dodał `products.custom_label_1` (migracja 028) i UI. Ten plan domyka lukę w feedzie TSV. + +## Source Files +@autoload/services/class.SupplementalFeed.php +@migrations/028_products_custom_label_1.sql + + + + +## AC-1: Nagłówek TSV zawiera custom_label_1 +```gherkin +Given klient o id = 9 ma wygenerowany feed przez SupplementalFeed::generate_for_client( 9 ) +When otworzę pierwszy wiersz pliku feeds/supplemental_9.tsv +Then kolumny rozdzielone TAB to dokładnie: id, title, description, google_product_category, custom_label_1, custom_label_3, custom_label_4 +``` + +## AC-2: Wartość custom_label_1 trafia do wierszy +```gherkin +Given produkt klienta 9 ma w DB products.custom_label_1 = "promo_spring" +When wygeneruję feed przez SupplementalFeed::generate_for_client( 9 ) +Then wiersz odpowiadający temu produktowi w feeds/supplemental_9.tsv ma w 5. kolumnie wartość "promo_spring" +``` + +## AC-3: Pusty custom_label_1 nie wymusza eksportu produktu ani nie psuje pustej logiki +```gherkin +Given produkt ma wszystkie kolumny (title, description, google_product_category, custom_label_1, custom_label_3, custom_label_4) puste +When wygeneruję feed +Then ten produkt zostaje pominięty (nie pojawia się w TSV), zgodnie z dotychczasowym zachowaniem +And produkty, które mają tylko custom_label_1 ustawione (reszta pusta), są eksportowane z custom_label_1 wypełnionym a pozostałymi kolumnami pustymi +``` + +## AC-4: Brak regresji dla custom_label_3 / custom_label_4 / bestseller +```gherkin +Given istniejąca logika refresh_bestseller_labels_for_client() nadal działa i ustawia products.custom_label_4 +When wygeneruję feed +Then custom_label_4 nadal jest w 7. kolumnie TSV (po dodaniu custom_label_1 kolumna przesuwa się z 6 na 7) +And custom_label_3 jest w 6. kolumnie TSV +And zwracane statystyki (products_total, products_written, file, labels_updated) zachowują dotychczasową strukturę +``` + + + + + + + Task 1: Dodaj custom_label_1 do SELECT, nagłówka, warunku pustki i wiersza TSV + autoload/services/class.SupplementalFeed.php + + W metodzie `generate_for_client( $client_id )`: + + 1. Rozszerz SELECT (ok. linia 166) o kolumnę `p.custom_label_1`: + ```sql + SELECT p.offer_id, p.title, p.description, p.google_product_category, + p.custom_label_1, p.custom_label_3, p.custom_label_4 + ``` + + 2. Rozszerz warunek WHERE o `p.custom_label_1 IS NOT NULL`: + ```sql + AND ( p.title IS NOT NULL + OR p.description IS NOT NULL + OR p.google_product_category IS NOT NULL + OR p.custom_label_1 IS NOT NULL + OR p.custom_label_3 IS NOT NULL + OR p.custom_label_4 IS NOT NULL ) + ``` + + 3. Nagłówek TSV (ok. linia 190) — zmień na: + `"id\ttitle\tdescription\tgoogle_product_category\tcustom_label_1\tcustom_label_3\tcustom_label_4\n"` + Kolejność: custom_label_1 PRZED custom_label_3 (zachowujemy naturalną numerację). + + 4. Pętla `foreach`: + - Dodaj `$custom_label_1 = trim( (string) ( $row['custom_label_1'] ?? '' ) );` + - Uwzględnij `$custom_label_1 === ''` w warunku pomijania produktu + (obok title/description/category/cl3/cl4). + - Dodaj `$custom_label_1` do tablicy przekazywanej do `implode( "\t", [...] )` — pozycja PRZED `$custom_label_3`. + + Unikaj: + - zmiany kolejności pozostałych kolumn (tylko DODAJEMY cl_1 w naturalnym miejscu) + - dotykania logiki `refresh_bestseller_labels_for_client()` ani `is_below_exit_for_cooldown()` (poza tym planem) + - zmiany sanitize_for_tsv / normalize_feed_offer_id + + + 1. Lokalnie (lub po wgraniu na serwer) uruchom PHP: + `php -r "require 'index.php'; print_r( \services\SupplementalFeed::generate_for_client( 9 ) );"` + (albo przez UI /feeds: klik "Generuj" dla klienta 9) + 2. `head -1 feeds/supplemental_9.tsv` → musi być: + `id\ttitle\tdescription\tgoogle_product_category\tcustom_label_1\tcustom_label_3\tcustom_label_4` + 3. Wybierz z DB produkt z ustawionym `custom_label_1`: + `SELECT offer_id, custom_label_1 FROM products WHERE client_id = 9 AND custom_label_1 <> '' LIMIT 1;` + Znajdź ten `offer_id` w TSV — 5. kolumna musi zawierać wartość z DB. + 4. Sanity check: liczba wierszy TSV ≈ poprzedniej generacji (plan nie powinien zmienić products_written poza przypadkami, gdzie TYLKO custom_label_1 jest wypełniony). + + AC-1, AC-2, AC-3, AC-4 spełnione: feed dla klienta 9 zawiera custom_label_1 w nagłówku i wierszach, pozostałe kolumny bez regresji. + + + + + + +## DO NOT CHANGE +- `refresh_bestseller_labels_for_client()`, `is_below_exit_for_cooldown()`, `get_client_bestseller_settings()` — logika bestsellera jest poza scope. +- `sanitize_for_tsv()`, `normalize_feed_offer_id()` — bez zmian. +- `migrations/028_products_custom_label_1.sql` — migracja już wdrożona w Phase 1. +- `autoload/controls/class.Products.php`, `templates/products/main_view.php` — UI produktów jest poza scope. +- Kolejność i nazwy pozostałych kolumn TSV (id, title, description, google_product_category, custom_label_3, custom_label_4) — tylko DODAJEMY custom_label_1 między `google_product_category` a `custom_label_3`. + +## SCOPE LIMITS +- Plan dotyczy WYŁĄCZNIE pliku `autoload/services/class.SupplementalFeed.php`. +- Nie dodajemy nowych etykiet (custom_label_0, 2) — to inne zadanie, jeśli kiedyś będzie. +- Nie wymuszamy automatycznej regeneracji feedów dla wszystkich klientów; regeneracja zajdzie przy najbliższym naturalnym wywołaniu z UI /feeds lub crona (o ile istnieje). +- Nie modyfikujemy formatu zwracanego przez `generate_for_client()` (klucze tablicy wynikowej pozostają: products_total, products_written, file, labels_updated). + + + + +Przed zamknięciem planu: +- [ ] `php -l autoload/services/class.SupplementalFeed.php` → No syntax errors +- [ ] Generacja feedu dla klienta 9 kończy się bez wyjątku +- [ ] Nagłówek TSV zawiera `custom_label_1` w 5. kolumnie +- [ ] Przynajmniej jeden wiersz TSV ma wypełnione `custom_label_1` (produkt z ustawioną etykietą w DB) +- [ ] Wszystkie AC spełnione + + + +- Zmodyfikowany jeden plik: `autoload/services/class.SupplementalFeed.php` +- Feed `feeds/supplemental_9.tsv` zawiera kolumnę `custom_label_1` z poprawnymi wartościami +- Brak błędów PHP (lint + runtime) +- Brak regresji w dotychczasowych kolumnach / statystykach zwrotnych + + + +Po ukończeniu utwórz `.paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md`. + diff --git a/.paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md b/.paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md new file mode 100644 index 0000000..31d2f03 --- /dev/null +++ b/.paul/phases/02-supplemental-feed-cl1/02-01-SUMMARY.md @@ -0,0 +1,111 @@ +--- +phase: 02-supplemental-feed-cl1 +plan: 01 +subsystem: feeds +tags: [merchant-center, supplemental-feed, tsv, custom-label, google-ads] + +requires: + - phase: 01-products-cl1-column + provides: kolumna `products.custom_label_1` w DB (migracja 028), UI edycji w /products +provides: + - Eksport `custom_label_1` do supplemental feed TSV (`feeds/supplemental_{client_id}.tsv`) + - Uzupełnienie łańcucha propagacji etykiety: UI → DB → feed → Google Merchant Center +affects: [merchant-center, google-ads-labels] + +tech-stack: + added: [] + patterns: [] + +key-files: + created: [] + modified: + - autoload/services/class.SupplementalFeed.php + +key-decisions: + - "Kolumna custom_label_1 w TSV umieszczona PRZED custom_label_3 (naturalna numeracja), a nie na końcu — łatwiejszy diff i zgodność z konwencją GMC" + +patterns-established: [] + +duration: ~5min +started: 2026-04-22T00:00:00Z +completed: 2026-04-22T00:00:00Z +--- + +# Phase 2 Plan 01: Supplemental Feed CL1 Summary + +**Supplemental feed TSV eksportuje teraz `custom_label_1` jako 5. kolumnę, domykając propagację etykiety z UI /products do Merchant Center.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~5 min | +| Started | 2026-04-22 | +| Completed | 2026-04-22 | +| Tasks | 1/1 | +| Files modified | 1 | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Nagłówek TSV zawiera custom_label_1 | Pass | Header: `id\ttitle\tdescription\tgoogle_product_category\tcustom_label_1\tcustom_label_3\tcustom_label_4` | +| AC-2: Wartość custom_label_1 trafia do wierszy | Pass | Użytkownik zweryfikował na produkcji — plik `feeds/supplemental_9.tsv` otwarty w IDE z poprawną zawartością | +| AC-3: Pusta logika rozszerzona o custom_label_1 | Pass | Warunek pomijania produktu uwzględnia `$custom_label_1 === ''` obok pozostałych; produkty z samym CL1 są eksportowane | +| AC-4: Brak regresji CL3/CL4/bestseller | Pass | Kolejność kolumn przesunięta zgodnie z planem (CL3 → pos 6, CL4 → pos 7), logika `refresh_bestseller_labels_for_client()` nietknięta | + +## Accomplishments + +- Zamknięta luka propagacji: `products.custom_label_1` (Phase 1) → TSV feed → GMC +- Użytkownik potwierdził działanie przez inspekcję `feeds/supplemental_9.tsv` na produkcji (po deployu FTP i regeneracji z UI /feeds) +- Zero regresji w dotychczasowych kolumnach i w logice bestseller + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `autoload/services/class.SupplementalFeed.php` | Modified | Dodano `custom_label_1` do SELECT (+WHERE), nagłówka TSV, warunku pustki w foreach i tablicy `implode` zapisu wiersza (+6/-4 linie) | +| `feeds/supplemental_9.tsv` | Regenerated (runtime artefakt) | Plik artefaktowy — regenerowany przez UI /feeds po deployu | + +## Decisions Made + +| Decision | Rationale | Impact | +|----------|-----------|--------| +| CL1 przed CL3 w TSV (pos 5) zamiast na końcu | Naturalna numeracja, mniejsze ryzyko pomyłek przy czytaniu feedu, zgodność z porządkiem atrybutów GMC | Kolumny CL3/CL4 przesunęły się o 1 w prawo — udokumentowane w AC-4, nie łamie parsera GMC (feed jest z nagłówkiem) | + +## Deviations from Plan + +### Summary + +| Type | Count | Impact | +|------|-------|--------| +| Auto-fixed | 0 | — | +| Scope additions | 0 | — | +| Deferred | 0 | — | + +**Total impact:** Brak odchyleń — plan wykonany 1:1. + +### Deferred Items + +Brak. + +## Issues Encountered + +Brak. + +## Next Phase Readiness + +**Ready:** +- Łańcuch propagacji custom_label_1 kompletny (UI ↔ DB ↔ feed TSV ↔ GMC) +- `SupplementalFeed::generate_for_client()` spójny z kolumnami DB dodanymi w Phase 1 + +**Concerns:** +- Jeśli kiedyś pojawi się `custom_label_0` / `custom_label_2` → trzeba dodać je analogicznie (obecnie pomijane, zgodnie ze scope) +- Feed jest generowany ad-hoc z UI /feeds — brak automatycznej regeneracji po zmianie etykiety; do rozważenia cron lub hook po edycji produktu + +**Blockers:** +- Brak + +--- +*Phase: 02-supplemental-feed-cl1, Plan: 01* +*Completed: 2026-04-22* diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 82019de..4a5c9c1 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -125,8 +125,8 @@ }, "class.Products.php": { "type": "-", - "size": 50620, - "lmtime": 1774556928712, + "size": 52633, + "lmtime": 1776810435280, "modified": false }, "class.Site.php": { @@ -193,8 +193,8 @@ }, "class.Products.php": { "type": "-", - "size": 42493, - "lmtime": 1774557838303, + "size": 44169, + "lmtime": 1776810339287, "modified": false }, "class.Users.php": { @@ -725,16 +725,22 @@ "lmtime": 1772116290944, "modified": false }, + "027_campaigns_comments.sql": { + "type": "-", + "size": 482, + "lmtime": 1772671313573, + "modified": false + }, "demo_data.sql": { "type": "-", "size": 21146, "lmtime": 0, "modified": true }, - "027_campaigns_comments.sql": { + "028_products_custom_label_1.sql": { "type": "-", - "size": 482, - "lmtime": 1772671313573, + "size": 527, + "lmtime": 1776810261993, "modified": false } }, @@ -793,8 +799,8 @@ "products": { "main_view.php": { "type": "-", - "size": 79768, - "lmtime": 1774561858674, + "size": 83598, + "lmtime": 1776810839722, "modified": false }, "product_history.php": { @@ -942,7 +948,39 @@ }, "tools": {}, "upload": {}, - "xml": {} + "xml": {}, + ".paul": { + "governance": { + "governance_2026-04-22.jsonl": { + "type": "-", + "size": 6322, + "lmtime": 1776811089208, + "modified": false + } + }, + "phases": { + "01-products-cl1-column": { + "01-01-PLAN.md": { + "type": "-", + "size": 13162, + "lmtime": 1776810182537, + "modified": false + }, + "01-01-SUMMARY.md": { + "type": "-", + "size": 5360, + "lmtime": 1776811074838, + "modified": false + } + } + }, + "STATE.md": { + "type": "-", + "size": 1220, + "lmtime": 1776811088649, + "modified": false + } + } } }, "$version": 1 diff --git a/autoload/services/class.SupplementalFeed.php b/autoload/services/class.SupplementalFeed.php index d66ae78..31b5cc9 100644 --- a/autoload/services/class.SupplementalFeed.php +++ b/autoload/services/class.SupplementalFeed.php @@ -163,12 +163,12 @@ class SupplementalFeed $labels_updated = self::refresh_bestseller_labels_for_client( $client_id ); $products = $mdb -> query( - "SELECT p.offer_id, p.title, p.description, p.google_product_category, p.custom_label_3, p.custom_label_4 + "SELECT p.offer_id, p.title, p.description, p.google_product_category, p.custom_label_1, p.custom_label_3, p.custom_label_4 FROM products p WHERE p.client_id = :client_id AND p.offer_id IS NOT NULL AND p.offer_id <> '' - AND ( p.title IS NOT NULL OR p.description IS NOT NULL OR p.google_product_category IS NOT NULL OR p.custom_label_3 IS NOT NULL OR p.custom_label_4 IS NOT NULL )", + AND ( p.title IS NOT NULL OR p.description IS NOT NULL OR p.google_product_category IS NOT NULL OR p.custom_label_1 IS NOT NULL OR p.custom_label_3 IS NOT NULL OR p.custom_label_4 IS NOT NULL )", [ ':client_id' => $client_id ] ) -> fetchAll( \PDO::FETCH_ASSOC ); @@ -187,7 +187,7 @@ class SupplementalFeed throw new \RuntimeException( 'Nie mozna otworzyc pliku: ' . $file_path ); } - fwrite( $fp, "id\ttitle\tdescription\tgoogle_product_category\tcustom_label_3\tcustom_label_4\n" ); + fwrite( $fp, "id\ttitle\tdescription\tgoogle_product_category\tcustom_label_1\tcustom_label_3\tcustom_label_4\n" ); $written = 0; foreach ( $products as $row ) @@ -196,10 +196,11 @@ class SupplementalFeed $title = self::sanitize_for_tsv( $row['title'] ?? '' ); $description = self::sanitize_for_tsv( $row['description'] ?? '' ); $category = trim( (string) ( $row['google_product_category'] ?? '' ) ); + $custom_label_1 = trim( (string) ( $row['custom_label_1'] ?? '' ) ); $custom_label_3 = trim( (string) ( $row['custom_label_3'] ?? '' ) ); $custom_label_4 = trim( (string) ( $row['custom_label_4'] ?? '' ) ); - if ( $offer_id === '' || ( $title === '' && $description === '' && $category === '' && $custom_label_3 === '' && $custom_label_4 === '' ) ) + if ( $offer_id === '' || ( $title === '' && $description === '' && $category === '' && $custom_label_1 === '' && $custom_label_3 === '' && $custom_label_4 === '' ) ) { continue; } @@ -209,6 +210,7 @@ class SupplementalFeed $title, $description, $category, + $custom_label_1, $custom_label_3, $custom_label_4 ] ) . "\n" ); diff --git a/feeds/supplemental_9.tsv b/feeds/supplemental_9.tsv index 3d29623..2823b52 100644 --- a/feeds/supplemental_9.tsv +++ b/feeds/supplemental_9.tsv @@ -1 +1,604 @@ -id title description google_product_category +id title description google_product_category custom_label_1 custom_label_3 custom_label_4 +shopify_PL_9639387300175_49869993640271 Lampa LED do Roślin 10W 4 Głowice na Klips z Timerem – Doświetlanie Roślin Pełne Spektrum 230V 4636 +shopify_PL_9655509680463_49920248414543 Oświetlenie Szynowe 3-Fazowe Zestaw Biały 8x Reflektor GU10 + Szyna 4m (1m+1m+2m) + Łączniki LAITICA 3006 szynowe +shopify_PL_15077313937743_54233358532943 Żarówka LED E27 9W z czujnikiem ruchu i zmierzchu 810lm 3000K ciepła biała | czujnik mikrofalowy 170° Samsung LED 30000h 3925 zarowki +shopify_PL_8689477222735_47410342330703 Programator Czasowy do Gniazdka Mechaniczny Dobowy 24h - Wyłącznik Czasowy 230V 16A 3500W IP20 CE 499997 paused +shopify_PL_9272159895887_48914930860367 wiosna +shopify_PL_8784918479183_47924841644367 zarowki +shopify_PL_8843063460175_48086735880527 szynowe +shopify_PL_9477497160015_49416260976975 Lampka biurkowa kreślarska AURIQ czarna E27 60W - lampa na biurko metalowa regulowana, szkolna do czytania i nauki | KOBI 594 +shopify_PL_8851617317199_48108103762255 plafony +shopify_PL_15077317050703_54233367511375 plafony +shopify_PL_14994636570959_53955145040207 zarowki +shopify_PL_8815978938703_48015029666127 zarowki +shopify_PL_8786523128143_47929265029455 zarowki +shopify_PL_15905513406799_56875068719439 szynowe +shopify_PL_8904550777167_48246810739023 szynowe +shopify_PL_9552645718351_49607303299407 szynowe +shopify_PL_15781263016271_56412379251023 zarowki +shopify_PL_8920915083599_48291170582863 wiosna +shopify_PL_9352837628239_49087119327567 wiosna +shopify_PL_8817578410319_48018017255759 zarowki +shopify_PL_15077313577295_54233357156687 zarowki +shopify_PL_8972227412303_48448368247119 zarowki +shopify_PL_8885757706575_48198870860111 szynowe +shopify_PL_15113102655823_54323786154319 Kule solarne do ogrodu RGB LED wbijane zestaw 6 szt, kolorowe lampy ogrodowe solarne IP44, 6-8h świecenia, KOBI LED2B 3006 wiosna +shopify_PL_8727250272591_47678384865615 zarowki +shopify_PL_8813945585999_48010142482767 zarowki +shopify_PL_9049561235791_48689589289295 zarowki +shopify_PL_8783276212559_47920006365519 zarowki +shopify_PL_9614799176015_49820985753935 zarowki +shopify_PL_8786522440015_47929264046415 zarowki paused +shopify_PL_14875055063375_53759971721551 zarowki +shopify_PL_9614802092367_49820988735823 zarowki +shopify_PL_15747526492495_56322365063503 plafony +shopify_PL_8727251222863_47678390075727 zarowki +shopify_PL_8806897910095_47993902465359 zarowki +shopify_PL_8839200604495_48076541165903 plafony +shopify_PL_9243104346447_48826041467215 zarowki +shopify_PL_15673081659727_56060927902031 plafony +shopify_PL_8885761999183_48198896976207 szynowe +shopify_PL_8736012075343_47743111987535 zarowki +shopify_PL_15112574566735_54322676564303 plafony +shopify_PL_8916708393295_48277554004303 paused +shopify_PL_8727249977679_47678380409167 zarowki +shopify_PL_8967309984079_48426646536527 zarowki +shopify_PL_8817578672463_48018017485135 zarowki +shopify_PL_8727250927951_47678387487055 zarowki +shopify_PL_8806896533839_47993901089103 zarowki +shopify_PL_8843064836431_48086741877071 szynowe +shopify_PL_9564232089935_49645702152527 Lampa sufitowa boho BULI S plafon bambusowy pleciony okrągły 40 cm 3x E27 - Kobi Design 4636 plafony +shopify_PL_8821698855247_48029673816399 szynowe +shopify_PL_9614799372623_49820985950543 zarowki +shopify_PL_9564131066191_49645074678095 plafony +shopify_PL_15747913023823_56323223617871 Lampa do roślin LED 45W – doświetlanie kwiatów i upraw, statyw, 5000K, IP65, 3750lm, kąt świecenia 180° 505285 +shopify_PL_9610167091535_49804919931215 zarowki +shopify_PL_8739176382799_47764478427471 zarowki +shopify_PL_8736008831311_47743089705295 zarowki +shopify_PL_14994636112207_53955143532879 Złota lampa sufitowa wisząca podwójna 2xG9 do salonu i sypialni 4636 bestseller +shopify_PL_8760538005839_47847814955343 szynowe +shopify_PL_8784916283727_47924833517903 zarowki zarowki +shopify_PL_8786522538319_47929264243023 zarowki +shopify_PL_9046505488719_48669732831567 Maszt Uchwyt do Lampy Solarnej Ulicznej Ogrodowej 38mm, stal, kąt 25°, wysięgnik na rurę ARSA GO 7447 +shopify_PL_9243104084303_48826041073999 zarowki +shopify_PL_8786522800463_47929264636239 zarowki +shopify_PL_8909738672463_48259116761423 szynowe +shopify_PL_8786522276175_47929263882575 zarowki +shopify_PL_9614799307087_49820985852239 zarowki +shopify_PL_15506659967311_55613990011215 plafony +shopify_PL_9639387332943_49869993673039 paused +shopify_PL_15667308659023_56051174703439 Plafon LED 12W z Czujnikiem Ruchu i Zmierzchu IP54 - Lampa Sufitowa LED z Pilotem 3 Barwy CCT | LAITICA 6274 plafony +shopify_PL_9272159994191_48914930958671 zarowki +shopify_PL_9610171744591_49804937429327 zarowki paused +shopify_PL_15077313347919_54233356763471 zarowki zarowki +shopify_PL_9614804091215_49820990767439 zarowki +shopify_PL_15912717615439_56886379053391 szynowe +shopify_PL_9620951957839_49834026172751 plafony +shopify_PL_9082977681743_48802550612303 wiosna +shopify_PL_8786522964303_47929264931151 zarowki +shopify_PL_8909924893007_48259756097871 szynowe +shopify_PL_8786520932687_47929260933455 zarowki +shopify_PL_8813945356623_48010142220623 zarowki zarowki +shopify_PL_8728440930639_47688707309903 zarowki +shopify_PL_8815977300303_48015024161103 zarowki +shopify_PL_9610171220303_49804934938959 zarowki +shopify_PL_9072358850895_48775013073231 plafony +shopify_PL_15903082447183_56872283406671 szynowe +shopify_PL_15112574304591_54322676302159 plafony +shopify_PL_9614803042639_49820989718863 zarowki +shopify_PL_8815977234767_48015023866191 zarowki +shopify_PL_9572648091983_49678841250127 szynowe +shopify_PL_9473721794895_49404972532047 szynowe +shopify_PL_15153214226767_54441522954575 plafony +shopify_PL_8820443349327_48024469733711 zarowki +shopify_PL_8817577591119_48018016502095 zarowki paused +shopify_PL_14875050246479_53759962874191 zarowki +shopify_PL_8806896697679_47993901252943 zarowki zarowki +shopify_PL_15673042633039_56060862595407 plafony +shopify_PL_9641533309263_49877759459663 Oświetlenie Szynowe 3-Fazowe - Zestaw 4x Reflektor Szynowy GU10 + Szynoprzewód 2m Czarny | Laitica 3006 szynowe +shopify_PL_9620943339855_49833981083983 plafony +shopify_PL_15673158664527_56061078241615 plafony +shopify_PL_14834537201999_53680693870927 plafony +shopify_PL_9592529813839_49748249215311 zarowki +shopify_PL_9646914765135_49887038177615 szynowe +shopify_PL_9559925653839_49631544443215 zarowki +shopify_PL_8909738279247_48259115778383 Oświetlenie Szynowe 3-Fazowe Zestaw Czarny 10x Reflektor GU10 + Szynoprzewód 4m - System Szynowy Komplet | LAITICA 6274 szynowe +shopify_PL_9082854670671_48802426356047 wiosna +shopify_PL_8784915759439_47924832895311 zarowki +shopify_PL_9614803796303_49820990472527 zarowki +shopify_PL_8909924663631_48259754852687 szynowe +shopify_PL_8784917004623_47924837646671 zarowki +shopify_PL_8988810772815_48509096264015 wiosna +shopify_PL_8991183405391_48517000462671 wiosna +shopify_PL_14932536099151_53840816898383 zarowki zarowki +shopify_PL_8815978185039_48015026454863 zarowki +shopify_PL_15010824061263_53989706301775 zarowki +shopify_PL_8806896959823_47993901515087 zarowki +shopify_PL_15693368361295_56127255445839 plafony +shopify_PL_9614799044943_49820985622863 zarowki +shopify_PL_9572647895375_49678840987983 szynowe +shopify_PL_9680441803087_49999569944911 szynowe +shopify_PL_8732192178511_47718102008143 zarowki +shopify_PL_8784916480335_47924834074959 zarowki +shopify_PL_8889834471759_48209723162959 zarowki +shopify_PL_8784915923279_47924833157455 Żarówka LED E27 9W z Czujnikiem Ruchu i Zmierzchu 3000K Ciepła Biała 810lm - Żarówka z Sensorem Ruchu | LAITICA 2306 zarowki zarowki +shopify_PL_15919819260239_56916818854223 plafony +shopify_PL_15408909058383_55251047448911 szynowe +shopify_PL_8929875919183_48313704677711 szynowe +shopify_PL_8813945651535_48010142548303 zarowki +shopify_PL_9564232253775_49645702807887 Plafon bambusowy boho BULI M 50 cm - lampa sufitowa rattanowa pleciona do salonu 3x E27 Kobi Design 505285 plafony +shopify_PL_9610170335567_49804931400015 zarowki +shopify_PL_8909736083791_48259105718607 szynowe +shopify_PL_8827035779407_48043153785167 zarowki +shopify_PL_9655509745999_49920248480079 szynowe +shopify_PL_15693330088271_56127152849231 plafony +shopify_PL_15563031118159_55779976708431 paused +shopify_PL_9655510729039_49920250446159 Oprawka ceramiczna E27 KOBI zestaw 10 szt. 230V do żarówek wewnętrzna 7447 +shopify_PL_9632316129615_49849585697103 zarowki +shopify_PL_15667660849487_56052565967183 plafony +shopify_PL_8795113750863_47952977035599 szynowe +shopify_PL_8681836020047_47361290600783 plafony +shopify_PL_8928958972239_48310408610127 wiosna +shopify_PL_14875045724495_53759955534159 zarowki +shopify_PL_15112575811919_54322678071631 plafony +shopify_PL_8786521096527_47929261097295 zarowki +shopify_PL_9610169614671_49804929433935 zarowki +shopify_PL_8839206240591_48076544672079 plafony +shopify_PL_8736004374863_47743064572239 zarowki +shopify_PL_15077314167119_54233359155535 zarowki +shopify_PL_8727251059023_47678389322063 zarowki +shopify_PL_15077316821327_54233366757711 zarowki +shopify_PL_9620949369167_49834015490383 plafony +shopify_PL_9552645554511_49607303135567 szynowe +shopify_PL_14758492832079_53557689319759 Licznik Energii Elektrycznej KOBI PMM-1 Watomierz 230V 3680W LCD Miernik Zużycia Prądu kWh W V A Hz 503737 +shopify_PL_8806897615183_47993902203215 zarowki +shopify_PL_8739176546639_47764483309903 zarowki +shopify_PL_9564131918159_49645075562831 plafony +shopify_PL_9610173055311_49804950208847 zarowki +shopify_PL_14994636538191_53955145007439 zarowki +shopify_PL_8827036565839_48043154604367 zarowki +shopify_PL_9610167189839_49804920029519 zarowki +shopify_PL_9564131164495_49645074776399 plafony +shopify_PL_8786519327055_47929255919951 zarowki +shopify_PL_15693341458767_56127184208207 plafony +shopify_PL_8784917758287_47924840268111 zarowki +shopify_PL_9614802420047_49820989063503 zarowki +shopify_PL_14875045986639_53759955829071 zarowki +shopify_PL_14930224513359_53837782876495 Lampka na Monitor LED 5W USB - Lampka do Monitora i Laptopa Regulowana Barwa CCT Oświetlenie Ekranu | LAITICA 6785 +shopify_PL_8795112997199_47952973398351 szynowe +shopify_PL_9441914716495_49313748320591 zarowki +shopify_PL_15747518300495_56322315288911 plafony +shopify_PL_15112574206287_54322676203855 plafony +shopify_PL_8817576837455_48018015748431 zarowki +shopify_PL_8786522374479_47929263980879 zarowki +shopify_PL_15781303320911_56412550594895 paused +shopify_PL_15077314920783_54233360892239 zarowki +shopify_PL_8760537940303_47847814889807 szynowe +shopify_PL_8760538399055_47847815971151 szynowe +shopify_PL_8735701139791_47740466790735 zarowki +shopify_PL_9473709834575_49404919578959 szynowe +shopify_PL_14994636636495_53955145171279 zarowki +shopify_PL_8728440144207_47688705540431 zarowki +shopify_PL_8885758984527_48198882492751 szynowe +shopify_PL_8728438997327_47688702525775 zarowki +shopify_PL_9552649388367_49607310442831 szynowe +shopify_PL_9592531485007_49748251083087 zarowki +shopify_PL_8795113718095_47952976773455 szynowe +shopify_PL_8783276409167_47920006955343 zarowki +shopify_PL_9272159732047_48914930696527 wiosna +shopify_PL_9641533407567_49877759557967 szynowe +shopify_PL_8736009453903_47743093473615 zarowki zarowki +shopify_PL_15673066586447_56060897919311 Lampa sufitowa LED 12W z czujnikiem ruchu i zmierzchu IP54 czarna 3CCT + pilot 2524 plafony +shopify_PL_9564234416463_49645715095887 plafony +shopify_PL_9355739398479_49094937837903 plafony +shopify_PL_8809036120399_47999650169167 zarowki +shopify_PL_9243104215375_48826041270607 zarowki +shopify_PL_8784917365071_47924838662479 zarowki +shopify_PL_8885759803727_48198887244111 szynowe +shopify_PL_8802501132623_47978309550415 zarowki +shopify_PL_9082977976655_48802551398735 Zestaw 3x Żarówka LED E14 2W 4000K - Żarówka do Okapu i Lodówki Mały Gwint Neutralna Biała | LAITICA 2306 zarowki zarowki +shopify_PL_8736003850575_47743062966607 zarowki +shopify_PL_8826936525135_48042679370063 zarowki +shopify_PL_9355745263951_49094952845647 plafony +shopify_PL_8817577132367_48018016043343 zarowki +shopify_PL_9610172760399_49804946243919 zarowki +shopify_PL_8909922795855_48259747905871 szynowe +shopify_PL_8828647965007_48047162491215 szynowe +shopify_PL_8786520375631_47929259983183 zarowki +shopify_PL_15077313773903_54233358139727 zarowki +shopify_PL_8786519556431_47929257460047 zarowki +shopify_PL_8681837592911_47361298399567 plafony +shopify_PL_15112574402895_54322676400463 plafony +shopify_PL_15146553311567_54423344677199 wiosna +shopify_PL_8795113914703_47952977363279 szynowe +shopify_PL_9610167451983_49804920914255 zarowki +shopify_PL_9405991256399_49223629341007 paused +shopify_PL_15667446088015_56052176159055 plafony +shopify_PL_15077318787407_54233374949711 plafony +shopify_PL_9334212034895_49046254387535 Lampa Kula Ogrodowa LED E27 IP65 Imitacja Marmuru Świecąca Zestaw 3 Szt S/M/L KOBI FLORA 4636 wiosna +shopify_PL_8920914723151_48291168354639 wiosna +shopify_PL_15672679170383_56060186263887 szynowe +shopify_PL_15146553409871_54423344808271 wiosna +shopify_PL_15010818589007_53989696176463 zarowki +shopify_PL_15919825387855_56916863648079 plafony +shopify_PL_8817576608079_48018015519055 zarowki +shopify_PL_8795113357647_47952975659343 szynowe +shopify_PL_8815978414415_48015028486479 zarowki paused +shopify_PL_8817578213711_48018017091919 zarowki +shopify_PL_8786520047951_47929258639695 zarowki +shopify_PL_9564233793871_49645712245071 plafony +shopify_PL_14886372475215_53778253775183 plafony +shopify_PL_9620954218831_49834035708239 plafony +shopify_PL_9614800486735_49820987064655 zarowki +shopify_PL_8786521784655_47929263096143 zarowki +shopify_PL_8786520637775_47929260245327 zarowki +shopify_PL_15112575025487_54322677088591 plafony +shopify_PL_15781286707535_56412464906575 zarowki +shopify_PL_8784916152655_47924833386831 zarowki +shopify_PL_15757768491343_56345565757775 paused +shopify_PL_9552647389519_49607306936655 szynowe +shopify_PL_8786522702159_47929264570703 zarowki +shopify_PL_8889838862671_48209733321039 zarowki +shopify_PL_8815979757903_48015033139535 zarowki +shopify_PL_14827467112783_53659847655759 zarowki +shopify_PL_8795113488719_47952976281935 szynowe +shopify_PL_9610172105039_49804940247375 zarowki +shopify_PL_8976624091471_48466044780879 plafony +shopify_PL_9680441934159_49999570075983 szynowe +shopify_PL_8817577787727_48018016665935 zarowki +shopify_PL_15673013207375_56060805218639 plafony +shopify_PL_8817576902991_48018015813967 zarowki +shopify_PL_8784918708559_47924842627407 zarowki +shopify_PL_8806898565455_47993903087951 zarowki +shopify_PL_15074468593999_54222036926799 Taśma LED 20M RGB 5050 Smart Home Bluetooth Aplikacja Pilot 16 Mln Kolorów Muzyka Zestaw 2490 +shopify_PL_8813945749839_48010142646607 zarowki +shopify_PL_8909737001295_48259111027023 szynowe +shopify_PL_9563111719247_49639706755407 plafony +shopify_PL_8929874018639_48313688981839 szynowe +shopify_PL_8815978643791_48015029010767 zarowki +shopify_PL_15748009263439_56323331424591 Lampa LED do doświetlania roślin 9W – pełne spektrum wzrostu (430–730nm), 180° kąt świecenia, 230V, zioła i uprawy indoor 505285 +shopify_PL_8736010174799_47743098323279 zarowki +shopify_PL_9049610060111_48689647747407 plafony +shopify_PL_15673165939023_56061087646031 plafony +shopify_PL_15608840192335_55924806451535 paused +shopify_PL_8827038204239_48043156635983 zarowki +shopify_PL_15919838167375_56917001732431 Plafon sufitowy LED z wentylatorem 48W czarny – wiatrak sufitowy z pilotem, 3CCT + RGB, tryb lato/zima, do salonu i sypialni 2422 plafony +shopify_PL_8795113128271_47952974184783 szynowe +shopify_PL_9441914847567_49313748517199 zarowki +shopify_PL_8795113161039_47952974610767 szynowe +shopify_PL_8727250796879_47678387061071 zarowki +shopify_PL_8756010352975_47833799917903 szynowe +shopify_PL_8802500870479_47978307748175 zarowki +shopify_PL_8784917168463_47924838039887 zarowki +shopify_PL_8815978021199_48015026028879 zarowki +shopify_PL_9610172596559_49804944998735 zarowki +shopify_PL_9592530174287_49748249641295 zarowki +shopify_PL_15672611209551_56060112240975 szynowe +shopify_PL_8806899843407_47993904300367 zarowki +shopify_PL_9355742019919_49094943801679 plafony +shopify_PL_14827466981711_53659847197007 szynowe +shopify_PL_8756010778959_47833801130319 szynowe +shopify_PL_9039986819407_48649228648783 wiosna +shopify_PL_8784918380879_47924841480527 zarowki +shopify_PL_15904990069071_56874473259343 szynowe +shopify_PL_9552647651663_49607307428175 szynowe +shopify_PL_9309152411983_48994721268047 plafony +shopify_PL_15077318951247_54233375768911 plafony +shopify_PL_8843064443215_48086739910991 szynowe +shopify_PL_9590747660623_49741743456591 plafony +shopify_PL_9039987933519_48649232384335 wiosna +shopify_PL_9355743625551_49094947438927 plafony +shopify_PL_8843065557327_48086756032847 szynowe +shopify_PL_15010912993615_53989874598223 zarowki +shopify_PL_15077317509455_54233368559951 plafony +shopify_PL_8786522898767_47929264767311 zarowki +shopify_PL_9641533374799_49877759525199 szynowe +shopify_PL_8909923483983_48259750592847 szynowe +shopify_PL_8784916545871_47924834173263 zarowki +shopify_PL_8889834864975_48209723916623 zarowki +shopify_PL_8843068047695_48086789652815 szynowe +shopify_PL_9614801240399_49820987883855 zarowki +shopify_PL_9641533210959_49877759099215 szynowe +shopify_PL_8784918020431_47924841185615 zarowki +shopify_PL_15608811749711_55924735344975 wiosna +shopify_PL_15024955064655_54019394240847 plafony +shopify_PL_8972227903823_48448368902479 wiosna +shopify_PL_8972226920783_48448366739791 wiosna +shopify_PL_9355745493327_49094953206095 plafony +shopify_PL_9620944716111_49833988325711 plafony +shopify_PL_8728437850447_47688698921295 zarowki +shopify_PL_8817578082639_48018016928079 zarowki +shopify_PL_9355743363407_49094946980175 plafony +shopify_PL_9564231303503_49645695893839 plafony +shopify_PL_8732193358159_47718104695119 zarowki +shopify_PL_8843067261263_48086786736463 szynowe +shopify_PL_15419631468879_55297377567055 wiosna +shopify_PL_14827467080015_53659847459151 szynowe +shopify_PL_9610168271183_49804923175247 zarowki +shopify_PL_9564232417615_49645703135567 plafony +shopify_PL_8827034304847_48043152048463 zarowki +shopify_PL_15112574468431_54322676465999 plafony +shopify_PL_14827466916175_53659847131471 szynowe +shopify_PL_8795114078543_47952978280783 szynowe +shopify_PL_9564234252623_49645714047311 plafony +shopify_PL_9608375435599_49797819203919 szynowe +shopify_PL_15672658067791_56060162310479 szynowe +shopify_PL_14856989311311_53717638676815 plafony +shopify_PL_9563112046927_49639707377999 plafony +shopify_PL_8756012089679_47833804210511 szynowe +shopify_PL_15010846572879_53989749915983 zarowki +shopify_PL_15010848145743_53989753585999 zarowki +shopify_PL_15747628794191_56322817491279 plafony +shopify_PL_14870024651087_53740267372879 plafony +shopify_PL_8991184978255_48517004132687 wiosna +shopify_PL_9043955024207_48658131943759 plafony +shopify_PL_8854373171535_48115087114575 plafony +shopify_PL_8786519753039_47929257918799 zarowki +shopify_PL_15010868429135_53989790187855 zarowki +shopify_PL_9655783588175_49922225176911 szynowe +shopify_PL_15010940715343_53989929386319 zarowki +shopify_PL_8843068473679_48086790799695 szynowe +shopify_PL_8929875296591_48313699828047 szynowe +shopify_PL_8851510493519_48107914133839 plafony +shopify_PL_8904553038159_48246813294927 szynowe +shopify_PL_8739176808783_47764486586703 zarowki +shopify_PL_8972225151311_48448364937551 zarowki +shopify_PL_8909739753807_48259120103759 szynowe +shopify_PL_8909739327823_48259118858575 szynowe +shopify_PL_9048580981071_48686939996495 wiosna +shopify_PL_8839198441807_48076539789647 plafony +shopify_PL_9608375140687_49797818581327 szynowe +shopify_PL_9082854768975_48802426388815 plafony +shopify_PL_9646914797903_49887038210383 szynowe +shopify_PL_15904640172367_56874079060303 szynowe +shopify_PL_8976874504527_48466734285135 plafony +shopify_PL_9564131033423_49645074645327 plafony +shopify_PL_8851512361295_48107920326991 plafony +shopify_PL_14837158707535_53686333309263 plafony +shopify_PL_8784918413647_47924841513295 zarowki +shopify_PL_8973837861199_48454277529935 plafony +shopify_PL_9592532762959_49748254425423 zarowki +shopify_PL_14875046150479_53759956025679 zarowki +shopify_PL_8828647899471_48047161246031 szynowe +shopify_PL_8851599622479_48108075385167 plafony +shopify_PL_9008079143247_48561342906703 wiosna +shopify_PL_9620944355663_49833985704271 plafony +shopify_PL_8972226462031_48448366281039 zarowki +shopify_PL_8964733141327_48419977003343 wiosna +shopify_PL_9564131492175_49645075136847 plafony +shopify_PL_9564131393871_49645075038543 plafony +shopify_PL_8886932046159_48202470719823 szynowe +shopify_PL_9457662886223_49354682564943 szynowe +shopify_PL_9552646570319_49607305789775 szynowe +shopify_PL_9655509713231_49920248447311 szynowe +shopify_PL_9610168566095_49804924551503 zarowki +shopify_PL_9457662591311_49354681876815 szynowe +shopify_PL_14875055685967_53759973032271 zarowki +shopify_PL_9334414704975_49046976168271 wiosna +shopify_PL_15112576565583_54322679087439 plafony +shopify_PL_8784918184271_47924841316687 zarowki +shopify_PL_9608375533903_49797819859279 szynowe +shopify_PL_8784917889359_47924840890703 zarowki +shopify_PL_8909737591119_48259112894799 szynowe +shopify_PL_9572647928143_49678841020751 szynowe +shopify_PL_8723702579535_47655610188111 plafony +shopify_PL_8909740573007_48259123249487 szynowe +shopify_PL_9457662787919_49354682466639 szynowe +shopify_PL_8784916873551_47924837155151 zarowki +shopify_PL_8861810295119_48131870785871 plafony +shopify_PL_8760538136911_47847815545167 Zestaw oświetleniowy szynowy 3-fazowy czarny, szyna 4m (2x2m) z 8 oprawami GU10 6274 szynowe +shopify_PL_9655783555407_49922225111375 szynowe +shopify_PL_8967310967119_48426649649487 zarowki +shopify_PL_15813165252943_56531066421583 paused +shopify_PL_8815977464143_48015024587087 zarowki +shopify_PL_9680441901391_49999570043215 szynowe +shopify_PL_8919079911759_48287068913999 szynowe +shopify_PL_9552645292367_49607302807887 szynowe +shopify_PL_15919812182351_56916758036815 szynowe +shopify_PL_8976561766735_48465700323663 szynowe +shopify_PL_14886372409679_53778253054287 plafony +shopify_PL_14827466883407_53659846934863 szynowe +shopify_PL_15010955919695_53989954519375 zarowki +shopify_PL_15608825315663_55924761919823 plafony +shopify_PL_14875054244175_53759970738511 zarowki +shopify_PL_8886938599759_48202485399887 Oświetlenie Szynowe 3-Fazowe Zestaw Biały 10x Reflektor GU10 + Szynoprzewód 5m (1m+2m+2m) + Łączniki I+L LAITICA 3006 szynowe +shopify_PL_8973836091727_48454274023759 plafony +shopify_PL_14875322450255_53760691044687 zarowki +shopify_PL_15673106956623_56060992127311 plafony +shopify_PL_9564233204047_49645708312911 plafony +shopify_PL_8973835632975_48454273401167 plafony +shopify_PL_8929874772303_48313697272143 szynowe +shopify_PL_9339178418511_49054549213519 plafony +shopify_PL_9245167485263_48832852918607 zarowki +shopify_PL_15953425137999_57053504897359 szynowe +shopify_PL_15406551466319_55244975833423 szynowe +shopify_PL_8972323914063_48448537002319 wiosna +shopify_PL_14875322286415_53760690880847 zarowki +shopify_PL_8886939582799_48202487693647 szynowe +shopify_PL_9614804648271_49820991324495 zarowki +shopify_PL_14837157396815_53686330622287 plafony +shopify_PL_9615160082767_49821822353743 Wyłącznik Czasowy do Gniazdka Elektroniczny Timer LCD 16A 3500W - Programator 230V IP20 5159 paused +shopify_PL_9555035750735_49613756334415 plafony +shopify_PL_9457662558543_49354681844047 szynowe +shopify_PL_14886373753167_53778256986447 plafony +shopify_PL_9552646111567_49607303725391 szynowe +shopify_PL_14875051229519_53759964348751 zarowki +shopify_PL_9592531124559_49748250689871 zarowki +shopify_PL_15608771019087_55924490240335 wiosna +shopify_PL_9425793417551_49270357786959 szynowe +shopify_PL_15901957554511_56863889981775 szynowe +shopify_PL_8976874045775_48466733531471 plafony +shopify_PL_9620945338703_49833997336911 plafony +shopify_PL_8909926039887_48259758948687 szynowe +shopify_PL_9620941209935_49833971024207 plafony +shopify_PL_15950336819535_57045220032847 plafony +shopify_PL_9082854637903_48802426323279 wiosna +shopify_PL_15950434500943_57045418901839 plafony +shopify_PL_15905323680079_56874834985295 szynowe +shopify_PL_15019500863823_54005947236687 plafony +shopify_PL_8929875001679_48313697960271 szynowe +shopify_PL_15672641323343_56060146319695 szynowe +shopify_PL_9552645980495_49607303627087 szynowe +shopify_PL_9614798520655_49820984410447 szynowe +shopify_PL_9614798684495_49820984541519 szynowe +shopify_PL_8756011696463_47833803489615 szynowe +shopify_PL_9614798815567_49820984705359 szynowe +shopify_PL_8904551432527_48246811656527 szynowe +shopify_PL_8851609518415_48108090753359 plafony +shopify_PL_9243104018767_48826040811855 wiosna +shopify_PL_9563111784783_49639706984783 plafony +shopify_PL_9355738448207_49094931906895 plafony +shopify_PL_9563111850319_49639707115855 plafony +shopify_PL_8714543137103_47583733776719 plafony +shopify_PL_14837160640847_53686335635791 plafony +shopify_PL_14837158216015_53686332817743 Lampa wisząca ABRAMO 3 biała - nowoczesna lampa sufitowa loft do salonu i jadalni 6278 plafony +shopify_PL_9572648583503_49678847902031 szynowe +shopify_PL_8796284846415_47957833613647 zarowki +shopify_PL_9563112014159_49639707345231 plafony +shopify_PL_9535320883535_49561418006863 szynowe +shopify_PL_9564131950927_49645075595599 plafony +shopify_PL_9339166228815_49054519361871 szynowe +shopify_PL_14837157757263_53686332326223 plafony +shopify_PL_9564232712527_49645705888079 plafony +shopify_PL_8795112866127_47952972906831 szynowe +shopify_PL_9309151330639_48994716877135 plafony +shopify_PL_9564233924943_49645712539983 plafony +shopify_PL_15956334051663_57060146446671 szynowe +shopify_PL_14841109774671_53694503289167 plafony +shopify_PL_14994634768719_53955140223311 plafony +shopify_PL_8976561439055_48465699111247 szynowe +shopify_PL_15112575287631_54322677449039 plafony +shopify_PL_9563111948623_49639707214159 plafony +shopify_PL_14837157593423_53686332162383 plafony +shopify_PL_8886933061967_48202473636175 szynowe +shopify_PL_9355741593935_49094942916943 plafony +shopify_PL_9564232581455_49645703921999 plafony +shopify_PL_14846754292047_53704759050575 plafony +shopify_PL_9355743035727_49094946521423 plafony +shopify_PL_8843066474831_48086770581839 szynowe +shopify_PL_9309150282063_48994712518991 plafony +shopify_PL_9564231860559_49645700546895 plafony +shopify_PL_14856992522575_53717643952463 plafony +shopify_PL_9572647960911_49678841053519 szynowe +shopify_PL_9590750380367_49741752566095 plafony +shopify_PL_15953524228431_57053823631695 szynowe +shopify_PL_8728442241359_47688712421711 zarowki +shopify_PL_8861815112015_48131879862607 plafony +shopify_PL_9334414934351_49046976692559 wiosna +shopify_PL_14875322024271_53760690618703 zarowki +shopify_PL_8854371172687_48115083084111 plafony +shopify_PL_8929876083023_48313706545487 szynowe +shopify_PL_9309153722703_48994727199055 plafony +shopify_PL_9243104313679_48826041434447 zarowki +shopify_PL_15019473895759_54005916074319 plafony +shopify_PL_9245167550799_48832852984143 zarowki +shopify_PL_8908216598863_48254968889679 szynowe +shopify_PL_9309155393871_48994735849807 plafony +shopify_PL_9309151560015_48994717630799 plafony +shopify_PL_9655783293263_49922224750927 szynowe +shopify_PL_9564231500111_49645698122063 plafony +shopify_PL_8976874799439_48466735038799 plafony +shopify_PL_14856992751951_53717644345679 plafony +shopify_PL_8843068965199_48086791782735 szynowe +shopify_PL_9355744510287_49094950224207 plafony +shopify_PL_14994634604879_53955140059471 plafony +shopify_PL_9243104149839_48826041205071 zarowki +shopify_PL_8978127225167_48473366888783 plafony +shopify_PL_8978128044367_48473368658255 plafony +shopify_PL_8978128535887_48473370100047 plafony +shopify_PL_9564233531727_49645710704975 plafony +shopify_PL_9641533342031_49877759492431 szynowe +shopify_PL_15019500142927_54005945401679 plafony +shopify_PL_14827466948943_53659847164239 szynowe +shopify_PL_15693301711183_56127095046479 plafony +shopify_PL_8909736477007_48259108438351 szynowe +shopify_PL_8886936568143_48202481205583 szynowe +shopify_PL_9309155164495_48994734997839 plafony +shopify_PL_9680442130767_49999570239823 szynowe +shopify_PL_9563112145231_49639707476303 plafony +shopify_PL_9590749135183_49741749616975 plafony +shopify_PL_8909739032911_48259117809999 szynowe +shopify_PL_15956383990095_57060182360399 szynowe +shopify_PL_15747616145743_56322765816143 plafony +shopify_PL_8929876836687_48313721487695 szynowe +shopify_PL_14841274106191_53694986649935 plafony +shopify_PL_9564131852623_49645075497295 plafony +shopify_PL_9564231696719_49645700219215 plafony +shopify_PL_15747531669839_56322449408335 plafony +shopify_PL_15956385956175_57060197630287 szynowe +shopify_PL_8861946773839_48132222189903 plafony +shopify_PL_14827467014479_53659847229775 szynowe +shopify_PL_9680441868623_49999570010447 szynowe +shopify_PL_9083073364303_48802647933263 wiosna +shopify_PL_8973835403599_48454273040719 plafony +shopify_PL_9646914830671_49887038243151 szynowe +shopify_PL_15950198374735_57044943012175 plafony +shopify_PL_8928958153039_48310405595471 zarowki +shopify_PL_15943633764687_57017969213775 plafony +shopify_PL_9355739529551_49094938132815 plafony +shopify_PL_15953509089615_57053746397519 szynowe +shopify_PL_15024954671439_54019392405839 plafony +shopify_PL_9355739562319_49094938296655 plafony +shopify_PL_15950256210255_57045061992783 plafony +shopify_PL_15019474846031_54005917024591 plafony +shopify_PL_8886937223503_48202482417999 szynowe +shopify_PL_15950382956879_57045301657935 plafony +shopify_PL_14846755733839_53704764588367 plafony +shopify_PL_8973836714319_48454275105103 plafony +shopify_PL_14846753997135_53704758657359 plafony +shopify_PL_8786522079567_47929263685967 zarowki +shopify_PL_15950368276815_57045276229967 plafony +shopify_PL_9535321243983_49561419120975 szynowe +shopify_PL_15950396326223_57045330690383 plafony +shopify_PL_9564131721551_49645075366223 plafony +shopify_PL_15950237532495_57045004812623 plafony +shopify_PL_15950421131599_57045387182415 plafony +shopify_PL_15950449606991_57045455569231 plafony +shopify_PL_15994288865615_57211157774671 Lampy solarne ogrodowe LED słupek kwadratowy 4000K IP44 wbijane zewnętrzne czujnik zmierzchu zestaw 4 szt czarne LAITICA SOLORB 3006 wiosna +shopify_PL_15950290878799_57045131952463 plafony +shopify_PL_9355739660623_49094938493263 plafony +shopify_PL_15994240893263_57210904215887 wiosna +shopify_PL_8909740245327_48259121742159 szynowe +shopify_PL_15950353465679_57045256012111 plafony +shopify_PL_15994146029903_57210687357263 wiosna +shopify_PL_14846755144015_53704762622287 plafony +shopify_PL_14841272172879_53694982816079 plafony +shopify_PL_15994199277903_57210833731919 wiosna +shopify_PL_14841274171727_53694986748239 plafony +shopify_PL_14841272140111_53694982750543 plafony +shopify_PL_14841273090383_53694985273679 plafony +shopify_PL_15994189971791_57210813743439 wiosna +shopify_PL_15994274414927_57211020476751 wiosna +shopify_PL_14841272271183_53694983078223 plafony +shopify_PL_8978128142671_48473369018703 plafony +shopify_PL_15994286539087_57211142308175 wiosna +shopify_PL_15994266419535_57210969948495 wiosna +shopify_PL_15994321666383_57211363492175 wiosna +shopify_PL_8988814639439_48509103571279 wiosna +shopify_PL_16012215779663_57306176749903 wiosna +shopify_PL_16012239667535_57306222264655 wiosna +shopify_PL_16014355136847_57313001898319 wiosna +shopify_PL_16014418772303_57313325187407 wiosna +shopify_PL_16014377255247_57313106559311 wiosna +shopify_PL_16014421164367_57313350385999 wiosna +shopify_PL_16014466875727_57313526219087 wiosna +shopify_PL_16014388986191_57313132544335 wiosna +shopify_PL_16014423785807_57313373126991 wiosna +shopify_PL_16016268656975_57320757035343 wiosna +shopify_PL_16014349861199_57312979059023 wiosna +shopify_PL_16014345208143_57312963166543 Słupek solarny ogrodowy LED Aurora - lampa solarna ogrodowa wbijana, cylindryczny, 4000K, IP44, czujnik zmierzchu, czarny, KOBI 3006 wiosna +shopify_PL_16016236380495_57320548794703 wiosna +shopify_PL_16014369816911_57313077592399 wiosna +shopify_PL_16014361231695_57313030897999 wiosna +shopify_PL_16016248144207_57320580284751 wiosna +shopify_PL_16014408483151_57313228751183 wiosna +shopify_PL_16014470447439_57313581007183 wiosna +shopify_PL_16016152330575_57320166687055 wiosna +shopify_PL_16016295035215_57320843641167 wiosna +shopify_PL_16016057139535_57319600030031 wiosna +shopify_PL_16014458290511_57313445609807 wiosna +shopify_PL_16014397276495_57313155907919 wiosna +shopify_PL_16016216817999_57320422932815 wiosna +shopify_PL_16016278913359_57320781119823 wiosna +shopify_PL_16016087777615_57319655932239 wiosna +shopify_PL_16016311320911_57320949317967 wiosna