--- 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*