Klient inicjuje zwrot przez wizard 3-krokowy na stronie /returns/?order=ID (klient zalogowany) lub /returns/ z weryfikacją email + order_key (gość). Wzorowane na flow Zalando — per-item granularność, strukturyzowane powody, czytelne podsumowanie.
Krok 1 — Items (wybór produktów)
Lista wszystkich pozycji z zamówienia (każdy WC_Order_Item_Product). Per-row:
- Thumbnail produktu
- Nazwa produktu + atrybuty wariantu
- Ilość zamówiona + cena jednostkowa
- Checkbox „Return this item”
- Input qty (max = ordered qty, default = ordered qty)
„Next: Reasons” wymaga zaznaczenia co najmniej jednej pozycji. Klient może zwrócić 1 z 3 sztuk tego samego produktu (per-item granularność).
Krok 2 — Reasons (powody zwrotu)
Renderowane są tylko pozycje wybrane w Kroku 1. Per-item:
- Dropdown z 8 reason codes (zobacz niżej)
- Textarea „Add a note” (opcjonalna, wymagana dla powodu „other”)
8 reason codes
too_small— Item too smalltoo_large— Item too largequality_mismatch— Quality not as expecteddescription_mismatch— Item does not match the descriptiondamaged— Item damaged or defectivewrong_item— Wrong item receiveddont_like— I do not like it / changed my mindother— Other (free text required)
Pro plugin może dodać własne powody przez filter wpnest_rfw_reason_codes — np. size_swap (wymiana rozmiaru), color_swap (wymiana koloru), gift_unwanted (prezent nietrafiony).
Krok 3 — Summary (podsumowanie)
- Read-only tabela: produkt, ilość, powód (label)
- Obowiązkowy checkbox „I understand this initiates a return request and that I will receive a confirmation by email”
- Przycisk „Submit return request” → REST POST
/submit
Po submicie
- Tworzona jest parent-row w
wpnest_rfw_requests+ N item-rows wwpnest_rfw_request_items - Status zamówienia WC zmieniany na
wc-rfw-pending - Generowany jest PDF potwierdzenia (token 32-hex w nazwie) i zapisywany w
wp-content/uploads/wpnest-rfw/ - Klient i sklep dostają plaintext maila z PDF + modelowym formularzem odstąpienia (PL lub EN wg locale klienta)
- Fires akcja
wpnest_rfw_request_submitted(Pro nasłuchuje dla SMS, etykiety, webhook)
Gość flow (bez konta)
- Klient wchodzi na
/returns/ - Wpisuje email + order_key (z maila potwierdzającego zamówienie)
- POST
/verify-guest→ walidacja (rate-limit 5/h per IP-hash) - Po sukcesie: tworzony 15-min token transient + renderowany wizard inline z tokenem jako hidden input
- Submit działa identycznie jak dla zalogowanego (token zamiast cookie auth)