diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md index 7f6a6c8..b836251 100644 --- a/.paul/PROJECT.md +++ b/.paul/PROJECT.md @@ -73,6 +73,7 @@ Sprzedawca moĹĽe obsĹ‚ugiwać zamĂłwienia ze wszystkich kanałów - [x] Ochrona danych lokalnych przy re-imporcie + rozroznienie import/aktualizacja w activity log shopPRO — Phase 62 - [x] Import i wyswietlanie personalizacji produktow z shopPRO (custom_fields) + naprawa daty zamowienia — Phase 63 - [x] Data wystawienia paragonu z dokladnoscia do godziny i minuty (DATE -> DATETIME) — Phase 64 +- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68 ### Active (In Progress) diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md index 27b64f2..77138a5 100644 --- a/.paul/ROADMAP.md +++ b/.paul/ROADMAP.md @@ -25,6 +25,10 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel | 62 | Import Re-import Safety | 1/1 | Complete | | 63 | Order Item Personalization | 1/1 | Complete | | 64 | Receipt Datetime Precision | 1/1 | Complete | +| 65 | PAUL Delegated Apply | 1/1 | Complete | +| 66 | Allegro Delivery Tracking | 2/2 | Complete | +| 67 | PAUL Codex Executor | 1/1 | Complete | +| 68 | Code Deduplication Refactor | 0/2 | Planning | | TBD | Mobile Orders List | - | Not started | | TBD | Mobile Order Details | - | Not started | | TBD | Mobile Settings | - | Not started | diff --git a/.paul/STATE.md b/.paul/STATE.md index d77111d..4bd904c 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -5,19 +5,19 @@ See: .paul/PROJECT.md (updated 2026-04-03) **Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami. -**Current focus:** Milestone v3.0 — Phase 64 complete, ready for next PLAN +**Current focus:** Milestone v3.0 — Phase 68 plan 01 complete, ready for next PLAN ## Current Position Milestone: v3.0 Mobile Responsive — In progress -Phase: 13 of N (64 - Receipt Datetime Precision) — Complete -Plan: 64-01 complete -Status: Loop complete — phase 64 done, ready for next PLAN -Last activity: 2026-04-03 — UNIFY closed for 64-01 +Phase: 68 (Code Deduplication Refactor) — In progress +Plan: 68-01 complete +Status: Loop complete — plan 68-01 done, ready for next PLAN +Last activity: 2026-04-03 — UNIFY closed for 68-01 Progress: -- Milestone: [######░░░░] ~64% -- Phase 64: [##########] 100% +- Milestone: [######░░░░] ~68% +- Phase 68: [#####░░░░░] 50% ## Loop Position @@ -30,12 +30,11 @@ PLAN ──▶ APPLY ──▶ UNIFY ## Session Continuity Last session: 2026-04-03 -Stopped at: Phase 64 complete -Next action: /paul:plan dla kolejnego modulu -Resume file: .paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md +Stopped at: Phase 68 plan 01 complete +Next action: /paul:plan for 68-02 (remaining duplications: validateCsrf, isActive filter) +Resume file: .paul/phases/68-code-deduplication-refactor/68-01-SUMMARY.md ## Git State -Last commit: 39c3183 +Last commit: 0e7ee95 Branch: main -Feature branches merged: none diff --git a/.paul/phases/65-paul-delegated-apply/65-01-PLAN.md b/.paul/phases/65-paul-delegated-apply/65-01-PLAN.md new file mode 100644 index 0000000..066817e --- /dev/null +++ b/.paul/phases/65-paul-delegated-apply/65-01-PLAN.md @@ -0,0 +1,302 @@ +--- +phase: 65-paul-delegated-apply +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - ~/.claude/paul-framework/workflows/apply-phase.md + - ~/.claude/paul-framework/references/delegated-apply.md + - ~/.claude/paul-framework/references/subagent-criteria.md + - ~/.claude/paul-framework/templates/PLAN.md +autonomous: false +--- + + +## Goal +Rozszerzyć workflow `/paul:apply` o tryb delegowany (delegated-apply), w którym orkiestrator w głównym kontekście rozbija taski z PLAN.md na mikro-zadania i zleca je sub-agentom przez Agent tool. Orkiestrator ocenia wyniki i decyduje: accept / retry / escalate. + +## Purpose +Główny kontekst zapełnia się zbyt szybko podczas APPLY — czytanie plików, implementacja, weryfikacja zużywają 60-80% okna kontekstowego na jedną fazę. Delegacja do sub-agentów pozwoli: +- Zachować główny kontekst na poziomie ~15-25% zużycia (orkiestracja + ocena) +- Wykonywać więcej faz w jednej sesji bez handoff +- Poprawić jakość — mniejsze, fokusowe zadania dla sub-agentów +- Umożliwić równoległe wykonywanie niezależnych tasków + +## Output +1. Zmodyfikowany `apply-phase.md` z trybem delegowanym +2. Nowy reference `delegated-apply.md` z pełną specyfikacją wzorca +3. Zaktualizowany `subagent-criteria.md` o kontekst PAUL delegacji +4. Zaktualizowany template `PLAN.md` o pole `delegation` + + + +## Project Context +@.paul/PROJECT.md +@.paul/STATE.md + +## Source Files (do edycji) +@~/.claude/paul-framework/workflows/apply-phase.md +@~/.claude/paul-framework/references/subagent-criteria.md +@~/.claude/paul-framework/references/delegated-apply.md (nowy) +@~/.claude/paul-framework/templates/PLAN.md + + + + +## AC-1: Tryb delegowany aktywuje się automatycznie lub ręcznie +```gherkin +Given plan z polem `delegation: auto` w frontmatter +When /paul:apply wykonuje plan +Then orkiestrator rozbija każdy task type="auto" na mikro-prompt i zleca Agent tool +And checkpointy (human-verify, decision) pozostają w głównym kontekście +``` + +## AC-2: Mikro-prompt zawiera pełny kontekst dla sub-agenta +```gherkin +Given task z PLAN.md z polami files, action, verify, done, boundaries +When orkiestrator buduje mikro-prompt +Then prompt zawiera: cel zadania, ścieżki plików, dokładne instrukcje, co NIE zmieniać, jak zweryfikować +And sub-agent nie musi czytać PLAN.md ani STATE.md (zero dodatkowego kontekstu) +``` + +## AC-3: Orkiestrator ocenia wynik i podejmuje decyzję +```gherkin +Given sub-agent zwrócił wynik mikro-zadania +When orkiestrator analizuje zwrócony summary +Then podejmuje jedną z decyzji: accept (kontynuuj) / retry (ponów z feedbackiem) / escalate (poproś użytkownika) +And loguje decyzję do progress trackera +``` + +## AC-4: Fallback do trybu inline +```gherkin +Given plan z polem `delegation: off` lub brak pola delegation +When /paul:apply wykonuje plan +Then workflow działa identycznie jak dotychczas (bez zmian w zachowaniu) +``` + +## AC-5: Równoległe wykonywanie niezależnych tasków +```gherkin +Given plan z 2+ taskami type="auto" które nie mają zależności między sobą +When orkiestrator jest w trybie delegowanym +Then może zlecić niezależne taski równolegle (multiple Agent calls w jednym kroku) +``` + + + + + + + Task 1: Utworzenie reference delegated-apply.md + ~/.claude/paul-framework/references/delegated-apply.md + + Utwórz nowy plik referencyjny opisujący wzorzec delegated-apply: + + 1. **Architektura orkiestratora:** + - Główny kontekst = lekki koordynator (czyta plan, buduje prompty, ocenia wyniki) + - Sub-agent = wykonawca jednego mikro-zadania (czyta pliki, implementuje, weryfikuje) + - Przepływ: parse plan → dla każdego taska → build micro-prompt → spawn Agent → evaluate result → accept/retry/escalate + + 2. **Budowanie mikro-promptu:** + Każdy mikro-prompt dla sub-agenta MUSI zawierać: + ``` + ## Cel + [task name z PLAN.md] + + ## Pliki do modyfikacji + [files z PLAN.md] + + ## Instrukcje + [action z PLAN.md — pełna treść, nie skrócona] + + ## Granice — NIE ZMIENIAJ + [boundaries z PLAN.md] + + ## Weryfikacja + [verify z PLAN.md] + + ## Kryteria ukończenia + [done z PLAN.md] + + ## Kontekst projektu (minimum) + - Stack: [z PROJECT.md — 1-2 linijki] + - Konwencje: [kluczowe konwencje z CONVENTIONS/CLAUDE.md — max 5 linijek] + ``` + + 3. **Ocena wyników (evaluation protocol):** + - Sub-agent zwraca summary ~100-300 słów + - Orkiestrator sprawdza: + a) Czy pliki zostały zmodyfikowane (git diff --stat) + b) Czy done criteria z PLAN.md są spełnione + c) Czy boundaries nie zostały naruszone (git diff na chronionych plikach) + - Decyzja: + - **accept**: wynik OK → przejdź do następnego taska + - **retry** (max 3x): wynik niekompletny → spawn Agent z feedbackiem co poprawić + - **escalate**: 3 retry failed lub problem wymaga decyzji → pytaj użytkownika + + 4. **Tryby delegacji:** + - `delegation: auto` — orkiestrator automatycznie deleguje taski type="auto" + - `delegation: parallel` — jak auto, ale niezależne taski lecą równolegle + - `delegation: off` — klasyczny inline (domyślne, backward compatible) + + 5. **Ograniczenia:** + - Checkpointy (human-verify, decision, human-action) ZAWSZE w głównym kontekście + - Sub-agent NIE aktualizuje STATE.md ani PLAN.md — to robi orkiestrator + - Max 1 task per sub-agent (atomowość) + - Sub-agent type: `general-purpose` (domyślny) + + 6. **Szacunek oszczędności kontekstu:** + | Element | Inline (teraz) | Delegated | + |---------|----------------|-----------| + | Czytanie plików źródłowych | ~3-5k tokens/plik | 0 (w sub-agencie) | + | Implementacja kodu | ~10-20k tokens | 0 (w sub-agencie) | + | Wynik weryfikacji | ~2-5k tokens | ~0.5k (summary) | + | Orkiestracja per task | 0 | ~1-2k tokens | + | **Total per task** | **~15-30k** | **~2-3k** | + + + Plik istnieje w ~/.claude/paul-framework/references/delegated-apply.md i zawiera sekcje: Architektura, Mikro-prompt, Evaluation Protocol, Tryby, Ograniczenia + AC-2 satisfied: specyfikacja mikro-promptu zdefiniowana. AC-3 satisfied: evaluation protocol zdefiniowany. + + + + Task 2: Modyfikacja apply-phase.md — dodanie trybu delegowanego + ~/.claude/paul-framework/workflows/apply-phase.md + + Dodaj nowy krok `determine_execution_mode` PRZED `execute_tasks` oraz zmodyfikuj `execute_tasks`: + + 1. **Nowy krok `determine_execution_mode`** (po `verify_required_skills`): + ``` + 1. Sprawdź frontmatter pola `delegation`: + - `auto` lub `parallel` → tryb delegowany + - `off` lub brak pola → tryb inline (bez zmian) + 2. Jeśli tryb delegowany: + - Załaduj @references/delegated-apply.md + - Przygotuj kontekst projektu dla mikro-promptów (stack, konwencje — max 10 linijek) + - Zidentyfikuj taski niezależne (do równoległego wykonania jeśli `parallel`) + 3. Log: "Execution mode: delegated|inline" + ``` + + 2. **Rozszerzenie `execute_tasks`** — dodaj alternatywną ścieżkę dla trybu delegowanego: + + **Jeśli tryb delegowany i task type="auto":** + ``` + 1. Zbuduj mikro-prompt wg szablonu z delegated-apply.md + 2. Wywołaj Agent tool: + - subagent_type: "general-purpose" + - prompt: [mikro-prompt] + - description: "PAUL task: [task name]" (3-5 słów) + 3. Odbierz wynik (summary od sub-agenta) + 4. Oceń wg evaluation protocol: + - Sprawdź git diff --stat + - Sprawdź done criteria + - Sprawdź boundaries + 5. Decyzja: accept / retry / escalate + 6. Przy retry: spawn ponownie z feedbackiem (max 3 razy) + ``` + + **Jeśli `delegation: parallel` i multiple niezależne taski:** + ``` + 1. Zidentyfikuj klastry niezależnych tasków + 2. Wywołaj multiple Agent tool w jednym kroku + 3. Oceń wyniki każdego + 4. Kontynuuj sekwencyjnie z taskami zależnymi + ``` + + **Checkpointy — BEZ ZMIAN:** + Taski checkpoint:* zawsze wykonywane inline w głównym kontekście. + + 3. **Rozszerzenie `finalize`** — dodaj podsumowanie trybu: + ``` + Delegated execution summary: + - Tasks delegated: N + - Accepted on first try: N + - Retried: N + - Escalated: N + ``` + + WAŻNE: Nie usuwaj i nie modyfikuj istniejącego zachowania inline. Tryb delegowany to DODATKOWA ścieżka. + + apply-phase.md zawiera kroki: determine_execution_mode, execute_tasks z alternatywną ścieżką delegowaną, finalize z podsumowaniem delegacji + AC-1 satisfied: tryb delegowany aktywuje się na podstawie pola delegation. AC-4 satisfied: brak pola = inline bez zmian. + + + + Task 3: Aktualizacja PLAN.md template i subagent-criteria.md + ~/.claude/paul-framework/templates/PLAN.md, ~/.claude/paul-framework/references/subagent-criteria.md + + 1. **PLAN.md template** — dodaj pole `delegation` do frontmatter: + ```yaml + delegation: off # off | auto | parallel + ``` + - Dodaj pole po `autonomous` z komentarzem + - Dodaj do tabeli Frontmatter Fields: `delegation | No | Execution mode: off (inline, default), auto (delegated), parallel (delegated + parallel)` + - Dodaj krótką sekcję "## Delegation Mode" w dokumencie opisującą kiedy użyć jakiego trybu + + 2. **subagent-criteria.md** — dodaj sekcję o kontekście PAUL: + - Nowa sekcja "## PAUL Delegated Apply Context" + - Wyjaśnij że w kontekście /paul:apply, sub-agenty służą do: + a) Wykonywania tasków z PLAN.md (well-defined, files+action+verify+done) + b) Ochrony głównego kontekstu orkiestratora + c) Umożliwienia wielu faz w jednej sesji + - Podkreśl że kryteria z istniejącej sekcji nadal obowiązują + - Dodaj notę: "W PAUL delegated-apply, każdy task z PLAN.md naturalnie spełnia kryteria: Task Independence (self-contained), Clear Scope (files+action+verify+done), Complexity Sweet Spot (2-3 taski per plan = 1 task per agent)" + + PLAN.md template zawiera pole delegation w frontmatter i tabeli. subagent-criteria.md zawiera sekcję PAUL Delegated Apply Context. + AC-1 partially satisfied: template wspiera pole delegation. AC-5 satisfied: parallel mode zdefiniowany. + + + + + Kompletny wzorzec delegated-apply dla PAUL: + 1. Reference doc z architekturą, mikro-promptem, evaluation protocol + 2. Zmodyfikowany apply-phase.md z trybem delegowanym + 3. Zaktualizowany template i subagent-criteria + + + 1. Przejrzyj ~/.claude/paul-framework/references/delegated-apply.md + 2. Przejrzyj zmiany w ~/.claude/paul-framework/workflows/apply-phase.md + 3. Sprawdź czy PLAN.md template ma pole delegation + 4. Przetestuj na następnej fazie orderPRO z `delegation: auto` + + Type "approved" to continue, or describe issues to fix + + + + + + +## DO NOT CHANGE +- ~/.claude/paul-framework/workflows/plan-phase.md (planning workflow untouched) +- ~/.claude/paul-framework/workflows/unify-phase.md (unify workflow untouched) +- ~/.claude/paul-framework/rules/* (framework rules untouched) +- .paul/PROJECT.md, .paul/ROADMAP.md (project state untouched) + +## SCOPE LIMITS +- Nie zmieniamy /paul:plan ani /paul:unify — tylko /paul:apply +- Nie tworzymy nowych komend — rozszerzamy istniejący workflow +- Nie przerabiamy istniejącego trybu inline — dodajemy alternatywną ścieżkę +- Nie implementujemy auto-detection rozmiaru (proste pole w frontmatter wystarczy) + + + + +Before declaring plan complete: +- [ ] delegated-apply.md istnieje i zawiera: architekturę, mikro-prompt template, evaluation protocol, tryby, ograniczenia +- [ ] apply-phase.md zawiera krok determine_execution_mode i alternatywną ścieżkę delegowaną +- [ ] PLAN.md template zawiera pole delegation w frontmatter +- [ ] subagent-criteria.md zawiera sekcję PAUL context +- [ ] Tryb inline (delegation: off / brak pola) działa bez zmian +- [ ] Wszystkie checkpointy nadal działają w głównym kontekście + + + +- Wszystkie 3 taski auto completed + checkpoint approved +- Framework PAUL wspiera tryb delegated-apply +- Backward compatible — istniejące plany bez pola delegation działają jak dotychczas +- Gotowy do przetestowania na następnej fazie orderPRO + + + +After completion, create `.paul/phases/65-paul-delegated-apply/65-01-SUMMARY.md` + diff --git a/.paul/phases/65-paul-delegated-apply/65-01-SUMMARY.md b/.paul/phases/65-paul-delegated-apply/65-01-SUMMARY.md new file mode 100644 index 0000000..613de18 --- /dev/null +++ b/.paul/phases/65-paul-delegated-apply/65-01-SUMMARY.md @@ -0,0 +1,124 @@ +--- +phase: 65-paul-delegated-apply +plan: 01 +subsystem: infra +tags: [paul-framework, subagents, delegation, context-management] + +requires: + - phase: none + provides: standalone enhancement + +provides: + - Delegated-apply execution mode for /paul:apply + - Micro-prompt template for sub-agent task delegation + - Evaluation protocol (accept/retry/escalate) + - delegation field in PLAN.md frontmatter + +affects: [all future phases using /paul:apply] + +tech-stack: + added: [] + patterns: [orchestrator-subagent delegation, micro-prompt composition, evaluation protocol] + +key-files: + created: + - ~/.claude/paul-framework/references/delegated-apply.md + modified: + - ~/.claude/paul-framework/workflows/apply-phase.md + - ~/.claude/paul-framework/templates/PLAN.md + - ~/.claude/paul-framework/references/subagent-criteria.md + +key-decisions: + - "delegation: auto as default for all new plans" + - "Max 3 retries before escalation to user" + - "Checkpoints always inline, never delegated" + +patterns-established: + - "Orchestrator builds micro-prompt from PLAN.md task fields, delegates via Agent tool" + - "Evaluation: git diff + done criteria + boundary check → accept/retry/escalate" + +duration: ~15min +started: 2026-04-03T20:10:00Z +completed: 2026-04-03T20:25:00Z +--- + +# Phase 65 Plan 01: PAUL Delegated Apply Summary + +**Rozszerzenie /paul:apply o tryb delegowany — orkiestrator w głównym kontekście zleca mikro-zadania sub-agentom, ocenia wyniki i decyduje accept/retry/escalate. Szacowana oszczędność: ~80% kontekstu per faza.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~15min | +| Started | 2026-04-03T20:10:00Z | +| Completed | 2026-04-03T20:25:00Z | +| Tasks | 3 auto + 1 checkpoint completed | +| Files modified | 4 | +| Execution mode | Delegated (parallel) — 3 sub-agents | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Tryb delegowany aktywuje się automatycznie | Pass | Pole `delegation: auto` (domyślne), workflow sprawdza frontmatter | +| AC-2: Mikro-prompt zawiera pełny kontekst | Pass | Template w delegated-apply.md: cel, pliki, instrukcje, granice, weryfikacja, kontekst | +| AC-3: Orkiestrator ocenia wynik | Pass | Evaluation protocol: git diff + done criteria + boundary check → accept/retry/escalate | +| AC-4: Fallback do trybu inline | Pass | `delegation: off` = inline bez zmian; brak pola = auto (zmiana z oryginalnego planu) | +| AC-5: Równoległe wykonywanie tasków | Pass | `delegation: parallel` mode zdefiniowany w workflow i reference | + +## Accomplishments + +- Utworzono kompletny reference `delegated-apply.md` z architekturą, mikro-prompt template, evaluation protocol, trybami i ograniczeniami +- Rozszerzono `apply-phase.md` o krok `determine_execution_mode` i alternatywną ścieżkę delegowaną (inline path bez zmian) +- Zaktualizowano template PLAN.md o pole `delegation` (domyślnie `auto`) i sekcję Delegation Mode +- Rozszerzono `subagent-criteria.md` o kontekst PAUL delegated-apply + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `~/.claude/paul-framework/references/delegated-apply.md` | Created | Pełna specyfikacja wzorca delegated-apply | +| `~/.claude/paul-framework/workflows/apply-phase.md` | Modified | Nowy krok determine_execution_mode + delegated path + delegation summary w finalize | +| `~/.claude/paul-framework/templates/PLAN.md` | Modified | Pole delegation w frontmatter (default: auto) + sekcja Delegation Mode | +| `~/.claude/paul-framework/references/subagent-criteria.md` | Modified | Sekcja PAUL Delegated Apply Context | + +## Decisions Made + +| Decision | Rationale | Impact | +|----------|-----------|--------| +| `delegation: auto` jako default | Użytkownik chce delegacji jako standardowego zachowania, nie opt-in | Wszystkie nowe plany automatycznie delegują taski | +| Max 3 retries (zmiana z 2) | Użytkownik poprosił o zwiększenie — daje więcej szans na sukces | Mniej escalacji do użytkownika | +| Checkpointy zawsze inline | Wymagają interakcji z użytkownikiem — nie da się delegować | Bezpieczeństwo workflow | + +## Deviations from Plan + +### Summary + +| Type | Count | Impact | +|------|-------|--------| +| Scope additions | 1 | Zmiana default z `off` na `auto` — poproszona przez użytkownika | + +**Total impact:** Pozytywna zmiana — lepsze UX, delegacja out-of-the-box. + +## Issues Encountered + +None + +## Next Phase Readiness + +**Ready:** +- Framework PAUL wspiera tryb delegated-apply we wszystkich projektach +- Każdy nowy plan domyślnie używa `delegation: auto` +- Gotowe do przetestowania na następnej fazie orderPRO + +**Concerns:** +- Wymaga przetestowania w praktyce — pierwszy real-world test na następnej fazie orderPRO pokaże czy mikro-prompty są wystarczająco dobre +- Sub-agenty mogą potrzebować dostrojenia kontekstu projektu (stack + konwencje) + +**Blockers:** +- None + +--- +*Phase: 65-paul-delegated-apply, Plan: 01* +*Completed: 2026-04-03* diff --git a/.paul/phases/66-allegro-delivery-tracking/66-01-PLAN.md b/.paul/phases/66-allegro-delivery-tracking/66-01-PLAN.md new file mode 100644 index 0000000..92b0507 --- /dev/null +++ b/.paul/phases/66-allegro-delivery-tracking/66-01-PLAN.md @@ -0,0 +1,312 @@ +--- +phase: 66-allegro-delivery-tracking +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - src/Modules/Shipments/AllegroTrackingService.php + - src/Modules/Shipments/DeliveryStatus.php + - src/Modules/Cron/ShipmentTrackingHandler.php +autonomous: true +delegation: auto +--- + + +## Goal +Zaimplementować śledzenie statusu przesyłek Allegro Delivery (numery A-*) przez publiczne edge API Allegro. Aktualnie `AllegroTrackingService` zwraca `null` dla przesyłek nie-InPost. Po zmianie — pobiera statusy z `https://edge.allegro.pl/ad/tracking?packageNo={nr}` i normalizuje je do istniejącego systemu `DeliveryStatus`. + +## Purpose +Przesyłki Allegro Delivery (One Kurier, DPD via Allegro, itp.) nie mają śledzenia w orderPRO. Użytkownicy muszą ręcznie sprawdzać status na allegro.pl. Ta zmiana automatyzuje ten proces. + +## Output +- `AllegroTrackingService` pobiera statusy z edge API dla przesyłek non-InPost +- `DeliveryStatus` ma rozszerzony mapping Allegro o statusy z edge API (opisy PL) +- Rate limiting: max 1 request na minutę per przesyłka (w cron handler) + + + +## Project Context +@.paul/PROJECT.md +@.paul/STATE.md + +## Source Files +@src/Modules/Shipments/AllegroTrackingService.php +@src/Modules/Shipments/DeliveryStatus.php +@src/Modules/Cron/ShipmentTrackingHandler.php + +## API Research +Edge API endpoint (publiczny, bez autoryzacji): +- URL: `https://edge.allegro.pl/ad/tracking?packageNo={trackingNumber}` +- Header: `Accept: application/vnd.allegro.internal.v1+json` +- Response: `{"status": [{"eventTimestamp": "ISO8601", "description": "Opis PL"}]}` +- Ostatni element tablicy = aktualny status +- Opisy są po polsku, np.: + - "Przesyłka została przygotowana przez nadawcę" + - "Przesyłka została nadana" + - "Przesyłka została podjęta z punktu przez kuriera" + - "Przesyłka została odebrana przez kuriera" + - "Kurier przekazał przesyłkę do magazynu" + + + + +## AC-1: Allegro Delivery tracking zwraca status +```gherkin +Given przesyłka z provider=allegro_wza i tracking_number zaczynający się od "A" +When cron tracking handler odpytuje AllegroTrackingService +Then serwis pobiera status z edge.allegro.pl/ad/tracking +And zwraca znormalizowany status + opis po polsku +``` + +## AC-2: Mapowanie opisów na znormalizowane statusy +```gherkin +Given odpowiedź z edge API zawiera description np. "Przesyłka została nadana" +When AllegroTrackingService przetwarza odpowiedź +Then mapuje opis na raw status (np. "shipped") i normalizuje przez DeliveryStatus +And status_raw zawiera oryginalny opis z API +``` + +## AC-3: Rate limiting — max 1 request/min +```gherkin +Given cron handler przetwarza wiele przesyłek allegro_wza +When odpytuje edge API +Then między kolejnymi requestami do edge.allegro.pl czeka minimum 60 sekund +And inne providery (InPost, Apaczka) nie są objęte tym limitem +``` + +## AC-4: Fallback InPost nadal działa +```gherkin +Given przesyłka z provider=allegro_wza i carrier_id zawierający "inpost" +When cron tracking handler odpytuje AllegroTrackingService +Then serwis nadal używa InPost API (nie edge API) +And zachowanie jest identyczne jak przed zmianą +``` + + + + + + + Task 1: Rozszerzenie DeliveryStatus o mapowanie Allegro edge API + src/Modules/Shipments/DeliveryStatus.php + + Dodaj nową mapę `ALLEGRO_EDGE_MAP` i `ALLEGRO_EDGE_DESCRIPTIONS` do DeliveryStatus. + + Edge API zwraca opisy po polsku (nie kody). Trzeba mapować opisy na wewnętrzne klucze, a potem na znormalizowane statusy. + + Nowa mapa `ALLEGRO_EDGE_MAP` (klucz = slug z opisu, wartość = normalized status): + ```php + private const ALLEGRO_EDGE_MAP = [ + 'przygotowana_przez_nadawce' => self::CREATED, + 'nadana' => self::CONFIRMED, + 'podjeta_z_punktu' => self::IN_TRANSIT, + 'odebrana_przez_kuriera' => self::IN_TRANSIT, + 'przekazana_do_magazynu' => self::IN_TRANSIT, + 'w_sortowni' => self::IN_TRANSIT, + 'w_doreceniu' => self::OUT_FOR_DELIVERY, + 'gotowa_do_odbioru' => self::READY_FOR_PICKUP, + 'dostarczona' => self::DELIVERED, + 'doreczona' => self::DELIVERED, + 'zwrocona' => self::RETURNED, + 'anulowana' => self::CANCELLED, + 'problem' => self::PROBLEM, + ]; + ``` + + Nowa mapa `ALLEGRO_EDGE_DESCRIPTIONS` — klucz = slug, wartość = oryginalny opis PL (identyczny jak z API). + + Dodaj nowy provider `allegro_edge` do: + - `PROVIDER_MAPS` array + - `PROVIDER_DESCRIPTIONS` array + - match w `normalize()` i `description()` + + Dodaj statyczną metodę `slugifyAllegroDescription(string $description): string` — konwertuje opis PL na slug: + 1. Usuwa prefiks "Przesyłka została " / "Kurier " + 2. Bierze główne słowo kluczowe + 3. Zamienia polskie znaki na ASCII + 4. Zamienia spacje na podkreślenia + 5. Zwraca lowercase slug + + WAŻNE: Metoda musi obsługiwać nieznane opisy — jeśli slug nie istnieje w mapie, zwróć sam slug jako raw_status i self::UNKNOWN jako normalized. + + Klasa DeliveryStatus kompiluje się bez błędów. Nowe stałe ALLEGRO_EDGE_MAP i ALLEGRO_EDGE_DESCRIPTIONS istnieją. Provider 'allegro_edge' jest obsługiwany w normalize() i description(). + AC-2 satisfied: mapowanie opisów na znormalizowane statusy zdefiniowane. + + + + Task 2: Implementacja fetchAllegroEdgeStatus w AllegroTrackingService + src/Modules/Shipments/AllegroTrackingService.php + + Zmodyfikuj `AllegroTrackingService::getDeliveryStatus()` aby obsługiwał przesyłki Allegro Delivery (non-InPost): + + 1. W metodzie `getDeliveryStatus()`, po bloku `if (str_contains(... 'inpost'))`, zamiast `return null` dodaj: + ```php + return $this->fetchAllegroEdgeStatus($trackingNumber); + ``` + + 2. Dodaj nową prywatną metodę `fetchAllegroEdgeStatus(string $trackingNumber): ?array`: + ```php + private function fetchAllegroEdgeStatus(string $trackingNumber): ?array + { + try { + $url = 'https://edge.allegro.pl/ad/tracking?packageNo=' . rawurlencode($trackingNumber); + $response = $this->edgeApiRequest($url); + + $statuses = $response['status'] ?? []; + if (!is_array($statuses) || $statuses === []) { + return null; + } + + // Ostatni element = najnowszy status + $latest = end($statuses); + $description = trim((string) ($latest['description'] ?? '')); + if ($description === '') { + return null; + } + + $slug = DeliveryStatus::slugifyAllegroDescription($description); + + return [ + 'status' => DeliveryStatus::normalize('allegro_edge', $slug), + 'status_raw' => $description, + 'description' => $description, + ]; + } catch (Throwable) { + return null; + } + } + ``` + + 3. Dodaj nową prywatną metodę `edgeApiRequest(string $url): array` — osobna od istniejącej `apiRequest()` bo nie wymaga autoryzacji: + ```php + private function edgeApiRequest(string $url): array + { + $ch = curl_init($url); + if ($ch === false) { + return []; + } + + $opts = [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_HTTPHEADER => [ + 'Accept: application/vnd.allegro.internal.v1+json', + 'Content-Type: application/vnd.allegro.internal.v1+json', + ], + ]; + + $caPath = $this->getCaBundlePath(); + if ($caPath !== null) { + $opts[CURLOPT_CAINFO] = $caPath; + } + + curl_setopt_array($ch, $opts); + $body = curl_exec($ch); + $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch = null; + + if ($body === false || $httpCode < 200 || $httpCode >= 300) { + return []; + } + + $json = json_decode((string) $body, true); + return is_array($json) ? $json : []; + } + ``` + + NIE zmieniaj istniejącej metody `fetchInpostStatus()` ani `apiRequest()` — to osobne ścieżki. + + AllegroTrackingService kompiluje się. Metoda getDeliveryStatus nie zwraca null dla non-InPost przesyłek (wywołuje fetchAllegroEdgeStatus). Metoda edgeApiRequest wysyła Accept: application/vnd.allegro.internal.v1+json. + AC-1 satisfied: Allegro Delivery tracking pobiera status z edge API. AC-4 satisfied: InPost path bez zmian. + + + + Task 3: Rate limiting w ShipmentTrackingHandler dla Allegro edge API + src/Modules/Cron/ShipmentTrackingHandler.php + + Dodaj rate limiting do `ShipmentTrackingHandler::handle()` — max 1 request na 60 sekund do edge.allegro.pl. + + 1. Dodaj stałą: + ```php + private const ALLEGRO_EDGE_RATE_LIMIT_SECONDS = 60; + ``` + + 2. W metodzie `handle()`, przed pętlą `foreach`, dodaj zmienną śledzącą czas ostatniego requestu Allegro edge: + ```php + $lastAllegroEdgeRequestTime = 0.0; + ``` + + 3. Wewnątrz pętli `foreach`, PO uzyskaniu `$service` a PRZED wywołaniem `$service->getDeliveryStatus()`, dodaj sprawdzenie: + ```php + if ($provider === 'allegro_wza') { + $carrierId = strtolower(trim((string) ($package['carrier_id'] ?? ''))); + $isInpost = str_contains($carrierId, 'inpost') || str_contains($carrierId, 'paczkomat'); + + if (!$isInpost) { + $elapsed = microtime(true) - $lastAllegroEdgeRequestTime; + if ($elapsed < self::ALLEGRO_EDGE_RATE_LIMIT_SECONDS) { + $sleepTime = (int) ceil(self::ALLEGRO_EDGE_RATE_LIMIT_SECONDS - $elapsed); + sleep($sleepTime); + } + // Zaraz po sleep (lub bez), przed wywołaniem getDeliveryStatus: + $lastAllegroEdgeRequestTime = microtime(true); + } + } + ``` + + WAŻNE: + - Rate limit dotyczy TYLKO requestów do edge.allegro.pl (non-InPost allegro_wza) + - InPost i Apaczka requestów NIE ograniczaj + - sleep() w cronie jest OK — to background process + + ShipmentTrackingHandler kompiluje się. Stała ALLEGRO_EDGE_RATE_LIMIT_SECONDS = 60 istnieje. Kod rate limitingu jest w pętli foreach przed getDeliveryStatus dla allegro_wza non-inpost. + AC-3 satisfied: max 1 request/min do edge.allegro.pl. + + + + + + +## DO NOT CHANGE +- src/Modules/Shipments/InpostTrackingService.php +- src/Modules/Shipments/ApaczkaTrackingService.php +- src/Modules/Shipments/ShipmentTrackingInterface.php +- src/Modules/Shipments/ShipmentTrackingRegistry.php +- src/Modules/Shipments/ShipmentPackageRepository.php +- src/Modules/Cron/CronHandlerFactory.php +- Istniejące mapy INPOST_MAP, APACZKA_MAP w DeliveryStatus +- Istniejąca metoda fetchInpostStatus() w AllegroTrackingService + +## SCOPE LIMITS +- Nie tworzymy nowych klas — rozszerzamy istniejące +- Nie zmieniamy schematu DB — delivery_status_raw już obsługuje dowolne stringi +- Nie dodajemy UI — tracking UI już istnieje i działa z dowolnym statusem +- Nie tworzymy unit testów w tym planie + + + + +Before declaring plan complete: +- [ ] DeliveryStatus::normalize('allegro_edge', 'nadana') zwraca 'confirmed' +- [ ] DeliveryStatus::slugifyAllegroDescription('Przesyłka została nadana') zwraca slug mapowany na status +- [ ] AllegroTrackingService::getDeliveryStatus() dla non-InPost allegro_wza wywołuje edge API +- [ ] AllegroTrackingService::getDeliveryStatus() dla InPost allegro_wza nadal używa InPost API +- [ ] ShipmentTrackingHandler ma rate limit 60s między requestami edge.allegro.pl +- [ ] Żadne chronione pliki nie zostały zmodyfikowane +- [ ] PHP syntax check: `php -l` na każdym zmienionym pliku + + + +- Wszystkie 3 taski auto completed +- Przesyłki Allegro Delivery (A-numery) mają automatyczny tracking statusu +- Rate limit chroni przed blokadą przez Allegro +- Istniejący tracking InPost i Apaczka bez zmian + + + +After completion, create `.paul/phases/66-allegro-delivery-tracking/66-01-SUMMARY.md` + diff --git a/.paul/phases/66-allegro-delivery-tracking/66-01-SUMMARY.md b/.paul/phases/66-allegro-delivery-tracking/66-01-SUMMARY.md new file mode 100644 index 0000000..b47d3eb --- /dev/null +++ b/.paul/phases/66-allegro-delivery-tracking/66-01-SUMMARY.md @@ -0,0 +1,96 @@ +--- +phase: 66-allegro-delivery-tracking +plan: 01 +subsystem: shipments +tags: [allegro, tracking, edge-api, delivery-status, cron] + +requires: + - phase: 27-shipment-tracking-backend + provides: ShipmentTrackingInterface, DeliveryStatus, ShipmentTrackingHandler + +provides: + - Allegro Delivery tracking via edge.allegro.pl API + - Edge API integration (no auth, public endpoint) + - Rate limiting for edge API requests (60s) + +affects: [allegro-tracking, delivery-status, cron-handler] + +tech-stack: + added: [] + patterns: [edge-api-integration, rate-limited-cron] + +key-files: + created: [] + modified: + - src/Modules/Shipments/AllegroTrackingService.php + - src/Modules/Shipments/DeliveryStatus.php + - src/Modules/Cron/ShipmentTrackingHandler.php + +key-decisions: + - "Edge API (edge.allegro.pl/ad/tracking) zamiast Allegro REST API (nie daje tracking statusów)" + - "Accept: application/vnd.allegro.internal.v1+json — wymagany nagłówek" + - "Provider allegro_edge osobny od allegro_wza w DeliveryStatus" + - "Rate limit 60s między requestami do edge API" + +patterns-established: + - "slugifyAllegroDescription() konwertuje opisy PL na slugi mapowalne na statusy" + - "Osobna metoda edgeApiRequest() bez Bearer token (publiczny endpoint)" + +duration: ~15min +started: 2026-04-03T20:30:00Z +completed: 2026-04-03T20:45:00Z +--- + +# Phase 66 Plan 01: Allegro Delivery Tracking — Core Integration + +**Integracja śledzenia przesyłek Allegro Delivery przez publiczne edge API — fetchAllegroEdgeStatus, mapowanie opisów PL na znormalizowane statusy, rate limiting 60s w cronie.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~15min | +| Tasks | 3 completed (delegated) | +| Files modified | 3 | +| Execution mode | Delegated auto (3 sub-agents) | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Allegro Delivery tracking zwraca status | Pass | fetchAllegroEdgeStatus pobiera z edge API | +| AC-2: Mapowanie opisów na statusy | Pass | slugify + ALLEGRO_EDGE_MAP | +| AC-3: Rate limiting max 1 req/min | Pass | sleep() w ShipmentTrackingHandler | +| AC-4: Fallback InPost nadal działa | Pass | Warunek carrier_id inpost/paczkomat bez zmian | + +## Accomplishments + +- AllegroTrackingService pobiera statusy z edge.allegro.pl/ad/tracking dla non-InPost przesyłek +- DeliveryStatus ma provider 'allegro_edge' z mapą slugów i opisów PL +- ShipmentTrackingHandler throttluje requesty do edge API (60s) + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `src/Modules/Shipments/DeliveryStatus.php` | Modified | ALLEGRO_EDGE_MAP, ALLEGRO_EDGE_DESCRIPTIONS, slugifyAllegroDescription() | +| `src/Modules/Shipments/AllegroTrackingService.php` | Modified | fetchAllegroEdgeStatus(), edgeApiRequest() | +| `src/Modules/Cron/ShipmentTrackingHandler.php` | Modified | Rate limiting 60s dla allegro_wza non-inpost | + +## Deviations from Plan + +### Auto-fixed Issues + +**1. Slug mismatch w mapie** +- **Found during:** Orkiestrator verification +- **Issue:** "Kurier przekazał przesyłkę do magazynu" → slug `przekazal_przesylke_do_magazynu` nie był w mapie (była `przekazana_do_magazynu`) +- **Fix:** Dodano wariant do ALLEGRO_EDGE_MAP +- **Verification:** Test 5/5 realnych opisów mapuje poprawnie + +## Next Phase Readiness + +**Ready:** Plan 66-02 rozszerza mapę i dodaje keyword fallback + +--- +*Phase: 66-allegro-delivery-tracking, Plan: 01* +*Completed: 2026-04-03* diff --git a/.paul/phases/66-allegro-delivery-tracking/66-02-PLAN.md b/.paul/phases/66-allegro-delivery-tracking/66-02-PLAN.md new file mode 100644 index 0000000..6aadc94 --- /dev/null +++ b/.paul/phases/66-allegro-delivery-tracking/66-02-PLAN.md @@ -0,0 +1,228 @@ +--- +phase: 66-allegro-delivery-tracking +plan: 02 +type: execute +wave: 2 +depends_on: ["66-01"] +files_modified: + - src/Modules/Shipments/DeliveryStatus.php + - src/Modules/Shipments/AllegroTrackingService.php +autonomous: true +delegation: auto +--- + + +## Goal +1. Uzupełnić mapę ALLEGRO_EDGE_MAP o brakujące statusy z realnych przesyłek +2. Dodać mechanizm keyword-based fallback (guessStatusFromDescription) dla nieznanych opisów +3. Logować nowe nierozpoznane statusy do activity_log + +## Purpose +Edge API Allegro zwraca opisy po polsku bez ustalonego słownika — mogą pojawić się nowe warianty. Hardcoded mapa nie wystarczy. Fallback + logowanie = system sam sobie radzi z nowymi opisami i informuje admina. + +## Output +- Rozszerzona mapa ALLEGRO_EDGE_MAP o 5 nowych slugów +- Metoda guessStatusFromDescription() w DeliveryStatus jako keyword fallback +- Logowanie nieznanych statusów w AllegroTrackingService + + + +## Prior Work +@.paul/phases/66-allegro-delivery-tracking/66-01-PLAN.md + +## Nowe statusy z realnego zamówienia AD0243IOG6 +| Slug | Opis | Mapowanie | +|------|------|-----------| +| podjeta_z_maszyny_przez_kuriera | Przesyłka została podjęta z maszyny przez kuriera | in_transit | +| przesylka_wyjechala_w_droge_do_punktu_docelowego | Przesyłka wyjechała w drogę do punktu docelowego | in_transit | +| wyslana_z_sortowni | Wysłana z sortowni | in_transit | +| wydana_do_doreczenia | Przesyłka została wydana do doręczenia | out_for_delivery | +| przesylka_oczekuje_na_odbior | Przesyłka oczekuje na odbiór | ready_for_pickup | + + + + +## AC-1: Nowe slugi w mapie +```gherkin +Given opis "Wysłana z sortowni" z edge API +When slugify + normalize +Then zwraca 'in_transit' (nie 'unknown') +``` + +## AC-2: Fallback keyword matching +```gherkin +Given nieznany opis np. "Paczka jest w drodze do odbiorcy" +When slug nie istnieje w ALLEGRO_EDGE_MAP +Then guessStatusFromDescription() dopasowuje na podstawie słów kluczowych +And zwraca odpowiedni znormalizowany status +``` + +## AC-3: Logowanie nieznanych statusów +```gherkin +Given opis z edge API którego slug NIE jest w mapie i fallback zwraca unknown +When AllegroTrackingService przetwarza taki status +Then loguje do error_log: "[AllegroTracking] Nowy niezmapowany status: {opis} (slug: {slug})" +And nadal zwraca wynik z status=unknown (nie null) +``` + + + + + + + Task 1: Rozszerzenie mapy + guessStatusFromDescription + src/Modules/Shipments/DeliveryStatus.php + + 1. Dodaj brakujące slugi do ALLEGRO_EDGE_MAP: + ```php + 'podjeta_z_maszyny_przez_kuriera' => self::IN_TRANSIT, + 'przesylka_wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT, + 'wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT, + 'wyslana_z_sortowni' => self::IN_TRANSIT, + 'wydana_do_doreczenia' => self::OUT_FOR_DELIVERY, + 'przesylka_oczekuje_na_odbior' => self::READY_FOR_PICKUP, + ``` + + 2. Dodaj odpowiednie opisy do ALLEGRO_EDGE_DESCRIPTIONS: + ```php + 'podjeta_z_maszyny_przez_kuriera' => 'Podjęta z maszyny przez kuriera', + 'przesylka_wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego', + 'wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego', + 'wyslana_z_sortowni' => 'Wysłana z sortowni', + 'wydana_do_doreczenia' => 'Wydana do doręczenia', + 'przesylka_oczekuje_na_odbior' => 'Oczekuje na odbiór', + ``` + + 3. Dodaj nową statyczną metodę `guessStatusFromDescription(string $description): string` — keyword-based fallback. Umieść ją po slugifyAllegroDescription(): + + ```php + public static function guessStatusFromDescription(string $description): string + { + $lower = mb_strtolower($description, 'UTF-8'); + + // Terminal statuses first + if (str_contains($lower, 'doręczon') || str_contains($lower, 'dostarczono') || str_contains($lower, 'odebrana przez odbiorc')) { + return self::DELIVERED; + } + if (str_contains($lower, 'zwrócon') || str_contains($lower, 'zwrocona')) { + return self::RETURNED; + } + if (str_contains($lower, 'anulowan')) { + return self::CANCELLED; + } + + // Active statuses + if (str_contains($lower, 'doręczeni') || str_contains($lower, 'doreczenia') || str_contains($lower, 'wydana do')) { + return self::OUT_FOR_DELIVERY; + } + if (str_contains($lower, 'odbiór') || str_contains($lower, 'odbior') || str_contains($lower, 'oczekuje na odb')) { + return self::READY_FOR_PICKUP; + } + if (str_contains($lower, 'sortowni') || str_contains($lower, 'magazyn') || str_contains($lower, 'w drodze') || str_contains($lower, 'tranzyt') || str_contains($lower, 'kurier') || str_contains($lower, 'podjęta') || str_contains($lower, 'podjeta') || str_contains($lower, 'wyjechał') || str_contains($lower, 'wyjechala')) { + return self::IN_TRANSIT; + } + if (str_contains($lower, 'nadana') || str_contains($lower, 'nadano')) { + return self::CONFIRMED; + } + if (str_contains($lower, 'przygotowan') || str_contains($lower, 'utworzon')) { + return self::CREATED; + } + if (str_contains($lower, 'uszkodzon') || str_contains($lower, 'problem') || str_contains($lower, 'zagubiła') || str_contains($lower, 'zagubion')) { + return self::PROBLEM; + } + + return self::UNKNOWN; + } + ``` + + WAŻNE: NIE zmieniaj istniejących metod normalize(), description(), slugifyAllegroDescription(). Tylko DODAWAJ nowe wpisy do map i nową metodę. + + php -l przechodzi. Test: DeliveryStatus::normalize('allegro_edge', 'wyslana_z_sortowni') zwraca 'in_transit'. Test: DeliveryStatus::guessStatusFromDescription('Paczka jest w drodze') zwraca 'in_transit'. + AC-1 satisfied: nowe slugi w mapie. AC-2 satisfied: fallback method istnieje. + + + + Task 2: Integracja fallback + logowanie w AllegroTrackingService + src/Modules/Shipments/AllegroTrackingService.php + + Zmodyfikuj metodę `fetchAllegroEdgeStatus()` — dodaj fallback i logowanie. + + Po linii: + ```php + $slug = DeliveryStatus::slugifyAllegroDescription($description); + ``` + + Zamień blok return na: + ```php + $normalized = DeliveryStatus::normalize('allegro_edge', $slug); + + // Fallback: jeśli slug nieznany, próbuj keyword matching + if ($normalized === DeliveryStatus::UNKNOWN) { + $normalized = DeliveryStatus::guessStatusFromDescription($description); + + // Loguj niezmapowany status (do uzupełnienia mapy w przyszłości) + error_log(sprintf( + '[AllegroTracking] Niezmapowany status: "%s" (slug: %s, guessed: %s)', + $description, + $slug, + $normalized + )); + } + + return [ + 'status' => $normalized, + 'status_raw' => $description, + 'description' => $description, + ]; + ``` + + To zastępuje istniejący blok: + ```php + return [ + 'status' => DeliveryStatus::normalize('allegro_edge', $slug), + 'status_raw' => $description, + 'description' => $description, + ]; + ``` + + WAŻNE: Nie zmieniaj nic innego w tym pliku. Tylko modyfikacja wewnątrz fetchAllegroEdgeStatus(). + + php -l przechodzi. Metoda fetchAllegroEdgeStatus zawiera fallback guessStatusFromDescription i error_log. + AC-2 partially satisfied: fallback zintegrowany. AC-3 satisfied: logowanie nieznanych statusów. + + + + + + +## DO NOT CHANGE +- Istniejące mapy INPOST_MAP, APACZKA_MAP, ALLEGRO_MAP +- Metody: normalize(), description(), slugifyAllegroDescription(), fetchInpostStatus() +- src/Modules/Cron/ShipmentTrackingHandler.php (rate limit z 66-01 bez zmian) +- Wszystkie inne pliki + +## SCOPE LIMITS +- Nie tworzymy UI do zarządzania mapowaniem (istniejący Delivery Status Mapping UI wystarczy) +- Nie tworzymy unit testów w tym planie + + + + +- [ ] php -l na obu plikach +- [ ] DeliveryStatus::normalize('allegro_edge', 'wyslana_z_sortowni') === 'in_transit' +- [ ] DeliveryStatus::normalize('allegro_edge', 'wydana_do_doreczenia') === 'out_for_delivery' +- [ ] DeliveryStatus::guessStatusFromDescription('Paczka jest w drodze do odbiorcy') === 'in_transit' +- [ ] DeliveryStatus::guessStatusFromDescription('Przesyłka odebrana w punkcie') !== 'unknown' +- [ ] fetchAllegroEdgeStatus fallback + error_log działa + + + +- Oba taski completed +- Wszystkie realne opisy z API (obu zamówień) mapują się na właściwe statusy +- Nieznane przyszłe opisy są obsługiwane przez keyword fallback +- Nieznane statusy logowane do error_log + + + +After completion, create `.paul/phases/66-allegro-delivery-tracking/66-02-SUMMARY.md` + diff --git a/.paul/phases/66-allegro-delivery-tracking/66-02-SUMMARY.md b/.paul/phases/66-allegro-delivery-tracking/66-02-SUMMARY.md new file mode 100644 index 0000000..cbb1c3d --- /dev/null +++ b/.paul/phases/66-allegro-delivery-tracking/66-02-SUMMARY.md @@ -0,0 +1,93 @@ +--- +phase: 66-allegro-delivery-tracking +plan: 02 +subsystem: shipments +tags: [allegro, tracking, fallback, keyword-matching, logging] + +requires: + - phase: 66-allegro-delivery-tracking + provides: AllegroTrackingService edge API, DeliveryStatus allegro_edge provider + +provides: + - Keyword-based fallback for unknown Allegro edge descriptions + - Error logging for unmapped statuses + - Extended ALLEGRO_EDGE_MAP with 6 new real-world slugs + +affects: [allegro-tracking, delivery-status] + +tech-stack: + added: [] + patterns: [keyword-fallback, graceful-degradation] + +key-files: + modified: + - src/Modules/Shipments/DeliveryStatus.php + - src/Modules/Shipments/AllegroTrackingService.php + +key-decisions: + - "Keyword fallback zamiast pytania użytkownika (cron nie ma interakcji)" + - "error_log dla niezmapowanych statusów (monitoring bez blokowania)" + - "IN_TRANSIT sprawdzany przed READY_FOR_PICKUP w fallback (uniknięcie fałszywego matchu 'odbior' w 'w drodze do odbiorcy')" + +patterns-established: + - "guessStatusFromDescription() jako graceful degradation dla nieznanych opisów" + - "Kolejność keyword matching: terminal → active → transit → pickup (specyficzność malejąca)" + +duration: ~10min +started: 2026-04-03T20:45:00Z +completed: 2026-04-03T20:55:00Z +--- + +# Phase 66 Plan 02: Allegro Tracking Fallback + Extended Map + +**Rozszerzenie mapy o 6 nowych slugów z realnych przesyłek, keyword-based fallback (guessStatusFromDescription) dla nieznanych opisów, logowanie nowych statusów do error_log.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~10min | +| Tasks | 2 completed (delegated) + 1 orkiestrator fix | +| Files modified | 2 | +| Execution mode | Delegated auto (2 sub-agents, sequential) | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Nowe slugi w mapie | Pass | 6 nowych slugów z zamówienia AD0243IOG6 | +| AC-2: Fallback keyword matching | Pass | guessStatusFromDescription() — 9 kategorii keywords | +| AC-3: Logowanie nieznanych statusów | Pass | error_log w fetchAllegroEdgeStatus | + +## Accomplishments + +- 6 nowych slugów w ALLEGRO_EDGE_MAP z realnego zamówienia AD0243IOG6 +- guessStatusFromDescription() jako keyword fallback — 9 kategorii (delivered, returned, cancelled, out_for_delivery, ready_for_pickup, in_transit, confirmed, created, problem) +- Logowanie niezmapowanych statusów do error_log z pełnym kontekstem (opis, slug, guessed status) +- Fix kolejności keyword matching: IN_TRANSIT przed READY_FOR_PICKUP + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `src/Modules/Shipments/DeliveryStatus.php` | Modified | +6 slugów w mapie, +guessStatusFromDescription() | +| `src/Modules/Shipments/AllegroTrackingService.php` | Modified | Fallback + error_log w fetchAllegroEdgeStatus() | + +## Deviations from Plan + +### Auto-fixed Issues + +**1. Kolejność keyword matching** +- **Found during:** Orkiestrator verification +- **Issue:** "w drodze do odbiorcy" matchował READY_FOR_PICKUP (bo `odbior`) zamiast IN_TRANSIT +- **Fix:** IN_TRANSIT sprawdzany przed READY_FOR_PICKUP, READY_FOR_PICKUP ograniczony do `oczekuje na odb`/`gotowa do odb` + +## Next Phase Readiness + +**Ready:** Phase 66 complete — Allegro Delivery tracking działa z mapą + fallback + logowaniem + +**Blockers:** None + +--- +*Phase: 66-allegro-delivery-tracking, Plan: 02* +*Completed: 2026-04-03* diff --git a/.paul/phases/67-paul-codex-executor/67-01-PLAN.md b/.paul/phases/67-paul-codex-executor/67-01-PLAN.md new file mode 100644 index 0000000..423136c --- /dev/null +++ b/.paul/phases/67-paul-codex-executor/67-01-PLAN.md @@ -0,0 +1,310 @@ +--- +phase: 67-paul-codex-executor +plan: 01 +type: execute +wave: 1 +depends_on: ["65-01"] +files_modified: + - ~/.claude/paul-framework/references/delegated-apply.md + - ~/.claude/paul-framework/workflows/apply-phase.md + - ~/.claude/paul-framework/templates/PLAN.md +autonomous: true +delegation: auto +--- + + +## Goal +Dodać Codex CLI (`codex exec`) jako alternatywny executor w PAUL delegated-apply. Reguła: jeśli plan ma >3 tasków auto, 1/3 z nich MUSI iść przez Codex. Plus: auto-fallback na Codex przy quota error Claude. + +## Purpose +- Oszczędność 5h limitu Claude Code — Codex jest osobno opłacany +- Rotacja executorów — wymuszenie użycia Codex przy większych planach +- Fallback — gdy Claude limit się kończy, praca nie staje + +## Output +- Zaktualizowany `delegated-apply.md` z sekcją Codex executor +- Zaktualizowany `apply-phase.md` z logiką wyboru executor (Claude vs Codex) +- Zaktualizowany `PLAN.md` template z nowym trybem delegation + + + +## Prior Work +@.paul/phases/65-paul-delegated-apply/65-01-SUMMARY.md + +## Research: Codex CLI +- Komenda: `codex exec -c 'approval_mode="full-auto"' "prompt"` +- Model: gpt-5.3-codex +- Synchroniczny, non-interactive, zwraca diff + summary +- Timeout: ~30s na proste zadanie, max ~5min na złożone +- Uwagi: pilnować UTF-8 bez BOM, polskie znaki w prompcie +- Skill warnings (niekrytyczne): ignorować + + + + +## AC-1: Reguła 1/3 Codex przy >3 taskach +```gherkin +Given plan z 6 taskami type="auto" i delegation: auto +When orkiestrator przydziela executory +Then minimum 2 taski (ceil(6/3)) idą przez Codex +And pozostałe 4 przez Claude sub-agent +And wybór tasków dla Codex to te najprostsze (najmniej plików) +``` + +## AC-2: Auto-fallback Claude → Codex +```gherkin +Given task delegowany do Claude sub-agent +When Agent tool zwróci błąd quota/rate-limit +Then orkiestrator automatycznie ponawia ten sam task przez codex exec +And loguje: "Task N: Claude quota → fallback Codex" +``` + +## AC-3: Codex micro-prompt zawiera guard UTF-8 +```gherkin +Given task przydzielony do Codex +When orkiestrator buduje mikro-prompt +Then prompt zawiera instrukcje: "IMPORTANT: All files must remain UTF-8 without BOM. Preserve Polish characters (ą,ć,ę,ł,ń,ó,ś,ź,ż)." +``` + +## AC-4: Backward compatible +```gherkin +Given plan z delegation: off lub delegation: auto z <=3 taskami +When orkiestrator wykonuje plan +Then zachowanie identyczne jak dotychczas (bez Codex) +``` + + + + + + + Task 1: Rozszerzenie delegated-apply.md o Codex executor + ~/.claude/paul-framework/references/delegated-apply.md + + Przeczytaj plik, potem dodaj nowe sekcje. + + 1. Dodaj nową sekcję "## Codex Executor" PO sekcji "## Evaluation Protocol" a PRZED "## Delegation Modes": + + ```markdown + ## Codex Executor + + Codex CLI (`codex exec`) służy jako alternatywny executor dla tasków z PLAN.md. + + ### Wywołanie + + ```bash + codex exec -c 'approval_mode="full-auto"' "MICRO_PROMPT" + ``` + + - Synchroniczny, non-interactive + - Timeout Bash: 300000ms (5 min) + - Output zawiera diff + summary — parsowany przez orkiestratora + + ### Reguła 1/3 + + Jeśli plan ma **>3 tasków type="auto"**, minimum `ceil(count/3)` tasków MUSI iść przez Codex: + + | Tasków auto | Min Codex | Min Claude | + |-------------|-----------|------------| + | 1-3 | 0 | all | + | 4-6 | 2 | reszta | + | 7-9 | 3 | reszta | + | 10+ | ceil(N/3) | reszta | + + **Wybór tasków dla Codex:** Orkiestrator przydziela Codexowi taski o najmniejszej liczbie plików w `` (najprostsze). Jeśli równe — pierwsze w kolejności. + + **KRYTYCZNE: Brak współdzielenia plików.** Codex i Claude sub-agenty NIE MOGĄ edytować tych samych plików — działają na tym samym working directory. Orkiestrator MUSI sprawdzić `` każdego taska i zapewnić że: + - Żaden plik z tasków Codex nie pokrywa się z plikami tasków Claude + - Jeśli jest konflikt plików → oba taski idą do tego samego executora + - Przy parallel mode: taski z tymi samymi plikami NIE lecą równolegle + + ### Auto-fallback + + Jeśli Claude Agent tool zwróci błąd (quota, rate-limit, timeout): + 1. Orkiestrator loguje: "Task N: Claude error → fallback Codex" + 2. Ponawia TEN SAM mikro-prompt przez `codex exec` + 3. Evaluation protocol identyczny jak dla Claude + + ### Micro-prompt guard + + Każdy mikro-prompt wysyłany do Codex MUSI zawierać na końcu: + + ``` + ## IMPORTANT + - All files must remain UTF-8 without BOM encoding + - Preserve all Polish characters: ą,ć,ę,ł,ń,ó,ś,ź,ż,Ą,Ć,Ę,Ł,Ń,Ó,Ś,Ź,Ż + - Do NOT convert file encoding + - Do NOT add BOM markers + ``` + + ### Evaluation po Codex + + Identyczny jak po Claude sub-agent: + 1. git diff --stat + 2. Sprawdź done criteria + 3. Sprawdź boundaries + 4. **Dodatkowe:** `file` command na zmodyfikowanych plikach — potwierdź UTF-8 + 5. Decyzja: accept / retry / escalate + ``` + + 2. W sekcji "## Delegation Modes", zaktualizuj tabelę: + + Dodaj wiersz: + ``` + | codex | `delegation: codex` | Wszystkie taski auto przez Codex exec | + ``` + + W "Kiedy użyć jakiego" dodaj: + ``` + - **`codex`** — wymuszone użycie Codex dla wszystkich tasków (np. przy niskim limicie Claude) + ``` + + 3. W sekcji "## Constraints", dodaj: + ``` + - Codex exec timeout: 300s (5 min) per task — jeśli task jest większy, rozbij + - Codex nie ma dostępu do MCP servers ani Agent tool — tylko filesystem + shell + ``` + + Plik zawiera sekcję "Codex Executor" z regułą 1/3, auto-fallback, micro-prompt guard. Tabela Delegation Modes zawiera tryb codex. + AC-1 spec: reguła 1/3 zdefiniowana. AC-2 spec: auto-fallback zdefiniowany. AC-3 spec: UTF-8 guard zdefiniowany. + + + + Task 2: Logika executor selection w apply-phase.md + ~/.claude/paul-framework/workflows/apply-phase.md + + Przeczytaj plik, potem zmodyfikuj. + + 1. W kroku `determine_execution_mode`, ROZSZERZ punkt 2 ("If delegated mode"): + Dodaj pod-punkt po identyfikacji task clusters: + ``` + - Determine executor assignment per task: + a. Count auto tasks in plan + b. If count > 3: assign ceil(count/3) tasks to Codex executor + - Select tasks with fewest files in for Codex + - Remaining tasks go to Claude Agent tool + - CRITICAL: Verify no file overlap between Codex and Claude tasks + If overlap detected → move conflicting task to same executor as its peer + c. If delegation: codex → all auto tasks to Codex + d. If delegation: auto/parallel with <=3 tasks → all to Claude Agent tool + e. Log: "Executor assignment: N Claude, M Codex (no file conflicts)" + ``` + + 2. W kroku `execute_tasks`, w bloku "If delegated mode and task type=auto": + Dodaj rozgałęzienie na executor: + ``` + **If task assigned to Claude Agent tool:** + [existing Agent tool delegation — no changes] + + **If task assigned to Codex executor:** + 1. Build micro-prompt (same template as Claude) + 2. Append UTF-8 guard block to prompt + 3. Execute via Bash: + codex exec -c 'approval_mode="full-auto"' "MICRO_PROMPT" + Timeout: 300000ms + 4. Parse output for diff and summary + 5. Evaluate: git diff + done criteria + boundaries + UTF-8 check + 6. Decision: accept / retry (max 3) / escalate + + **Auto-fallback (Claude → Codex):** + If Agent tool returns error (quota/rate-limit/connection): + 1. Log: "Task N: [name] → Claude error: [reason] → fallback Codex" + 2. Re-execute same micro-prompt via codex exec + 3. Continue evaluation as normal + ``` + + 3. W kroku `finalize`, rozszerz "Delegated execution summary": + ``` + - Tasks via Claude: N + - Tasks via Codex: N + - Tasks via Codex (fallback): N + ``` + + 4. W sekcji `error_handling`, dodaj: + ``` + **Codex exec timeout:** + - If codex exec exceeds 300s timeout: mark as failed + - Offer retry via Claude Agent tool (reverse fallback) + + **Codex encoding issue:** + - If file check shows non-UTF-8 after Codex: auto-fix encoding + - Log warning and continue + ``` + + WAŻNE: Nie usuwaj istniejącej logiki — rozszerzaj. + + apply-phase.md zawiera: executor assignment w determine_execution_mode, rozgałęzienie Claude/Codex w execute_tasks, auto-fallback, Codex w finalize summary, Codex error handling. + AC-1: logika 1/3 w orkiestratorze. AC-2: auto-fallback zaimplementowany. AC-4: <=3 tasków = bez Codex. + + + + Task 3: Aktualizacja PLAN.md template + ~/.claude/paul-framework/templates/PLAN.md + + Przeczytaj plik, potem zmodyfikuj. + + 1. W frontmatter YAML, zaktualizuj komentarz przy delegation: + Zmień: + ```yaml + delegation: auto # auto (default) | parallel | off — execution mode for /paul:apply + ``` + na: + ```yaml + delegation: auto # auto (default) | parallel | codex | off — execution mode for /paul:apply + ``` + + 2. W tabeli Frontmatter Fields, zaktualizuj opis delegation: + Zmień na: + ``` + | `delegation` | No | Execution mode: `auto` (delegated, 1/3 Codex if >3 tasks, default), `parallel` (delegated + parallel), `codex` (all tasks via Codex), `off` (inline, legacy) | + ``` + + 3. W sekcji "## Delegation Mode", dodaj `codex` do tabeli: + ``` + | `codex` | When Claude limit is low or you want to force Codex for all tasks | + ``` + + WAŻNE: Nie zmieniaj nic innego. + + PLAN.md template zawiera tryb codex w frontmatter komentarzu, tabeli i sekcji Delegation Mode. + AC-4 partially: template zaktualizowany o nowy tryb. + + + + + + +## DO NOT CHANGE +- ~/.claude/paul-framework/workflows/plan-phase.md +- ~/.claude/paul-framework/workflows/unify-phase.md +- ~/.claude/paul-framework/rules/* +- ~/.claude/paul-framework/references/subagent-criteria.md +- .paul/PROJECT.md, .paul/ROADMAP.md + +## SCOPE LIMITS +- Nie tworzymy wrapper script dla codex — wywołanie bezpośrednio z Bash +- Nie modyfikujemy Codex config (~/.codex/) — używamy -c flag +- Nie implementujemy monitoring limitu Claude — reaktywny fallback wystarczy + + + + +- [ ] delegated-apply.md zawiera sekcję Codex Executor z regułą 1/3 +- [ ] apply-phase.md zawiera executor assignment + rozgałęzienie Claude/Codex +- [ ] apply-phase.md zawiera auto-fallback Claude → Codex +- [ ] PLAN.md template zawiera tryb codex +- [ ] Reguła 1/3 dotyczy tylko planów >3 tasków auto +- [ ] UTF-8 guard jest w każdym Codex mikro-prompcie + + + +- Wszystkie 3 taski completed +- PAUL apply wspiera Codex jako executor +- Reguła 1/3 wymusza rotację przy większych planach +- Auto-fallback chroni przed przestojem przy quota error +- Backward compatible + + + +After completion, create `.paul/phases/67-paul-codex-executor/67-01-SUMMARY.md` + diff --git a/.paul/phases/67-paul-codex-executor/67-01-SUMMARY.md b/.paul/phases/67-paul-codex-executor/67-01-SUMMARY.md new file mode 100644 index 0000000..3f7f01c --- /dev/null +++ b/.paul/phases/67-paul-codex-executor/67-01-SUMMARY.md @@ -0,0 +1,97 @@ +--- +phase: 67-paul-codex-executor +plan: 01 +subsystem: infra +tags: [paul-framework, codex, delegation, executor, fallback] + +requires: + - phase: 65-paul-delegated-apply + provides: Delegated-apply workflow, micro-prompt template, evaluation protocol + +provides: + - Codex CLI as alternative executor in PAUL delegated-apply + - Rule of thirds (1/3 Codex if >3 tasks) + - Auto-fallback Claude → Codex on quota error + - UTF-8 guard for Codex micro-prompts + - File overlap protection between executors + +affects: [all future phases using /paul:apply with >3 tasks] + +tech-stack: + added: [codex-cli] + patterns: [multi-executor-delegation, auto-fallback, file-conflict-detection] + +key-files: + modified: + - ~/.claude/paul-framework/references/delegated-apply.md + - ~/.claude/paul-framework/workflows/apply-phase.md + - ~/.claude/paul-framework/templates/PLAN.md + +key-decisions: + - "Reguła 1/3: ceil(count/3) tasków do Codex przy >3 taskach auto" + - "Codex dostaje najprostsze taski (fewest files)" + - "Codex i Claude NIE MOGĄ edytować tych samych plików" + - "Auto-fallback Claude→Codex przy quota error, reverse fallback przy Codex timeout" + - "UTF-8 guard obowiązkowy w każdym Codex micro-prompt" + +patterns-established: + - "codex exec -c 'approval_mode=\"full-auto\"' jako non-interactive executor" + - "File overlap check przed przydziałem executorów" + - "delegation: codex jako tryb wymuszający Codex dla wszystkich tasków" + +duration: ~10min +started: 2026-04-03T21:00:00Z +completed: 2026-04-03T21:10:00Z +--- + +# Phase 67 Plan 01: PAUL Codex Executor + +**Integracja Codex CLI jako alternatywny executor w PAUL — reguła 1/3 przy >3 taskach, auto-fallback Claude→Codex, ochrona plików przed współdzieleniem executorów, UTF-8 guard.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~10min | +| Tasks | 3 completed (delegated, parallel) | +| Files modified | 3 | +| Execution mode | Delegated auto (3 sub-agents parallel) | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Reguła 1/3 Codex przy >3 taskach | Pass | Zdefiniowana w delegated-apply.md + apply-phase.md | +| AC-2: Auto-fallback Claude → Codex | Pass | W execute_tasks + error_handling | +| AC-3: UTF-8 guard w Codex prompts | Pass | Micro-prompt guard w delegated-apply.md | +| AC-4: Backward compatible | Pass | <=3 tasków = bez Codex, delegation: off = inline | + +## Accomplishments + +- Sekcja "Codex Executor" w delegated-apply.md z regułą 1/3, auto-fallback, UTF-8 guard +- Executor assignment logic w apply-phase.md z file overlap protection +- Tryb `delegation: codex` w PLAN.md template +- Error handling: Codex timeout, encoding issues, file conflicts +- Anti-patterns: mixing executors on same files, Polish text without guard + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `~/.claude/paul-framework/references/delegated-apply.md` | Modified | +Codex Executor section, +codex mode, +constraints | +| `~/.claude/paul-framework/workflows/apply-phase.md` | Modified | +executor assignment, +Codex path, +fallback, +error handling | +| `~/.claude/paul-framework/templates/PLAN.md` | Modified | +codex mode w frontmatter, tabeli, sekcji | + +## Deviations from Plan + +None — plan executed as specified. + +## Next Phase Readiness + +**Ready:** PAUL wspiera 4 tryby delegation: auto, parallel, codex, off. Codex zintegrowany jako executor z pełną ochroną (file overlap, UTF-8, fallback). + +**Blockers:** None + +--- +*Phase: 67-paul-codex-executor, Plan: 01* +*Completed: 2026-04-03* diff --git a/.paul/phases/68-code-deduplication-refactor/68-01-PLAN.md b/.paul/phases/68-code-deduplication-refactor/68-01-PLAN.md new file mode 100644 index 0000000..103c60c --- /dev/null +++ b/.paul/phases/68-code-deduplication-refactor/68-01-PLAN.md @@ -0,0 +1,222 @@ +--- +phase: 68-code-deduplication-refactor +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - src/Core/Http/SslCertificateResolver.php (new) + - src/Modules/Settings/AllegroApiClient.php + - src/Modules/Settings/ApaczkaApiClient.php + - src/Modules/Settings/ShopproApiClient.php + - src/Modules/Settings/AllegroOAuthClient.php + - src/Modules/Shipments/AllegroTrackingService.php + - src/Modules/Shipments/InpostShipmentService.php + - src/Modules/Shipments/InpostTrackingService.php + - src/Core/Http/ToggleableRepositoryTrait.php (new) + - src/Modules/Automation/AutomationController.php + - src/Modules/Settings/EmailMailboxRepository.php + - src/Modules/Settings/EmailTemplateRepository.php + - src/Modules/Settings/ReceiptConfigRepository.php + - src/Modules/Settings/EmailMailboxController.php + - src/Modules/Settings/EmailTemplateController.php + - src/Modules/Settings/ReceiptConfigController.php + - src/Core/Http/RedirectPathResolver.php (new) + - src/Modules/Settings/AllegroIntegrationController.php + - src/Modules/Settings/ApaczkaIntegrationController.php + - src/Modules/Settings/InpostIntegrationController.php +autonomous: true +delegation: auto +--- + + +## Goal +Wyeliminowac zduplikowana logike biznesowa i infrastrukturalna z codebase — 7x getCaBundlePath, 7x toggleStatus, 3x resolveRedirectPath — przez ekstrakcje do wspolnych klas/traitow. + +## Purpose +Duplikacja kodu powoduje realne bugi (jak dzisiejszy brak godzin na paragonach — ta sama logika w 2 miejscach, poprawiona tylko w 1). Konsolidacja zmniejsza ryzyko rozsynchronizowania i ulatwia utrzymanie. + +## Output +- `Core/Http/SslCertificateResolver.php` — statyczna metoda zastepujaca 7 kopii getCaBundlePath +- `Core/Http/ToggleableRepositoryTrait.php` — trait z metoda toggleActive() dla repozytoriow +- `Core/Http/RedirectPathResolver.php` — statyczna metoda zastepujaca 3 kopie resolveRedirectPath +- 13 zrefaktoryzowanych plikow zrodlowych + + + +## Project Context +@.paul/PROJECT.md +@.paul/ROADMAP.md +@.paul/STATE.md + +## Source Files +@src/Modules/Settings/AllegroApiClient.php +@src/Modules/Settings/ApaczkaApiClient.php +@src/Modules/Settings/ShopproApiClient.php +@src/Modules/Settings/AllegroOAuthClient.php +@src/Modules/Shipments/AllegroTrackingService.php +@src/Modules/Shipments/InpostShipmentService.php +@src/Modules/Shipments/InpostTrackingService.php +@src/Modules/Automation/AutomationController.php +@src/Modules/Settings/EmailMailboxRepository.php +@src/Modules/Settings/EmailTemplateRepository.php +@src/Modules/Settings/ReceiptConfigRepository.php +@src/Modules/Settings/AllegroIntegrationController.php +@src/Modules/Settings/ApaczkaIntegrationController.php +@src/Modules/Settings/InpostIntegrationController.php + + + + +## AC-1: getCaBundlePath wyeliminowane z 7 klas +```gherkin +Given 7 klas posiada identyczna prywatna metode getCaBundlePath() +When refaktor zostanie zastosowany +Then istnieje jedna klasa SslCertificateResolver ze statyczna metoda resolve() +And zadna z 7 klas nie posiada juz metody getCaBundlePath +And wszystkie wywolania uzywaja SslCertificateResolver::resolve() +And PHP lint przechodzi bez bledow +``` + +## AC-2: toggleStatus skonsolidowane w trait +```gherkin +Given 4+ repozytoriow posiada podobna metode toggleActive/toggleStatus +When refaktor zostanie zastosowany +Then istnieje trait ToggleableRepositoryTrait z metoda toggleActive() +And repozytoria uzywaja traita zamiast wlasnej implementacji +And kontrolery toggleStatus wywoluja repozytorium bez zmian w zachowaniu +And PHP lint przechodzi bez bledow +``` + +## AC-3: resolveRedirectPath skonsolidowane +```gherkin +Given 3 kontrolery integracji posiadaja identyczna metode resolveRedirectPath +When refaktor zostanie zastosowany +Then istnieje jedna klasa/metoda RedirectPathResolver +And 3 kontrolery uzywaja wspolnej implementacji +And PHP lint przechodzi bez bledow +``` + + + + + + + Task 1: Ekstrakcja SslCertificateResolver z 7 kopii getCaBundlePath + + src/Core/Http/SslCertificateResolver.php (new), + src/Modules/Settings/AllegroApiClient.php, + src/Modules/Settings/ApaczkaApiClient.php, + src/Modules/Settings/ShopproApiClient.php, + src/Modules/Settings/AllegroOAuthClient.php, + src/Modules/Shipments/AllegroTrackingService.php, + src/Modules/Shipments/InpostShipmentService.php, + src/Modules/Shipments/InpostTrackingService.php + + + 1. Przeczytaj getCaBundlePath() z jednej z 7 klas (identyczne) + 2. Utworz src/Core/Http/SslCertificateResolver.php: + - final class, namespace App\Core\Http + - public static function resolve(): string — logika z getCaBundlePath + 3. W kazdej z 7 klas: + - Dodaj use App\Core\Http\SslCertificateResolver + - Zamien wywolania $this->getCaBundlePath() na SslCertificateResolver::resolve() + - Usun prywatna metode getCaBundlePath() + 4. Uruchom PHP lint na wszystkich 8 plikach + Unikaj: zmieniania jakiejkolwiek innej logiki w tych klasach + + PHP lint: php -l na wszystkich 8 plikach + grep -r "getCaBundlePath" src/ zwraca 0 wynikow + AC-1 satisfied: getCaBundlePath nie istnieje w zadnej z 7 klas, SslCertificateResolver jest jedynym zrodlem + + + + Task 2: Ekstrakcja ToggleableRepositoryTrait z powtorzonej logiki toggleActive + + src/Core/Http/ToggleableRepositoryTrait.php (new), + src/Modules/Settings/EmailMailboxRepository.php, + src/Modules/Settings/EmailTemplateRepository.php, + src/Modules/Settings/ReceiptConfigRepository.php, + src/Modules/Automation/AutomationController.php, + src/Modules/Settings/EmailMailboxController.php, + src/Modules/Settings/EmailTemplateController.php, + src/Modules/Settings/ReceiptConfigController.php + + + 1. Przeczytaj metody toggleActive/toggleStatus z repozytoriow — zidentyfikuj wspolny wzorzec + 2. Utworz src/Core/Http/ToggleableRepositoryTrait.php: + - trait ToggleableRepositoryTrait, namespace App\Core\Http + - Metoda toggleActive(string $table, int $id, string $column = 'is_active'): bool + - Wymaga aby klasa uzywajaca traita miala property $db (Medoo) + 3. W kazdym repozytorium z toggleActive: + - Dodaj use ToggleableRepositoryTrait + - Usun lokalna metode toggleActive/toggleStatus + - Jesli sygnatura sie rozni, dostosuj wywolania w kontrolerach + 4. PHP lint na wszystkich zmienionych plikach + Unikaj: zmieniania logiki kontrolerow poza dostosowaniem wywolan toggle + + PHP lint na wszystkich zmienionych plikach + metody toggleActive/toggleStatus nie istnieja lokalnie w repozytoriach + AC-2 satisfied: trait ToggleableRepositoryTrait jest jedynym zrodlem logiki toggle + + + + Task 3: Ekstrakcja RedirectPathResolver z 3 kontrolerow integracji + + src/Core/Http/RedirectPathResolver.php (new), + src/Modules/Settings/AllegroIntegrationController.php, + src/Modules/Settings/ApaczkaIntegrationController.php, + src/Modules/Settings/InpostIntegrationController.php + + + 1. Przeczytaj resolveRedirectPath() z 3 kontrolerow — potwierdz identycznosc + 2. Utworz src/Core/Http/RedirectPathResolver.php: + - final class, namespace App\Core\Http + - public static function resolve(string $requestedPath, array $allowedPaths, string $default): string + 3. W kazdym z 3 kontrolerow: + - Dodaj use App\Core\Http\RedirectPathResolver + - Zamien wywolania $this->resolveRedirectPath(...) na RedirectPathResolver::resolve(...) + - Usun prywatna metode resolveRedirectPath() + 4. PHP lint na 4 plikach + Unikaj: zmieniania logiki walidacji/przekierowan poza ekstrakcja + + PHP lint na 4 plikach + grep -r "function resolveRedirectPath" src/ zwraca 0 wynikow + AC-3 satisfied: resolveRedirectPath nie istnieje w zadnym z 3 kontrolerow + + + + + + +## DO NOT CHANGE +- database/migrations/* — brak zmian schematu +- resources/views/* — brak zmian widokow +- routes/web.php — brak zmian routingu (chyba ze wymagane przez nowe zależności DI) +- Logika biznesowa w zmienianych klasach — refaktor dotyczy TYLKO duplikacji + +## SCOPE LIMITS +- Ten plan obejmuje tylko getCaBundlePath, toggleStatus i resolveRedirectPath +- Duplikacje apiRequest, downloadLabel, buildReceiverAddress, resolveColumns — osobny plan (68-02) +- Nie refaktoryzowac validateCsrf (wymaga analizy middleware — osobny plan) + + + + +Before declaring plan complete: +- [ ] PHP lint przechodzi na wszystkich zmienionych plikach +- [ ] grep -r "getCaBundlePath" src/ — 0 wynikow +- [ ] grep -r "function resolveRedirectPath" src/ — 0 wynikow +- [ ] Ponowna analiza duplikacji w codebase — potwierdzenie eliminacji +- [ ] Wszystkie acceptance criteria spelnione + + + +- 7 kopii getCaBundlePath → 1 klasa SslCertificateResolver +- 7 kopii toggleStatus → 1 trait ToggleableRepositoryTrait +- 3 kopie resolveRedirectPath → 1 klasa RedirectPathResolver +- ~170 linii zduplikowanego kodu wyeliminowane +- Zero regresji (PHP lint clean) +- Ponowna analiza duplikacji potwierdza eliminacje + + + +After completion, create `.paul/phases/68-code-deduplication-refactor/68-01-SUMMARY.md` + diff --git a/.paul/phases/68-code-deduplication-refactor/68-01-SUMMARY.md b/.paul/phases/68-code-deduplication-refactor/68-01-SUMMARY.md new file mode 100644 index 0000000..253b6ca --- /dev/null +++ b/.paul/phases/68-code-deduplication-refactor/68-01-SUMMARY.md @@ -0,0 +1,149 @@ +--- +phase: 68-code-deduplication-refactor +plan: 01 +subsystem: infra +tags: [refactor, deduplication, trait, static-helper] + +requires: [] +provides: + - SslCertificateResolver — single source for CA bundle path + - ToggleableRepositoryTrait — reusable toggle pattern for repositories + - RedirectPathResolver — single source for redirect path validation + - ReceiptService — single source for receipt issuance logic +affects: [future integrations, new repositories with toggle, new controllers with redirects] + +tech-stack: + added: [] + patterns: [static resolver classes, repository traits] + +key-files: + created: + - src/Core/Http/SslCertificateResolver.php + - src/Core/Http/ToggleableRepositoryTrait.php + - src/Core/Http/RedirectPathResolver.php + - src/Modules/Accounting/ReceiptService.php + - src/Modules/Accounting/ReceiptIssueException.php + modified: + - src/Modules/Settings/AllegroApiClient.php + - src/Modules/Settings/ApaczkaApiClient.php + - src/Modules/Settings/ShopproApiClient.php + - src/Modules/Settings/AllegroOAuthClient.php + - src/Modules/Shipments/AllegroTrackingService.php + - src/Modules/Shipments/InpostShipmentService.php + - src/Modules/Shipments/InpostTrackingService.php + - src/Modules/Settings/EmailMailboxRepository.php + - src/Modules/Settings/EmailTemplateRepository.php + - src/Modules/Settings/ReceiptConfigRepository.php + - src/Modules/Automation/AutomationRepository.php + - src/Modules/Settings/AllegroIntegrationController.php + - src/Modules/Settings/ApaczkaIntegrationController.php + - src/Modules/Settings/InpostIntegrationController.php + - src/Modules/Accounting/ReceiptController.php + - src/Modules/Automation/AutomationService.php + - src/Modules/Cron/CronHandlerFactory.php + - routes/web.php + +key-decisions: + - "Static resolver classes for stateless utilities (SSL, redirect)" + - "Trait for toggle pattern — repos keep thin public wrapper for backward compat" + - "ReceiptService as full service class (not static) — needs DI dependencies" + +patterns-established: + - "Stateless utility → final class with static methods in Core/Http/" + - "Shared repo behavior → trait in Core/Http/ with $this->db/$this->pdo access" + +duration: ~25min +started: 2026-04-03T19:10:00Z +completed: 2026-04-03T19:35:00Z +--- + +# Phase 68 Plan 01: Code Deduplication Refactor Summary + +**Extracted 3 shared utilities + 1 service from 17+ duplicated methods across codebase, eliminating ~250 lines of copy-pasted code** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~25min | +| Started | 2026-04-03T19:10:00Z | +| Completed | 2026-04-03T19:35:00Z | +| Tasks | 3 completed (+ 1 pre-plan ReceiptService) | +| Files modified | 18 | +| Delegation | 3 tasks via Claude Agent (parallel) | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: getCaBundlePath eliminated from 7 classes | Pass | 0 occurrences remain, SslCertificateResolver is sole source | +| AC-2: toggleStatus consolidated in trait | Pass | 4 repos use ToggleableRepositoryTrait, controllers unchanged | +| AC-3: resolveRedirectPath consolidated | Pass | 0 occurrences remain, RedirectPathResolver is sole source | + +## Accomplishments + +- Extracted `SslCertificateResolver` replacing 7 identical `getCaBundlePath()` copies +- Extracted `ToggleableRepositoryTrait` used by 4 repositories (Automation, EmailMailbox, EmailTemplate, ReceiptConfig) +- Extracted `RedirectPathResolver` replacing 3 identical `resolveRedirectPath()` copies +- Extracted `ReceiptService` consolidating receipt issuance from ReceiptController + AutomationService (pre-plan bugfix that prompted this phase) +- Fixed receipt datetime bug: `date('Y-m-d')` → `date('Y-m-d H:i:s')` in automation path +- Migration 000077: `sale_date` DATE→DATETIME + backfill old receipts from `created_at` + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `src/Core/Http/SslCertificateResolver.php` | Created | CA bundle path resolution (was in 7 classes) | +| `src/Core/Http/ToggleableRepositoryTrait.php` | Created | Shared toggle active/inactive pattern | +| `src/Core/Http/RedirectPathResolver.php` | Created | Redirect path validation (was in 3 controllers) | +| `src/Modules/Accounting/ReceiptService.php` | Created | Centralized receipt issuance logic | +| `src/Modules/Accounting/ReceiptIssueException.php` | Created | Dedicated exception for receipt errors | +| `database/migrations/20260403_000077_*` | Created | sale_date DATETIME + backfill | +| 7x API/Tracking clients | Modified | getCaBundlePath → SslCertificateResolver | +| 4x Repositories | Modified | toggleActive → ToggleableRepositoryTrait | +| 3x Integration controllers | Modified | resolveRedirectPath → RedirectPathResolver | +| `ReceiptController.php` | Modified | Delegates to ReceiptService | +| `AutomationService.php` | Modified | Delegates to ReceiptService, removed 7 private methods | +| `CronHandlerFactory.php` | Modified | Wires ReceiptService | +| `routes/web.php` | Modified | Wires ReceiptService | + +## Deviations from Plan + +### Summary + +| Type | Count | Impact | +|------|-------|--------| +| Scope additions | 1 | ReceiptService extracted pre-plan as bugfix response | +| Auto-fixed | 0 | None | +| Deferred | 0 | None | + +**Total impact:** ReceiptService was essential — it fixed the datetime bug AND eliminated the largest duplication case. + +## Re-analysis Results (Post-Refactor) + +Remaining duplications found: + +| Priority | Issue | Copies | Recommendation | +|----------|-------|--------|----------------| +| HIGH | validateCsrf() | 6 | CsrfValidator service | +| MEDIUM | isActive filter closure | 3 | Utility function | +| LOW | array_values(array_filter()) | 12+ | ArrayHelper | +| LOW | date instantiation pattern | 8+ | Monitor only | +| LOW | array_map('intval') | 4 | Monitor only | + +## Next Phase Readiness + +**Ready:** +- Core/Http/ established as location for shared utilities +- Pattern proven: static resolvers + traits work cleanly with existing architecture +- Re-analysis baseline documented for plan 68-02 + +**Concerns:** +- validateCsrf duplication is security-sensitive — should be next priority +- ToggleableRepositoryTrait uses `$this->pdo` — verify consistency across repos + +**Blockers:** None + +--- +*Phase: 68-code-deduplication-refactor, Plan: 01* +*Completed: 2026-04-03* diff --git a/.playwright-mcp/allegro-tracking-history.md b/.playwright-mcp/allegro-tracking-history.md new file mode 100644 index 0000000..49ad2e1 --- /dev/null +++ b/.playwright-mcp/allegro-tracking-history.md @@ -0,0 +1,939 @@ +- generic [ref=e1]: + - img + - generic [ref=e2]: + - link [ref=e684] [cursor=pointer]: + - /url: "#main-content" + - text: Przejdź do treści + - banner [ref=e32]: + - link [ref=e685] [cursor=pointer]: + - /url: / + - img [ref=e686] + - main [ref=e41]: + - generic [ref=e45]: + - heading [level=2] [ref=e687]: Śledź przesyłkę + - paragraph [ref=e47]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e48]: + - generic [ref=e49]: + - textbox [ref=e688]: + - /placeholder: Numer przesyłki + - text: A0046XFMG1 + - generic [ref=e51]: Numer przesyłki + - button [ref=e689] [cursor=pointer]: Śledź przesyłkę + - generic [ref=e56]: + - heading [level=6] [ref=e690]: Kurier przekazał przesyłkę do magazynu + - button [ref=e691] [cursor=pointer]: sprawdź historię przesyłki + - generic [ref=e63]: + - generic [ref=e66]: + - generic [ref=e73]: + - generic [ref=e76]: + - generic [ref=e77]: + - generic [ref=e79]: + - heading [level=6] [ref=e692]: Rankingi + - list [ref=e81]: + - listitem [ref=e82]: + - link [ref=e693] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - text: Ranking zestawów mebli łazienkowych + - listitem [ref=e84]: + - link [ref=e694] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - text: Ranking zestawów podynkowych WC + - listitem [ref=e86]: + - link [ref=e695] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - text: Ranking zestawów prysznicowych + - listitem [ref=e88]: + - link [ref=e696] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - text: Ranking zlewozmywaków + - listitem [ref=e90]: + - link [ref=e697] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - text: Ranking zlewów gospodarczych + - listitem [ref=e92]: + - link [ref=e698] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - text: Ranking zmiękczaczy wody + - generic [ref=e95]: + - heading [level=6] [ref=e699]: Ostatnio dodane + - list [ref=e97]: + - listitem [ref=e98]: + - link [ref=e700] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - text: Robert Lewandowski. Prawdziwy + - listitem [ref=e100]: + - link [ref=e701] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - text: Battlefield 6 PlayStation 5 + - listitem [ref=e102]: + - link [ref=e702] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - text: Ghost of yotei ps5 + - listitem [ref=e104]: + - link [ref=e703] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - text: Karty Pokemon TCG + - listitem [ref=e106]: + - link [ref=e704] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - text: Zestawy szachowe + - listitem [ref=e108]: + - link [ref=e705] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - text: Keyboard Yamaha + - generic [ref=e111]: + - heading [level=6] [ref=e706]: Dla najmłodszych + - list [ref=e113]: + - listitem [ref=e114]: + - link [ref=e707] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - text: Albik Globus + - listitem [ref=e116]: + - link [ref=e708] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - text: Czytaj z Albikiem - zestaw + - listitem [ref=e118]: + - link [ref=e709] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - text: Ciało człowieka Albik + - listitem [ref=e120]: + - link [ref=e710] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - text: Elementarz przedszkolaka Albik + - listitem [ref=e122]: + - link [ref=e711] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - text: Świat zwierząt + - listitem [ref=e124]: + - link [ref=e712] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - text: Pucio uczy się mówić + - generic [ref=e127]: + - heading [level=6] [ref=e713]: Wyjątkowe okazje + - list [ref=e129]: + - listitem [ref=e130]: + - link [ref=e714] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - text: Prezenty na Wielkanoc + - listitem [ref=e132]: + - link [ref=e715] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - text: Prezent na Wielkanoc dla dzieci + - listitem [ref=e134]: + - link [ref=e716] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - text: Ozdoby wielkanocne + - listitem [ref=e136]: + - link [ref=e717] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - text: Buty komunijne + - listitem [ref=e138]: + - link [ref=e718] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - text: LEGO Editions + - listitem [ref=e140]: + - link [ref=e719] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - text: Zaproszenia na komunię + - generic [ref=e142]: + - generic [ref=e144]: + - heading [level=6] [ref=e720]: Dom i Ogród + - list [ref=e146]: + - listitem [ref=e147]: + - link [ref=e721] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - text: Palma wielkanocna + - listitem [ref=e149]: + - link [ref=e722] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - text: Baranek wielkanocny + - listitem [ref=e151]: + - link [ref=e723] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - text: Świdośliwa lamarcka + - listitem [ref=e153]: + - link [ref=e724] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - text: Wiąz syberyjski + - listitem [ref=e155]: + - link [ref=e725] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - text: Tanie domki na działkę z montażem i transportem + - listitem [ref=e157]: + - link [ref=e726] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - text: Rekuperator + - listitem [ref=e159]: + - link [ref=e727] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - text: Agregat prądotwórczy + - listitem [ref=e161]: + - link [ref=e728] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - text: Toaletka z lustrem + - listitem [ref=e163]: + - link [ref=e729] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - text: Styropian 20 cm + - listitem [ref=e165]: + - link [ref=e730] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - text: Stroik wielkanocny na cmentarz + - listitem [ref=e167]: + - link [ref=e731] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - text: Stroiki wielkanocne na cmentarz + - listitem [ref=e169]: + - link [ref=e732] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - text: Pościel 160x200 + - listitem [ref=e171]: + - link [ref=e733] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - text: Ogrodzenie panelowe + - listitem [ref=e173]: + - link [ref=e734] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - text: Kostka brukowa + - listitem [ref=e175]: + - link [ref=e735] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - text: Odkurzacz piorący + - listitem [ref=e177]: + - link [ref=e736] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - text: Kartki wielkanocne + - listitem [ref=e179]: + - link [ref=e737] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - text: Filtry do wody na cały dom + - listitem [ref=e181]: + - link [ref=e738] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - text: Jutlandia meble ogrodowe + - listitem [ref=e183]: + - link [ref=e739] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - text: Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie + - generic [ref=e186]: + - heading [level=6] [ref=e740]: Moda + - list [ref=e188]: + - listitem [ref=e189]: + - link [ref=e741] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - text: Jan spekter + - listitem [ref=e191]: + - link [ref=e742] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - text: Kurtka wiosenna męska + - listitem [ref=e193]: + - link [ref=e743] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - text: Buty męskie + - listitem [ref=e195]: + - link [ref=e744] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - text: Eleganckie komplety damskie ze spodniami na wesele plus size + - listitem [ref=e197]: + - link [ref=e745] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - text: Sukienki wizytowe + - listitem [ref=e199]: + - link [ref=e746] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - text: Buty damskie na szeroką stopę i wysokie podbicie + - listitem [ref=e201]: + - link [ref=e747] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - text: Eleganckie komplety damskie ze spodniami na wesele + - listitem [ref=e203]: + - link [ref=e748] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - text: Sukienka na wesele dla 50 latki + - listitem [ref=e205]: + - link [ref=e749] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - text: New balance 9060 damskie + - listitem [ref=e207]: + - link [ref=e750] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - text: Asics novablast 5 + - listitem [ref=e209]: + - link [ref=e751] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - text: Buty trekkingowe męskie + - listitem [ref=e211]: + - link [ref=e752] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - text: Nike vomero 18 + - listitem [ref=e213]: + - link [ref=e753] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - text: Adidas gazelle damskie + - listitem [ref=e215]: + - link [ref=e754] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - text: New balance 327 damskie + - listitem [ref=e217]: + - link [ref=e755] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - text: Air force 1 damskie + - listitem [ref=e219]: + - link [ref=e756] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - text: Nike pegasus 41 + - listitem [ref=e221]: + - link [ref=e757] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - text: Nike v5 rnr + - listitem [ref=e223]: + - link [ref=e758] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - text: Buty na koturnie damskie + - listitem [ref=e225]: + - link [ref=e759] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - text: Elegancki komplet marynarka i spodnie + - generic [ref=e228]: + - heading [level=6] [ref=e760]: Elektronika + - list [ref=e230]: + - listitem [ref=e231]: + - link [ref=e761] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - text: Memory stick pro duo + - listitem [ref=e233]: + - link [ref=e762] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - text: Air fryer + - listitem [ref=e235]: + - link [ref=e763] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - text: Ekspres do kawy + - listitem [ref=e237]: + - link [ref=e764] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - text: Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi + - listitem [ref=e239]: + - link [ref=e765] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - text: Vivo x300 ultra + - listitem [ref=e241]: + - link [ref=e766] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - text: Sodastream + - listitem [ref=e243]: + - link [ref=e767] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - text: Odkurzacz bezprzewodowy + - listitem [ref=e245]: + - link [ref=e768] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - text: Iphone 16 pro max + - listitem [ref=e247]: + - link [ref=e769] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - text: Odkurzacz xiaomi vacuum cleaner g20 lite + - listitem [ref=e249]: + - link [ref=e770] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - text: Iphone 16 pro + - listitem [ref=e251]: + - link [ref=e771] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - text: Motorola edge 60 pro + - listitem [ref=e253]: + - link [ref=e772] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - text: Samsung s25 ultra + - listitem [ref=e255]: + - link [ref=e773] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - text: Oppo reno 15 pro + - listitem [ref=e257]: + - link [ref=e774] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - text: Iphone 16 + - listitem [ref=e259]: + - link [ref=e775] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - text: Realme 16 pro plus + - listitem [ref=e261]: + - link [ref=e776] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - text: Nintendo switch 2 + - listitem [ref=e263]: + - link [ref=e777] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - text: Iphone 15 pro + - listitem [ref=e265]: + - link [ref=e778] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - text: Oppo find x9 ultra + - listitem [ref=e267]: + - link [ref=e779] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - text: Motorola edge 50 pro + - generic [ref=e270]: + - heading [level=6] [ref=e780]: Motoryzacja + - list [ref=e272]: + - listitem [ref=e273]: + - link [ref=e781] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - text: Ursus c-330 + - listitem [ref=e275]: + - link [ref=e782] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - text: Bagażnik rowerowy na hak 2 rowery + - listitem [ref=e277]: + - link [ref=e783] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - text: Simparica na kleszcze + - listitem [ref=e279]: + - link [ref=e784] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - text: Bagażnik rowerowy na hak 4 rowery + - listitem [ref=e281]: + - link [ref=e785] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - text: Uchwyt na telefon do motocykla + - listitem [ref=e283]: + - link [ref=e786] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - text: Felgi aluminiowe 16 + - listitem [ref=e285]: + - link [ref=e787] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - text: Części samochodowe + - listitem [ref=e287]: + - link [ref=e788] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - text: Continental premiumcontact 7 + - listitem [ref=e289]: + - link [ref=e789] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - text: Części po vin + - listitem [ref=e291]: + - link [ref=e790] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - text: Mata dla psa do samochodu + - listitem [ref=e293]: + - link [ref=e791] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - text: Myjka ciśnieniowa z podgrzewaniem wody + - listitem [ref=e295]: + - link [ref=e792] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - text: Felgi aluminiowe 17 + - listitem [ref=e297]: + - link [ref=e793] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - text: Wosk platinum na rysy samochodowe + - listitem [ref=e299]: + - link [ref=e794] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - text: Kurtka motocyklowa damska + - listitem [ref=e301]: + - link [ref=e795] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - text: Rower dla 10 latki + - listitem [ref=e303]: + - link [ref=e796] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - text: Skuter elektryczny + - listitem [ref=e305]: + - link [ref=e797] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - text: Dpf control + - listitem [ref=e307]: + - link [ref=e798] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - text: Rust paint + - listitem [ref=e309]: + - link [ref=e799] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - text: Ceratec liqui moly + - generic [ref=e312]: + - heading [level=6] [ref=e800]: Dziecko + - list [ref=e314]: + - listitem [ref=e315]: + - link [ref=e801] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - text: Prezent na chrzest dla dziewczynki + - listitem [ref=e317]: + - link [ref=e802] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - text: Klocki magnetyczne + - listitem [ref=e319]: + - link [ref=e803] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - text: Chusta do noszenia dziecka + - listitem [ref=e321]: + - link [ref=e804] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - text: Ubranko do chrztu dla chłopca + - listitem [ref=e323]: + - link [ref=e805] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - text: Prezent dla 7 latki + - listitem [ref=e325]: + - link [ref=e806] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - text: Sukienka na chrzest dla dziewczynki + - listitem [ref=e327]: + - link [ref=e807] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - text: Torba do szpitala dla mamy i dziecka + - listitem [ref=e329]: + - link [ref=e808] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - text: Rowerek biegowy dla 2 latka + - listitem [ref=e331]: + - link [ref=e809] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - text: Needoh nice cube + - listitem [ref=e333]: + - link [ref=e810] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - text: Lego star wars + - listitem [ref=e335]: + - link [ref=e811] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - text: Zaproszenia na komunię dla dziewczynki + - listitem [ref=e337]: + - link [ref=e812] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - text: Plac zabaw dla dzieci + - listitem [ref=e339]: + - link [ref=e813] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - text: Stolik i krzesełka dla dzieci + - listitem [ref=e341]: + - link [ref=e814] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - text: Prezent dla 6 latki + - listitem [ref=e343]: + - link [ref=e815] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - text: Rower dla 6 latka + - listitem [ref=e345]: + - link [ref=e816] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - text: Prezent dla 9 latki + - listitem [ref=e347]: + - link [ref=e817] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - text: Pamiątka na komunię dla chłopca + - listitem [ref=e349]: + - link [ref=e818] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - text: Naklejki na sciane do pokoju dziecka + - listitem [ref=e351]: + - link [ref=e819] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - text: Prezent dla 8 latki + - generic [ref=e354]: + - heading [level=6] [ref=e820]: Kultura i rozrywka + - list [ref=e356]: + - listitem [ref=e357]: + - link [ref=e821] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - text: I have no mouth and i must scream + - listitem [ref=e359]: + - link [ref=e822] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - text: 21 dni by dziecko samo usiadło do lekcji + - listitem [ref=e361]: + - link [ref=e823] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - text: Gry na nintendo switch 2 + - listitem [ref=e363]: + - link [ref=e824] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - text: Ruletka + - listitem [ref=e365]: + - link [ref=e825] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - text: Karty pokemon + - listitem [ref=e367]: + - link [ref=e826] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - text: Call of duty ps5 + - listitem [ref=e369]: + - link [ref=e827] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - text: Kalendarz brań ryb + - listitem [ref=e371]: + - link [ref=e828] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - text: A dictionary of color combinations + - listitem [ref=e373]: + - link [ref=e829] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - text: Forza horizon 5 + - listitem [ref=e375]: + - link [ref=e830] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - text: Magic the gathering + - listitem [ref=e377]: + - link [ref=e831] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - text: Gry planszowe dla całej rodziny + - listitem [ref=e379]: + - link [ref=e832] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - text: Karta podarunkowa netflix 33 zł online + - listitem [ref=e381]: + - link [ref=e833] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - text: Wiewiórki które nie chciały się dzielić + - listitem [ref=e383]: + - link [ref=e834] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - text: Chłopaki nie płaczą chłopaki z okien skaczą + - listitem [ref=e385]: + - link [ref=e835] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - text: Gta san andreas + - listitem [ref=e387]: + - link [ref=e836] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - text: Dying light the beast ps5 + - listitem [ref=e389]: + - link [ref=e837] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - text: Ivermectin + - listitem [ref=e391]: + - link [ref=e838] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - text: Gra dla 4 latka + - listitem [ref=e393]: + - link [ref=e839] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - text: Gotowy by umrzeć gotowy by zabić + - button [ref=e840] [cursor=pointer]: Pokaż więcej + - generic [ref=e399]: + - generic [ref=e401]: + - generic [ref=e405]: + - heading [level=3] [ref=e841]: Allegro + - list [ref=e409]: + - listitem [ref=e410]: + - link [ref=e842] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - text: O nas + - list [ref=e414]: + - listitem [ref=e415]: + - link [ref=e843] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - text: Reklama + - listitem [ref=e417]: + - link [ref=e844] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - text: Allegro Ads + - listitem [ref=e419]: + - link [ref=e845] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - text: Allegro API + - listitem [ref=e421]: + - link [ref=e846] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - text: Praca w Allegro + - listitem [ref=e423]: + - link [ref=e847] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - text: Zrównoważony rozwój + - list [ref=e427]: + - listitem [ref=e428]: + - link [ref=e848] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - text: Mapa strony + - listitem [ref=e430]: + - link [ref=e849] [cursor=pointer]: + - /url: /rankingi + - text: Rankingi produktów + - listitem [ref=e432]: + - link [ref=e850] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - text: Informacja o realizacji strategii podatkowej + - list [ref=e436]: + - listitem [ref=e437]: + - link [ref=e851] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - text: Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych + - listitem [ref=e439]: + - link [ref=e852] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - text: Dodatkowe informacje o reklamie w Allegro i jej parametrach + - listitem [ref=e441]: + - link [ref=e853] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - text: Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym + - generic [ref=e446]: + - heading [level=3] [ref=e854]: Centrum pomocy + - list [ref=e450]: + - listitem [ref=e451]: + - link [ref=e855] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - text: Pomoc dla kupujących + - listitem [ref=e453]: + - link [ref=e856] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - text: Aktualności dla kupujących + - listitem [ref=e455]: + - link [ref=e857] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - text: Spytaj Społeczność + - list [ref=e459]: + - listitem [ref=e460]: + - link [ref=e858] [cursor=pointer]: + - /url: /dla-kupujacych + - text: Dla kupujących + - list [ref=e464]: + - listitem [ref=e465]: + - link [ref=e859] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - text: Pomoc dla sprzedających + - listitem [ref=e467]: + - link [ref=e860] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - text: Sprzedawaj na Allegro + - listitem [ref=e469]: + - link [ref=e861] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - text: Zwrot zakupu + - listitem [ref=e471]: + - link [ref=e862] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - text: Polityka prywatności mediów społecznościowych + - listitem [ref=e473]: + - link [ref=e863] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - text: Polityka plików "cookies" + - listitem [ref=e475]: + - link [ref=e864] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - text: Ustawienia plików "cookies" + - listitem [ref=e477]: + - link [ref=e865] [cursor=pointer]: + - /url: /regulamin + - text: Regulamin + - listitem [ref=e479]: + - link [ref=e866] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - text: Udostępnianie lokalizacji + - listitem [ref=e481]: + - link [ref=e867] [cursor=pointer]: + - /url: https://cert.allegro.com + - text: Bezpieczeństwo + - listitem [ref=e483]: + - link [ref=e868] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - text: Sprzedaż międzynarodowa + - listitem [ref=e485]: + - link [ref=e869] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - text: Informacja o dostępności usług + - generic [ref=e490]: + - heading [level=3] [ref=e870]: Serwisy + - list [ref=e494]: + - listitem [ref=e495]: + - link [ref=e871] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - text: Allegro Ochrona Kupujących + - list [ref=e499]: + - listitem [ref=e500]: + - link [ref=e872] [cursor=pointer]: + - /url: /akademia + - text: Akademia Allegro + - list [ref=e504]: + - listitem [ref=e505]: + - link [ref=e873] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - text: Allegro Analytics + - list [ref=e509]: + - listitem [ref=e510]: + - link [ref=e874] [cursor=pointer]: + - /url: /biznes + - text: Allegro Business + - list [ref=e514]: + - listitem [ref=e515]: + - link [ref=e875] [cursor=pointer]: + - /url: /zobacz/allegro-care + - text: Allegro Care + - list [ref=e519]: + - listitem [ref=e520]: + - link [ref=e876] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - text: Allegro Charytatywni + - list [ref=e524]: + - listitem [ref=e525]: + - link [ref=e877] [cursor=pointer]: + - /url: /artykuly + - text: Allegro Inspiruje + - list [ref=e529]: + - listitem [ref=e530]: + - link [ref=e878] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - text: Allegro Lokalnie + - list [ref=e534]: + - listitem [ref=e535]: + - link [ref=e879] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - text: Allegro Kapitał + - list [ref=e539]: + - listitem [ref=e540]: + - link [ref=e880] [cursor=pointer]: + - /url: /kampania/one + - text: Allegro One + - list [ref=e544]: + - listitem [ref=e545]: + - link [ref=e881] [cursor=pointer]: + - /url: /kampania/fulfillment + - text: Allegro One Fulfillment + - list [ref=e549]: + - listitem [ref=e550]: + - link [ref=e882] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - text: Allegro Pay + - list [ref=e554]: + - listitem [ref=e555]: + - link [ref=e883] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - text: Allegro Pay Business + - list [ref=e559]: + - listitem [ref=e560]: + - link [ref=e884] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - text: Allegro Klik + - list [ref=e564]: + - listitem [ref=e565]: + - link [ref=e885] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - text: Allegro Smart! + - list [ref=e569]: + - listitem [ref=e570]: + - link [ref=e886] [cursor=pointer]: + - /url: /karty-podarunkowe + - text: Karty podarunkowe Allegro + - list [ref=e574]: + - listitem [ref=e575]: + - link [ref=e887] [cursor=pointer]: + - /url: /kampania/monety + - text: Monety Allegro + - list [ref=e579]: + - listitem [ref=e580]: + - link [ref=e888] [cursor=pointer]: + - /url: /strefamarek + - text: Strefa marek + - generic [ref=e585]: + - generic [ref=e588]: + - heading [level=3] [ref=e889]: Ustawienia wyświetlania + - generic [ref=e591]: + - img [ref=e592] + - generic [ref=e593]: "wygląd:" + - link [ref=e890] [cursor=pointer]: + - /url: "#display-theme" + - text: motyw jasny + - generic [ref=e597]: + - heading [level=3] [ref=e891]: Ustawienia lokalizacji + - list [ref=e600]: + - listitem [ref=e601]: + - text: Kraj + - button [ref=e892] [cursor=pointer]: Polska + - listitem [ref=e603]: + - text: Kraj dostawy + - button [ref=e893] [cursor=pointer]: Polska + - listitem [ref=e605]: + - text: Język + - button [ref=e894] [cursor=pointer]: polski + - listitem [ref=e607]: + - text: Waluta + - button [ref=e895] [cursor=pointer]: PLN + - generic [ref=e613]: + - generic [ref=e617]: + - link [ref=e896] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img [ref=e897] + - link [ref=e898] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img [ref=e899] + - link [ref=e900] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img [ref=e901] + - generic [ref=e627]: + - link [ref=e902] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img [ref=e903] + - link [ref=e904] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img [ref=e905] + - link [ref=e906] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img [ref=e907] + - link [ref=e908] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img [ref=e909] + - link [ref=e910] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img [ref=e911] + - link [ref=e912] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img [ref=e913] + - generic [ref=e642]: + - img [ref=e914] + - generic [ref=e654]: + - paragraph [ref=e657]: Serwisy Grupy Allegro + - generic [ref=e659]: + - list [ref=e663]: + - listitem [ref=e664]: + - link [ref=e915] [cursor=pointer]: + - /url: https://allegro.cz/ + - text: Allegro.cz + - list [ref=e669]: + - listitem [ref=e670]: + - link [ref=e916] [cursor=pointer]: + - /url: https://allegro.sk/ + - text: Allegro.sk + - list [ref=e675]: + - listitem [ref=e676]: + - link [ref=e917] [cursor=pointer]: + - /url: https://allegro.hu/ + - text: Allegro.hu + - list [ref=e681]: + - listitem [ref=e682]: + - link [ref=e918] [cursor=pointer]: + - /url: https://onedelivery.cz/ + - text: Onedelivery.cz + - dialog [ref=e919]: + - generic "Historia przesyłki" [ref=e921]: + - generic [ref=e922]: + - button "zamknij" [active] [ref=e923] [cursor=pointer]: + - img [ref=e924] + - generic [ref=e925]: + - heading "Historia przesyłki" [level=3] [ref=e926] + - list [ref=e927]: + - listitem [ref=e928]: + - generic [ref=e929]: + - time [ref=e930]: 3 kwi 2026, 17:24 + - generic [ref=e931]: Kurier przekazał przesyłkę do magazynu + - separator [ref=e932] + - listitem [ref=e933]: + - generic [ref=e934]: + - time [ref=e935]: 3 kwi 2026, 15:49 + - generic [ref=e936]: Przesyłka została odebrana przez kuriera + - separator [ref=e937] + - listitem [ref=e938]: + - generic [ref=e939]: + - time [ref=e940]: 3 kwi 2026, 15:47 + - generic [ref=e941]: Przesyłka została podjęta z punktu przez kuriera + - separator [ref=e942] + - listitem [ref=e943]: + - generic [ref=e944]: + - time [ref=e945]: 3 kwi 2026, 15:08 + - generic [ref=e946]: Przesyłka została nadana + - separator [ref=e947] + - listitem [ref=e948]: + - generic [ref=e949]: + - time [ref=e950]: 3 kwi 2026, 10:50 + - generic [ref=e951]: Przesyłka została przygotowana przez nadawcę + - separator [ref=e952] + - button "Zamknij" [ref=e954] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/allegro-tracking.md b/.playwright-mcp/allegro-tracking.md new file mode 100644 index 0000000..87da211 --- /dev/null +++ b/.playwright-mcp/allegro-tracking.md @@ -0,0 +1,714 @@ +- generic [active] [ref=e1]: + - img + - generic [ref=e2]: + - link "Przejdź do treści" [ref=e30] [cursor=pointer]: + - /url: "#main-content" + - banner [ref=e32]: + - link "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e36] [cursor=pointer]: + - /url: / + - img "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e37] + - main [ref=e41]: + - generic [ref=e45]: + - heading "Śledź przesyłkę" [level=2] [ref=e46] + - paragraph [ref=e47]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e48]: + - generic [ref=e49]: + - textbox "Numer przesyłki" [ref=e50]: A0046XFMG1 + - generic [ref=e51]: Numer przesyłki + - button "Śledź przesyłkę" [ref=e52] [cursor=pointer] + - generic [ref=e56]: + - heading "Kurier przekazał przesyłkę do magazynu" [level=6] [ref=e58] + - button "sprawdź historię przesyłki" [ref=e60] [cursor=pointer] + - generic [ref=e63]: + - generic [ref=e66]: + - generic [ref=e73]: + - generic [ref=e76]: + - generic [ref=e77]: + - generic [ref=e79]: + - heading "Rankingi" [level=6] [ref=e80] + - list [ref=e81]: + - listitem [ref=e82]: + - link "Ranking zestawów mebli łazienkowych" [ref=e83] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - listitem [ref=e84]: + - link "Ranking zestawów podynkowych WC" [ref=e85] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - listitem [ref=e86]: + - link "Ranking zestawów prysznicowych" [ref=e87] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - listitem [ref=e88]: + - link "Ranking zlewozmywaków" [ref=e89] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - listitem [ref=e90]: + - link "Ranking zlewów gospodarczych" [ref=e91] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - listitem [ref=e92]: + - link "Ranking zmiękczaczy wody" [ref=e93] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - generic [ref=e95]: + - heading "Ostatnio dodane" [level=6] [ref=e96] + - list [ref=e97]: + - listitem [ref=e98]: + - link "Robert Lewandowski. Prawdziwy" [ref=e99] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - listitem [ref=e100]: + - link "Battlefield 6 PlayStation 5" [ref=e101] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - listitem [ref=e102]: + - link "Ghost of yotei ps5" [ref=e103] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - listitem [ref=e104]: + - link "Karty Pokemon TCG" [ref=e105] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e106]: + - link "Zestawy szachowe" [ref=e107] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - listitem [ref=e108]: + - link "Keyboard Yamaha" [ref=e109] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - generic [ref=e111]: + - heading "Dla najmłodszych" [level=6] [ref=e112] + - list [ref=e113]: + - listitem [ref=e114]: + - link "Albik Globus" [ref=e115] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - listitem [ref=e116]: + - link "Czytaj z Albikiem - zestaw" [ref=e117] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - listitem [ref=e118]: + - link "Ciało człowieka Albik" [ref=e119] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - listitem [ref=e120]: + - link "Elementarz przedszkolaka Albik" [ref=e121] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - listitem [ref=e122]: + - link "Świat zwierząt" [ref=e123] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - listitem [ref=e124]: + - link "Pucio uczy się mówić" [ref=e125] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - generic [ref=e127]: + - heading "Wyjątkowe okazje" [level=6] [ref=e128] + - list [ref=e129]: + - listitem [ref=e130]: + - link "Prezenty na Wielkanoc" [ref=e131] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - listitem [ref=e132]: + - link "Prezent na Wielkanoc dla dzieci" [ref=e133] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - listitem [ref=e134]: + - link "Ozdoby wielkanocne" [ref=e135] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - listitem [ref=e136]: + - link "Buty komunijne" [ref=e137] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - listitem [ref=e138]: + - link "LEGO Editions" [ref=e139] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - listitem [ref=e140]: + - link "Zaproszenia na komunię" [ref=e141] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - generic [ref=e142]: + - generic [ref=e144]: + - heading "Dom i Ogród" [level=6] [ref=e145] + - list [ref=e146]: + - listitem [ref=e147]: + - link "Palma wielkanocna" [ref=e148] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - listitem [ref=e149]: + - link "Baranek wielkanocny" [ref=e150] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - listitem [ref=e151]: + - link "Świdośliwa lamarcka" [ref=e152] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - listitem [ref=e153]: + - link "Wiąz syberyjski" [ref=e154] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - listitem [ref=e155]: + - link "Tanie domki na działkę z montażem i transportem" [ref=e156] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - listitem [ref=e157]: + - link "Rekuperator" [ref=e158] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - listitem [ref=e159]: + - link "Agregat prądotwórczy" [ref=e160] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - listitem [ref=e161]: + - link "Toaletka z lustrem" [ref=e162] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - listitem [ref=e163]: + - link "Styropian 20 cm" [ref=e164] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - listitem [ref=e165]: + - link "Stroik wielkanocny na cmentarz" [ref=e166] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - listitem [ref=e167]: + - link "Stroiki wielkanocne na cmentarz" [ref=e168] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - listitem [ref=e169]: + - link "Pościel 160x200" [ref=e170] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - listitem [ref=e171]: + - link "Ogrodzenie panelowe" [ref=e172] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - listitem [ref=e173]: + - link "Kostka brukowa" [ref=e174] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - listitem [ref=e175]: + - link "Odkurzacz piorący" [ref=e176] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - listitem [ref=e177]: + - link "Kartki wielkanocne" [ref=e178] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - listitem [ref=e179]: + - link "Filtry do wody na cały dom" [ref=e180] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - listitem [ref=e181]: + - link "Jutlandia meble ogrodowe" [ref=e182] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - listitem [ref=e183]: + - link "Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie" [ref=e184] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - generic [ref=e186]: + - heading "Moda" [level=6] [ref=e187] + - list [ref=e188]: + - listitem [ref=e189]: + - link "Jan spekter" [ref=e190] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - listitem [ref=e191]: + - link "Kurtka wiosenna męska" [ref=e192] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - listitem [ref=e193]: + - link "Buty męskie" [ref=e194] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - listitem [ref=e195]: + - link "Eleganckie komplety damskie ze spodniami na wesele plus size" [ref=e196] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - listitem [ref=e197]: + - link "Sukienki wizytowe" [ref=e198] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - listitem [ref=e199]: + - link "Buty damskie na szeroką stopę i wysokie podbicie" [ref=e200] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - listitem [ref=e201]: + - link "Eleganckie komplety damskie ze spodniami na wesele" [ref=e202] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - listitem [ref=e203]: + - link "Sukienka na wesele dla 50 latki" [ref=e204] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - listitem [ref=e205]: + - link "New balance 9060 damskie" [ref=e206] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - listitem [ref=e207]: + - link "Asics novablast 5" [ref=e208] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - listitem [ref=e209]: + - link "Buty trekkingowe męskie" [ref=e210] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - listitem [ref=e211]: + - link "Nike vomero 18" [ref=e212] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - listitem [ref=e213]: + - link "Adidas gazelle damskie" [ref=e214] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - listitem [ref=e215]: + - link "New balance 327 damskie" [ref=e216] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - listitem [ref=e217]: + - link "Air force 1 damskie" [ref=e218] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - listitem [ref=e219]: + - link "Nike pegasus 41" [ref=e220] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - listitem [ref=e221]: + - link "Nike v5 rnr" [ref=e222] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - listitem [ref=e223]: + - link "Buty na koturnie damskie" [ref=e224] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - listitem [ref=e225]: + - link "Elegancki komplet marynarka i spodnie" [ref=e226] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - generic [ref=e228]: + - heading "Elektronika" [level=6] [ref=e229] + - list [ref=e230]: + - listitem [ref=e231]: + - link "Memory stick pro duo" [ref=e232] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - listitem [ref=e233]: + - link "Air fryer" [ref=e234] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - listitem [ref=e235]: + - link "Ekspres do kawy" [ref=e236] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - listitem [ref=e237]: + - link "Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi" [ref=e238] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - listitem [ref=e239]: + - link "Vivo x300 ultra" [ref=e240] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - listitem [ref=e241]: + - link "Sodastream" [ref=e242] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - listitem [ref=e243]: + - link "Odkurzacz bezprzewodowy" [ref=e244] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - listitem [ref=e245]: + - link "Iphone 16 pro max" [ref=e246] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - listitem [ref=e247]: + - link "Odkurzacz xiaomi vacuum cleaner g20 lite" [ref=e248] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - listitem [ref=e249]: + - link "Iphone 16 pro" [ref=e250] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - listitem [ref=e251]: + - link "Motorola edge 60 pro" [ref=e252] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - listitem [ref=e253]: + - link "Samsung s25 ultra" [ref=e254] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - listitem [ref=e255]: + - link "Oppo reno 15 pro" [ref=e256] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - listitem [ref=e257]: + - link "Iphone 16" [ref=e258] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - listitem [ref=e259]: + - link "Realme 16 pro plus" [ref=e260] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - listitem [ref=e261]: + - link "Nintendo switch 2" [ref=e262] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - listitem [ref=e263]: + - link "Iphone 15 pro" [ref=e264] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - listitem [ref=e265]: + - link "Oppo find x9 ultra" [ref=e266] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - listitem [ref=e267]: + - link "Motorola edge 50 pro" [ref=e268] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - generic [ref=e270]: + - heading "Motoryzacja" [level=6] [ref=e271] + - list [ref=e272]: + - listitem [ref=e273]: + - link "Ursus c-330" [ref=e274] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - listitem [ref=e275]: + - link "Bagażnik rowerowy na hak 2 rowery" [ref=e276] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - listitem [ref=e277]: + - link "Simparica na kleszcze" [ref=e278] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - listitem [ref=e279]: + - link "Bagażnik rowerowy na hak 4 rowery" [ref=e280] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - listitem [ref=e281]: + - link "Uchwyt na telefon do motocykla" [ref=e282] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - listitem [ref=e283]: + - link "Felgi aluminiowe 16" [ref=e284] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - listitem [ref=e285]: + - link "Części samochodowe" [ref=e286] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - listitem [ref=e287]: + - link "Continental premiumcontact 7" [ref=e288] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - listitem [ref=e289]: + - link "Części po vin" [ref=e290] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - listitem [ref=e291]: + - link "Mata dla psa do samochodu" [ref=e292] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - listitem [ref=e293]: + - link "Myjka ciśnieniowa z podgrzewaniem wody" [ref=e294] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - listitem [ref=e295]: + - link "Felgi aluminiowe 17" [ref=e296] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - listitem [ref=e297]: + - link "Wosk platinum na rysy samochodowe" [ref=e298] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - listitem [ref=e299]: + - link "Kurtka motocyklowa damska" [ref=e300] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - listitem [ref=e301]: + - link "Rower dla 10 latki" [ref=e302] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - listitem [ref=e303]: + - link "Skuter elektryczny" [ref=e304] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - listitem [ref=e305]: + - link "Dpf control" [ref=e306] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - listitem [ref=e307]: + - link "Rust paint" [ref=e308] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - listitem [ref=e309]: + - link "Ceratec liqui moly" [ref=e310] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - generic [ref=e312]: + - heading "Dziecko" [level=6] [ref=e313] + - list [ref=e314]: + - listitem [ref=e315]: + - link "Prezent na chrzest dla dziewczynki" [ref=e316] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - listitem [ref=e317]: + - link "Klocki magnetyczne" [ref=e318] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - listitem [ref=e319]: + - link "Chusta do noszenia dziecka" [ref=e320] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - listitem [ref=e321]: + - link "Ubranko do chrztu dla chłopca" [ref=e322] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - listitem [ref=e323]: + - link "Prezent dla 7 latki" [ref=e324] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - listitem [ref=e325]: + - link "Sukienka na chrzest dla dziewczynki" [ref=e326] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - listitem [ref=e327]: + - link "Torba do szpitala dla mamy i dziecka" [ref=e328] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - listitem [ref=e329]: + - link "Rowerek biegowy dla 2 latka" [ref=e330] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - listitem [ref=e331]: + - link "Needoh nice cube" [ref=e332] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - listitem [ref=e333]: + - link "Lego star wars" [ref=e334] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - listitem [ref=e335]: + - link "Zaproszenia na komunię dla dziewczynki" [ref=e336] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - listitem [ref=e337]: + - link "Plac zabaw dla dzieci" [ref=e338] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - listitem [ref=e339]: + - link "Stolik i krzesełka dla dzieci" [ref=e340] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - listitem [ref=e341]: + - link "Prezent dla 6 latki" [ref=e342] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - listitem [ref=e343]: + - link "Rower dla 6 latka" [ref=e344] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - listitem [ref=e345]: + - link "Prezent dla 9 latki" [ref=e346] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - listitem [ref=e347]: + - link "Pamiątka na komunię dla chłopca" [ref=e348] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - listitem [ref=e349]: + - link "Naklejki na sciane do pokoju dziecka" [ref=e350] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - listitem [ref=e351]: + - link "Prezent dla 8 latki" [ref=e352] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - generic [ref=e354]: + - heading "Kultura i rozrywka" [level=6] [ref=e355] + - list [ref=e356]: + - listitem [ref=e357]: + - link "I have no mouth and i must scream" [ref=e358] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - listitem [ref=e359]: + - link "21 dni by dziecko samo usiadło do lekcji" [ref=e360] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - listitem [ref=e361]: + - link "Gry na nintendo switch 2" [ref=e362] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - listitem [ref=e363]: + - link "Ruletka" [ref=e364] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - listitem [ref=e365]: + - link "Karty pokemon" [ref=e366] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e367]: + - link "Call of duty ps5" [ref=e368] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - listitem [ref=e369]: + - link "Kalendarz brań ryb" [ref=e370] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - listitem [ref=e371]: + - link "A dictionary of color combinations" [ref=e372] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - listitem [ref=e373]: + - link "Forza horizon 5" [ref=e374] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - listitem [ref=e375]: + - link "Magic the gathering" [ref=e376] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - listitem [ref=e377]: + - link "Gry planszowe dla całej rodziny" [ref=e378] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - listitem [ref=e379]: + - link "Karta podarunkowa netflix 33 zł online" [ref=e380] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - listitem [ref=e381]: + - link "Wiewiórki które nie chciały się dzielić" [ref=e382] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - listitem [ref=e383]: + - link "Chłopaki nie płaczą chłopaki z okien skaczą" [ref=e384] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - listitem [ref=e385]: + - link "Gta san andreas" [ref=e386] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - listitem [ref=e387]: + - link "Dying light the beast ps5" [ref=e388] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - listitem [ref=e389]: + - link "Ivermectin" [ref=e390] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - listitem [ref=e391]: + - link "Gra dla 4 latka" [ref=e392] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - listitem [ref=e393]: + - link "Gotowy by umrzeć gotowy by zabić" [ref=e394] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - button "Pokaż więcej" [ref=e396] [cursor=pointer] + - generic [ref=e399]: + - generic [ref=e401]: + - generic [ref=e405]: + - heading "Allegro" [level=3] [ref=e406] + - list [ref=e409]: + - listitem [ref=e410]: + - link "O nas" [ref=e411] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - list [ref=e414]: + - listitem [ref=e415]: + - link "Reklama" [ref=e416] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - listitem [ref=e417]: + - link "Allegro Ads" [ref=e418] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - listitem [ref=e419]: + - link "Allegro API" [ref=e420] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - listitem [ref=e421]: + - link "Praca w Allegro" [ref=e422] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - listitem [ref=e423]: + - link "Zrównoważony rozwój" [ref=e424] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - list [ref=e427]: + - listitem [ref=e428]: + - link "Mapa strony" [ref=e429] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - listitem [ref=e430]: + - link "Rankingi produktów" [ref=e431] [cursor=pointer]: + - /url: /rankingi + - listitem [ref=e432]: + - link "Informacja o realizacji strategii podatkowej" [ref=e433] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - list [ref=e436]: + - listitem [ref=e437]: + - link "Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych" [ref=e438] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - listitem [ref=e439]: + - link "Dodatkowe informacje o reklamie w Allegro i jej parametrach" [ref=e440] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - listitem [ref=e441]: + - link "Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym" [ref=e442] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - generic [ref=e446]: + - heading "Centrum pomocy" [level=3] [ref=e447] + - list [ref=e450]: + - listitem [ref=e451]: + - link "Pomoc dla kupujących" [ref=e452] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - listitem [ref=e453]: + - link "Aktualności dla kupujących" [ref=e454] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - listitem [ref=e455]: + - link "Spytaj Społeczność" [ref=e456] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - list [ref=e459]: + - listitem [ref=e460]: + - link "Dla kupujących" [ref=e461] [cursor=pointer]: + - /url: /dla-kupujacych + - list [ref=e464]: + - listitem [ref=e465]: + - link "Pomoc dla sprzedających" [ref=e466] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - listitem [ref=e467]: + - link "Sprzedawaj na Allegro" [ref=e468] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - listitem [ref=e469]: + - link "Zwrot zakupu" [ref=e470] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - listitem [ref=e471]: + - link "Polityka prywatności mediów społecznościowych" [ref=e472] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - listitem [ref=e473]: + - link "Polityka plików \"cookies\"" [ref=e474] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - listitem [ref=e475]: + - link "Ustawienia plików \"cookies\"" [ref=e476] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - listitem [ref=e477]: + - link "Regulamin" [ref=e478] [cursor=pointer]: + - /url: /regulamin + - listitem [ref=e479]: + - link "Udostępnianie lokalizacji" [ref=e480] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - listitem [ref=e481]: + - link "Bezpieczeństwo" [ref=e482] [cursor=pointer]: + - /url: https://cert.allegro.com + - listitem [ref=e483]: + - link "Sprzedaż międzynarodowa" [ref=e484] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - listitem [ref=e485]: + - link "Informacja o dostępności usług" [ref=e486] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - generic [ref=e490]: + - heading "Serwisy" [level=3] [ref=e491] + - list [ref=e494]: + - listitem [ref=e495]: + - link "Allegro Ochrona Kupujących" [ref=e496] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - list [ref=e499]: + - listitem [ref=e500]: + - link "Akademia Allegro" [ref=e501] [cursor=pointer]: + - /url: /akademia + - list [ref=e504]: + - listitem [ref=e505]: + - link "Allegro Analytics" [ref=e506] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - list [ref=e509]: + - listitem [ref=e510]: + - link "Allegro Business" [ref=e511] [cursor=pointer]: + - /url: /biznes + - list [ref=e514]: + - listitem [ref=e515]: + - link "Allegro Care" [ref=e516] [cursor=pointer]: + - /url: /zobacz/allegro-care + - list [ref=e519]: + - listitem [ref=e520]: + - link "Allegro Charytatywni" [ref=e521] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - list [ref=e524]: + - listitem [ref=e525]: + - link "Allegro Inspiruje" [ref=e526] [cursor=pointer]: + - /url: /artykuly + - list [ref=e529]: + - listitem [ref=e530]: + - link "Allegro Lokalnie" [ref=e531] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - list [ref=e534]: + - listitem [ref=e535]: + - link "Allegro Kapitał" [ref=e536] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - list [ref=e539]: + - listitem [ref=e540]: + - link "Allegro One" [ref=e541] [cursor=pointer]: + - /url: /kampania/one + - list [ref=e544]: + - listitem [ref=e545]: + - link "Allegro One Fulfillment" [ref=e546] [cursor=pointer]: + - /url: /kampania/fulfillment + - list [ref=e549]: + - listitem [ref=e550]: + - link "Allegro Pay" [ref=e551] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - list [ref=e554]: + - listitem [ref=e555]: + - link "Allegro Pay Business" [ref=e556] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - list [ref=e559]: + - listitem [ref=e560]: + - link "Allegro Klik" [ref=e561] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - list [ref=e564]: + - listitem [ref=e565]: + - link "Allegro Smart!" [ref=e566] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - list [ref=e569]: + - listitem [ref=e570]: + - link "Karty podarunkowe Allegro" [ref=e571] [cursor=pointer]: + - /url: /karty-podarunkowe + - list [ref=e574]: + - listitem [ref=e575]: + - link "Monety Allegro" [ref=e576] [cursor=pointer]: + - /url: /kampania/monety + - list [ref=e579]: + - listitem [ref=e580]: + - link "Strefa marek" [ref=e581] [cursor=pointer]: + - /url: /strefamarek + - generic [ref=e585]: + - generic [ref=e588]: + - heading "Ustawienia wyświetlania" [level=3] [ref=e589] + - generic [ref=e591]: + - img [ref=e592] + - generic [ref=e593]: "wygląd:" + - link "motyw jasny" [ref=e594] [cursor=pointer]: + - /url: "#display-theme" + - generic [ref=e597]: + - heading "Ustawienia lokalizacji" [level=3] [ref=e598] + - list [ref=e600]: + - listitem [ref=e601]: + - text: Kraj + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e602] [cursor=pointer]: Polska + - listitem [ref=e603]: + - text: Kraj dostawy + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e604] [cursor=pointer]: Polska + - listitem [ref=e605]: + - text: Język + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e606] [cursor=pointer]: polski + - listitem [ref=e607]: + - text: Waluta + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e608] [cursor=pointer]: PLN + - generic [ref=e613]: + - generic [ref=e617]: + - link "AppStore" [ref=e618] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img "AppStore" [ref=e619] + - link "PlayStore" [ref=e620] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img "GooglePlay" [ref=e621] + - link "AppGallery" [ref=e622] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img "AppGallery" [ref=e623] + - generic [ref=e627]: + - link "Podziel się na Facebook" [ref=e628] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img "Facebook" [ref=e629] + - link "Podziel się na LinkedIn" [ref=e630] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img "LinkedIn" [ref=e631] + - link "Instagram" [ref=e632] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img "Instagram" [ref=e633] + - link "Podziel się na Pinterest" [ref=e634] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img "Pinterest" [ref=e635] + - link "YouTube" [ref=e636] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img "YouTube" [ref=e637] + - link "Charytatywni Allegro" [ref=e638] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img "Charytatywni Allegro" [ref=e639] + - generic [ref=e642]: + - img "Allegro" [ref=e651] + - generic [ref=e654]: + - paragraph [ref=e657]: Serwisy Grupy Allegro + - generic [ref=e659]: + - list [ref=e663]: + - listitem [ref=e664]: + - link "Allegro.cz" [ref=e665] [cursor=pointer]: + - /url: https://allegro.cz/ + - list [ref=e669]: + - listitem [ref=e670]: + - link "Allegro.sk" [ref=e671] [cursor=pointer]: + - /url: https://allegro.sk/ + - list [ref=e675]: + - listitem [ref=e676]: + - link "Allegro.hu" [ref=e677] [cursor=pointer]: + - /url: https://allegro.hu/ + - list [ref=e681]: + - listitem [ref=e682]: + - link "Onedelivery.cz" [ref=e683] [cursor=pointer]: + - /url: https://onedelivery.cz/ \ No newline at end of file diff --git a/.playwright-mcp/console-2026-04-03T18-30-12-509Z.log b/.playwright-mcp/console-2026-04-03T18-30-12-509Z.log new file mode 100644 index 0000000..4bd518d --- /dev/null +++ b/.playwright-mcp/console-2026-04-03T18-30-12-509Z.log @@ -0,0 +1,4 @@ +[ 110ms] [ERROR] Failed to load resource: the server responded with a status of 403 () @ https://allegro.pl/allegrodelivery/sledzenie-paczki?numer=A0046XFMG1:0 +[ 33316ms] [INFO] %c WP Info %c WPJSlib ES6 2.5.668 gosync (2026-04-02 16:44:30) font-size:12px;background:blue;color:white;padding:2px;border-radius:3px;margin-right:3px; font-size:12px; @ https://std.wpcdn.pl/wpjslib6/wpjslib-gosync.js:0 +[ 80455ms] [ERROR] Access to fetch at 'https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1' from origin 'https://allegro.pl' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. @ https://allegro.pl/allegrodelivery/sledzenie-paczki?numer=A0046XFMG1&dd_referrer=:0 +[ 80456ms] [ERROR] Failed to load resource: net::ERR_FAILED @ https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1:0 diff --git a/.playwright-mcp/console-2026-04-03T18-31-36-818Z.log b/.playwright-mcp/console-2026-04-03T18-31-36-818Z.log new file mode 100644 index 0000000..124b7b8 --- /dev/null +++ b/.playwright-mcp/console-2026-04-03T18-31-36-818Z.log @@ -0,0 +1,3 @@ +[ 41ms] [ERROR] Failed to load resource: the server responded with a status of 406 () @ https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1:0 +[ 84ms] [ERROR] Failed to load resource: the server responded with a status of 404 () @ https://edge.allegro.pl/favicon.ico:0 +[ 9549ms] [ERROR] Failed to load resource: the server responded with a status of 406 () @ https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1:0 diff --git a/.playwright-mcp/console-2026-04-03T18-31-57-928Z.log b/.playwright-mcp/console-2026-04-03T18-31-57-928Z.log new file mode 100644 index 0000000..b16721c --- /dev/null +++ b/.playwright-mcp/console-2026-04-03T18-31-57-928Z.log @@ -0,0 +1,8 @@ +[ 375ms] [ERROR] Failed to load resource: net::ERR_NAME_NOT_RESOLVED @ https://mr.ceneo.pl/v1/cross_domain/id:0 +[ 453ms] [ERROR] Failed to load resource: net::ERR_CERT_AUTHORITY_INVALID @ https://mr.ebilet.pl/v1/cross_domain/id:0 +[ 1316ms] [INFO] %c WP Info %c WPJSlib ES6 2.5.668 gosync (2026-04-02 16:44:30) font-size:12px;background:blue;color:white;padding:2px;border-radius:3px;margin-right:3px; font-size:12px; @ https://std.wpcdn.pl/wpjslib6/wpjslib-gosync.js:0 +[ 12247ms] [ERROR] Access to XMLHttpRequest at 'https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1' from origin 'https://allegro.pl' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute. @ https://allegro.pl/allegrodelivery/sledzenie-paczki?numer=A0046XFMG1:0 +[ 12247ms] [ERROR] Failed to load resource: net::ERR_FAILED @ https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1:0 +[ 16863ms] [ERROR] Access to fetch at 'https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1' from origin 'https://allegro.pl' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. @ https://allegro.pl/allegrodelivery/sledzenie-paczki?numer=A0046XFMG1:0 +[ 16863ms] [ERROR] Failed to load resource: net::ERR_FAILED @ https://edge.allegro.pl/ad/tracking?packageNo=A0046XFMG1:0 +[ 27685ms] [INFO] %c WP Info %c WPJSlib ES6 2.5.668 gosync (2026-04-02 16:44:30) font-size:12px;background:blue;color:white;padding:2px;border-radius:3px;margin-right:3px; font-size:12px; @ https://std.wpcdn.pl/wpjslib6/wpjslib-gosync.js:0 diff --git a/.playwright-mcp/console-2026-04-03T18-43-05-808Z.log b/.playwright-mcp/console-2026-04-03T18-43-05-808Z.log new file mode 100644 index 0000000..0ab30b7 --- /dev/null +++ b/.playwright-mcp/console-2026-04-03T18-43-05-808Z.log @@ -0,0 +1,2 @@ +[ 916ms] [INFO] %c WP Info %c WPJSlib ES6 2.5.668 gosync (2026-04-02 16:44:30) font-size:12px;background:blue;color:white;padding:2px;border-radius:3px;margin-right:3px; font-size:12px; @ https://std.wpcdn.pl/wpjslib6/wpjslib-gosync.js:0 +[ 7912ms] [INFO] %c WP Info %c WPJSlib ES6 2.5.668 gosync (2026-04-02 16:44:30) font-size:12px;background:blue;color:white;padding:2px;border-radius:3px;margin-right:3px; font-size:12px; @ https://std.wpcdn.pl/wpjslib6/wpjslib-gosync.js:0 diff --git a/.playwright-mcp/page-2026-04-03T18-30-13-306Z.yml b/.playwright-mcp/page-2026-04-03T18-30-13-306Z.yml new file mode 100644 index 0000000..fc947a5 --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-30-13-306Z.yml @@ -0,0 +1,2 @@ +- iframe [ref=e2]: + \ No newline at end of file diff --git a/.playwright-mcp/page-2026-04-03T18-30-46-661Z.yml b/.playwright-mcp/page-2026-04-03T18-30-46-661Z.yml new file mode 100644 index 0000000..87da211 --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-30-46-661Z.yml @@ -0,0 +1,714 @@ +- generic [active] [ref=e1]: + - img + - generic [ref=e2]: + - link "Przejdź do treści" [ref=e30] [cursor=pointer]: + - /url: "#main-content" + - banner [ref=e32]: + - link "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e36] [cursor=pointer]: + - /url: / + - img "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e37] + - main [ref=e41]: + - generic [ref=e45]: + - heading "Śledź przesyłkę" [level=2] [ref=e46] + - paragraph [ref=e47]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e48]: + - generic [ref=e49]: + - textbox "Numer przesyłki" [ref=e50]: A0046XFMG1 + - generic [ref=e51]: Numer przesyłki + - button "Śledź przesyłkę" [ref=e52] [cursor=pointer] + - generic [ref=e56]: + - heading "Kurier przekazał przesyłkę do magazynu" [level=6] [ref=e58] + - button "sprawdź historię przesyłki" [ref=e60] [cursor=pointer] + - generic [ref=e63]: + - generic [ref=e66]: + - generic [ref=e73]: + - generic [ref=e76]: + - generic [ref=e77]: + - generic [ref=e79]: + - heading "Rankingi" [level=6] [ref=e80] + - list [ref=e81]: + - listitem [ref=e82]: + - link "Ranking zestawów mebli łazienkowych" [ref=e83] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - listitem [ref=e84]: + - link "Ranking zestawów podynkowych WC" [ref=e85] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - listitem [ref=e86]: + - link "Ranking zestawów prysznicowych" [ref=e87] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - listitem [ref=e88]: + - link "Ranking zlewozmywaków" [ref=e89] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - listitem [ref=e90]: + - link "Ranking zlewów gospodarczych" [ref=e91] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - listitem [ref=e92]: + - link "Ranking zmiękczaczy wody" [ref=e93] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - generic [ref=e95]: + - heading "Ostatnio dodane" [level=6] [ref=e96] + - list [ref=e97]: + - listitem [ref=e98]: + - link "Robert Lewandowski. Prawdziwy" [ref=e99] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - listitem [ref=e100]: + - link "Battlefield 6 PlayStation 5" [ref=e101] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - listitem [ref=e102]: + - link "Ghost of yotei ps5" [ref=e103] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - listitem [ref=e104]: + - link "Karty Pokemon TCG" [ref=e105] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e106]: + - link "Zestawy szachowe" [ref=e107] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - listitem [ref=e108]: + - link "Keyboard Yamaha" [ref=e109] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - generic [ref=e111]: + - heading "Dla najmłodszych" [level=6] [ref=e112] + - list [ref=e113]: + - listitem [ref=e114]: + - link "Albik Globus" [ref=e115] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - listitem [ref=e116]: + - link "Czytaj z Albikiem - zestaw" [ref=e117] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - listitem [ref=e118]: + - link "Ciało człowieka Albik" [ref=e119] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - listitem [ref=e120]: + - link "Elementarz przedszkolaka Albik" [ref=e121] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - listitem [ref=e122]: + - link "Świat zwierząt" [ref=e123] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - listitem [ref=e124]: + - link "Pucio uczy się mówić" [ref=e125] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - generic [ref=e127]: + - heading "Wyjątkowe okazje" [level=6] [ref=e128] + - list [ref=e129]: + - listitem [ref=e130]: + - link "Prezenty na Wielkanoc" [ref=e131] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - listitem [ref=e132]: + - link "Prezent na Wielkanoc dla dzieci" [ref=e133] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - listitem [ref=e134]: + - link "Ozdoby wielkanocne" [ref=e135] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - listitem [ref=e136]: + - link "Buty komunijne" [ref=e137] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - listitem [ref=e138]: + - link "LEGO Editions" [ref=e139] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - listitem [ref=e140]: + - link "Zaproszenia na komunię" [ref=e141] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - generic [ref=e142]: + - generic [ref=e144]: + - heading "Dom i Ogród" [level=6] [ref=e145] + - list [ref=e146]: + - listitem [ref=e147]: + - link "Palma wielkanocna" [ref=e148] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - listitem [ref=e149]: + - link "Baranek wielkanocny" [ref=e150] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - listitem [ref=e151]: + - link "Świdośliwa lamarcka" [ref=e152] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - listitem [ref=e153]: + - link "Wiąz syberyjski" [ref=e154] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - listitem [ref=e155]: + - link "Tanie domki na działkę z montażem i transportem" [ref=e156] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - listitem [ref=e157]: + - link "Rekuperator" [ref=e158] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - listitem [ref=e159]: + - link "Agregat prądotwórczy" [ref=e160] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - listitem [ref=e161]: + - link "Toaletka z lustrem" [ref=e162] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - listitem [ref=e163]: + - link "Styropian 20 cm" [ref=e164] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - listitem [ref=e165]: + - link "Stroik wielkanocny na cmentarz" [ref=e166] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - listitem [ref=e167]: + - link "Stroiki wielkanocne na cmentarz" [ref=e168] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - listitem [ref=e169]: + - link "Pościel 160x200" [ref=e170] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - listitem [ref=e171]: + - link "Ogrodzenie panelowe" [ref=e172] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - listitem [ref=e173]: + - link "Kostka brukowa" [ref=e174] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - listitem [ref=e175]: + - link "Odkurzacz piorący" [ref=e176] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - listitem [ref=e177]: + - link "Kartki wielkanocne" [ref=e178] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - listitem [ref=e179]: + - link "Filtry do wody na cały dom" [ref=e180] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - listitem [ref=e181]: + - link "Jutlandia meble ogrodowe" [ref=e182] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - listitem [ref=e183]: + - link "Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie" [ref=e184] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - generic [ref=e186]: + - heading "Moda" [level=6] [ref=e187] + - list [ref=e188]: + - listitem [ref=e189]: + - link "Jan spekter" [ref=e190] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - listitem [ref=e191]: + - link "Kurtka wiosenna męska" [ref=e192] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - listitem [ref=e193]: + - link "Buty męskie" [ref=e194] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - listitem [ref=e195]: + - link "Eleganckie komplety damskie ze spodniami na wesele plus size" [ref=e196] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - listitem [ref=e197]: + - link "Sukienki wizytowe" [ref=e198] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - listitem [ref=e199]: + - link "Buty damskie na szeroką stopę i wysokie podbicie" [ref=e200] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - listitem [ref=e201]: + - link "Eleganckie komplety damskie ze spodniami na wesele" [ref=e202] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - listitem [ref=e203]: + - link "Sukienka na wesele dla 50 latki" [ref=e204] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - listitem [ref=e205]: + - link "New balance 9060 damskie" [ref=e206] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - listitem [ref=e207]: + - link "Asics novablast 5" [ref=e208] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - listitem [ref=e209]: + - link "Buty trekkingowe męskie" [ref=e210] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - listitem [ref=e211]: + - link "Nike vomero 18" [ref=e212] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - listitem [ref=e213]: + - link "Adidas gazelle damskie" [ref=e214] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - listitem [ref=e215]: + - link "New balance 327 damskie" [ref=e216] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - listitem [ref=e217]: + - link "Air force 1 damskie" [ref=e218] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - listitem [ref=e219]: + - link "Nike pegasus 41" [ref=e220] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - listitem [ref=e221]: + - link "Nike v5 rnr" [ref=e222] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - listitem [ref=e223]: + - link "Buty na koturnie damskie" [ref=e224] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - listitem [ref=e225]: + - link "Elegancki komplet marynarka i spodnie" [ref=e226] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - generic [ref=e228]: + - heading "Elektronika" [level=6] [ref=e229] + - list [ref=e230]: + - listitem [ref=e231]: + - link "Memory stick pro duo" [ref=e232] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - listitem [ref=e233]: + - link "Air fryer" [ref=e234] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - listitem [ref=e235]: + - link "Ekspres do kawy" [ref=e236] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - listitem [ref=e237]: + - link "Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi" [ref=e238] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - listitem [ref=e239]: + - link "Vivo x300 ultra" [ref=e240] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - listitem [ref=e241]: + - link "Sodastream" [ref=e242] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - listitem [ref=e243]: + - link "Odkurzacz bezprzewodowy" [ref=e244] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - listitem [ref=e245]: + - link "Iphone 16 pro max" [ref=e246] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - listitem [ref=e247]: + - link "Odkurzacz xiaomi vacuum cleaner g20 lite" [ref=e248] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - listitem [ref=e249]: + - link "Iphone 16 pro" [ref=e250] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - listitem [ref=e251]: + - link "Motorola edge 60 pro" [ref=e252] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - listitem [ref=e253]: + - link "Samsung s25 ultra" [ref=e254] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - listitem [ref=e255]: + - link "Oppo reno 15 pro" [ref=e256] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - listitem [ref=e257]: + - link "Iphone 16" [ref=e258] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - listitem [ref=e259]: + - link "Realme 16 pro plus" [ref=e260] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - listitem [ref=e261]: + - link "Nintendo switch 2" [ref=e262] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - listitem [ref=e263]: + - link "Iphone 15 pro" [ref=e264] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - listitem [ref=e265]: + - link "Oppo find x9 ultra" [ref=e266] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - listitem [ref=e267]: + - link "Motorola edge 50 pro" [ref=e268] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - generic [ref=e270]: + - heading "Motoryzacja" [level=6] [ref=e271] + - list [ref=e272]: + - listitem [ref=e273]: + - link "Ursus c-330" [ref=e274] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - listitem [ref=e275]: + - link "Bagażnik rowerowy na hak 2 rowery" [ref=e276] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - listitem [ref=e277]: + - link "Simparica na kleszcze" [ref=e278] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - listitem [ref=e279]: + - link "Bagażnik rowerowy na hak 4 rowery" [ref=e280] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - listitem [ref=e281]: + - link "Uchwyt na telefon do motocykla" [ref=e282] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - listitem [ref=e283]: + - link "Felgi aluminiowe 16" [ref=e284] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - listitem [ref=e285]: + - link "Części samochodowe" [ref=e286] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - listitem [ref=e287]: + - link "Continental premiumcontact 7" [ref=e288] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - listitem [ref=e289]: + - link "Części po vin" [ref=e290] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - listitem [ref=e291]: + - link "Mata dla psa do samochodu" [ref=e292] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - listitem [ref=e293]: + - link "Myjka ciśnieniowa z podgrzewaniem wody" [ref=e294] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - listitem [ref=e295]: + - link "Felgi aluminiowe 17" [ref=e296] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - listitem [ref=e297]: + - link "Wosk platinum na rysy samochodowe" [ref=e298] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - listitem [ref=e299]: + - link "Kurtka motocyklowa damska" [ref=e300] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - listitem [ref=e301]: + - link "Rower dla 10 latki" [ref=e302] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - listitem [ref=e303]: + - link "Skuter elektryczny" [ref=e304] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - listitem [ref=e305]: + - link "Dpf control" [ref=e306] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - listitem [ref=e307]: + - link "Rust paint" [ref=e308] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - listitem [ref=e309]: + - link "Ceratec liqui moly" [ref=e310] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - generic [ref=e312]: + - heading "Dziecko" [level=6] [ref=e313] + - list [ref=e314]: + - listitem [ref=e315]: + - link "Prezent na chrzest dla dziewczynki" [ref=e316] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - listitem [ref=e317]: + - link "Klocki magnetyczne" [ref=e318] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - listitem [ref=e319]: + - link "Chusta do noszenia dziecka" [ref=e320] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - listitem [ref=e321]: + - link "Ubranko do chrztu dla chłopca" [ref=e322] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - listitem [ref=e323]: + - link "Prezent dla 7 latki" [ref=e324] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - listitem [ref=e325]: + - link "Sukienka na chrzest dla dziewczynki" [ref=e326] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - listitem [ref=e327]: + - link "Torba do szpitala dla mamy i dziecka" [ref=e328] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - listitem [ref=e329]: + - link "Rowerek biegowy dla 2 latka" [ref=e330] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - listitem [ref=e331]: + - link "Needoh nice cube" [ref=e332] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - listitem [ref=e333]: + - link "Lego star wars" [ref=e334] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - listitem [ref=e335]: + - link "Zaproszenia na komunię dla dziewczynki" [ref=e336] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - listitem [ref=e337]: + - link "Plac zabaw dla dzieci" [ref=e338] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - listitem [ref=e339]: + - link "Stolik i krzesełka dla dzieci" [ref=e340] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - listitem [ref=e341]: + - link "Prezent dla 6 latki" [ref=e342] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - listitem [ref=e343]: + - link "Rower dla 6 latka" [ref=e344] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - listitem [ref=e345]: + - link "Prezent dla 9 latki" [ref=e346] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - listitem [ref=e347]: + - link "Pamiątka na komunię dla chłopca" [ref=e348] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - listitem [ref=e349]: + - link "Naklejki na sciane do pokoju dziecka" [ref=e350] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - listitem [ref=e351]: + - link "Prezent dla 8 latki" [ref=e352] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - generic [ref=e354]: + - heading "Kultura i rozrywka" [level=6] [ref=e355] + - list [ref=e356]: + - listitem [ref=e357]: + - link "I have no mouth and i must scream" [ref=e358] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - listitem [ref=e359]: + - link "21 dni by dziecko samo usiadło do lekcji" [ref=e360] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - listitem [ref=e361]: + - link "Gry na nintendo switch 2" [ref=e362] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - listitem [ref=e363]: + - link "Ruletka" [ref=e364] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - listitem [ref=e365]: + - link "Karty pokemon" [ref=e366] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e367]: + - link "Call of duty ps5" [ref=e368] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - listitem [ref=e369]: + - link "Kalendarz brań ryb" [ref=e370] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - listitem [ref=e371]: + - link "A dictionary of color combinations" [ref=e372] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - listitem [ref=e373]: + - link "Forza horizon 5" [ref=e374] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - listitem [ref=e375]: + - link "Magic the gathering" [ref=e376] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - listitem [ref=e377]: + - link "Gry planszowe dla całej rodziny" [ref=e378] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - listitem [ref=e379]: + - link "Karta podarunkowa netflix 33 zł online" [ref=e380] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - listitem [ref=e381]: + - link "Wiewiórki które nie chciały się dzielić" [ref=e382] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - listitem [ref=e383]: + - link "Chłopaki nie płaczą chłopaki z okien skaczą" [ref=e384] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - listitem [ref=e385]: + - link "Gta san andreas" [ref=e386] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - listitem [ref=e387]: + - link "Dying light the beast ps5" [ref=e388] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - listitem [ref=e389]: + - link "Ivermectin" [ref=e390] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - listitem [ref=e391]: + - link "Gra dla 4 latka" [ref=e392] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - listitem [ref=e393]: + - link "Gotowy by umrzeć gotowy by zabić" [ref=e394] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - button "Pokaż więcej" [ref=e396] [cursor=pointer] + - generic [ref=e399]: + - generic [ref=e401]: + - generic [ref=e405]: + - heading "Allegro" [level=3] [ref=e406] + - list [ref=e409]: + - listitem [ref=e410]: + - link "O nas" [ref=e411] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - list [ref=e414]: + - listitem [ref=e415]: + - link "Reklama" [ref=e416] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - listitem [ref=e417]: + - link "Allegro Ads" [ref=e418] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - listitem [ref=e419]: + - link "Allegro API" [ref=e420] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - listitem [ref=e421]: + - link "Praca w Allegro" [ref=e422] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - listitem [ref=e423]: + - link "Zrównoważony rozwój" [ref=e424] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - list [ref=e427]: + - listitem [ref=e428]: + - link "Mapa strony" [ref=e429] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - listitem [ref=e430]: + - link "Rankingi produktów" [ref=e431] [cursor=pointer]: + - /url: /rankingi + - listitem [ref=e432]: + - link "Informacja o realizacji strategii podatkowej" [ref=e433] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - list [ref=e436]: + - listitem [ref=e437]: + - link "Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych" [ref=e438] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - listitem [ref=e439]: + - link "Dodatkowe informacje o reklamie w Allegro i jej parametrach" [ref=e440] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - listitem [ref=e441]: + - link "Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym" [ref=e442] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - generic [ref=e446]: + - heading "Centrum pomocy" [level=3] [ref=e447] + - list [ref=e450]: + - listitem [ref=e451]: + - link "Pomoc dla kupujących" [ref=e452] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - listitem [ref=e453]: + - link "Aktualności dla kupujących" [ref=e454] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - listitem [ref=e455]: + - link "Spytaj Społeczność" [ref=e456] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - list [ref=e459]: + - listitem [ref=e460]: + - link "Dla kupujących" [ref=e461] [cursor=pointer]: + - /url: /dla-kupujacych + - list [ref=e464]: + - listitem [ref=e465]: + - link "Pomoc dla sprzedających" [ref=e466] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - listitem [ref=e467]: + - link "Sprzedawaj na Allegro" [ref=e468] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - listitem [ref=e469]: + - link "Zwrot zakupu" [ref=e470] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - listitem [ref=e471]: + - link "Polityka prywatności mediów społecznościowych" [ref=e472] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - listitem [ref=e473]: + - link "Polityka plików \"cookies\"" [ref=e474] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - listitem [ref=e475]: + - link "Ustawienia plików \"cookies\"" [ref=e476] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - listitem [ref=e477]: + - link "Regulamin" [ref=e478] [cursor=pointer]: + - /url: /regulamin + - listitem [ref=e479]: + - link "Udostępnianie lokalizacji" [ref=e480] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - listitem [ref=e481]: + - link "Bezpieczeństwo" [ref=e482] [cursor=pointer]: + - /url: https://cert.allegro.com + - listitem [ref=e483]: + - link "Sprzedaż międzynarodowa" [ref=e484] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - listitem [ref=e485]: + - link "Informacja o dostępności usług" [ref=e486] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - generic [ref=e490]: + - heading "Serwisy" [level=3] [ref=e491] + - list [ref=e494]: + - listitem [ref=e495]: + - link "Allegro Ochrona Kupujących" [ref=e496] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - list [ref=e499]: + - listitem [ref=e500]: + - link "Akademia Allegro" [ref=e501] [cursor=pointer]: + - /url: /akademia + - list [ref=e504]: + - listitem [ref=e505]: + - link "Allegro Analytics" [ref=e506] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - list [ref=e509]: + - listitem [ref=e510]: + - link "Allegro Business" [ref=e511] [cursor=pointer]: + - /url: /biznes + - list [ref=e514]: + - listitem [ref=e515]: + - link "Allegro Care" [ref=e516] [cursor=pointer]: + - /url: /zobacz/allegro-care + - list [ref=e519]: + - listitem [ref=e520]: + - link "Allegro Charytatywni" [ref=e521] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - list [ref=e524]: + - listitem [ref=e525]: + - link "Allegro Inspiruje" [ref=e526] [cursor=pointer]: + - /url: /artykuly + - list [ref=e529]: + - listitem [ref=e530]: + - link "Allegro Lokalnie" [ref=e531] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - list [ref=e534]: + - listitem [ref=e535]: + - link "Allegro Kapitał" [ref=e536] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - list [ref=e539]: + - listitem [ref=e540]: + - link "Allegro One" [ref=e541] [cursor=pointer]: + - /url: /kampania/one + - list [ref=e544]: + - listitem [ref=e545]: + - link "Allegro One Fulfillment" [ref=e546] [cursor=pointer]: + - /url: /kampania/fulfillment + - list [ref=e549]: + - listitem [ref=e550]: + - link "Allegro Pay" [ref=e551] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - list [ref=e554]: + - listitem [ref=e555]: + - link "Allegro Pay Business" [ref=e556] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - list [ref=e559]: + - listitem [ref=e560]: + - link "Allegro Klik" [ref=e561] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - list [ref=e564]: + - listitem [ref=e565]: + - link "Allegro Smart!" [ref=e566] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - list [ref=e569]: + - listitem [ref=e570]: + - link "Karty podarunkowe Allegro" [ref=e571] [cursor=pointer]: + - /url: /karty-podarunkowe + - list [ref=e574]: + - listitem [ref=e575]: + - link "Monety Allegro" [ref=e576] [cursor=pointer]: + - /url: /kampania/monety + - list [ref=e579]: + - listitem [ref=e580]: + - link "Strefa marek" [ref=e581] [cursor=pointer]: + - /url: /strefamarek + - generic [ref=e585]: + - generic [ref=e588]: + - heading "Ustawienia wyświetlania" [level=3] [ref=e589] + - generic [ref=e591]: + - img [ref=e592] + - generic [ref=e593]: "wygląd:" + - link "motyw jasny" [ref=e594] [cursor=pointer]: + - /url: "#display-theme" + - generic [ref=e597]: + - heading "Ustawienia lokalizacji" [level=3] [ref=e598] + - list [ref=e600]: + - listitem [ref=e601]: + - text: Kraj + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e602] [cursor=pointer]: Polska + - listitem [ref=e603]: + - text: Kraj dostawy + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e604] [cursor=pointer]: Polska + - listitem [ref=e605]: + - text: Język + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e606] [cursor=pointer]: polski + - listitem [ref=e607]: + - text: Waluta + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e608] [cursor=pointer]: PLN + - generic [ref=e613]: + - generic [ref=e617]: + - link "AppStore" [ref=e618] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img "AppStore" [ref=e619] + - link "PlayStore" [ref=e620] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img "GooglePlay" [ref=e621] + - link "AppGallery" [ref=e622] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img "AppGallery" [ref=e623] + - generic [ref=e627]: + - link "Podziel się na Facebook" [ref=e628] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img "Facebook" [ref=e629] + - link "Podziel się na LinkedIn" [ref=e630] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img "LinkedIn" [ref=e631] + - link "Instagram" [ref=e632] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img "Instagram" [ref=e633] + - link "Podziel się na Pinterest" [ref=e634] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img "Pinterest" [ref=e635] + - link "YouTube" [ref=e636] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img "YouTube" [ref=e637] + - link "Charytatywni Allegro" [ref=e638] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img "Charytatywni Allegro" [ref=e639] + - generic [ref=e642]: + - img "Allegro" [ref=e651] + - generic [ref=e654]: + - paragraph [ref=e657]: Serwisy Grupy Allegro + - generic [ref=e659]: + - list [ref=e663]: + - listitem [ref=e664]: + - link "Allegro.cz" [ref=e665] [cursor=pointer]: + - /url: https://allegro.cz/ + - list [ref=e669]: + - listitem [ref=e670]: + - link "Allegro.sk" [ref=e671] [cursor=pointer]: + - /url: https://allegro.sk/ + - list [ref=e675]: + - listitem [ref=e676]: + - link "Allegro.hu" [ref=e677] [cursor=pointer]: + - /url: https://allegro.hu/ + - list [ref=e681]: + - listitem [ref=e682]: + - link "Onedelivery.cz" [ref=e683] [cursor=pointer]: + - /url: https://onedelivery.cz/ \ No newline at end of file diff --git a/.playwright-mcp/page-2026-04-03T18-31-06-047Z.yml b/.playwright-mcp/page-2026-04-03T18-31-06-047Z.yml new file mode 100644 index 0000000..49ad2e1 --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-31-06-047Z.yml @@ -0,0 +1,939 @@ +- generic [ref=e1]: + - img + - generic [ref=e2]: + - link [ref=e684] [cursor=pointer]: + - /url: "#main-content" + - text: Przejdź do treści + - banner [ref=e32]: + - link [ref=e685] [cursor=pointer]: + - /url: / + - img [ref=e686] + - main [ref=e41]: + - generic [ref=e45]: + - heading [level=2] [ref=e687]: Śledź przesyłkę + - paragraph [ref=e47]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e48]: + - generic [ref=e49]: + - textbox [ref=e688]: + - /placeholder: Numer przesyłki + - text: A0046XFMG1 + - generic [ref=e51]: Numer przesyłki + - button [ref=e689] [cursor=pointer]: Śledź przesyłkę + - generic [ref=e56]: + - heading [level=6] [ref=e690]: Kurier przekazał przesyłkę do magazynu + - button [ref=e691] [cursor=pointer]: sprawdź historię przesyłki + - generic [ref=e63]: + - generic [ref=e66]: + - generic [ref=e73]: + - generic [ref=e76]: + - generic [ref=e77]: + - generic [ref=e79]: + - heading [level=6] [ref=e692]: Rankingi + - list [ref=e81]: + - listitem [ref=e82]: + - link [ref=e693] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - text: Ranking zestawów mebli łazienkowych + - listitem [ref=e84]: + - link [ref=e694] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - text: Ranking zestawów podynkowych WC + - listitem [ref=e86]: + - link [ref=e695] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - text: Ranking zestawów prysznicowych + - listitem [ref=e88]: + - link [ref=e696] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - text: Ranking zlewozmywaków + - listitem [ref=e90]: + - link [ref=e697] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - text: Ranking zlewów gospodarczych + - listitem [ref=e92]: + - link [ref=e698] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - text: Ranking zmiękczaczy wody + - generic [ref=e95]: + - heading [level=6] [ref=e699]: Ostatnio dodane + - list [ref=e97]: + - listitem [ref=e98]: + - link [ref=e700] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - text: Robert Lewandowski. Prawdziwy + - listitem [ref=e100]: + - link [ref=e701] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - text: Battlefield 6 PlayStation 5 + - listitem [ref=e102]: + - link [ref=e702] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - text: Ghost of yotei ps5 + - listitem [ref=e104]: + - link [ref=e703] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - text: Karty Pokemon TCG + - listitem [ref=e106]: + - link [ref=e704] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - text: Zestawy szachowe + - listitem [ref=e108]: + - link [ref=e705] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - text: Keyboard Yamaha + - generic [ref=e111]: + - heading [level=6] [ref=e706]: Dla najmłodszych + - list [ref=e113]: + - listitem [ref=e114]: + - link [ref=e707] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - text: Albik Globus + - listitem [ref=e116]: + - link [ref=e708] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - text: Czytaj z Albikiem - zestaw + - listitem [ref=e118]: + - link [ref=e709] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - text: Ciało człowieka Albik + - listitem [ref=e120]: + - link [ref=e710] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - text: Elementarz przedszkolaka Albik + - listitem [ref=e122]: + - link [ref=e711] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - text: Świat zwierząt + - listitem [ref=e124]: + - link [ref=e712] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - text: Pucio uczy się mówić + - generic [ref=e127]: + - heading [level=6] [ref=e713]: Wyjątkowe okazje + - list [ref=e129]: + - listitem [ref=e130]: + - link [ref=e714] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - text: Prezenty na Wielkanoc + - listitem [ref=e132]: + - link [ref=e715] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - text: Prezent na Wielkanoc dla dzieci + - listitem [ref=e134]: + - link [ref=e716] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - text: Ozdoby wielkanocne + - listitem [ref=e136]: + - link [ref=e717] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - text: Buty komunijne + - listitem [ref=e138]: + - link [ref=e718] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - text: LEGO Editions + - listitem [ref=e140]: + - link [ref=e719] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - text: Zaproszenia na komunię + - generic [ref=e142]: + - generic [ref=e144]: + - heading [level=6] [ref=e720]: Dom i Ogród + - list [ref=e146]: + - listitem [ref=e147]: + - link [ref=e721] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - text: Palma wielkanocna + - listitem [ref=e149]: + - link [ref=e722] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - text: Baranek wielkanocny + - listitem [ref=e151]: + - link [ref=e723] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - text: Świdośliwa lamarcka + - listitem [ref=e153]: + - link [ref=e724] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - text: Wiąz syberyjski + - listitem [ref=e155]: + - link [ref=e725] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - text: Tanie domki na działkę z montażem i transportem + - listitem [ref=e157]: + - link [ref=e726] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - text: Rekuperator + - listitem [ref=e159]: + - link [ref=e727] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - text: Agregat prądotwórczy + - listitem [ref=e161]: + - link [ref=e728] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - text: Toaletka z lustrem + - listitem [ref=e163]: + - link [ref=e729] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - text: Styropian 20 cm + - listitem [ref=e165]: + - link [ref=e730] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - text: Stroik wielkanocny na cmentarz + - listitem [ref=e167]: + - link [ref=e731] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - text: Stroiki wielkanocne na cmentarz + - listitem [ref=e169]: + - link [ref=e732] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - text: Pościel 160x200 + - listitem [ref=e171]: + - link [ref=e733] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - text: Ogrodzenie panelowe + - listitem [ref=e173]: + - link [ref=e734] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - text: Kostka brukowa + - listitem [ref=e175]: + - link [ref=e735] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - text: Odkurzacz piorący + - listitem [ref=e177]: + - link [ref=e736] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - text: Kartki wielkanocne + - listitem [ref=e179]: + - link [ref=e737] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - text: Filtry do wody na cały dom + - listitem [ref=e181]: + - link [ref=e738] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - text: Jutlandia meble ogrodowe + - listitem [ref=e183]: + - link [ref=e739] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - text: Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie + - generic [ref=e186]: + - heading [level=6] [ref=e740]: Moda + - list [ref=e188]: + - listitem [ref=e189]: + - link [ref=e741] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - text: Jan spekter + - listitem [ref=e191]: + - link [ref=e742] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - text: Kurtka wiosenna męska + - listitem [ref=e193]: + - link [ref=e743] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - text: Buty męskie + - listitem [ref=e195]: + - link [ref=e744] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - text: Eleganckie komplety damskie ze spodniami na wesele plus size + - listitem [ref=e197]: + - link [ref=e745] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - text: Sukienki wizytowe + - listitem [ref=e199]: + - link [ref=e746] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - text: Buty damskie na szeroką stopę i wysokie podbicie + - listitem [ref=e201]: + - link [ref=e747] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - text: Eleganckie komplety damskie ze spodniami na wesele + - listitem [ref=e203]: + - link [ref=e748] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - text: Sukienka na wesele dla 50 latki + - listitem [ref=e205]: + - link [ref=e749] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - text: New balance 9060 damskie + - listitem [ref=e207]: + - link [ref=e750] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - text: Asics novablast 5 + - listitem [ref=e209]: + - link [ref=e751] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - text: Buty trekkingowe męskie + - listitem [ref=e211]: + - link [ref=e752] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - text: Nike vomero 18 + - listitem [ref=e213]: + - link [ref=e753] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - text: Adidas gazelle damskie + - listitem [ref=e215]: + - link [ref=e754] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - text: New balance 327 damskie + - listitem [ref=e217]: + - link [ref=e755] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - text: Air force 1 damskie + - listitem [ref=e219]: + - link [ref=e756] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - text: Nike pegasus 41 + - listitem [ref=e221]: + - link [ref=e757] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - text: Nike v5 rnr + - listitem [ref=e223]: + - link [ref=e758] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - text: Buty na koturnie damskie + - listitem [ref=e225]: + - link [ref=e759] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - text: Elegancki komplet marynarka i spodnie + - generic [ref=e228]: + - heading [level=6] [ref=e760]: Elektronika + - list [ref=e230]: + - listitem [ref=e231]: + - link [ref=e761] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - text: Memory stick pro duo + - listitem [ref=e233]: + - link [ref=e762] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - text: Air fryer + - listitem [ref=e235]: + - link [ref=e763] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - text: Ekspres do kawy + - listitem [ref=e237]: + - link [ref=e764] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - text: Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi + - listitem [ref=e239]: + - link [ref=e765] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - text: Vivo x300 ultra + - listitem [ref=e241]: + - link [ref=e766] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - text: Sodastream + - listitem [ref=e243]: + - link [ref=e767] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - text: Odkurzacz bezprzewodowy + - listitem [ref=e245]: + - link [ref=e768] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - text: Iphone 16 pro max + - listitem [ref=e247]: + - link [ref=e769] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - text: Odkurzacz xiaomi vacuum cleaner g20 lite + - listitem [ref=e249]: + - link [ref=e770] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - text: Iphone 16 pro + - listitem [ref=e251]: + - link [ref=e771] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - text: Motorola edge 60 pro + - listitem [ref=e253]: + - link [ref=e772] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - text: Samsung s25 ultra + - listitem [ref=e255]: + - link [ref=e773] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - text: Oppo reno 15 pro + - listitem [ref=e257]: + - link [ref=e774] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - text: Iphone 16 + - listitem [ref=e259]: + - link [ref=e775] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - text: Realme 16 pro plus + - listitem [ref=e261]: + - link [ref=e776] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - text: Nintendo switch 2 + - listitem [ref=e263]: + - link [ref=e777] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - text: Iphone 15 pro + - listitem [ref=e265]: + - link [ref=e778] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - text: Oppo find x9 ultra + - listitem [ref=e267]: + - link [ref=e779] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - text: Motorola edge 50 pro + - generic [ref=e270]: + - heading [level=6] [ref=e780]: Motoryzacja + - list [ref=e272]: + - listitem [ref=e273]: + - link [ref=e781] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - text: Ursus c-330 + - listitem [ref=e275]: + - link [ref=e782] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - text: Bagażnik rowerowy na hak 2 rowery + - listitem [ref=e277]: + - link [ref=e783] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - text: Simparica na kleszcze + - listitem [ref=e279]: + - link [ref=e784] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - text: Bagażnik rowerowy na hak 4 rowery + - listitem [ref=e281]: + - link [ref=e785] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - text: Uchwyt na telefon do motocykla + - listitem [ref=e283]: + - link [ref=e786] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - text: Felgi aluminiowe 16 + - listitem [ref=e285]: + - link [ref=e787] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - text: Części samochodowe + - listitem [ref=e287]: + - link [ref=e788] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - text: Continental premiumcontact 7 + - listitem [ref=e289]: + - link [ref=e789] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - text: Części po vin + - listitem [ref=e291]: + - link [ref=e790] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - text: Mata dla psa do samochodu + - listitem [ref=e293]: + - link [ref=e791] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - text: Myjka ciśnieniowa z podgrzewaniem wody + - listitem [ref=e295]: + - link [ref=e792] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - text: Felgi aluminiowe 17 + - listitem [ref=e297]: + - link [ref=e793] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - text: Wosk platinum na rysy samochodowe + - listitem [ref=e299]: + - link [ref=e794] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - text: Kurtka motocyklowa damska + - listitem [ref=e301]: + - link [ref=e795] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - text: Rower dla 10 latki + - listitem [ref=e303]: + - link [ref=e796] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - text: Skuter elektryczny + - listitem [ref=e305]: + - link [ref=e797] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - text: Dpf control + - listitem [ref=e307]: + - link [ref=e798] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - text: Rust paint + - listitem [ref=e309]: + - link [ref=e799] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - text: Ceratec liqui moly + - generic [ref=e312]: + - heading [level=6] [ref=e800]: Dziecko + - list [ref=e314]: + - listitem [ref=e315]: + - link [ref=e801] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - text: Prezent na chrzest dla dziewczynki + - listitem [ref=e317]: + - link [ref=e802] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - text: Klocki magnetyczne + - listitem [ref=e319]: + - link [ref=e803] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - text: Chusta do noszenia dziecka + - listitem [ref=e321]: + - link [ref=e804] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - text: Ubranko do chrztu dla chłopca + - listitem [ref=e323]: + - link [ref=e805] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - text: Prezent dla 7 latki + - listitem [ref=e325]: + - link [ref=e806] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - text: Sukienka na chrzest dla dziewczynki + - listitem [ref=e327]: + - link [ref=e807] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - text: Torba do szpitala dla mamy i dziecka + - listitem [ref=e329]: + - link [ref=e808] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - text: Rowerek biegowy dla 2 latka + - listitem [ref=e331]: + - link [ref=e809] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - text: Needoh nice cube + - listitem [ref=e333]: + - link [ref=e810] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - text: Lego star wars + - listitem [ref=e335]: + - link [ref=e811] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - text: Zaproszenia na komunię dla dziewczynki + - listitem [ref=e337]: + - link [ref=e812] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - text: Plac zabaw dla dzieci + - listitem [ref=e339]: + - link [ref=e813] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - text: Stolik i krzesełka dla dzieci + - listitem [ref=e341]: + - link [ref=e814] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - text: Prezent dla 6 latki + - listitem [ref=e343]: + - link [ref=e815] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - text: Rower dla 6 latka + - listitem [ref=e345]: + - link [ref=e816] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - text: Prezent dla 9 latki + - listitem [ref=e347]: + - link [ref=e817] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - text: Pamiątka na komunię dla chłopca + - listitem [ref=e349]: + - link [ref=e818] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - text: Naklejki na sciane do pokoju dziecka + - listitem [ref=e351]: + - link [ref=e819] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - text: Prezent dla 8 latki + - generic [ref=e354]: + - heading [level=6] [ref=e820]: Kultura i rozrywka + - list [ref=e356]: + - listitem [ref=e357]: + - link [ref=e821] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - text: I have no mouth and i must scream + - listitem [ref=e359]: + - link [ref=e822] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - text: 21 dni by dziecko samo usiadło do lekcji + - listitem [ref=e361]: + - link [ref=e823] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - text: Gry na nintendo switch 2 + - listitem [ref=e363]: + - link [ref=e824] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - text: Ruletka + - listitem [ref=e365]: + - link [ref=e825] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - text: Karty pokemon + - listitem [ref=e367]: + - link [ref=e826] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - text: Call of duty ps5 + - listitem [ref=e369]: + - link [ref=e827] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - text: Kalendarz brań ryb + - listitem [ref=e371]: + - link [ref=e828] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - text: A dictionary of color combinations + - listitem [ref=e373]: + - link [ref=e829] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - text: Forza horizon 5 + - listitem [ref=e375]: + - link [ref=e830] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - text: Magic the gathering + - listitem [ref=e377]: + - link [ref=e831] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - text: Gry planszowe dla całej rodziny + - listitem [ref=e379]: + - link [ref=e832] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - text: Karta podarunkowa netflix 33 zł online + - listitem [ref=e381]: + - link [ref=e833] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - text: Wiewiórki które nie chciały się dzielić + - listitem [ref=e383]: + - link [ref=e834] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - text: Chłopaki nie płaczą chłopaki z okien skaczą + - listitem [ref=e385]: + - link [ref=e835] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - text: Gta san andreas + - listitem [ref=e387]: + - link [ref=e836] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - text: Dying light the beast ps5 + - listitem [ref=e389]: + - link [ref=e837] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - text: Ivermectin + - listitem [ref=e391]: + - link [ref=e838] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - text: Gra dla 4 latka + - listitem [ref=e393]: + - link [ref=e839] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - text: Gotowy by umrzeć gotowy by zabić + - button [ref=e840] [cursor=pointer]: Pokaż więcej + - generic [ref=e399]: + - generic [ref=e401]: + - generic [ref=e405]: + - heading [level=3] [ref=e841]: Allegro + - list [ref=e409]: + - listitem [ref=e410]: + - link [ref=e842] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - text: O nas + - list [ref=e414]: + - listitem [ref=e415]: + - link [ref=e843] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - text: Reklama + - listitem [ref=e417]: + - link [ref=e844] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - text: Allegro Ads + - listitem [ref=e419]: + - link [ref=e845] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - text: Allegro API + - listitem [ref=e421]: + - link [ref=e846] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - text: Praca w Allegro + - listitem [ref=e423]: + - link [ref=e847] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - text: Zrównoważony rozwój + - list [ref=e427]: + - listitem [ref=e428]: + - link [ref=e848] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - text: Mapa strony + - listitem [ref=e430]: + - link [ref=e849] [cursor=pointer]: + - /url: /rankingi + - text: Rankingi produktów + - listitem [ref=e432]: + - link [ref=e850] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - text: Informacja o realizacji strategii podatkowej + - list [ref=e436]: + - listitem [ref=e437]: + - link [ref=e851] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - text: Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych + - listitem [ref=e439]: + - link [ref=e852] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - text: Dodatkowe informacje o reklamie w Allegro i jej parametrach + - listitem [ref=e441]: + - link [ref=e853] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - text: Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym + - generic [ref=e446]: + - heading [level=3] [ref=e854]: Centrum pomocy + - list [ref=e450]: + - listitem [ref=e451]: + - link [ref=e855] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - text: Pomoc dla kupujących + - listitem [ref=e453]: + - link [ref=e856] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - text: Aktualności dla kupujących + - listitem [ref=e455]: + - link [ref=e857] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - text: Spytaj Społeczność + - list [ref=e459]: + - listitem [ref=e460]: + - link [ref=e858] [cursor=pointer]: + - /url: /dla-kupujacych + - text: Dla kupujących + - list [ref=e464]: + - listitem [ref=e465]: + - link [ref=e859] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - text: Pomoc dla sprzedających + - listitem [ref=e467]: + - link [ref=e860] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - text: Sprzedawaj na Allegro + - listitem [ref=e469]: + - link [ref=e861] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - text: Zwrot zakupu + - listitem [ref=e471]: + - link [ref=e862] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - text: Polityka prywatności mediów społecznościowych + - listitem [ref=e473]: + - link [ref=e863] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - text: Polityka plików "cookies" + - listitem [ref=e475]: + - link [ref=e864] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - text: Ustawienia plików "cookies" + - listitem [ref=e477]: + - link [ref=e865] [cursor=pointer]: + - /url: /regulamin + - text: Regulamin + - listitem [ref=e479]: + - link [ref=e866] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - text: Udostępnianie lokalizacji + - listitem [ref=e481]: + - link [ref=e867] [cursor=pointer]: + - /url: https://cert.allegro.com + - text: Bezpieczeństwo + - listitem [ref=e483]: + - link [ref=e868] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - text: Sprzedaż międzynarodowa + - listitem [ref=e485]: + - link [ref=e869] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - text: Informacja o dostępności usług + - generic [ref=e490]: + - heading [level=3] [ref=e870]: Serwisy + - list [ref=e494]: + - listitem [ref=e495]: + - link [ref=e871] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - text: Allegro Ochrona Kupujących + - list [ref=e499]: + - listitem [ref=e500]: + - link [ref=e872] [cursor=pointer]: + - /url: /akademia + - text: Akademia Allegro + - list [ref=e504]: + - listitem [ref=e505]: + - link [ref=e873] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - text: Allegro Analytics + - list [ref=e509]: + - listitem [ref=e510]: + - link [ref=e874] [cursor=pointer]: + - /url: /biznes + - text: Allegro Business + - list [ref=e514]: + - listitem [ref=e515]: + - link [ref=e875] [cursor=pointer]: + - /url: /zobacz/allegro-care + - text: Allegro Care + - list [ref=e519]: + - listitem [ref=e520]: + - link [ref=e876] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - text: Allegro Charytatywni + - list [ref=e524]: + - listitem [ref=e525]: + - link [ref=e877] [cursor=pointer]: + - /url: /artykuly + - text: Allegro Inspiruje + - list [ref=e529]: + - listitem [ref=e530]: + - link [ref=e878] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - text: Allegro Lokalnie + - list [ref=e534]: + - listitem [ref=e535]: + - link [ref=e879] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - text: Allegro Kapitał + - list [ref=e539]: + - listitem [ref=e540]: + - link [ref=e880] [cursor=pointer]: + - /url: /kampania/one + - text: Allegro One + - list [ref=e544]: + - listitem [ref=e545]: + - link [ref=e881] [cursor=pointer]: + - /url: /kampania/fulfillment + - text: Allegro One Fulfillment + - list [ref=e549]: + - listitem [ref=e550]: + - link [ref=e882] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - text: Allegro Pay + - list [ref=e554]: + - listitem [ref=e555]: + - link [ref=e883] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - text: Allegro Pay Business + - list [ref=e559]: + - listitem [ref=e560]: + - link [ref=e884] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - text: Allegro Klik + - list [ref=e564]: + - listitem [ref=e565]: + - link [ref=e885] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - text: Allegro Smart! + - list [ref=e569]: + - listitem [ref=e570]: + - link [ref=e886] [cursor=pointer]: + - /url: /karty-podarunkowe + - text: Karty podarunkowe Allegro + - list [ref=e574]: + - listitem [ref=e575]: + - link [ref=e887] [cursor=pointer]: + - /url: /kampania/monety + - text: Monety Allegro + - list [ref=e579]: + - listitem [ref=e580]: + - link [ref=e888] [cursor=pointer]: + - /url: /strefamarek + - text: Strefa marek + - generic [ref=e585]: + - generic [ref=e588]: + - heading [level=3] [ref=e889]: Ustawienia wyświetlania + - generic [ref=e591]: + - img [ref=e592] + - generic [ref=e593]: "wygląd:" + - link [ref=e890] [cursor=pointer]: + - /url: "#display-theme" + - text: motyw jasny + - generic [ref=e597]: + - heading [level=3] [ref=e891]: Ustawienia lokalizacji + - list [ref=e600]: + - listitem [ref=e601]: + - text: Kraj + - button [ref=e892] [cursor=pointer]: Polska + - listitem [ref=e603]: + - text: Kraj dostawy + - button [ref=e893] [cursor=pointer]: Polska + - listitem [ref=e605]: + - text: Język + - button [ref=e894] [cursor=pointer]: polski + - listitem [ref=e607]: + - text: Waluta + - button [ref=e895] [cursor=pointer]: PLN + - generic [ref=e613]: + - generic [ref=e617]: + - link [ref=e896] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img [ref=e897] + - link [ref=e898] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img [ref=e899] + - link [ref=e900] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img [ref=e901] + - generic [ref=e627]: + - link [ref=e902] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img [ref=e903] + - link [ref=e904] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img [ref=e905] + - link [ref=e906] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img [ref=e907] + - link [ref=e908] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img [ref=e909] + - link [ref=e910] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img [ref=e911] + - link [ref=e912] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img [ref=e913] + - generic [ref=e642]: + - img [ref=e914] + - generic [ref=e654]: + - paragraph [ref=e657]: Serwisy Grupy Allegro + - generic [ref=e659]: + - list [ref=e663]: + - listitem [ref=e664]: + - link [ref=e915] [cursor=pointer]: + - /url: https://allegro.cz/ + - text: Allegro.cz + - list [ref=e669]: + - listitem [ref=e670]: + - link [ref=e916] [cursor=pointer]: + - /url: https://allegro.sk/ + - text: Allegro.sk + - list [ref=e675]: + - listitem [ref=e676]: + - link [ref=e917] [cursor=pointer]: + - /url: https://allegro.hu/ + - text: Allegro.hu + - list [ref=e681]: + - listitem [ref=e682]: + - link [ref=e918] [cursor=pointer]: + - /url: https://onedelivery.cz/ + - text: Onedelivery.cz + - dialog [ref=e919]: + - generic "Historia przesyłki" [ref=e921]: + - generic [ref=e922]: + - button "zamknij" [active] [ref=e923] [cursor=pointer]: + - img [ref=e924] + - generic [ref=e925]: + - heading "Historia przesyłki" [level=3] [ref=e926] + - list [ref=e927]: + - listitem [ref=e928]: + - generic [ref=e929]: + - time [ref=e930]: 3 kwi 2026, 17:24 + - generic [ref=e931]: Kurier przekazał przesyłkę do magazynu + - separator [ref=e932] + - listitem [ref=e933]: + - generic [ref=e934]: + - time [ref=e935]: 3 kwi 2026, 15:49 + - generic [ref=e936]: Przesyłka została odebrana przez kuriera + - separator [ref=e937] + - listitem [ref=e938]: + - generic [ref=e939]: + - time [ref=e940]: 3 kwi 2026, 15:47 + - generic [ref=e941]: Przesyłka została podjęta z punktu przez kuriera + - separator [ref=e942] + - listitem [ref=e943]: + - generic [ref=e944]: + - time [ref=e945]: 3 kwi 2026, 15:08 + - generic [ref=e946]: Przesyłka została nadana + - separator [ref=e947] + - listitem [ref=e948]: + - generic [ref=e949]: + - time [ref=e950]: 3 kwi 2026, 10:50 + - generic [ref=e951]: Przesyłka została przygotowana przez nadawcę + - separator [ref=e952] + - button "Zamknij" [ref=e954] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-04-03T18-31-36-905Z.yml b/.playwright-mcp/page-2026-04-03T18-31-36-905Z.yml new file mode 100644 index 0000000..ab9b45f --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-31-36-905Z.yml @@ -0,0 +1 @@ +- generic [ref=e2]: "{\"errors\":[{\"code\":\"NotAcceptableException\",\"message\":\"Not acceptable representation requested. Please check 'Accept' request header\",\"details\":null,\"path\":null,\"userMessage\":\"Żądanie zawiera błędne dane. Skontaktuj się z autorem aplikacji.\",\"metadata\":{}}]}" \ No newline at end of file diff --git a/.playwright-mcp/page-2026-04-03T18-31-59-136Z.yml b/.playwright-mcp/page-2026-04-03T18-31-59-136Z.yml new file mode 100644 index 0000000..207192c --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-31-59-136Z.yml @@ -0,0 +1,714 @@ +- generic [active] [ref=e1]: + - img + - generic [ref=e2]: + - link "Przejdź do treści" [ref=e4] [cursor=pointer]: + - /url: "#main-content" + - banner [ref=e6]: + - link "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e10] [cursor=pointer]: + - /url: / + - img "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e11] + - main [ref=e15]: + - generic [ref=e19]: + - heading "Śledź przesyłkę" [level=2] [ref=e20] + - paragraph [ref=e21]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e22]: + - generic [ref=e23]: + - textbox "Numer przesyłki" [ref=e24]: A0046XFMG1 + - generic [ref=e25]: Numer przesyłki + - button "Śledź przesyłkę" [ref=e26] [cursor=pointer] + - generic [ref=e30]: + - heading "Kurier przekazał przesyłkę do magazynu" [level=6] [ref=e32] + - button "sprawdź historię przesyłki" [ref=e34] [cursor=pointer] + - generic [ref=e37]: + - generic [ref=e40]: + - generic [ref=e47]: + - generic [ref=e50]: + - generic [ref=e51]: + - generic [ref=e53]: + - heading "Rankingi" [level=6] [ref=e54] + - list [ref=e55]: + - listitem [ref=e56]: + - link "Ranking zestawów mebli łazienkowych" [ref=e57] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - listitem [ref=e58]: + - link "Ranking zestawów podynkowych WC" [ref=e59] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - listitem [ref=e60]: + - link "Ranking zestawów prysznicowych" [ref=e61] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - listitem [ref=e62]: + - link "Ranking zlewozmywaków" [ref=e63] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - listitem [ref=e64]: + - link "Ranking zlewów gospodarczych" [ref=e65] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - listitem [ref=e66]: + - link "Ranking zmiękczaczy wody" [ref=e67] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - generic [ref=e69]: + - heading "Ostatnio dodane" [level=6] [ref=e70] + - list [ref=e71]: + - listitem [ref=e72]: + - link "Robert Lewandowski. Prawdziwy" [ref=e73] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - listitem [ref=e74]: + - link "Battlefield 6 PlayStation 5" [ref=e75] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - listitem [ref=e76]: + - link "Ghost of yotei ps5" [ref=e77] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - listitem [ref=e78]: + - link "Karty Pokemon TCG" [ref=e79] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e80]: + - link "Zestawy szachowe" [ref=e81] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - listitem [ref=e82]: + - link "Keyboard Yamaha" [ref=e83] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - generic [ref=e85]: + - heading "Dla najmłodszych" [level=6] [ref=e86] + - list [ref=e87]: + - listitem [ref=e88]: + - link "Albik Globus" [ref=e89] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - listitem [ref=e90]: + - link "Czytaj z Albikiem - zestaw" [ref=e91] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - listitem [ref=e92]: + - link "Ciało człowieka Albik" [ref=e93] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - listitem [ref=e94]: + - link "Elementarz przedszkolaka Albik" [ref=e95] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - listitem [ref=e96]: + - link "Świat zwierząt" [ref=e97] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - listitem [ref=e98]: + - link "Pucio uczy się mówić" [ref=e99] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - generic [ref=e101]: + - heading "Wyjątkowe okazje" [level=6] [ref=e102] + - list [ref=e103]: + - listitem [ref=e104]: + - link "Prezenty na Wielkanoc" [ref=e105] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - listitem [ref=e106]: + - link "Prezent na Wielkanoc dla dzieci" [ref=e107] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - listitem [ref=e108]: + - link "Ozdoby wielkanocne" [ref=e109] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - listitem [ref=e110]: + - link "Buty komunijne" [ref=e111] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - listitem [ref=e112]: + - link "LEGO Editions" [ref=e113] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - listitem [ref=e114]: + - link "Zaproszenia na komunię" [ref=e115] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - generic [ref=e116]: + - generic [ref=e118]: + - heading "Dom i Ogród" [level=6] [ref=e119] + - list [ref=e120]: + - listitem [ref=e121]: + - link "Palma wielkanocna" [ref=e122] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - listitem [ref=e123]: + - link "Baranek wielkanocny" [ref=e124] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - listitem [ref=e125]: + - link "Świdośliwa lamarcka" [ref=e126] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - listitem [ref=e127]: + - link "Wiąz syberyjski" [ref=e128] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - listitem [ref=e129]: + - link "Tanie domki na działkę z montażem i transportem" [ref=e130] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - listitem [ref=e131]: + - link "Rekuperator" [ref=e132] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - listitem [ref=e133]: + - link "Agregat prądotwórczy" [ref=e134] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - listitem [ref=e135]: + - link "Toaletka z lustrem" [ref=e136] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - listitem [ref=e137]: + - link "Styropian 20 cm" [ref=e138] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - listitem [ref=e139]: + - link "Stroik wielkanocny na cmentarz" [ref=e140] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - listitem [ref=e141]: + - link "Stroiki wielkanocne na cmentarz" [ref=e142] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - listitem [ref=e143]: + - link "Pościel 160x200" [ref=e144] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - listitem [ref=e145]: + - link "Ogrodzenie panelowe" [ref=e146] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - listitem [ref=e147]: + - link "Kostka brukowa" [ref=e148] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - listitem [ref=e149]: + - link "Odkurzacz piorący" [ref=e150] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - listitem [ref=e151]: + - link "Kartki wielkanocne" [ref=e152] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - listitem [ref=e153]: + - link "Filtry do wody na cały dom" [ref=e154] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - listitem [ref=e155]: + - link "Jutlandia meble ogrodowe" [ref=e156] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - listitem [ref=e157]: + - link "Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie" [ref=e158] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - generic [ref=e160]: + - heading "Moda" [level=6] [ref=e161] + - list [ref=e162]: + - listitem [ref=e163]: + - link "Jan spekter" [ref=e164] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - listitem [ref=e165]: + - link "Kurtka wiosenna męska" [ref=e166] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - listitem [ref=e167]: + - link "Buty męskie" [ref=e168] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - listitem [ref=e169]: + - link "Eleganckie komplety damskie ze spodniami na wesele plus size" [ref=e170] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - listitem [ref=e171]: + - link "Sukienki wizytowe" [ref=e172] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - listitem [ref=e173]: + - link "Buty damskie na szeroką stopę i wysokie podbicie" [ref=e174] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - listitem [ref=e175]: + - link "Eleganckie komplety damskie ze spodniami na wesele" [ref=e176] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - listitem [ref=e177]: + - link "Sukienka na wesele dla 50 latki" [ref=e178] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - listitem [ref=e179]: + - link "New balance 9060 damskie" [ref=e180] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - listitem [ref=e181]: + - link "Asics novablast 5" [ref=e182] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - listitem [ref=e183]: + - link "Buty trekkingowe męskie" [ref=e184] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - listitem [ref=e185]: + - link "Nike vomero 18" [ref=e186] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - listitem [ref=e187]: + - link "Adidas gazelle damskie" [ref=e188] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - listitem [ref=e189]: + - link "New balance 327 damskie" [ref=e190] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - listitem [ref=e191]: + - link "Air force 1 damskie" [ref=e192] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - listitem [ref=e193]: + - link "Nike pegasus 41" [ref=e194] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - listitem [ref=e195]: + - link "Nike v5 rnr" [ref=e196] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - listitem [ref=e197]: + - link "Buty na koturnie damskie" [ref=e198] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - listitem [ref=e199]: + - link "Elegancki komplet marynarka i spodnie" [ref=e200] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - generic [ref=e202]: + - heading "Elektronika" [level=6] [ref=e203] + - list [ref=e204]: + - listitem [ref=e205]: + - link "Memory stick pro duo" [ref=e206] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - listitem [ref=e207]: + - link "Air fryer" [ref=e208] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - listitem [ref=e209]: + - link "Ekspres do kawy" [ref=e210] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - listitem [ref=e211]: + - link "Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi" [ref=e212] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - listitem [ref=e213]: + - link "Vivo x300 ultra" [ref=e214] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - listitem [ref=e215]: + - link "Sodastream" [ref=e216] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - listitem [ref=e217]: + - link "Odkurzacz bezprzewodowy" [ref=e218] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - listitem [ref=e219]: + - link "Iphone 16 pro max" [ref=e220] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - listitem [ref=e221]: + - link "Odkurzacz xiaomi vacuum cleaner g20 lite" [ref=e222] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - listitem [ref=e223]: + - link "Iphone 16 pro" [ref=e224] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - listitem [ref=e225]: + - link "Motorola edge 60 pro" [ref=e226] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - listitem [ref=e227]: + - link "Samsung s25 ultra" [ref=e228] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - listitem [ref=e229]: + - link "Oppo reno 15 pro" [ref=e230] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - listitem [ref=e231]: + - link "Iphone 16" [ref=e232] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - listitem [ref=e233]: + - link "Realme 16 pro plus" [ref=e234] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - listitem [ref=e235]: + - link "Nintendo switch 2" [ref=e236] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - listitem [ref=e237]: + - link "Iphone 15 pro" [ref=e238] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - listitem [ref=e239]: + - link "Oppo find x9 ultra" [ref=e240] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - listitem [ref=e241]: + - link "Motorola edge 50 pro" [ref=e242] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - generic [ref=e244]: + - heading "Motoryzacja" [level=6] [ref=e245] + - list [ref=e246]: + - listitem [ref=e247]: + - link "Ursus c-330" [ref=e248] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - listitem [ref=e249]: + - link "Bagażnik rowerowy na hak 2 rowery" [ref=e250] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - listitem [ref=e251]: + - link "Simparica na kleszcze" [ref=e252] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - listitem [ref=e253]: + - link "Bagażnik rowerowy na hak 4 rowery" [ref=e254] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - listitem [ref=e255]: + - link "Uchwyt na telefon do motocykla" [ref=e256] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - listitem [ref=e257]: + - link "Felgi aluminiowe 16" [ref=e258] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - listitem [ref=e259]: + - link "Części samochodowe" [ref=e260] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - listitem [ref=e261]: + - link "Continental premiumcontact 7" [ref=e262] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - listitem [ref=e263]: + - link "Części po vin" [ref=e264] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - listitem [ref=e265]: + - link "Mata dla psa do samochodu" [ref=e266] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - listitem [ref=e267]: + - link "Myjka ciśnieniowa z podgrzewaniem wody" [ref=e268] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - listitem [ref=e269]: + - link "Felgi aluminiowe 17" [ref=e270] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - listitem [ref=e271]: + - link "Wosk platinum na rysy samochodowe" [ref=e272] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - listitem [ref=e273]: + - link "Kurtka motocyklowa damska" [ref=e274] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - listitem [ref=e275]: + - link "Rower dla 10 latki" [ref=e276] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - listitem [ref=e277]: + - link "Skuter elektryczny" [ref=e278] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - listitem [ref=e279]: + - link "Dpf control" [ref=e280] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - listitem [ref=e281]: + - link "Rust paint" [ref=e282] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - listitem [ref=e283]: + - link "Ceratec liqui moly" [ref=e284] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - generic [ref=e286]: + - heading "Dziecko" [level=6] [ref=e287] + - list [ref=e288]: + - listitem [ref=e289]: + - link "Prezent na chrzest dla dziewczynki" [ref=e290] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - listitem [ref=e291]: + - link "Klocki magnetyczne" [ref=e292] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - listitem [ref=e293]: + - link "Chusta do noszenia dziecka" [ref=e294] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - listitem [ref=e295]: + - link "Ubranko do chrztu dla chłopca" [ref=e296] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - listitem [ref=e297]: + - link "Prezent dla 7 latki" [ref=e298] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - listitem [ref=e299]: + - link "Sukienka na chrzest dla dziewczynki" [ref=e300] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - listitem [ref=e301]: + - link "Torba do szpitala dla mamy i dziecka" [ref=e302] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - listitem [ref=e303]: + - link "Rowerek biegowy dla 2 latka" [ref=e304] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - listitem [ref=e305]: + - link "Needoh nice cube" [ref=e306] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - listitem [ref=e307]: + - link "Lego star wars" [ref=e308] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - listitem [ref=e309]: + - link "Zaproszenia na komunię dla dziewczynki" [ref=e310] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - listitem [ref=e311]: + - link "Plac zabaw dla dzieci" [ref=e312] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - listitem [ref=e313]: + - link "Stolik i krzesełka dla dzieci" [ref=e314] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - listitem [ref=e315]: + - link "Prezent dla 6 latki" [ref=e316] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - listitem [ref=e317]: + - link "Rower dla 6 latka" [ref=e318] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - listitem [ref=e319]: + - link "Prezent dla 9 latki" [ref=e320] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - listitem [ref=e321]: + - link "Pamiątka na komunię dla chłopca" [ref=e322] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - listitem [ref=e323]: + - link "Naklejki na sciane do pokoju dziecka" [ref=e324] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - listitem [ref=e325]: + - link "Prezent dla 8 latki" [ref=e326] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - generic [ref=e328]: + - heading "Kultura i rozrywka" [level=6] [ref=e329] + - list [ref=e330]: + - listitem [ref=e331]: + - link "I have no mouth and i must scream" [ref=e332] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - listitem [ref=e333]: + - link "21 dni by dziecko samo usiadło do lekcji" [ref=e334] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - listitem [ref=e335]: + - link "Gry na nintendo switch 2" [ref=e336] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - listitem [ref=e337]: + - link "Ruletka" [ref=e338] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - listitem [ref=e339]: + - link "Karty pokemon" [ref=e340] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e341]: + - link "Call of duty ps5" [ref=e342] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - listitem [ref=e343]: + - link "Kalendarz brań ryb" [ref=e344] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - listitem [ref=e345]: + - link "A dictionary of color combinations" [ref=e346] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - listitem [ref=e347]: + - link "Forza horizon 5" [ref=e348] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - listitem [ref=e349]: + - link "Magic the gathering" [ref=e350] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - listitem [ref=e351]: + - link "Gry planszowe dla całej rodziny" [ref=e352] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - listitem [ref=e353]: + - link "Karta podarunkowa netflix 33 zł online" [ref=e354] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - listitem [ref=e355]: + - link "Wiewiórki które nie chciały się dzielić" [ref=e356] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - listitem [ref=e357]: + - link "Chłopaki nie płaczą chłopaki z okien skaczą" [ref=e358] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - listitem [ref=e359]: + - link "Gta san andreas" [ref=e360] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - listitem [ref=e361]: + - link "Dying light the beast ps5" [ref=e362] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - listitem [ref=e363]: + - link "Ivermectin" [ref=e364] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - listitem [ref=e365]: + - link "Gra dla 4 latka" [ref=e366] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - listitem [ref=e367]: + - link "Gotowy by umrzeć gotowy by zabić" [ref=e368] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - button "Pokaż więcej" [ref=e370] [cursor=pointer] + - generic [ref=e373]: + - generic [ref=e375]: + - generic [ref=e379]: + - heading "Allegro" [level=3] [ref=e380] + - list [ref=e383]: + - listitem [ref=e384]: + - link "O nas" [ref=e385] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - list [ref=e388]: + - listitem [ref=e389]: + - link "Reklama" [ref=e390] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - listitem [ref=e391]: + - link "Allegro Ads" [ref=e392] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - listitem [ref=e393]: + - link "Allegro API" [ref=e394] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - listitem [ref=e395]: + - link "Praca w Allegro" [ref=e396] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - listitem [ref=e397]: + - link "Zrównoważony rozwój" [ref=e398] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - list [ref=e401]: + - listitem [ref=e402]: + - link "Mapa strony" [ref=e403] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - listitem [ref=e404]: + - link "Rankingi produktów" [ref=e405] [cursor=pointer]: + - /url: /rankingi + - listitem [ref=e406]: + - link "Informacja o realizacji strategii podatkowej" [ref=e407] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - list [ref=e410]: + - listitem [ref=e411]: + - link "Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych" [ref=e412] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - listitem [ref=e413]: + - link "Dodatkowe informacje o reklamie w Allegro i jej parametrach" [ref=e414] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - listitem [ref=e415]: + - link "Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym" [ref=e416] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - generic [ref=e420]: + - heading "Centrum pomocy" [level=3] [ref=e421] + - list [ref=e424]: + - listitem [ref=e425]: + - link "Pomoc dla kupujących" [ref=e426] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - listitem [ref=e427]: + - link "Aktualności dla kupujących" [ref=e428] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - listitem [ref=e429]: + - link "Spytaj Społeczność" [ref=e430] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - list [ref=e433]: + - listitem [ref=e434]: + - link "Dla kupujących" [ref=e435] [cursor=pointer]: + - /url: /dla-kupujacych + - list [ref=e438]: + - listitem [ref=e439]: + - link "Pomoc dla sprzedających" [ref=e440] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - listitem [ref=e441]: + - link "Sprzedawaj na Allegro" [ref=e442] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - listitem [ref=e443]: + - link "Zwrot zakupu" [ref=e444] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - listitem [ref=e445]: + - link "Polityka prywatności mediów społecznościowych" [ref=e446] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - listitem [ref=e447]: + - link "Polityka plików \"cookies\"" [ref=e448] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - listitem [ref=e449]: + - link "Ustawienia plików \"cookies\"" [ref=e450] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - listitem [ref=e451]: + - link "Regulamin" [ref=e452] [cursor=pointer]: + - /url: /regulamin + - listitem [ref=e453]: + - link "Udostępnianie lokalizacji" [ref=e454] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - listitem [ref=e455]: + - link "Bezpieczeństwo" [ref=e456] [cursor=pointer]: + - /url: https://cert.allegro.com + - listitem [ref=e457]: + - link "Sprzedaż międzynarodowa" [ref=e458] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - listitem [ref=e459]: + - link "Informacja o dostępności usług" [ref=e460] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - generic [ref=e464]: + - heading "Serwisy" [level=3] [ref=e465] + - list [ref=e468]: + - listitem [ref=e469]: + - link "Allegro Ochrona Kupujących" [ref=e470] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - list [ref=e473]: + - listitem [ref=e474]: + - link "Akademia Allegro" [ref=e475] [cursor=pointer]: + - /url: /akademia + - list [ref=e478]: + - listitem [ref=e479]: + - link "Allegro Analytics" [ref=e480] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - list [ref=e483]: + - listitem [ref=e484]: + - link "Allegro Business" [ref=e485] [cursor=pointer]: + - /url: /biznes + - list [ref=e488]: + - listitem [ref=e489]: + - link "Allegro Care" [ref=e490] [cursor=pointer]: + - /url: /zobacz/allegro-care + - list [ref=e493]: + - listitem [ref=e494]: + - link "Allegro Charytatywni" [ref=e495] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - list [ref=e498]: + - listitem [ref=e499]: + - link "Allegro Inspiruje" [ref=e500] [cursor=pointer]: + - /url: /artykuly + - list [ref=e503]: + - listitem [ref=e504]: + - link "Allegro Lokalnie" [ref=e505] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - list [ref=e508]: + - listitem [ref=e509]: + - link "Allegro Kapitał" [ref=e510] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - list [ref=e513]: + - listitem [ref=e514]: + - link "Allegro One" [ref=e515] [cursor=pointer]: + - /url: /kampania/one + - list [ref=e518]: + - listitem [ref=e519]: + - link "Allegro One Fulfillment" [ref=e520] [cursor=pointer]: + - /url: /kampania/fulfillment + - list [ref=e523]: + - listitem [ref=e524]: + - link "Allegro Pay" [ref=e525] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - list [ref=e528]: + - listitem [ref=e529]: + - link "Allegro Pay Business" [ref=e530] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - list [ref=e533]: + - listitem [ref=e534]: + - link "Allegro Klik" [ref=e535] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - list [ref=e538]: + - listitem [ref=e539]: + - link "Allegro Smart!" [ref=e540] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - list [ref=e543]: + - listitem [ref=e544]: + - link "Karty podarunkowe Allegro" [ref=e545] [cursor=pointer]: + - /url: /karty-podarunkowe + - list [ref=e548]: + - listitem [ref=e549]: + - link "Monety Allegro" [ref=e550] [cursor=pointer]: + - /url: /kampania/monety + - list [ref=e553]: + - listitem [ref=e554]: + - link "Strefa marek" [ref=e555] [cursor=pointer]: + - /url: /strefamarek + - generic [ref=e559]: + - generic [ref=e562]: + - heading "Ustawienia wyświetlania" [level=3] [ref=e563] + - generic [ref=e565]: + - img [ref=e566] + - generic [ref=e567]: "wygląd:" + - link "motyw jasny" [ref=e568] [cursor=pointer]: + - /url: "#display-theme" + - generic [ref=e571]: + - heading "Ustawienia lokalizacji" [level=3] [ref=e572] + - list [ref=e574]: + - listitem [ref=e575]: + - text: Kraj + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e576] [cursor=pointer]: Polska + - listitem [ref=e577]: + - text: Kraj dostawy + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e578] [cursor=pointer]: Polska + - listitem [ref=e579]: + - text: Język + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e580] [cursor=pointer]: polski + - listitem [ref=e581]: + - text: Waluta + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e582] [cursor=pointer]: PLN + - generic [ref=e587]: + - generic [ref=e591]: + - link "AppStore" [ref=e592] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img "AppStore" [ref=e593] + - link "PlayStore" [ref=e594] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img "GooglePlay" [ref=e595] + - link "AppGallery" [ref=e596] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img "AppGallery" [ref=e597] + - generic [ref=e601]: + - link "Podziel się na Facebook" [ref=e602] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img "Facebook" [ref=e603] + - link "Podziel się na LinkedIn" [ref=e604] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img "LinkedIn" [ref=e605] + - link "Instagram" [ref=e606] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img "Instagram" [ref=e607] + - link "Podziel się na Pinterest" [ref=e608] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img "Pinterest" [ref=e609] + - link "YouTube" [ref=e610] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img "YouTube" [ref=e611] + - link "Charytatywni Allegro" [ref=e612] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img "Charytatywni Allegro" [ref=e613] + - generic [ref=e616]: + - img "Allegro" [ref=e625] + - generic [ref=e628]: + - paragraph [ref=e631]: Serwisy Grupy Allegro + - generic [ref=e633]: + - list [ref=e637]: + - listitem [ref=e638]: + - link "Allegro.cz" [ref=e639] [cursor=pointer]: + - /url: https://allegro.cz/ + - list [ref=e643]: + - listitem [ref=e644]: + - link "Allegro.sk" [ref=e645] [cursor=pointer]: + - /url: https://allegro.sk/ + - list [ref=e649]: + - listitem [ref=e650]: + - link "Allegro.hu" [ref=e651] [cursor=pointer]: + - /url: https://allegro.hu/ + - list [ref=e655]: + - listitem [ref=e656]: + - link "Onedelivery.cz" [ref=e657] [cursor=pointer]: + - /url: https://onedelivery.cz/ \ No newline at end of file diff --git a/.playwright-mcp/page-2026-04-03T18-43-06-591Z.yml b/.playwright-mcp/page-2026-04-03T18-43-06-591Z.yml new file mode 100644 index 0000000..1c4cff3 --- /dev/null +++ b/.playwright-mcp/page-2026-04-03T18-43-06-591Z.yml @@ -0,0 +1,714 @@ +- generic [active] [ref=e1]: + - img + - generic [ref=e2]: + - link "Przejdź do treści" [ref=e4] [cursor=pointer]: + - /url: "#main-content" + - banner [ref=e6]: + - link "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e10] [cursor=pointer]: + - /url: / + - img "Allegro - wygodne i bezpieczne zakupy online, największy wybór ofert" [ref=e11] + - main [ref=e15]: + - generic [ref=e19]: + - heading "Śledź przesyłkę" [level=2] [ref=e20] + - paragraph [ref=e21]: Wpisz numer przesyłki, by sprawdzić jej aktualny status. + - generic [ref=e22]: + - generic [ref=e23]: + - textbox "Numer przesyłki" [ref=e24]: AD0243IOG6 + - generic [ref=e25]: Numer przesyłki + - button "Śledź przesyłkę" [ref=e26] [cursor=pointer] + - generic [ref=e30]: + - heading "Przesyłka została doręczona" [level=6] [ref=e32] + - button "sprawdź historię przesyłki" [ref=e34] [cursor=pointer] + - generic [ref=e37]: + - generic [ref=e40]: + - generic [ref=e47]: + - generic [ref=e50]: + - generic [ref=e51]: + - generic [ref=e53]: + - heading "Rankingi" [level=6] [ref=e54] + - list [ref=e55]: + - listitem [ref=e56]: + - link "Ranking zestawów mebli łazienkowych" [ref=e57] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-mebli-lazienkowych + - listitem [ref=e58]: + - link "Ranking zestawów podynkowych WC" [ref=e59] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-podtynkowe-wc + - listitem [ref=e60]: + - link "Ranking zestawów prysznicowych" [ref=e61] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zestawy-prysznicowe + - listitem [ref=e62]: + - link "Ranking zlewozmywaków" [ref=e63] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewozmywaki + - listitem [ref=e64]: + - link "Ranking zlewów gospodarczych" [ref=e65] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zlewy-gospodarcze + - listitem [ref=e66]: + - link "Ranking zmiękczaczy wody" [ref=e67] [cursor=pointer]: + - /url: https://allegro.pl/ranking/zmiekczacze-do-wody + - generic [ref=e69]: + - heading "Ostatnio dodane" [level=6] [ref=e70] + - list [ref=e71]: + - listitem [ref=e72]: + - link "Robert Lewandowski. Prawdziwy" [ref=e73] [cursor=pointer]: + - /url: https://allegro.pl/produkt/robert-lewandowski-prawdziwy-sebastian-staszewski-b14c07b7-84cd-4eda-8198-17ba16c7fad3?offerId=17982035786 + - listitem [ref=e74]: + - link "Battlefield 6 PlayStation 5" [ref=e75] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=battlefield%206%20ps5 + - listitem [ref=e76]: + - link "Ghost of yotei ps5" [ref=e77] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ghost%20of%20yotei%20ps5 + - listitem [ref=e78]: + - link "Karty Pokemon TCG" [ref=e79] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e80]: + - link "Zestawy szachowe" [ref=e81] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=szachy%20zestaw + - listitem [ref=e82]: + - link "Keyboard Yamaha" [ref=e83] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=keyboard%20yamaha + - generic [ref=e85]: + - heading "Dla najmłodszych" [level=6] [ref=e86] + - list [ref=e87]: + - listitem [ref=e88]: + - link "Albik Globus" [ref=e89] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=globus%20albik + - listitem [ref=e90]: + - link "Czytaj z Albikiem - zestaw" [ref=e91] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=czytaj%20z%20albikiem%20zestaw + - listitem [ref=e92]: + - link "Ciało człowieka Albik" [ref=e93] [cursor=pointer]: + - /url: https://allegro.pl/produkt/cialo-czlowieka-lucie-ujcova-pavel-pecina-1dd79beb-6c9e-438c-97ed-33993d684768 + - listitem [ref=e94]: + - link "Elementarz przedszkolaka Albik" [ref=e95] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=albik%20elementarz + - listitem [ref=e96]: + - link "Świat zwierząt" [ref=e97] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwiat%20zwierz%C4%85t + - listitem [ref=e98]: + - link "Pucio uczy się mówić" [ref=e99] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pucio%20uczy%20si%C4%99%20m%C3%B3wi%C4%87 + - generic [ref=e101]: + - heading "Wyjątkowe okazje" [level=6] [ref=e102] + - list [ref=e103]: + - listitem [ref=e104]: + - link "Prezenty na Wielkanoc" [ref=e105] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20na%20wielkanoc + - listitem [ref=e106]: + - link "Prezent na Wielkanoc dla dzieci" [ref=e107] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezenty%20na%20wielkanoc%20dla%20dzieci + - listitem [ref=e108]: + - link "Ozdoby wielkanocne" [ref=e109] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/ozdoby-swiateczne-i-okolicznosciowe-wielkanoc-11995 + - listitem [ref=e110]: + - link "Buty komunijne" [ref=e111] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/komunia-obuwie-88316 + - listitem [ref=e112]: + - link "LEGO Editions" [ref=e113] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-editions-324972 + - listitem [ref=e114]: + - link "Zaproszenia na komunię" [ref=e115] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zaproszenia-komunia-88342 + - generic [ref=e116]: + - generic [ref=e118]: + - heading "Dom i Ogród" [level=6] [ref=e119] + - list [ref=e120]: + - listitem [ref=e121]: + - link "Palma wielkanocna" [ref=e122] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=palma%20wielkanocna + - listitem [ref=e123]: + - link "Baranek wielkanocny" [ref=e124] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baranek%20wielkanocny + - listitem [ref=e125]: + - link "Świdośliwa lamarcka" [ref=e126] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=%C5%9Bwido%C5%9Bliwa%20lamarcka + - listitem [ref=e127]: + - link "Wiąz syberyjski" [ref=e128] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rosliny-drzewa-i-krzewy-lisciaste-99754?string=wi%C4%85z%20syberyjski + - listitem [ref=e129]: + - link "Tanie domki na działkę z montażem i transportem" [ref=e130] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/architektura-ogrodowa-domki-82283?string=domek%20z%20monta%C5%BCem + - listitem [ref=e131]: + - link "Rekuperator" [ref=e132] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rekuperacja-rekuperatory-68623 + - listitem [ref=e133]: + - link "Agregat prądotwórczy" [ref=e134] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/narzedzia-agregaty-pradotworcze-147642 + - listitem [ref=e135]: + - link "Toaletka z lustrem" [ref=e136] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=toaletka%20z%20lustrem + - listitem [ref=e137]: + - link "Styropian 20 cm" [ref=e138] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=styropian%2020%20cm + - listitem [ref=e139]: + - link "Stroik wielkanocny na cmentarz" [ref=e140] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroik%20wielkanocny%20na%20gr%C3%B3b + - listitem [ref=e141]: + - link "Stroiki wielkanocne na cmentarz" [ref=e142] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=stroiki%20wielkanocne%20na%20cmentarz + - listitem [ref=e143]: + - link "Pościel 160x200" [ref=e144] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=po%C5%9Bciel%20160x200 + - listitem [ref=e145]: + - link "Ogrodzenie panelowe" [ref=e146] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ogrodzenie%20panelowe%20komplet + - listitem [ref=e147]: + - link "Kostka brukowa" [ref=e148] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/podloza-kostka-brukowa-126193 + - listitem [ref=e149]: + - link "Odkurzacz piorący" [ref=e150] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20pior%C4%85cy + - listitem [ref=e151]: + - link "Kartki wielkanocne" [ref=e152] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wielkanocne%20kartki%20%C5%9Bwi%C4%85teczne + - listitem [ref=e153]: + - link "Filtry do wody na cały dom" [ref=e154] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=filtry%20wody%20na%20ca%C5%82y%20dom + - listitem [ref=e155]: + - link "Jutlandia meble ogrodowe" [ref=e156] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=meble%20ogrodowe%20jutlandia + - listitem [ref=e157]: + - link "Bezprzewodowa myjka wysokociśnieniowa z dwoma akumulatorami w zestawie" [ref=e158] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjka%20akumulatorowa%202%20akumulatory + - generic [ref=e160]: + - heading "Moda" [level=6] [ref=e161] + - list [ref=e162]: + - listitem [ref=e163]: + - link "Jan spekter" [ref=e164] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-meska-jeansy-254260?string=jan%20spekter%20jeansy + - listitem [ref=e165]: + - link "Kurtka wiosenna męska" [ref=e166] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20wiosenna%20m%C4%99ska + - listitem [ref=e167]: + - link "Buty męskie" [ref=e168] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532 + - listitem [ref=e169]: + - link "Eleganckie komplety damskie ze spodniami na wesele plus size" [ref=e170] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=plus%20size + - listitem [ref=e171]: + - link "Sukienki wizytowe" [ref=e172] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-sukienki-124264?styl=wizytowa + - listitem [ref=e173]: + - link "Buty damskie na szeroką stopę i wysokie podbicie" [ref=e174] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=szeroka%20stopa + - listitem [ref=e175]: + - link "Eleganckie komplety damskie ze spodniami na wesele" [ref=e176] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=wesele + - listitem [ref=e177]: + - link "Sukienka na wesele dla 50 latki" [ref=e178] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienki%20na%20wesele%2050%20plus + - listitem [ref=e179]: + - link "New balance 9060 damskie" [ref=e180] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=new%20balance%209060%20damskie + - listitem [ref=e181]: + - link "Asics novablast 5" [ref=e182] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=asics%20novablast%205 + - listitem [ref=e183]: + - link "Buty trekkingowe męskie" [ref=e184] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/meskie-trekkingowe-55207 + - listitem [ref=e185]: + - link "Nike vomero 18" [ref=e186] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nike%20vomero%2018 + - listitem [ref=e187]: + - link "Adidas gazelle damskie" [ref=e188] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=adidas%20gazelle + - listitem [ref=e189]: + - link "New balance 327 damskie" [ref=e190] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=new%20balance%20327 + - listitem [ref=e191]: + - link "Air force 1 damskie" [ref=e192] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=nike%20air%20force%201 + - listitem [ref=e193]: + - link "Nike pegasus 41" [ref=e194] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-meskie-532?string=nike%20pegasus%2041 + - listitem [ref=e195]: + - link "Nike v5 rnr" [ref=e196] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=buty%20nike%20v5%20rnr + - listitem [ref=e197]: + - link "Buty na koturnie damskie" [ref=e198] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/obuwie-damskie-531?string=koturny + - listitem [ref=e199]: + - link "Elegancki komplet marynarka i spodnie" [ref=e200] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/odziez-damska-komplety-76110?string=komplet%20spodnie%20%2B%20marynarka + - generic [ref=e202]: + - heading "Elektronika" [level=6] [ref=e203] + - list [ref=e204]: + - listitem [ref=e205]: + - link "Memory stick pro duo" [ref=e206] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20memory%20stick%20pro%20duo + - listitem [ref=e207]: + - link "Air fryer" [ref=e208] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=air%20fryer + - listitem [ref=e209]: + - link "Ekspres do kawy" [ref=e210] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-kuchni-ekspresy-do-kawy-258232 + - listitem [ref=e211]: + - link "Wizjer do drzwi z kamerą czujnik ruchu dzień noc wifi" [ref=e212] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=wizjer%20do%20drzwi%20z%20kamer%C4%85%20czujnik%20ruchu%20dzie%C5%84%20noc%20wifi + - listitem [ref=e213]: + - link "Vivo x300 ultra" [ref=e214] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20vivo%20x300%20ultra + - listitem [ref=e215]: + - link "Sodastream" [ref=e216] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=soda%20stream + - listitem [ref=e217]: + - link "Odkurzacz bezprzewodowy" [ref=e218] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=odkurzacz%20bezprzewodowy + - listitem [ref=e219]: + - link "Iphone 16 pro max" [ref=e220] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-max-323879 + - listitem [ref=e221]: + - link "Odkurzacz xiaomi vacuum cleaner g20 lite" [ref=e222] [cursor=pointer]: + - /url: https://allegro.pl/produkt/odkurzacz-pionowy-xiaomi-g20-lite-215w-bialy-81603652-e957-4e6c-b750-a7f97e0df2ae + - listitem [ref=e223]: + - link "Iphone 16 pro" [ref=e224] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-pro-323878 + - listitem [ref=e225]: + - link "Motorola edge 60 pro" [ref=e226] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=motorola%20edge%2060%20pro + - listitem [ref=e227]: + - link "Samsung s25 ultra" [ref=e228] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/samsung-galaxy-s25-ultra-324079 + - listitem [ref=e229]: + - link "Oppo reno 15 pro" [ref=e230] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=telefon%20oppo%20reno%2015%20pro + - listitem [ref=e231]: + - link "Iphone 16" [ref=e232] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-16-323876 + - listitem [ref=e233]: + - link "Realme 16 pro plus" [ref=e234] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-realme-307093?string=realme%2016%20pro%20plus + - listitem [ref=e235]: + - link "Nintendo switch 2" [ref=e236] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nintendo-switch-2-konsole-324319 + - listitem [ref=e237]: + - link "Iphone 15 pro" [ref=e238] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/apple-iphone-15-pro-322854 + - listitem [ref=e239]: + - link "Oppo find x9 ultra" [ref=e240] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=smartfon%20oppo%20find%20x9%20ultra + - listitem [ref=e241]: + - link "Motorola edge 50 pro" [ref=e242] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/motorola-edge-50-pro-323461 + - generic [ref=e244]: + - heading "Motoryzacja" [level=6] [ref=e245] + - list [ref=e246]: + - listitem [ref=e247]: + - link "Ursus c-330" [ref=e248] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ci%C4%85gnik%20ursus%20c%20330 + - listitem [ref=e249]: + - link "Bagażnik rowerowy na hak 2 rowery" [ref=e250] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%20holowniczy%202%20rowery + - listitem [ref=e251]: + - link "Simparica na kleszcze" [ref=e252] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=simparica%20tabletka%20na%20kleszcze + - listitem [ref=e253]: + - link "Bagażnik rowerowy na hak 4 rowery" [ref=e254] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=baga%C5%BCnik%20rowerowy%20na%20hak%204%20rowery + - listitem [ref=e255]: + - link "Uchwyt na telefon do motocykla" [ref=e256] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=uchwyt%20motocyklowy%20na%20telefon + - listitem [ref=e257]: + - link "Felgi aluminiowe 16" [ref=e258] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=16%22 + - listitem [ref=e259]: + - link "Części samochodowe" [ref=e260] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620 + - listitem [ref=e261]: + - link "Continental premiumcontact 7" [ref=e262] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/opony-do-samochodow-osobowych-i-suv-257688?string=continental%20premiumcontact%207 + - listitem [ref=e263]: + - link "Części po vin" [ref=e264] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/czesci-samochodowe-620?string=po%20vin + - listitem [ref=e265]: + - link "Mata dla psa do samochodu" [ref=e266] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=mata%20dla%20psa%20do%20samochodu + - listitem [ref=e267]: + - link "Myjka ciśnieniowa z podgrzewaniem wody" [ref=e268] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=myjki%20ci%C5%9Bnieniowe%20z%20podgrzewaniem%20wody + - listitem [ref=e269]: + - link "Felgi aluminiowe 17" [ref=e270] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/do-samochodow-aluminiowe-257711?srednica-felgi=17%22 + - listitem [ref=e271]: + - link "Wosk platinum na rysy samochodowe" [ref=e272] [cursor=pointer]: + - /url: https://allegro.pl/produkt/platinum-20-sec-zestaw-do-usuwania-rys-zarysowan-e63a4fd5-5a8a-4e12-9750-ad989b5fea92 + - listitem [ref=e273]: + - link "Kurtka motocyklowa damska" [ref=e274] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kurtka%20motocyklowa%20damska + - listitem [ref=e275]: + - link "Rower dla 10 latki" [ref=e276] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20dziewczynki%2010%20lat + - listitem [ref=e277]: + - link "Skuter elektryczny" [ref=e278] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=skuter%20elektryczny + - listitem [ref=e279]: + - link "Dpf control" [ref=e280] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dpf%20control + - listitem [ref=e281]: + - link "Rust paint" [ref=e282] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rust%20paint%20farba + - listitem [ref=e283]: + - link "Ceratec liqui moly" [ref=e284] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=liqui%20moly%20ceratec + - generic [ref=e286]: + - heading "Dziecko" [level=6] [ref=e287] + - list [ref=e288]: + - listitem [ref=e289]: + - link "Prezent na chrzest dla dziewczynki" [ref=e290] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=chrzest%20prezenty%20dla%20dziewczynki + - listitem [ref=e291]: + - link "Klocki magnetyczne" [ref=e292] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/klocki-magnetyczne-19535 + - listitem [ref=e293]: + - link "Chusta do noszenia dziecka" [ref=e294] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/nosidelka-i-chusty-chusty-83685 + - listitem [ref=e295]: + - link "Ubranko do chrztu dla chłopca" [ref=e296] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ubranko%20do%20chrztu%20dla%20ch%C5%82opca + - listitem [ref=e297]: + - link "Prezent dla 7 latki" [ref=e298] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%207%20lat + - listitem [ref=e299]: + - link "Sukienka na chrzest dla dziewczynki" [ref=e300] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=sukienka%20na%20chrzest%20dla%20dziewczynki + - listitem [ref=e301]: + - link "Torba do szpitala dla mamy i dziecka" [ref=e302] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=torba%20do%20szpitala%20dla%20mamy + - listitem [ref=e303]: + - link "Rowerek biegowy dla 2 latka" [ref=e304] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/rowery-i-pojazdy-rowery-biegowe-86414?wiek-dziecka=2%20lata%20%2B + - listitem [ref=e305]: + - link "Needoh nice cube" [ref=e306] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=nice%20cube%20needoh + - listitem [ref=e307]: + - link "Lego star wars" [ref=e308] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zestawy-star-wars-93205 + - listitem [ref=e309]: + - link "Zaproszenia na komunię dla dziewczynki" [ref=e310] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=zaproszenia%20na%20komunie%20dla%20dziewczynki + - listitem [ref=e311]: + - link "Plac zabaw dla dzieci" [ref=e312] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/zabawki-ogrodowe-place-zabaw-86342 + - listitem [ref=e313]: + - link "Stolik i krzesełka dla dzieci" [ref=e314] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/stoliki-i-krzesla-zestawy-stoliki-i-krzesla-319355 + - listitem [ref=e315]: + - link "Prezent dla 6 latki" [ref=e316] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%206%20lat + - listitem [ref=e317]: + - link "Rower dla 6 latka" [ref=e318] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=rower%20dla%20ch%C5%82opca%206%20lat + - listitem [ref=e319]: + - link "Prezent dla 9 latki" [ref=e320] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%209%20lat + - listitem [ref=e321]: + - link "Pamiątka na komunię dla chłopca" [ref=e322] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=pami%C4%85tka%20komunii%20%C5%9Bwi%C4%99tej%20dla%20ch%C5%82opca + - listitem [ref=e323]: + - link "Naklejki na sciane do pokoju dziecka" [ref=e324] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/dekoracje-i-ozdoby-naklejki-scienne-98726 + - listitem [ref=e325]: + - link "Prezent dla 8 latki" [ref=e326] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=prezent%20dla%20dziewczynki%208%20lat + - generic [ref=e328]: + - heading "Kultura i rozrywka" [level=6] [ref=e329] + - list [ref=e330]: + - listitem [ref=e331]: + - link "I have no mouth and i must scream" [ref=e332] [cursor=pointer]: + - /url: https://allegro.pl/produkt/i-have-no-mouth-and-i-must-scream-harlan-ellison-302f0c72-00d2-4834-a4da-c392302b6fd6 + - listitem [ref=e333]: + - link "21 dni by dziecko samo usiadło do lekcji" [ref=e334] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=21%20dni%20by%20dziecko%20samo%20usiad%C5%82o + - listitem [ref=e335]: + - link "Gry na nintendo switch 2" [ref=e336] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-nintendo-switch-2-324323 + - listitem [ref=e337]: + - link "Ruletka" [ref=e338] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ruletka + - listitem [ref=e339]: + - link "Karty pokemon" [ref=e340] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karty%20pokemon + - listitem [ref=e341]: + - link "Call of duty ps5" [ref=e342] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry-na-konsole-sony-playstation-5-ps5-314793?string=call%20of%20duty + - listitem [ref=e343]: + - link "Kalendarz brań ryb" [ref=e344] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=kalendarz%20bra%C5%84%20ryb + - listitem [ref=e345]: + - link "A dictionary of color combinations" [ref=e346] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dictionary%20of%20color%20combinations + - listitem [ref=e347]: + - link "Forza horizon 5" [ref=e348] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/gry?string=forza%20horizon%205 + - listitem [ref=e349]: + - link "Magic the gathering" [ref=e350] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/kolekcjonerskie-magic-the-gathering-6066 + - listitem [ref=e351]: + - link "Gry planszowe dla całej rodziny" [ref=e352] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gry%20planszowe%20dla%20ca%C5%82ej%20rodziny + - listitem [ref=e353]: + - link "Karta podarunkowa netflix 33 zł online" [ref=e354] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=karta%20podarunkowa%20netflix%2033%20zl + - listitem [ref=e355]: + - link "Wiewiórki które nie chciały się dzielić" [ref=e356] [cursor=pointer]: + - /url: https://allegro.pl/produkt/wiewiorki-ktore-nie-chcialy-sie-dzielic-jim-field-rachel-bright-d0a401e8-e2d9-48e3-a457-1357aab39562 + - listitem [ref=e357]: + - link "Chłopaki nie płaczą chłopaki z okien skaczą" [ref=e358] [cursor=pointer]: + - /url: https://allegro.pl/produkt/chlopaki-nie-placza-chlopaki-z-okien-skacza-poradnik-ratujacy-zycie-43d0d8a5-f203-4aa4-b4da-3339649a39de + - listitem [ref=e359]: + - link "Gta san andreas" [ref=e360] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=gta%20san%20andreas + - listitem [ref=e361]: + - link "Dying light the beast ps5" [ref=e362] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=dying%20light%20the%20beast%20ps5 + - listitem [ref=e363]: + - link "Ivermectin" [ref=e364] [cursor=pointer]: + - /url: https://allegro.pl/listing?string=ivermectin + - listitem [ref=e365]: + - link "Gra dla 4 latka" [ref=e366] [cursor=pointer]: + - /url: https://allegro.pl/kategoria/planszowe-dla-najmlodszych-123958?wiek-dziecka=4%20lata%20%2B + - listitem [ref=e367]: + - link "Gotowy by umrzeć gotowy by zabić" [ref=e368] [cursor=pointer]: + - /url: https://allegro.pl/produkt/gotowy-by-umrzec-gotowy-by-zabic-amadeusz-burdziak-4ad6d681-20ce-48d8-9923-7fa68532d91d + - button "Pokaż więcej" [ref=e370] [cursor=pointer] + - generic [ref=e373]: + - generic [ref=e375]: + - generic [ref=e379]: + - heading "Allegro" [level=3] [ref=e380] + - list [ref=e383]: + - listitem [ref=e384]: + - link "O nas" [ref=e385] [cursor=pointer]: + - /url: https://about.allegro.eu/pl/o-nas/poznajmy-sie + - list [ref=e388]: + - listitem [ref=e389]: + - link "Reklama" [ref=e390] [cursor=pointer]: + - /url: /reklama/?utm_source=internal&utm_medium=footer&utm_campaign=link + - listitem [ref=e391]: + - link "Allegro Ads" [ref=e392] [cursor=pointer]: + - /url: /ads?utm_source=allegro_internal&utm_campaign=ads-promo&utm_medium=allegro_footer + - listitem [ref=e393]: + - link "Allegro API" [ref=e394] [cursor=pointer]: + - /url: https://developer.allegro.pl/ + - listitem [ref=e395]: + - link "Praca w Allegro" [ref=e396] [cursor=pointer]: + - /url: https://jobs.allegro.eu + - listitem [ref=e397]: + - link "Zrównoważony rozwój" [ref=e398] [cursor=pointer]: + - /url: //raportcsr.allegro.pl/ + - list [ref=e401]: + - listitem [ref=e402]: + - link "Mapa strony" [ref=e403] [cursor=pointer]: + - /url: /mapa-strony/kategorie + - listitem [ref=e404]: + - link "Rankingi produktów" [ref=e405] [cursor=pointer]: + - /url: /rankingi + - listitem [ref=e406]: + - link "Informacja o realizacji strategii podatkowej" [ref=e407] [cursor=pointer]: + - /url: /informacje-prawne/informacja-o-realizacji-strategii-podatkowej-x5KaVqV14s6 + - list [ref=e410]: + - listitem [ref=e411]: + - link "Informacje dla Aktu o Usługach Cyfrowych i zgłaszanie produktów niebezpiecznych" [ref=e412] [cursor=pointer]: + - /url: /zobacz/informacje-dla-aktu-o-uslugach-cyfrowych + - listitem [ref=e413]: + - link "Dodatkowe informacje o reklamie w Allegro i jej parametrach" [ref=e414] [cursor=pointer]: + - /url: /informacje-prawne/dodatkowe-informacje-o-reklamie-w-allegro-i-jej-parametrach-K6VVZZ0YDHO + - listitem [ref=e415]: + - link "Raport o przeciwdziałaniu rozpowszechniania treści o charakterze terrorystycznym" [ref=e416] [cursor=pointer]: + - /url: /informacje-prawne/raport-o-przeciwdzialaniu-rozpowszechniania-tresci-o-charakterze-terrorystycznym-k1298nAOoUk + - generic [ref=e420]: + - heading "Centrum pomocy" [level=3] [ref=e421] + - list [ref=e424]: + - listitem [ref=e425]: + - link "Pomoc dla kupujących" [ref=e426] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych + - listitem [ref=e427]: + - link "Aktualności dla kupujących" [ref=e428] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/aktualnosci + - listitem [ref=e429]: + - link "Spytaj Społeczność" [ref=e430] [cursor=pointer]: + - /url: https://spolecznosc.allegro.pl/ + - list [ref=e433]: + - listitem [ref=e434]: + - link "Dla kupujących" [ref=e435] [cursor=pointer]: + - /url: /dla-kupujacych + - list [ref=e438]: + - listitem [ref=e439]: + - link "Pomoc dla sprzedających" [ref=e440] [cursor=pointer]: + - /url: https://help.allegro.com/sell/pl?marketplaceId=allegro-pl + - listitem [ref=e441]: + - link "Sprzedawaj na Allegro" [ref=e442] [cursor=pointer]: + - /url: /kampania/zacznij-sprzedaz + - listitem [ref=e443]: + - link "Zwrot zakupu" [ref=e444] [cursor=pointer]: + - /url: /pomoc/dla-kupujacych/zasady-reklamacji-i-zwrotu-towaru/jak-zwrocic-zakup-GDeq5VeKRHD + - listitem [ref=e445]: + - link "Polityka prywatności mediów społecznościowych" [ref=e446] [cursor=pointer]: + - /url: /regulaminy/polityka-prywatnosci-mediow-spolecznosciowych-x58jVwbeqFj + - listitem [ref=e447]: + - link "Polityka plików \"cookies\"" [ref=e448] [cursor=pointer]: + - /url: /regulaminy/polityka-plikow-cookies-lDzYv9wn8Tn + - listitem [ref=e449]: + - link "Ustawienia plików \"cookies\"" [ref=e450] [cursor=pointer]: + - /url: /regulaminy/ustawienia-plikow-cookies-mGEVAZaXoc3 + - listitem [ref=e451]: + - link "Regulamin" [ref=e452] [cursor=pointer]: + - /url: /regulamin + - listitem [ref=e453]: + - link "Udostępnianie lokalizacji" [ref=e454] [cursor=pointer]: + - /url: /regulaminy/udostepnianie-lokalizacji-yVx7ezEWySE + - listitem [ref=e455]: + - link "Bezpieczeństwo" [ref=e456] [cursor=pointer]: + - /url: https://cert.allegro.com + - listitem [ref=e457]: + - link "Sprzedaż międzynarodowa" [ref=e458] [cursor=pointer]: + - /url: https://help.allegro.com/pl/marketplaces + - listitem [ref=e459]: + - link "Informacja o dostępności usług" [ref=e460] [cursor=pointer]: + - /url: /regulaminy/informacja-o-dostepnosci-uslug-swiadczonych-przez-spolke-w-ramach-allegro-3A22oOxarC3 + - generic [ref=e464]: + - heading "Serwisy" [level=3] [ref=e465] + - list [ref=e468]: + - listitem [ref=e469]: + - link "Allegro Ochrona Kupujących" [ref=e470] [cursor=pointer]: + - /url: /dla-kupujacych/allegro-ochrona-kupujacych + - list [ref=e473]: + - listitem [ref=e474]: + - link "Akademia Allegro" [ref=e475] [cursor=pointer]: + - /url: /akademia + - list [ref=e478]: + - listitem [ref=e479]: + - link "Allegro Analytics" [ref=e480] [cursor=pointer]: + - /url: /moje-allegro/sprzedaz/allegro-analytics + - list [ref=e483]: + - listitem [ref=e484]: + - link "Allegro Business" [ref=e485] [cursor=pointer]: + - /url: /biznes + - list [ref=e488]: + - listitem [ref=e489]: + - link "Allegro Care" [ref=e490] [cursor=pointer]: + - /url: /zobacz/allegro-care + - list [ref=e493]: + - listitem [ref=e494]: + - link "Allegro Charytatywni" [ref=e495] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl/ + - list [ref=e498]: + - listitem [ref=e499]: + - link "Allegro Inspiruje" [ref=e500] [cursor=pointer]: + - /url: /artykuly + - list [ref=e503]: + - listitem [ref=e504]: + - link "Allegro Lokalnie" [ref=e505] [cursor=pointer]: + - /url: https://allegrolokalnie.pl/ + - list [ref=e508]: + - listitem [ref=e509]: + - link "Allegro Kapitał" [ref=e510] [cursor=pointer]: + - /url: https://salescenter.allegro.com/allegro-capital?referrer=ALLEGRO_NAWIGACJA_FOOTER_KAPITAL_BUTTON + - list [ref=e513]: + - listitem [ref=e514]: + - link "Allegro One" [ref=e515] [cursor=pointer]: + - /url: /kampania/one + - list [ref=e518]: + - listitem [ref=e519]: + - link "Allegro One Fulfillment" [ref=e520] [cursor=pointer]: + - /url: /kampania/fulfillment + - list [ref=e523]: + - listitem [ref=e524]: + - link "Allegro Pay" [ref=e525] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay?referrer=PRESALES_FOOTER_AP_NULL_NULL + - list [ref=e528]: + - listitem [ref=e529]: + - link "Allegro Pay Business" [ref=e530] [cursor=pointer]: + - /url: /metody-platnosci/allegro-pay-business?referrer=PRESALES_FOOTER_APB_NULL_NULL + - list [ref=e533]: + - listitem [ref=e534]: + - link "Allegro Klik" [ref=e535] [cursor=pointer]: + - /url: /metody-platnosci/allegro-klik?referrer=PRESALES_FOOTER_KLIK_NULL_NULL + - list [ref=e538]: + - listitem [ref=e539]: + - link "Allegro Smart!" [ref=e540] [cursor=pointer]: + - /url: /smart?bi_s=allegro_smart&bi_m=footer + - list [ref=e543]: + - listitem [ref=e544]: + - link "Karty podarunkowe Allegro" [ref=e545] [cursor=pointer]: + - /url: /karty-podarunkowe + - list [ref=e548]: + - listitem [ref=e549]: + - link "Monety Allegro" [ref=e550] [cursor=pointer]: + - /url: /kampania/monety + - list [ref=e553]: + - listitem [ref=e554]: + - link "Strefa marek" [ref=e555] [cursor=pointer]: + - /url: /strefamarek + - generic [ref=e559]: + - generic [ref=e562]: + - heading "Ustawienia wyświetlania" [level=3] [ref=e563] + - generic [ref=e565]: + - img [ref=e566] + - generic [ref=e567]: "wygląd:" + - link "motyw jasny" [ref=e568] [cursor=pointer]: + - /url: "#display-theme" + - generic [ref=e571]: + - heading "Ustawienia lokalizacji" [level=3] [ref=e572] + - list [ref=e574]: + - listitem [ref=e575]: + - text: Kraj + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e576] [cursor=pointer]: Polska + - listitem [ref=e577]: + - text: Kraj dostawy + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e578] [cursor=pointer]: Polska + - listitem [ref=e579]: + - text: Język + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e580] [cursor=pointer]: polski + - listitem [ref=e581]: + - text: Waluta + - button "Kliknij, aby otworzyć modal z ustawieniami lokalizacji" [ref=e582] [cursor=pointer]: PLN + - generic [ref=e587]: + - generic [ref=e591]: + - link "AppStore" [ref=e592] [cursor=pointer]: + - /url: https://apps.apple.com/app/apple-store/id305659772 + - img "AppStore" [ref=e593] + - link "PlayStore" [ref=e594] [cursor=pointer]: + - /url: https://play.google.com/store/apps/details?id=pl.allegro&referrer=utm_source%3Dsg%26utm_medium%3Dlink + - img "GooglePlay" [ref=e595] + - link "AppGallery" [ref=e596] [cursor=pointer]: + - /url: https://appgallery.huawei.com/#/app/C100506481 + - img "AppGallery" [ref=e597] + - generic [ref=e601]: + - link "Podziel się na Facebook" [ref=e602] [cursor=pointer]: + - /url: https://www.facebook.com/allegro + - img "Facebook" [ref=e603] + - link "Podziel się na LinkedIn" [ref=e604] [cursor=pointer]: + - /url: https://www.linkedin.com/company/allegro-pl + - img "LinkedIn" [ref=e605] + - link "Instagram" [ref=e606] [cursor=pointer]: + - /url: https://www.instagram.com/allegropl + - img "Instagram" [ref=e607] + - link "Podziel się na Pinterest" [ref=e608] [cursor=pointer]: + - /url: https://www.pinterest.com/allegropl + - img "Pinterest" [ref=e609] + - link "YouTube" [ref=e610] [cursor=pointer]: + - /url: https://www.youtube.com/allegro + - img "YouTube" [ref=e611] + - link "Charytatywni Allegro" [ref=e612] [cursor=pointer]: + - /url: https://charytatywni.allegro.pl + - img "Charytatywni Allegro" [ref=e613] + - generic [ref=e616]: + - img "Allegro" [ref=e625] + - generic [ref=e628]: + - paragraph [ref=e631]: Serwisy Grupy Allegro + - generic [ref=e633]: + - list [ref=e637]: + - listitem [ref=e638]: + - link "Allegro.cz" [ref=e639] [cursor=pointer]: + - /url: https://allegro.cz/ + - list [ref=e643]: + - listitem [ref=e644]: + - link "Allegro.sk" [ref=e645] [cursor=pointer]: + - /url: https://allegro.sk/ + - list [ref=e649]: + - listitem [ref=e650]: + - link "Allegro.hu" [ref=e651] [cursor=pointer]: + - /url: https://allegro.hu/ + - list [ref=e655]: + - listitem [ref=e656]: + - link "Onedelivery.cz" [ref=e657] [cursor=pointer]: + - /url: https://onedelivery.cz/ \ No newline at end of file diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 356f011..c16cb02 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -567,6 +567,12 @@ "size": 81, "lmtime": 1775064030991, "modified": false + }, + "20260403_000076_alter_receipts_issue_date_to_datetime.sql": { + "type": "-", + "size": 69, + "lmtime": 1775202951503, + "modified": false } }, "seeders": {}, @@ -594,8 +600,8 @@ }, "DB_SCHEMA.md": { "type": "-", - "size": 33404, - "lmtime": 1775064193370, + "size": 33408, + "lmtime": 1775203394938, "modified": false }, "ORDERS_SCHEMA_APILO_DRAFT.md": { @@ -618,8 +624,8 @@ }, "TECH_CHANGELOG.md": { "type": "-", - "size": 72463, - "lmtime": 1775064275599, + "size": 73079, + "lmtime": 1775203398451, "modified": false }, "todo.md": { @@ -2103,14 +2109,14 @@ }, "receipt-create.php": { "type": "-", - "size": 6502, - "lmtime": 0, - "modified": true + "size": 6627, + "lmtime": 1775202984476, + "modified": false }, "show.php": { "type": "-", - "size": 51510, - "lmtime": 1775065504861, + "size": 51639, + "lmtime": 1775202975277, "modified": false } }, @@ -2146,7 +2152,20 @@ "modified": false } }, - "receipts": {}, + "receipts": { + "print.php": { + "type": "-", + "size": 5584, + "lmtime": 1775202973795, + "modified": false + }, + "show.php": { + "type": "-", + "size": 5284, + "lmtime": 1775202972006, + "modified": false + } + }, "settings": { "accounting.php": { "type": "-", @@ -2454,14 +2473,14 @@ "Accounting": { "AccountingController.php": { "type": "-", - "size": 10212, - "lmtime": 0, + "size": 10469, + "lmtime": 1775202969748, "modified": false }, "ReceiptController.php": { "type": "-", - "size": 14363, - "lmtime": 1773790208003, + "size": 14584, + "lmtime": 1775202953600, "modified": false }, "ReceiptRepository.php": { diff --git a/database/migrations/20260403_000077_fix_receipts_datetime_columns.sql b/database/migrations/20260403_000077_fix_receipts_datetime_columns.sql new file mode 100644 index 0000000..12128ab --- /dev/null +++ b/database/migrations/20260403_000077_fix_receipts_datetime_columns.sql @@ -0,0 +1,14 @@ +-- sale_date was still DATE, change to DATETIME like issue_date +ALTER TABLE `receipts` MODIFY COLUMN `sale_date` DATETIME NOT NULL; + +-- Fix old receipts where issue_date/sale_date lost time (00:00:00) +-- Use created_at as the best available source of actual time +UPDATE `receipts` +SET `issue_date` = `created_at` +WHERE TIME(`issue_date`) = '00:00:00' + AND DATE(`issue_date`) = DATE(`created_at`); + +UPDATE `receipts` +SET `sale_date` = `created_at` +WHERE TIME(`sale_date`) = '00:00:00' + AND DATE(`sale_date`) = DATE(`created_at`); diff --git a/routes/web.php b/routes/web.php index bbf4f51..9fae59c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -48,6 +48,7 @@ use App\Modules\Email\VariableResolver; use App\Modules\Accounting\AccountingController; use App\Modules\Accounting\ReceiptController; use App\Modules\Accounting\ReceiptRepository; +use App\Modules\Accounting\ReceiptService; use App\Modules\Automation\AutomationController; use App\Modules\Automation\AutomationRepository; use App\Modules\Automation\AutomationService; @@ -250,6 +251,12 @@ return static function (Application $app): void { $variableResolver, $attachmentGenerator ); + $receiptService = new ReceiptService( + $receiptRepository, + $receiptConfigRepository, + $companySettingsRepository, + new OrdersRepository($app->db()) + ); $automationService = new AutomationService( $automationRepository, $automationExecutionLogRepository, @@ -258,7 +265,8 @@ return static function (Application $app): void { $companySettingsRepository, $receiptRepository, $receiptConfigRepository, - $shipmentPackageRepositoryForOrders + $shipmentPackageRepositoryForOrders, + $receiptService ); $printJobRepository = new PrintJobRepository($app->db()); $ordersController = new OrdersController($template, $translator, $auth, $app->orders(), $shipmentPackageRepositoryForOrders, $receiptRepository, $receiptConfigRepository, $emailSendingService, $emailTemplateRepository, $emailMailboxRepository, $app->basePath('storage'), $printJobRepository, $shopproIntegrationsRepository, $automationService); @@ -270,7 +278,8 @@ return static function (Application $app): void { $receiptConfigRepository, $companySettingsRepository, new OrdersRepository($app->db()), - $automationService + $automationService, + $receiptService ); $accountingController = new AccountingController( $template, diff --git a/src/Core/Http/RedirectPathResolver.php b/src/Core/Http/RedirectPathResolver.php new file mode 100644 index 0000000..1323839 --- /dev/null +++ b/src/Core/Http/RedirectPathResolver.php @@ -0,0 +1,29 @@ + $allowedPaths Prefixes that the path must start with + * @param string $default Fallback path when validation fails + */ + public static function resolve(string $requestedPath, array $allowedPaths, string $default): string + { + $value = trim($requestedPath); + if ($value === '') { + return $default; + } + + foreach ($allowedPaths as $prefix) { + if (str_starts_with($value, $prefix)) { + return $value; + } + } + + return $default; + } +} diff --git a/src/Core/Http/SslCertificateResolver.php b/src/Core/Http/SslCertificateResolver.php new file mode 100644 index 0000000..4b327ce --- /dev/null +++ b/src/Core/Http/SslCertificateResolver.php @@ -0,0 +1,30 @@ +pdo->prepare( + 'UPDATE ' . $table . ' SET ' . $column . ' = NOT ' . $column . ' WHERE id = :id' + ); + + return $statement->execute(['id' => $id]); + } +} diff --git a/src/Modules/Accounting/ReceiptController.php b/src/Modules/Accounting/ReceiptController.php index 45319f2..8956011 100644 --- a/src/Modules/Accounting/ReceiptController.php +++ b/src/Modules/Accounting/ReceiptController.php @@ -26,7 +26,8 @@ final class ReceiptController private readonly ReceiptConfigRepository $receiptConfigs, private readonly CompanySettingsRepository $companySettings, private readonly OrdersRepository $orders, - private readonly AutomationService $automation + private readonly AutomationService $automation, + private readonly ReceiptService $receiptService ) { } @@ -48,14 +49,8 @@ final class ReceiptController $order = is_array($details['order'] ?? null) ? $details['order'] : []; $items = is_array($details['items'] ?? null) ? $details['items'] : []; - $seller = $this->companySettings->getSettings(); - $totalGross = 0.0; - foreach ($items as $item) { - $qty = (float) ($item['quantity'] ?? 0); - $price = $item['original_price_with_tax'] !== null ? (float) $item['original_price_with_tax'] : 0.0; - $totalGross += $qty * $price; - } + $totalGross = $this->receiptService->calculateTotalGross($items); $html = $this->template->render('orders/receipt-create', [ 'title' => $this->translator->get('receipts.create.title'), @@ -67,7 +62,7 @@ final class ReceiptController 'order' => $order, 'items' => $items, 'configs' => array_values($configs), - 'seller' => $seller, + 'seller' => $this->companySettings->getSettings(), 'totalGross' => $totalGross, 'existingReceipts' => $existingReceipts, ], 'layouts/app'); @@ -90,98 +85,13 @@ final class ReceiptController return Response::redirect('/orders/' . $orderId . '/receipt/create'); } - $config = $this->receiptConfigs->findById($configId); - if ($config === null || (int) ($config['is_active'] ?? 0) !== 1) { - Flash::set('order.error', $this->translator->get('receipts.create.invalid_config')); - return Response::redirect('/orders/' . $orderId . '/receipt/create'); - } - - $details = $this->orders->findDetails($orderId); - if ($details === null) { - return Response::html('Not found', 404); - } - - $order = is_array($details['order'] ?? null) ? $details['order'] : []; - $items = is_array($details['items'] ?? null) ? $details['items'] : []; - $addresses = is_array($details['addresses'] ?? null) ? $details['addresses'] : []; - $payments = is_array($details['payments'] ?? null) ? $details['payments'] : []; - - $seller = $this->companySettings->getSettings(); - $sellerSnapshot = [ - 'company_name' => $seller['company_name'] ?? '', - 'tax_number' => $seller['tax_number'] ?? '', - 'street' => $seller['street'] ?? '', - 'city' => $seller['city'] ?? '', - 'postal_code' => $seller['postal_code'] ?? '', - 'phone' => $seller['phone'] ?? '', - 'email' => $seller['email'] ?? '', - 'bank_account' => $seller['bank_account'] ?? '', - 'bdo_number' => $seller['bdo_number'] ?? '', - 'regon' => $seller['regon'] ?? '', - 'court_register' => $seller['court_register'] ?? '', - ]; - - $buyerAddress = $this->resolveBuyerAddress($addresses); - $buyerSnapshot = $buyerAddress !== null ? [ - 'name' => $buyerAddress['name'] ?? '', - 'company_name' => $buyerAddress['company_name'] ?? '', - 'tax_number' => $buyerAddress['company_tax_number'] ?? '', - 'street' => trim(($buyerAddress['street_name'] ?? '') . ' ' . ($buyerAddress['street_number'] ?? '')), - 'city' => $buyerAddress['city'] ?? '', - 'postal_code' => $buyerAddress['zip_code'] ?? '', - 'phone' => $buyerAddress['phone'] ?? '', - 'email' => $buyerAddress['email'] ?? '', - ] : null; - - $itemsSnapshot = []; - $totalGross = 0.0; - foreach ($items as $item) { - $qty = (float) ($item['quantity'] ?? 0); - $price = $item['original_price_with_tax'] !== null ? (float) $item['original_price_with_tax'] : 0.0; - $lineTotal = $qty * $price; - $totalGross += $lineTotal; - $itemsSnapshot[] = [ - 'name' => $item['original_name'] ?? '', - 'quantity' => $qty, - 'price' => $price, - 'total' => $lineTotal, - 'sku' => $item['sku'] ?? '', - 'ean' => $item['ean'] ?? '', - ]; - } - - $issueDate = trim((string) $request->input('issue_date', '')); - if ($issueDate !== '' && strtotime($issueDate) !== false) { - $issueDate = date('Y-m-d H:i:s', strtotime($issueDate)); - } else { - $issueDate = date('Y-m-d H:i:s'); - } - - $saleDate = $this->resolveSaleDate($config, $order, $payments, $issueDate); - - $orderReference = $this->resolveOrderReference($config, $order); + $user = $this->auth->user(); try { - $receiptNumber = $this->receipts->getNextNumber( - $configId, - (string) ($config['number_format'] ?? 'PAR/%N/%M/%Y'), - (string) ($config['numbering_type'] ?? 'monthly') - ); - - $user = $this->auth->user(); - - $this->receipts->create([ + $result = $this->receiptService->issue([ 'order_id' => $orderId, 'config_id' => $configId, - 'receipt_number' => $receiptNumber, - 'issue_date' => $issueDate, - 'sale_date' => $saleDate, - 'seller_data_json' => json_encode($sellerSnapshot, JSON_UNESCAPED_UNICODE), - 'buyer_data_json' => $buyerSnapshot !== null ? json_encode($buyerSnapshot, JSON_UNESCAPED_UNICODE) : null, - 'items_json' => json_encode($itemsSnapshot, JSON_UNESCAPED_UNICODE), - 'total_net' => number_format($totalGross, 2, '.', ''), - 'total_gross' => number_format($totalGross, 2, '.', ''), - 'order_reference_value' => $orderReference, + 'issue_date_override' => (string) $request->input('issue_date', ''), 'created_by' => is_array($user) ? ($user['id'] ?? null) : null, ]); @@ -189,19 +99,20 @@ final class ReceiptController $this->orders->recordActivity( $orderId, 'receipt_issued', - 'Wystawiono paragon: ' . $receiptNumber, - ['receipt_number' => $receiptNumber, 'config_id' => $configId, 'total_gross' => number_format($totalGross, 2, '.', '')], + 'Wystawiono paragon: ' . $result['receipt_number'], + ['receipt_number' => $result['receipt_number'], 'config_id' => $configId, 'total_gross' => $result['total_gross']], 'user', $userName !== '' ? $userName : null ); - Flash::set('order.success', 'Paragon wystawiony: ' . $receiptNumber); + Flash::set('order.success', 'Paragon wystawiony: ' . $result['receipt_number']); try { $this->automation->trigger('receipt.created', $orderId); } catch (Throwable) { - // Blad automatyzacji nie blokuje sukcesu paragonu } + } catch (ReceiptIssueException $e) { + Flash::set('order.error', $e->getMessage()); } catch (Throwable) { Flash::set('order.error', 'Blad wystawiania paragonu'); } @@ -209,71 +120,6 @@ final class ReceiptController return Response::redirect('/orders/' . $orderId); } - /** - * @param list> $addresses - * @return array|null - */ - private function resolveBuyerAddress(array $addresses): ?array - { - $byType = []; - foreach ($addresses as $addr) { - $type = (string) ($addr['address_type'] ?? ''); - if ($type !== '' && !isset($byType[$type])) { - $byType[$type] = $addr; - } - } - - return $byType['invoice'] ?? $byType['customer'] ?? null; - } - - /** - * @param array $config - * @param array $order - * @param list> $payments - */ - private function resolveSaleDate(array $config, array $order, array $payments, string $issueDate): string - { - $source = (string) ($config['sale_date_source'] ?? 'issue_date'); - - if ($source === 'order_date') { - $ordered = (string) ($order['ordered_at'] ?? ''); - if ($ordered !== '') { - $ts = strtotime($ordered); - return $ts !== false ? date('Y-m-d', $ts) : $issueDate; - } - } - - if ($source === 'payment_date' && $payments !== []) { - $lastPayment = $payments[0] ?? []; - $payDate = (string) ($lastPayment['payment_date'] ?? ''); - if ($payDate !== '') { - $ts = strtotime($payDate); - return $ts !== false ? date('Y-m-d', $ts) : $issueDate; - } - } - - return $issueDate; - } - - /** - * @param array $config - * @param array $order - */ - private function resolveOrderReference(array $config, array $order): ?string - { - $ref = (string) ($config['order_reference'] ?? 'none'); - - if ($ref === 'orderpro') { - return (string) ($order['internal_order_number'] ?? ''); - } - - if ($ref === 'integration') { - return (string) ($order['external_order_id'] ?? ''); - } - - return null; - } - public function show(Request $request): Response { $orderId = max(0, (int) $request->input('id', 0)); diff --git a/src/Modules/Accounting/ReceiptIssueException.php b/src/Modules/Accounting/ReceiptIssueException.php new file mode 100644 index 0000000..e388562 --- /dev/null +++ b/src/Modules/Accounting/ReceiptIssueException.php @@ -0,0 +1,10 @@ +receiptConfigs->findById($configId); + if ($config === null || (int) ($config['is_active'] ?? 0) !== 1) { + throw new ReceiptIssueException('Nieprawidlowa lub nieaktywna konfiguracja paragonu'); + } + + $details = $this->orders->findDetails($orderId); + if ($details === null) { + throw new ReceiptIssueException('Zamowienie nie istnieje'); + } + + $order = is_array($details['order'] ?? null) ? $details['order'] : []; + $items = is_array($details['items'] ?? null) ? $details['items'] : []; + $addresses = is_array($details['addresses'] ?? null) ? $details['addresses'] : []; + $payments = is_array($details['payments'] ?? null) ? $details['payments'] : []; + + $issueDateOverride = trim((string) ($params['issue_date_override'] ?? '')); + if ($issueDateOverride !== '' && strtotime($issueDateOverride) !== false) { + $issueDate = date('Y-m-d H:i:s', strtotime($issueDateOverride)); + } else { + $issueDateMode = (string) ($params['issue_date_mode'] ?? 'today'); + $issueDate = $this->resolveIssueDate($issueDateMode, $order, $payments); + } + + $saleDate = $this->resolveSaleDate($config, $order, $payments, $issueDate); + $orderReference = $this->resolveOrderReference($config, $order); + $sellerSnapshot = $this->buildSellerSnapshot(); + $buyerSnapshot = $this->buildBuyerSnapshot($addresses); + ['items' => $itemsSnapshot, 'total_gross' => $totalGross] = $this->buildItemsSnapshot($items); + + $receiptNumber = $this->receipts->getNextNumber( + $configId, + (string) ($config['number_format'] ?? 'PAR/%N/%M/%Y'), + (string) ($config['numbering_type'] ?? 'monthly') + ); + + $this->receipts->create([ + 'order_id' => $orderId, + 'config_id' => $configId, + 'receipt_number' => $receiptNumber, + 'issue_date' => $issueDate, + 'sale_date' => $saleDate, + 'seller_data_json' => json_encode($sellerSnapshot, JSON_UNESCAPED_UNICODE), + 'buyer_data_json' => $buyerSnapshot !== null ? json_encode($buyerSnapshot, JSON_UNESCAPED_UNICODE) : null, + 'items_json' => json_encode($itemsSnapshot, JSON_UNESCAPED_UNICODE), + 'total_net' => number_format($totalGross, 2, '.', ''), + 'total_gross' => number_format($totalGross, 2, '.', ''), + 'order_reference_value' => $orderReference, + 'created_by' => $params['created_by'] ?? null, + ]); + + return [ + 'receipt_number' => $receiptNumber, + 'total_gross' => number_format($totalGross, 2, '.', ''), + ]; + } + + /** + * @param list> $items + */ + public function calculateTotalGross(array $items): float + { + $total = 0.0; + foreach ($items as $item) { + $qty = (float) ($item['quantity'] ?? 0); + $price = $item['original_price_with_tax'] !== null ? (float) $item['original_price_with_tax'] : 0.0; + $total += $qty * $price; + } + return $total; + } + + /** + * @param array $order + * @param list> $payments + */ + private function resolveIssueDate(string $mode, array $order, array $payments): string + { + if ($mode === 'order_date') { + $orderedAt = trim((string) ($order['ordered_at'] ?? '')); + if ($orderedAt !== '') { + $timestamp = strtotime($orderedAt); + if ($timestamp !== false) { + return date('Y-m-d H:i:s', $timestamp); + } + } + } + + if ($mode === 'payment_date') { + $firstPayment = $payments[0] ?? []; + $paymentDate = trim((string) ($firstPayment['payment_date'] ?? '')); + if ($paymentDate !== '') { + $timestamp = strtotime($paymentDate); + if ($timestamp !== false) { + return date('Y-m-d H:i:s', $timestamp); + } + } + } + + return date('Y-m-d H:i:s'); + } + + /** + * @param array $config + * @param array $order + * @param list> $payments + */ + private function resolveSaleDate(array $config, array $order, array $payments, string $issueDate): string + { + $source = (string) ($config['sale_date_source'] ?? 'issue_date'); + + if ($source === 'order_date') { + $ordered = (string) ($order['ordered_at'] ?? ''); + if ($ordered !== '') { + $ts = strtotime($ordered); + return $ts !== false ? date('Y-m-d H:i:s', $ts) : $issueDate; + } + } + + if ($source === 'payment_date' && $payments !== []) { + $lastPayment = $payments[0] ?? []; + $payDate = (string) ($lastPayment['payment_date'] ?? ''); + if ($payDate !== '') { + $ts = strtotime($payDate); + return $ts !== false ? date('Y-m-d H:i:s', $ts) : $issueDate; + } + } + + return $issueDate; + } + + /** + * @param array $config + * @param array $order + */ + private function resolveOrderReference(array $config, array $order): ?string + { + $ref = (string) ($config['order_reference'] ?? 'none'); + + if ($ref === 'orderpro') { + return (string) ($order['internal_order_number'] ?? ''); + } + + if ($ref === 'integration') { + return (string) ($order['external_order_id'] ?? ''); + } + + return null; + } + + /** + * @return array + */ + private function buildSellerSnapshot(): array + { + $seller = $this->companySettings->getSettings(); + + return [ + 'company_name' => $seller['company_name'] ?? '', + 'tax_number' => $seller['tax_number'] ?? '', + 'street' => $seller['street'] ?? '', + 'city' => $seller['city'] ?? '', + 'postal_code' => $seller['postal_code'] ?? '', + 'phone' => $seller['phone'] ?? '', + 'email' => $seller['email'] ?? '', + 'bank_account' => $seller['bank_account'] ?? '', + 'bdo_number' => $seller['bdo_number'] ?? '', + 'regon' => $seller['regon'] ?? '', + 'court_register' => $seller['court_register'] ?? '', + ]; + } + + /** + * @param list> $addresses + * @return array|null + */ + private function buildBuyerSnapshot(array $addresses): ?array + { + $buyerAddress = $this->resolveBuyerAddress($addresses); + if ($buyerAddress === null) { + return null; + } + + return [ + 'name' => $buyerAddress['name'] ?? '', + 'company_name' => $buyerAddress['company_name'] ?? '', + 'tax_number' => $buyerAddress['company_tax_number'] ?? '', + 'street' => trim(($buyerAddress['street_name'] ?? '') . ' ' . ($buyerAddress['street_number'] ?? '')), + 'city' => $buyerAddress['city'] ?? '', + 'postal_code' => $buyerAddress['zip_code'] ?? '', + 'phone' => $buyerAddress['phone'] ?? '', + 'email' => $buyerAddress['email'] ?? '', + ]; + } + + /** + * @param list> $addresses + * @return array|null + */ + private function resolveBuyerAddress(array $addresses): ?array + { + $byType = []; + foreach ($addresses as $addr) { + $type = (string) ($addr['address_type'] ?? ''); + if ($type !== '' && !isset($byType[$type])) { + $byType[$type] = $addr; + } + } + + return $byType['invoice'] ?? $byType['customer'] ?? null; + } + + /** + * @param list> $items + * @return array{items: list>, total_gross: float} + */ + private function buildItemsSnapshot(array $items): array + { + $itemsSnapshot = []; + $totalGross = 0.0; + foreach ($items as $item) { + $qty = (float) ($item['quantity'] ?? 0); + $price = $item['original_price_with_tax'] !== null ? (float) $item['original_price_with_tax'] : 0.0; + $lineTotal = $qty * $price; + $totalGross += $lineTotal; + $itemsSnapshot[] = [ + 'name' => $item['original_name'] ?? '', + 'quantity' => $qty, + 'price' => $price, + 'total' => $lineTotal, + 'sku' => $item['sku'] ?? '', + 'ean' => $item['ean'] ?? '', + ]; + } + + return [ + 'items' => $itemsSnapshot, + 'total_gross' => $totalGross, + ]; + } +} diff --git a/src/Modules/Automation/AutomationRepository.php b/src/Modules/Automation/AutomationRepository.php index f4f681a..3775697 100644 --- a/src/Modules/Automation/AutomationRepository.php +++ b/src/Modules/Automation/AutomationRepository.php @@ -3,11 +3,15 @@ declare(strict_types=1); namespace App\Modules\Automation; +use App\Core\Http\ToggleableRepositoryTrait; use PDO; use Throwable; final class AutomationRepository { + use ToggleableRepositoryTrait { + toggleActive as private traitToggleActive; + } public function __construct( private readonly PDO $pdo ) { @@ -150,10 +154,7 @@ final class AutomationRepository public function toggleActive(int $id): void { - $statement = $this->pdo->prepare( - 'UPDATE automation_rules SET is_active = NOT is_active WHERE id = :id' - ); - $statement->execute(['id' => $id]); + $this->traitToggleActive('automation_rules', $id); } /** diff --git a/src/Modules/Automation/AutomationService.php b/src/Modules/Automation/AutomationService.php index 540db76..cd90d72 100644 --- a/src/Modules/Automation/AutomationService.php +++ b/src/Modules/Automation/AutomationService.php @@ -3,7 +3,9 @@ declare(strict_types=1); namespace App\Modules\Automation; +use App\Modules\Accounting\ReceiptIssueException; use App\Modules\Accounting\ReceiptRepository; +use App\Modules\Accounting\ReceiptService; use App\Modules\Email\EmailSendingService; use App\Modules\Orders\OrdersRepository; use App\Modules\Settings\CompanySettingsRepository; @@ -36,7 +38,8 @@ final class AutomationService private readonly CompanySettingsRepository $companySettings, private readonly ReceiptRepository $receipts, private readonly ReceiptConfigRepository $receiptConfigs, - private readonly ShipmentPackageRepository $shipmentPackages + private readonly ShipmentPackageRepository $shipmentPackages, + private readonly ReceiptService $receiptService ) { } @@ -347,22 +350,8 @@ final class AutomationService if ($configId <= 0) { return; } - $issueDateMode = (string) ($config['issue_date_mode'] ?? 'today'); $duplicatePolicy = (string) ($config['duplicate_policy'] ?? 'skip_if_exists'); - $receiptConfig = $this->receiptConfigs->findById($configId); - if ($receiptConfig === null || (int) ($receiptConfig['is_active'] ?? 0) !== 1) { - $this->orders->recordActivity( - $orderId, - 'automation_receipt_failed', - $actorName . ' - nieprawidlowa lub nieaktywna konfiguracja paragonu', - ['receipt_config_id' => $configId], - 'system', - $actorName - ); - return; - } - $existingReceipts = $this->receipts->findByOrderId($orderId); if ($duplicatePolicy === 'skip_if_exists' && $existingReceipts !== []) { $this->orders->recordActivity( @@ -376,55 +365,23 @@ final class AutomationService return; } - $details = $this->orders->findDetails($orderId); - if ($details === null) { - return; - } - $order = is_array($details['order'] ?? null) ? $details['order'] : []; - $items = is_array($details['items'] ?? null) ? $details['items'] : []; - $addresses = is_array($details['addresses'] ?? null) ? $details['addresses'] : []; - $payments = is_array($details['payments'] ?? null) ? $details['payments'] : []; - - $issueDate = $this->resolveIssueDate($issueDateMode, $order, $payments); - $saleDate = $this->resolveSaleDate($receiptConfig, $order, $payments, $issueDate); - $orderReference = $this->resolveOrderReference($receiptConfig, $order); - $sellerSnapshot = $this->buildSellerSnapshot(); - $buyerSnapshot = $this->buildBuyerSnapshot($addresses); - ['items' => $itemsSnapshot, 'total_gross' => $totalGross] = $this->buildItemsSnapshot($items); - try { - $receiptNumber = $this->receipts->getNextNumber( - $configId, - (string) ($receiptConfig['number_format'] ?? 'PAR/%N/%M/%Y'), - (string) ($receiptConfig['numbering_type'] ?? 'monthly') - ); - $this->receipts->create([ + $result = $this->receiptService->issue([ 'order_id' => $orderId, 'config_id' => $configId, - 'receipt_number' => $receiptNumber, - 'issue_date' => $issueDate, - 'sale_date' => $saleDate, - 'seller_data_json' => json_encode($sellerSnapshot, JSON_UNESCAPED_UNICODE), - 'buyer_data_json' => $buyerSnapshot !== null ? json_encode($buyerSnapshot, JSON_UNESCAPED_UNICODE) : null, - 'items_json' => json_encode($itemsSnapshot, JSON_UNESCAPED_UNICODE), - 'total_net' => number_format($totalGross, 2, '.', ''), - 'total_gross' => number_format($totalGross, 2, '.', ''), - 'order_reference_value' => $orderReference, + 'issue_date_mode' => (string) ($config['issue_date_mode'] ?? 'today'), 'created_by' => null, ]); $this->orders->recordActivity( $orderId, 'receipt_issued', - 'Wystawiono paragon: ' . $receiptNumber, - ['receipt_number' => $receiptNumber, 'config_id' => $configId, 'total_gross' => number_format($totalGross, 2, '.', '')], + 'Wystawiono paragon: ' . $result['receipt_number'], + ['receipt_number' => $result['receipt_number'], 'config_id' => $configId, 'total_gross' => $result['total_gross']], 'system', $actorName ); - // Chain automation: issuing receipt from one rule should trigger - // rules listening on receipt.created. Uses generic chain context - // with depth + rule deduplication to prevent loops. $this->emitEvent( 'receipt.created', $orderId, @@ -432,10 +389,19 @@ final class AutomationService [ 'automation_source' => 'issue_receipt', 'automation_rule' => $ruleName, - 'receipt_number' => $receiptNumber, + 'receipt_number' => $result['receipt_number'], 'receipt_config_id' => $configId, ] ); + } catch (ReceiptIssueException $e) { + $this->orders->recordActivity( + $orderId, + 'automation_receipt_failed', + $actorName . ' - ' . $e->getMessage(), + ['receipt_config_id' => $configId], + 'system', + $actorName + ); } catch (Throwable $exception) { $this->orders->recordActivity( $orderId, @@ -593,175 +559,6 @@ final class AutomationService return $this->shipmentPackages->findLatestByOrderId($orderId); } - /** - * @param array $order - * @param list> $payments - */ - private function resolveIssueDate(string $mode, array $order, array $payments): string - { - if ($mode === 'order_date') { - $orderedAt = trim((string) ($order['ordered_at'] ?? '')); - if ($orderedAt !== '') { - $timestamp = strtotime($orderedAt); - if ($timestamp !== false) { - return date('Y-m-d', $timestamp); - } - } - } - - if ($mode === 'payment_date') { - $firstPayment = $payments[0] ?? []; - $paymentDate = trim((string) ($firstPayment['payment_date'] ?? '')); - if ($paymentDate !== '') { - $timestamp = strtotime($paymentDate); - if ($timestamp !== false) { - return date('Y-m-d', $timestamp); - } - } - } - - return date('Y-m-d'); - } - - /** - * @param array $receiptConfig - * @param array $order - * @param list> $payments - */ - private function resolveSaleDate(array $receiptConfig, array $order, array $payments, string $issueDate): string - { - $source = (string) ($receiptConfig['sale_date_source'] ?? 'issue_date'); - - if ($source === 'order_date') { - $ordered = (string) ($order['ordered_at'] ?? ''); - if ($ordered !== '') { - $ts = strtotime($ordered); - return $ts !== false ? date('Y-m-d', $ts) : $issueDate; - } - } - - if ($source === 'payment_date' && $payments !== []) { - $lastPayment = $payments[0] ?? []; - $payDate = (string) ($lastPayment['payment_date'] ?? ''); - if ($payDate !== '') { - $ts = strtotime($payDate); - return $ts !== false ? date('Y-m-d', $ts) : $issueDate; - } - } - - return $issueDate; - } - - /** - * @param array $receiptConfig - * @param array $order - */ - private function resolveOrderReference(array $receiptConfig, array $order): ?string - { - $ref = (string) ($receiptConfig['order_reference'] ?? 'none'); - - if ($ref === 'orderpro') { - return (string) ($order['internal_order_number'] ?? ''); - } - - if ($ref === 'integration') { - return (string) ($order['external_order_id'] ?? ''); - } - - return null; - } - - /** - * @return array - */ - private function buildSellerSnapshot(): array - { - $seller = $this->companySettings->getSettings(); - - return [ - 'company_name' => $seller['company_name'] ?? '', - 'tax_number' => $seller['tax_number'] ?? '', - 'street' => $seller['street'] ?? '', - 'city' => $seller['city'] ?? '', - 'postal_code' => $seller['postal_code'] ?? '', - 'phone' => $seller['phone'] ?? '', - 'email' => $seller['email'] ?? '', - 'bank_account' => $seller['bank_account'] ?? '', - 'bdo_number' => $seller['bdo_number'] ?? '', - 'regon' => $seller['regon'] ?? '', - 'court_register' => $seller['court_register'] ?? '', - ]; - } - - /** - * @param list> $addresses - * @return array|null - */ - private function buildBuyerSnapshot(array $addresses): ?array - { - $buyerAddress = $this->resolveBuyerAddress($addresses); - if ($buyerAddress === null) { - return null; - } - - return [ - 'name' => $buyerAddress['name'] ?? '', - 'company_name' => $buyerAddress['company_name'] ?? '', - 'tax_number' => $buyerAddress['company_tax_number'] ?? '', - 'street' => trim((string) (($buyerAddress['street_name'] ?? '') . ' ' . ($buyerAddress['street_number'] ?? ''))), - 'city' => $buyerAddress['city'] ?? '', - 'postal_code' => $buyerAddress['zip_code'] ?? '', - 'phone' => $buyerAddress['phone'] ?? '', - 'email' => $buyerAddress['email'] ?? '', - ]; - } - - /** - * @param list> $addresses - * @return array|null - */ - private function resolveBuyerAddress(array $addresses): ?array - { - $byType = []; - foreach ($addresses as $address) { - $type = (string) ($address['address_type'] ?? ''); - if ($type !== '' && !isset($byType[$type])) { - $byType[$type] = $address; - } - } - - return $byType['invoice'] ?? $byType['customer'] ?? null; - } - - /** - * @param list> $items - * @return array{items:list>,total_gross:float} - */ - private function buildItemsSnapshot(array $items): array - { - $itemsSnapshot = []; - $totalGross = 0.0; - foreach ($items as $item) { - $qty = (float) ($item['quantity'] ?? 0); - $price = $item['original_price_with_tax'] !== null ? (float) $item['original_price_with_tax'] : 0.0; - $lineTotal = $qty * $price; - $totalGross += $lineTotal; - $itemsSnapshot[] = [ - 'name' => $item['original_name'] ?? '', - 'quantity' => $qty, - 'price' => $price, - 'total' => $lineTotal, - 'sku' => $item['sku'] ?? '', - 'ean' => $item['ean'] ?? '', - ]; - } - - return [ - 'items' => $itemsSnapshot, - 'total_gross' => $totalGross, - ]; - } - /** * @param array $context * @return array{chain_id:string,depth:int,executions:list} diff --git a/src/Modules/Cron/CronHandlerFactory.php b/src/Modules/Cron/CronHandlerFactory.php index 701f853..cfa13e9 100644 --- a/src/Modules/Cron/CronHandlerFactory.php +++ b/src/Modules/Cron/CronHandlerFactory.php @@ -7,6 +7,7 @@ use App\Core\I18n\Translator; use App\Core\Support\Logger; use App\Core\View\Template; use App\Modules\Accounting\ReceiptRepository; +use App\Modules\Accounting\ReceiptService; use App\Modules\Automation\AutomationRepository; use App\Modules\Automation\AutomationService; use App\Modules\Automation\AutomationExecutionLogRepository; @@ -207,15 +208,26 @@ final class CronHandlerFactory ) ); + $receiptRepository = new ReceiptRepository($this->db); + $receiptConfigRepository = new ReceiptConfigRepository($this->db); + + $receiptService = new ReceiptService( + $receiptRepository, + $receiptConfigRepository, + $companySettingsRepository, + $ordersRepository + ); + return new AutomationService( $automationRepository, $executionLogRepository, $emailService, $ordersRepository, $companySettingsRepository, - new ReceiptRepository($this->db), - new ReceiptConfigRepository($this->db), - new ShipmentPackageRepository($this->db) + $receiptRepository, + $receiptConfigRepository, + new ShipmentPackageRepository($this->db), + $receiptService ); } } diff --git a/src/Modules/Cron/ShipmentTrackingHandler.php b/src/Modules/Cron/ShipmentTrackingHandler.php index 9342792..74fd08b 100644 --- a/src/Modules/Cron/ShipmentTrackingHandler.php +++ b/src/Modules/Cron/ShipmentTrackingHandler.php @@ -10,6 +10,8 @@ use Throwable; final class ShipmentTrackingHandler { + private const ALLEGRO_EDGE_RATE_LIMIT_SECONDS = 60; + public function __construct( private readonly ShipmentTrackingRegistry $registry, private readonly ShipmentPackageRepository $repository, @@ -28,6 +30,8 @@ final class ShipmentTrackingHandler $updated = 0; $errors = 0; + $lastAllegroEdgeRequestTime = 0.0; + foreach ($packages as $package) { $provider = trim((string) ($package['provider'] ?? '')); $packageId = (int) ($package['id'] ?? 0); @@ -38,6 +42,20 @@ final class ShipmentTrackingHandler } try { + if ($provider === 'allegro_wza') { + $carrierId = strtolower(trim((string) ($package['carrier_id'] ?? ''))); + $isInpost = str_contains($carrierId, 'inpost') || str_contains($carrierId, 'paczkomat'); + + if (!$isInpost) { + $elapsed = microtime(true) - $lastAllegroEdgeRequestTime; + if ($elapsed < self::ALLEGRO_EDGE_RATE_LIMIT_SECONDS) { + $sleepTime = (int) ceil(self::ALLEGRO_EDGE_RATE_LIMIT_SECONDS - $elapsed); + sleep($sleepTime); + } + $lastAllegroEdgeRequestTime = microtime(true); + } + } + $result = $service->getDeliveryStatus($package); if ($result !== null) { $previousStatus = trim((string) ($package['delivery_status'] ?? 'unknown')); diff --git a/src/Modules/Settings/AllegroApiClient.php b/src/Modules/Settings/AllegroApiClient.php index e109378..b00a6fb 100644 --- a/src/Modules/Settings/AllegroApiClient.php +++ b/src/Modules/Settings/AllegroApiClient.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Modules\Settings; use App\Core\Exceptions\AllegroApiException; +use App\Core\Http\SslCertificateResolver; final class AllegroApiClient { @@ -171,29 +172,6 @@ final class AllegroApiClient ]); } - private function getCaBundlePath(): ?string - { - $envPath = (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''); - if ($envPath !== '' && is_file($envPath)) { - return $envPath; - } - $iniPath = (string) ini_get('curl.cainfo'); - if ($iniPath !== '' && is_file($iniPath)) { - return $iniPath; - } - $candidates = [ - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if (is_file($path)) { - return $path; - } - } - return null; - } - /** * @param array $opts * @return array @@ -202,7 +180,7 @@ final class AllegroApiClient { $opts[CURLOPT_SSL_VERIFYPEER] = true; $opts[CURLOPT_SSL_VERIFYHOST] = 2; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } diff --git a/src/Modules/Settings/AllegroIntegrationController.php b/src/Modules/Settings/AllegroIntegrationController.php index d3edf5a..a6170f1 100644 --- a/src/Modules/Settings/AllegroIntegrationController.php +++ b/src/Modules/Settings/AllegroIntegrationController.php @@ -16,6 +16,7 @@ use DateTimeImmutable; use App\Core\Constants\IntegrationSources; use App\Core\Constants\RedirectPaths; use App\Core\Exceptions\IntegrationConfigException; +use App\Core\Http\RedirectPathResolver; use Throwable; final class AllegroIntegrationController @@ -115,7 +116,7 @@ final class AllegroIntegrationController public function save(Request $request): Response { - $redirectTo = $this->resolveRedirectPath((string) $request->input('return_to', RedirectPaths::ALLEGRO_INTEGRATION)); + $redirectTo = RedirectPathResolver::resolve((string) $request->input('return_to', RedirectPaths::ALLEGRO_INTEGRATION), ['/settings/integrations'], RedirectPaths::ALLEGRO_INTEGRATION); if (!Csrf::validate((string) $request->input('_token', ''))) { Flash::set('settings_error', $this->translator->get('auth.errors.csrf_expired')); return Response::redirect($redirectTo); @@ -383,19 +384,6 @@ final class AllegroIntegrationController return Response::redirect(RedirectPaths::ALLEGRO_INTEGRATION); } - private function resolveRedirectPath(string $candidate): string - { - $value = trim($candidate); - if ($value === '') { - return RedirectPaths::ALLEGRO_INTEGRATION; - } - if (!str_starts_with($value, '/settings/integrations')) { - return RedirectPaths::ALLEGRO_INTEGRATION; - } - - return $value; - } - /** * @return array */ diff --git a/src/Modules/Settings/AllegroOAuthClient.php b/src/Modules/Settings/AllegroOAuthClient.php index d335896..03b58a9 100644 --- a/src/Modules/Settings/AllegroOAuthClient.php +++ b/src/Modules/Settings/AllegroOAuthClient.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Modules\Settings; use App\Core\Exceptions\AllegroOAuthException; +use App\Core\Http\SslCertificateResolver; final class AllegroOAuthClient { @@ -127,29 +128,6 @@ final class AllegroOAuthClient return trim(strtolower($environment)) === 'production' ? 'production' : 'sandbox'; } - private function getCaBundlePath(): ?string - { - $envPath = (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''); - if ($envPath !== '' && is_file($envPath)) { - return $envPath; - } - $iniPath = (string) ini_get('curl.cainfo'); - if ($iniPath !== '' && is_file($iniPath)) { - return $iniPath; - } - $candidates = [ - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if (is_file($path)) { - return $path; - } - } - return null; - } - /** * @param array $formData * @return array @@ -179,7 +157,7 @@ final class AllegroOAuthClient ], CURLOPT_POSTFIELDS => http_build_query($formData), ]; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $sslOpts[CURLOPT_CAINFO] = $caPath; } diff --git a/src/Modules/Settings/ApaczkaApiClient.php b/src/Modules/Settings/ApaczkaApiClient.php index 6f5ad94..8788428 100644 --- a/src/Modules/Settings/ApaczkaApiClient.php +++ b/src/Modules/Settings/ApaczkaApiClient.php @@ -4,34 +4,12 @@ declare(strict_types=1); namespace App\Modules\Settings; use App\Core\Exceptions\ApaczkaApiException; +use App\Core\Http\SslCertificateResolver; final class ApaczkaApiClient { private const API_BASE_URL = 'https://www.apaczka.pl/api/v2'; - private function getCaBundlePath(): ?string - { - $envPath = (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''); - if ($envPath !== '' && is_file($envPath)) { - return $envPath; - } - $iniPath = (string) ini_get('curl.cainfo'); - if ($iniPath !== '' && is_file($iniPath)) { - return $iniPath; - } - $candidates = [ - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if (is_file($path)) { - return $path; - } - } - return null; - } - /** * @return array> */ @@ -217,7 +195,7 @@ final class ApaczkaApiClient 'User-Agent: orderPRO/1.0', ], ]; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $sslOpts[CURLOPT_CAINFO] = $caPath; } diff --git a/src/Modules/Settings/ApaczkaIntegrationController.php b/src/Modules/Settings/ApaczkaIntegrationController.php index df38996..c54643f 100644 --- a/src/Modules/Settings/ApaczkaIntegrationController.php +++ b/src/Modules/Settings/ApaczkaIntegrationController.php @@ -9,6 +9,7 @@ use App\Core\I18n\Translator; use App\Core\Security\Csrf; use App\Core\Support\Flash; use App\Core\View\Template; +use App\Core\Http\RedirectPathResolver; use App\Modules\Auth\AuthService; use Throwable; @@ -43,7 +44,7 @@ final class ApaczkaIntegrationController public function save(Request $request): Response { - $redirectTo = $this->resolveRedirectPath((string) $request->input('return_to', '/settings/integrations/apaczka')); + $redirectTo = RedirectPathResolver::resolve((string) $request->input('return_to', '/settings/integrations/apaczka'), ['/settings/integrations'], '/settings/integrations/apaczka'); if (!Csrf::validate((string) $request->input('_token', ''))) { Flash::set('settings_error', $this->translator->get('auth.errors.csrf_expired')); @@ -74,7 +75,7 @@ final class ApaczkaIntegrationController public function test(Request $request): Response { - $redirectTo = $this->resolveRedirectPath((string) $request->input('return_to', '/settings/integrations/apaczka')); + $redirectTo = RedirectPathResolver::resolve((string) $request->input('return_to', '/settings/integrations/apaczka'), ['/settings/integrations'], '/settings/integrations/apaczka'); if (!Csrf::validate((string) $request->input('_token', ''))) { Flash::set('settings_error', $this->translator->get('auth.errors.csrf_expired')); return Response::redirect($redirectTo); @@ -95,16 +96,4 @@ final class ApaczkaIntegrationController return Response::redirect($redirectTo); } - private function resolveRedirectPath(string $candidate): string - { - $value = trim($candidate); - if ($value === '') { - return '/settings/integrations/apaczka'; - } - if (!str_starts_with($value, '/settings/integrations')) { - return '/settings/integrations/apaczka'; - } - - return $value; - } } diff --git a/src/Modules/Settings/EmailMailboxRepository.php b/src/Modules/Settings/EmailMailboxRepository.php index eb555a6..e8e757f 100644 --- a/src/Modules/Settings/EmailMailboxRepository.php +++ b/src/Modules/Settings/EmailMailboxRepository.php @@ -3,10 +3,12 @@ declare(strict_types=1); namespace App\Modules\Settings; +use App\Core\Http\ToggleableRepositoryTrait; use PDO; final class EmailMailboxRepository { + use ToggleableRepositoryTrait; public function __construct( private readonly PDO $pdo, private readonly IntegrationSecretCipher $cipher @@ -151,9 +153,6 @@ final class EmailMailboxRepository public function toggleStatus(int $id): void { - $statement = $this->pdo->prepare( - 'UPDATE email_mailboxes SET is_active = NOT is_active WHERE id = :id' - ); - $statement->execute(['id' => $id]); + $this->toggleActive('email_mailboxes', $id); } } diff --git a/src/Modules/Settings/EmailTemplateRepository.php b/src/Modules/Settings/EmailTemplateRepository.php index c448202..3cc8253 100644 --- a/src/Modules/Settings/EmailTemplateRepository.php +++ b/src/Modules/Settings/EmailTemplateRepository.php @@ -4,10 +4,12 @@ declare(strict_types=1); namespace App\Modules\Settings; +use App\Core\Http\ToggleableRepositoryTrait; use PDO; final class EmailTemplateRepository { + use ToggleableRepositoryTrait; public function __construct( private readonly PDO $pdo ) { @@ -114,10 +116,7 @@ final class EmailTemplateRepository public function toggleStatus(int $id): void { - $statement = $this->pdo->prepare( - 'UPDATE email_templates SET is_active = NOT is_active WHERE id = :id' - ); - $statement->execute(['id' => $id]); + $this->toggleActive('email_templates', $id); } public function duplicate(int $id): void diff --git a/src/Modules/Settings/InpostIntegrationController.php b/src/Modules/Settings/InpostIntegrationController.php index 235808d..9d6b3d2 100644 --- a/src/Modules/Settings/InpostIntegrationController.php +++ b/src/Modules/Settings/InpostIntegrationController.php @@ -9,6 +9,7 @@ use App\Core\I18n\Translator; use App\Core\Security\Csrf; use App\Core\Support\Flash; use App\Core\View\Template; +use App\Core\Http\RedirectPathResolver; use App\Modules\Auth\AuthService; use Throwable; @@ -42,7 +43,7 @@ final class InpostIntegrationController public function save(Request $request): Response { - $redirectTo = $this->resolveRedirectPath((string) $request->input('return_to', '/settings/integrations/inpost')); + $redirectTo = RedirectPathResolver::resolve((string) $request->input('return_to', '/settings/integrations/inpost'), ['/settings/integrations'], '/settings/integrations/inpost'); if (!Csrf::validate((string) $request->input('_token', ''))) { Flash::set('settings_error', $this->translator->get('auth.errors.csrf_expired')); @@ -77,16 +78,4 @@ final class InpostIntegrationController return Response::redirect($redirectTo); } - private function resolveRedirectPath(string $candidate): string - { - $value = trim($candidate); - if ($value === '') { - return '/settings/integrations/inpost'; - } - if (!str_starts_with($value, '/settings/integrations')) { - return '/settings/integrations/inpost'; - } - - return $value; - } } diff --git a/src/Modules/Settings/ReceiptConfigRepository.php b/src/Modules/Settings/ReceiptConfigRepository.php index cc36f3b..4698153 100644 --- a/src/Modules/Settings/ReceiptConfigRepository.php +++ b/src/Modules/Settings/ReceiptConfigRepository.php @@ -3,11 +3,13 @@ declare(strict_types=1); namespace App\Modules\Settings; +use App\Core\Http\ToggleableRepositoryTrait; use PDO; use Throwable; final class ReceiptConfigRepository { + use ToggleableRepositoryTrait; public function __construct( private readonly PDO $pdo ) { @@ -85,10 +87,7 @@ final class ReceiptConfigRepository public function toggleStatus(int $id): void { - $statement = $this->pdo->prepare( - 'UPDATE receipt_configs SET is_active = NOT is_active WHERE id = :id' - ); - $statement->execute(['id' => $id]); + $this->toggleActive('receipt_configs', $id); } public function delete(int $id): void diff --git a/src/Modules/Settings/ShopproApiClient.php b/src/Modules/Settings/ShopproApiClient.php index d9f3a55..5d3fa02 100644 --- a/src/Modules/Settings/ShopproApiClient.php +++ b/src/Modules/Settings/ShopproApiClient.php @@ -3,31 +3,10 @@ declare(strict_types=1); namespace App\Modules\Settings; +use App\Core\Http\SslCertificateResolver; + final class ShopproApiClient { - private function getCaBundlePath(): ?string - { - $envPath = (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''); - if ($envPath !== '' && is_file($envPath)) { - return $envPath; - } - $iniPath = (string) ini_get('curl.cainfo'); - if ($iniPath !== '' && is_file($iniPath)) { - return $iniPath; - } - $candidates = [ - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if (is_file($path)) { - return $path; - } - } - return null; - } - /** * @return array{ok:bool,http_code:int|null,message:string,items:array>,total:int,page:int,per_page:int} */ @@ -337,7 +316,7 @@ final class ShopproApiClient $opts[CURLOPT_HTTPHEADER] = $headers; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } diff --git a/src/Modules/Shipments/AllegroTrackingService.php b/src/Modules/Shipments/AllegroTrackingService.php index 50e4018..d626a21 100644 --- a/src/Modules/Shipments/AllegroTrackingService.php +++ b/src/Modules/Shipments/AllegroTrackingService.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace App\Modules\Shipments; +use App\Core\Http\SslCertificateResolver; use App\Modules\Settings\InpostIntegrationRepository; use Throwable; @@ -34,8 +35,7 @@ final class AllegroTrackingService implements ShipmentTrackingInterface return $this->fetchInpostStatus($trackingNumber); } - // Allegro Delivery (One Kurier), DHL, DPD via Allegro — brak publicznego API trackingu - return null; + return $this->fetchAllegroEdgeStatus($trackingNumber); } private function fetchInpostStatus(string $trackingNumber): ?array @@ -75,6 +75,88 @@ final class AllegroTrackingService implements ShipmentTrackingInterface } } + private function fetchAllegroEdgeStatus(string $trackingNumber): ?array + { + try { + $url = 'https://edge.allegro.pl/ad/tracking?packageNo=' . rawurlencode($trackingNumber); + $response = $this->edgeApiRequest($url); + + $statuses = $response['status'] ?? []; + if (!is_array($statuses) || $statuses === []) { + return null; + } + + $latest = end($statuses); + $description = trim((string) ($latest['description'] ?? '')); + if ($description === '') { + return null; + } + + $slug = DeliveryStatus::slugifyAllegroDescription($description); + + $normalized = DeliveryStatus::normalize('allegro_edge', $slug); + + if ($normalized === DeliveryStatus::UNKNOWN) { + $normalized = DeliveryStatus::guessStatusFromDescription($description); + + error_log(sprintf( + '[AllegroTracking] Niezmapowany status: "%s" (slug: %s, guessed: %s)', + $description, + $slug, + $normalized + )); + } + + return [ + 'status' => $normalized, + 'status_raw' => $description, + 'description' => $description, + ]; + } catch (Throwable) { + return null; + } + } + + /** + * @return array + */ + private function edgeApiRequest(string $url): array + { + $ch = curl_init($url); + if ($ch === false) { + return []; + } + + $opts = [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_HTTPHEADER => [ + 'Accept: application/vnd.allegro.internal.v1+json', + 'Content-Type: application/vnd.allegro.internal.v1+json', + ], + ]; + + $caPath = SslCertificateResolver::resolve(); + if ($caPath !== null) { + $opts[CURLOPT_CAINFO] = $caPath; + } + + curl_setopt_array($ch, $opts); + $body = curl_exec($ch); + $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + $ch = null; + + if ($body === false || $httpCode < 200 || $httpCode >= 300) { + return []; + } + + $json = json_decode((string) $body, true); + return is_array($json) ? $json : []; + } + private function resolveInpostToken(): ?string { try { @@ -107,7 +189,7 @@ final class AllegroTrackingService implements ShipmentTrackingInterface ], ]; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } @@ -125,20 +207,4 @@ final class AllegroTrackingService implements ShipmentTrackingInterface return is_array($json) ? $json : []; } - private function getCaBundlePath(): ?string - { - $candidates = [ - (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''), - (string) ini_get('curl.cainfo'), - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if ($path !== '' && is_file($path)) { - return $path; - } - } - return null; - } } diff --git a/src/Modules/Shipments/DeliveryStatus.php b/src/Modules/Shipments/DeliveryStatus.php index 6091340..7aacba5 100644 --- a/src/Modules/Shipments/DeliveryStatus.php +++ b/src/Modules/Shipments/DeliveryStatus.php @@ -191,6 +191,65 @@ final class DeliveryStatus 'RETURNED' => 'Zwrócona do nadawcy', ]; + private const ALLEGRO_EDGE_MAP = [ + // Realne slugi z edge API (po slugify opisów) + 'przygotowana_przez_nadawce' => self::CREATED, + 'nadana' => self::CONFIRMED, + 'podjeta_z_maszyny_przez_kuriera' => self::IN_TRANSIT, + 'podjeta_z_punktu_przez_kuriera' => self::IN_TRANSIT, + 'podjeta_z_punktu' => self::IN_TRANSIT, + 'odebrana_przez_kuriera' => self::IN_TRANSIT, + 'przekazal_przesylke_do_magazynu' => self::IN_TRANSIT, + 'przekazana_do_magazynu' => self::IN_TRANSIT, + 'przesylka_wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT, + 'w_sortowni' => self::IN_TRANSIT, + 'wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT, + 'wyslana_z_sortowni' => self::IN_TRANSIT, + 'w_doreczeniu' => self::OUT_FOR_DELIVERY, + 'wydana_do_doreczenia' => self::OUT_FOR_DELIVERY, + 'dostarczana' => self::OUT_FOR_DELIVERY, + 'gotowa_do_odbioru' => self::READY_FOR_PICKUP, + 'oczekuje_na_odbior' => self::READY_FOR_PICKUP, + 'przesylka_oczekuje_na_odbior' => self::READY_FOR_PICKUP, + 'dostarczona' => self::DELIVERED, + 'doreczona' => self::DELIVERED, + 'odebrana' => self::DELIVERED, + 'zwrocona' => self::RETURNED, + 'zwrocona_do_nadawcy' => self::RETURNED, + 'anulowana' => self::CANCELLED, + 'odmowa_przyjecia' => self::PROBLEM, + 'uszkodzona' => self::PROBLEM, + 'zagubiona' => self::PROBLEM, + ]; + + private const ALLEGRO_EDGE_DESCRIPTIONS = [ + 'przygotowana_przez_nadawce' => 'Przesyłka przygotowana przez nadawcę', + 'nadana' => 'Przesyłka nadana', + 'podjeta_z_maszyny_przez_kuriera' => 'Podjęta z maszyny przez kuriera', + 'podjeta_z_punktu_przez_kuriera' => 'Podjęta z punktu przez kuriera', + 'odebrana_przez_kuriera' => 'Odebrana przez kuriera', + 'przekazana_do_magazynu' => 'Przekazana do magazynu', + 'przesylka_wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego', + 'w_sortowni' => 'W sortowni', + 'wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego', + 'wyslana_z_sortowni' => 'Wysłana z sortowni', + 'w_doreczeniu' => 'W doręczeniu', + 'wydana_do_doreczenia' => 'Wydana do doręczenia', + 'dostarczana' => 'Dostarczana', + 'gotowa_do_odbioru' => 'Gotowa do odbioru', + 'oczekuje_na_odbior' => 'Oczekuje na odbiór', + 'przesylka_oczekuje_na_odbior' => 'Oczekuje na odbiór', + 'dostarczona' => 'Dostarczona', + 'doreczona' => 'Doręczona', + 'odebrana' => 'Odebrana', + 'zwrocona' => 'Zwrócona', + 'zwrocona_do_nadawcy' => 'Zwrócona do nadawcy', + 'anulowana' => 'Anulowana', + 'odmowa_przyjecia' => 'Odmowa przyjęcia', + 'uszkodzona' => 'Uszkodzona', + 'zagubiona' => 'Zagubiona', + ]; + public const ALL_STATUSES = [ self::UNKNOWN, self::CREATED, @@ -208,12 +267,14 @@ final class DeliveryStatus 'inpost' => self::INPOST_MAP, 'apaczka' => self::APACZKA_MAP, 'allegro_wza' => self::ALLEGRO_MAP, + 'allegro_edge' => self::ALLEGRO_EDGE_MAP, ]; private const PROVIDER_DESCRIPTIONS = [ 'inpost' => self::INPOST_DESCRIPTIONS, 'apaczka' => self::APACZKA_DESCRIPTIONS, 'allegro_wza' => self::ALLEGRO_DESCRIPTIONS, + 'allegro_edge' => self::ALLEGRO_EDGE_DESCRIPTIONS, ]; /** @@ -267,6 +328,7 @@ final class DeliveryStatus 'inpost' => self::INPOST_MAP, 'apaczka' => self::APACZKA_MAP, 'allegro_wza' => self::ALLEGRO_MAP, + 'allegro_edge' => self::ALLEGRO_EDGE_MAP, default => [], }; @@ -279,6 +341,7 @@ final class DeliveryStatus 'inpost' => self::INPOST_DESCRIPTIONS, 'apaczka' => self::APACZKA_DESCRIPTIONS, 'allegro_wza' => self::ALLEGRO_DESCRIPTIONS, + 'allegro_edge' => self::ALLEGRO_EDGE_DESCRIPTIONS, default => [], }; @@ -295,6 +358,70 @@ final class DeliveryStatus return in_array($status, self::TERMINAL_STATUSES, true); } + public static function slugifyAllegroDescription(string $description): string + { + $text = trim($description); + if ($text === '') { + return 'unknown'; + } + + // Usuń typowe prefiksy + $text = preg_replace('/^Przesy[łl]ka zosta[łl]a\s+/ui', '', $text); + $text = preg_replace('/^Kurier\s+/ui', '', $text); + $text = preg_replace('/^Paczka zosta[łl]a\s+/ui', '', $text); + + // Polskie znaki na ASCII + $polish = ['ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż']; + $ascii = ['a','c','e','l','n','o','s','z','z','A','C','E','L','N','O','S','Z','Z']; + $text = str_replace($polish, $ascii, $text); + + // Lowercase, zamień nie-alfanumeryczne na podkreślenia + $text = strtolower($text); + $text = preg_replace('/[^a-z0-9]+/', '_', $text); + $text = trim($text, '_'); + + return $text !== '' ? $text : 'unknown'; + } + + /** + * Keyword-based fallback for unknown Allegro edge descriptions. + * Used when slugified description is not in ALLEGRO_EDGE_MAP. + */ + public static function guessStatusFromDescription(string $description): string + { + $lower = mb_strtolower($description, 'UTF-8'); + + if (str_contains($lower, 'doręczon') || str_contains($lower, 'dostarczono') || str_contains($lower, 'odebrana przez odbiorc')) { + return self::DELIVERED; + } + if (str_contains($lower, 'zwrócon') || str_contains($lower, 'zwrocona')) { + return self::RETURNED; + } + if (str_contains($lower, 'anulowan')) { + return self::CANCELLED; + } + if (str_contains($lower, 'doręczeni') || str_contains($lower, 'doreczenia') || str_contains($lower, 'wydana do')) { + return self::OUT_FOR_DELIVERY; + } + if (str_contains($lower, 'sortowni') || str_contains($lower, 'magazyn') || str_contains($lower, 'w drodze') || str_contains($lower, 'tranzyt') || str_contains($lower, 'kurier') || str_contains($lower, 'podjęta') || str_contains($lower, 'podjeta') || str_contains($lower, 'wyjechał') || str_contains($lower, 'wyjechala')) { + return self::IN_TRANSIT; + } + if (str_contains($lower, 'oczekuje na odb') || str_contains($lower, 'gotowa do odb') || (str_contains($lower, 'odbiór') && !str_contains($lower, 'w drodze'))) { + return self::READY_FOR_PICKUP; + } + if (str_contains($lower, 'nadana') || str_contains($lower, 'nadano')) { + return self::CONFIRMED; + } + if (str_contains($lower, 'przygotowan') || str_contains($lower, 'utworzon')) { + return self::CREATED; + } + if (str_contains($lower, 'uszkodzon') || str_contains($lower, 'problem') || str_contains($lower, 'zagubion')) { + return self::PROBLEM; + } + + return self::UNKNOWN; + } + public static function trackingUrl(string $provider, string $trackingNumber, string $carrierId = ''): ?string { $number = trim($trackingNumber); diff --git a/src/Modules/Shipments/InpostShipmentService.php b/src/Modules/Shipments/InpostShipmentService.php index 56ad65b..6452cb3 100644 --- a/src/Modules/Shipments/InpostShipmentService.php +++ b/src/Modules/Shipments/InpostShipmentService.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Modules\Shipments; use App\Core\Exceptions\IntegrationConfigException; +use App\Core\Http\SslCertificateResolver; use App\Core\Exceptions\ShipmentException; use App\Modules\Orders\OrdersRepository; use App\Modules\Settings\CompanySettingsRepository; @@ -328,7 +329,7 @@ final class InpostShipmentService implements ShipmentProviderInterface CURLOPT_CUSTOMREQUEST => $method, ]; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } @@ -376,29 +377,6 @@ final class InpostShipmentService implements ShipmentProviderInterface return 'InPost API zwrocilo blad HTTP ' . $httpCode; } - private function getCaBundlePath(): ?string - { - $envPath = (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''); - if ($envPath !== '' && is_file($envPath)) { - return $envPath; - } - $iniPath = (string) ini_get('curl.cainfo'); - if ($iniPath !== '' && is_file($iniPath)) { - return $iniPath; - } - $candidates = [ - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if (is_file($path)) { - return $path; - } - } - return null; - } - /** * @param array $orderDetails * @param array $formData diff --git a/src/Modules/Shipments/InpostTrackingService.php b/src/Modules/Shipments/InpostTrackingService.php index 5e7124a..1389378 100644 --- a/src/Modules/Shipments/InpostTrackingService.php +++ b/src/Modules/Shipments/InpostTrackingService.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace App\Modules\Shipments; +use App\Core\Http\SslCertificateResolver; use App\Modules\Settings\InpostIntegrationRepository; use Throwable; @@ -91,7 +92,7 @@ final class InpostTrackingService implements ShipmentTrackingInterface ], ]; - $caPath = $this->getCaBundlePath(); + $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } @@ -109,20 +110,4 @@ final class InpostTrackingService implements ShipmentTrackingInterface return is_array($json) ? $json : []; } - private function getCaBundlePath(): ?string - { - $candidates = [ - (string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''), - (string) ini_get('curl.cainfo'), - 'C:/xampp/apache/bin/curl-ca-bundle.crt', - 'C:/xampp/php/extras/ssl/cacert.pem', - '/etc/ssl/certs/ca-certificates.crt', - ]; - foreach ($candidates as $path) { - if ($path !== '' && is_file($path)) { - return $path; - } - } - return null; - } }