# Odbiór w sklepie (Store Pickup): kompletny przewodnik

> Wprowadzenie Moduł Odbiór w sklepie (datafireflystorepickup) pozwala Twoim klientom odebrać zamówienie w jednym z Twoich punktów sprzedaży zamiast korzystać z dostawy. Przy instalacji automatycznie tworzony jest przewoźnik „Odbiór w sklepie”.…

- Strona: <https://www.datafirefly.com/pl/documentation/datafireflystorepickup/>
- Język: pl
- Zaktualizowano: 2026-07-31
- Inne języki: [fr](https://www.datafirefly.com/documentation/datafireflystorepickup/index.md), [en](https://www.datafirefly.com/en/documentation/datafireflystorepickup/index.md), [es](https://www.datafirefly.com/es/documentation/datafireflystorepickup/index.md), [de](https://www.datafirefly.com/de/documentation/datafireflystorepickup/index.md), [it](https://www.datafirefly.com/it/documentation/datafireflystorepickup/index.md), [pt](https://www.datafirefly.com/pt/documentation/datafireflystorepickup/index.md), [nl](https://www.datafirefly.com/nl/documentation/datafireflystorepickup/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

## Wprowadzenie

Moduł **Odbiór w sklepie** (`datafireflystorepickup`) pozwala Twoim klientom odebrać zamówienie w jednym z Twoich punktów sprzedaży zamiast korzystać z dostawy. Przy instalacji automatycznie tworzony jest przewoźnik „Odbiór w sklepie”. W checkoucie, gdy klient wybierze tego przewoźnika, pojawia się lista sklepów i interaktywna mapa: klient wskazuje swój punkt odbioru, a wybór jest zapisywany razem z zamówieniem.

Mapa opiera się na **Leaflet** i **OpenStreetMap**, bez konieczności podawania jakiegokolwiek klucza API. Moduł jest zgodny z PrestaShop 8.x i 9.x i korzysta wyłącznie z natywnych hooków, bez nadpisywania rdzenia.

## Instalacja

1. Spakuj katalog `datafireflystorepickup` (archiwum musi zawierać sam katalog, a nie tylko jego zawartość).
2. W panelu administracyjnym otwórz **Moduły > Menedżer modułów**, kliknij **Zainstaluj moduł** i wgraj archiwum ZIP.
3. Po zakończeniu instalacji kliknij **Konfiguruj**.

Przy instalacji moduł wykonuje automatycznie następujące operacje: tworzy przewoźnika „Odbiór w sklepie” (wraz z przedziałami ceny i wagi, wszystkimi strefami i grupami klientów), tworzy tabele danych, rejestruje hooki i ustawia opłatę za odbiór na 0.

Przewoźnik jest identyfikowany przez swoją **referencję** (`id_reference`), a nie tylko przez identyfikator: możesz go swobodnie zmieniać w **Transport > Przewoźnicy** (nazwa, czas dostawy, logo, strefy), nie zrywając powiązania z modułem.

## Konfiguracja

Przejdź do **Moduły > Odbiór w sklepie > Konfiguruj**. Strona łączy ustawienia ogólne i zarządzanie sklepami.

### Opłata za odbiór

Pole **Opłata za odbiór (netto)** określa koszt przypisany do przewoźnika odbioru. Pozostaw **0** dla odbioru bezpłatnego albo wpisz kwotę netto. Ta stawka obowiązuje niezależnie od wybranego sklepu.

### Zarządzanie sklepami

Lista sklepów pokazuje wszystkie Twoje punkty odbioru wraz z nazwą, adresem, kodem pocztowym, miastem, telefonem i statusem. Z poziomu tej listy dodajesz, edytujesz, włączasz i wyłączasz oraz usuwasz sklepy.

Każdy sklep ma następujące pola:

- **Nazwa** (obowiązkowa): etykieta wyświetlana klientowi.
- **Adres** (obowiązkowy) i **Kod pocztowy**.
- **Miasto** (obowiązkowe).
- **Telefon**.
- **Godziny otwarcia**: pole tekstowe, na przykład „Pn-Sob 9:00-19:00”.
- **Szerokość** i **długość geograficzna** (obowiązkowe): pozycja sklepu na mapie.
- **Aktywny**: w checkoucie proponowane są wyłącznie sklepy aktywne.

Aby uzupełnić współrzędne, nie musisz ich wyszukiwać ręcznie: **kliknij na mapie** wyświetlonej pod formularzem, aby ustawić punkt, albo skorzystaj z geokodowania adresu. Szerokość i długość geograficzna uzupełnią się automatycznie. Geokodowanie opiera się na **Nominatim / OpenStreetMap**.

## Po stronie klienta (checkout)

Na etapie dostawy, gdy klient wybierze przewoźnika „Odbiór w sklepie”, moduł wyświetla pod przewoźnikiem **listę aktywnych sklepów** oraz **interaktywną mapę**, na której każdy sklep oznaczony jest znacznikiem. Klient wybiera punkt odbioru z listy albo bezpośrednio na mapie.

Wybór jest **obowiązkowy**: dopóki żaden sklep nie zostanie wskazany, etapu dostawy nie da się zatwierdzić, a komunikat prosi klienta o wybranie sklepu. Wybór zapisuje się w czasie rzeczywistym (przez zapytanie AJAX) i jest przypisany do koszyka.

Jeśli żaden sklep nie jest aktywny, zamiast mapy wyświetla się komunikat ostrzegawczy.

## Śledzenie zamówienia

Po zatwierdzeniu zamówienia wybrany sklep jest zapisywany jako **migawka** powiązana z zamówieniem (nazwa, adres, kod pocztowy, miasto, telefon i godziny otwarcia z chwili zakupu). Pozostaje dzięki temu dostępny nawet wtedy, gdy sklep zostanie później zmieniony albo usunięty. Punkt odbioru wyświetla się automatycznie:

- na **stronie potwierdzenia zamówienia**;
- w **szczegółach zamówienia** w koncie klienta;
- w **karcie zamówienia w panelu administracyjnym**, w bocznej kolumnie.

## Struktura techniczna

Ta sekcja jest przeznaczona dla integratorów i programistów, którzy chcą poznać wewnętrzne działanie modułu.

### Rodzaj modułu

Klasa główna `DataFireflyStorePickup` rozszerza `CarrierModule`. Stawkę przewoźnika zwracają metody `getOrderShippingCost()` i `getOrderShippingCostExternal()`, obie oparte na konfiguracji `DATAFIREFLY_PICKUP_FEE`.

### Używane hooki

- `actionFrontControllerSetMedia`: ładuje Leaflet (zdalne CSS/JS) oraz zasoby frontowe modułu na stronie zamówienia.
- `displayCarrierExtraContent`: wstrzykuje listę i mapę pod przewoźnikiem odbioru.
- `actionCarrierUpdate`: aktualizuje identyfikator przewoźnika po jego zmianie w panelu administracyjnym.
- `actionValidateStepComplete`: czyni wybór sklepu obowiązkowym na etapie dostawy.
- `actionValidateOrder`: utrwala wybrany sklep w zamówieniu.
- `displayOrderConfirmation` i `displayOrderDetail`: wyświetlają punkt odbioru po stronie klienta.
- `displayAdminOrderSide`: wyświetla punkt odbioru w karcie zamówienia w panelu administracyjnym.

### Rozpoznawanie przewoźnika

Metoda `isPickupCarrier()` identyfikuje przewoźnika odbioru zarówno po jego referencji (`id_reference`), jak i po bieżącym identyfikatorze, ponieważ ID przewoźnika w PrestaShop zmienia się przy każdej modyfikacji w panelu administracyjnym. Przechowywane są w tym celu dwa klucze konfiguracji: `DATAFIREFLY_PICKUP_CARRIER_ID` i `DATAFIREFLY_PICKUP_CARRIER_REF`.

### Tabele danych

- `datafirefly_pickup_store`: sklepy (nazwa, adres, współrzędne, godziny otwarcia, status). Obsługiwana przez `ObjectModel` `DataFireflyPickupStore`.
- `datafirefly_pickup_selection`: sklep wybrany dla koszyka (klucz `id_cart`), przed zatwierdzeniem zamówienia.
- `datafirefly_pickup_order`: migawka sklepu dla zamówienia (klucz `id_order`), zachowywana po zakupie.

### Wybór przez AJAX

Kontroler frontowy `ajax` (akcja `selectStore`) zapisuje wybrany sklep w tabeli `datafirefly_pickup_selection` dla bieżącego koszyka. Przy zatwierdzeniu zamówienia ten wybór jest kopiowany do `datafirefly_pickup_order`, a wiersz koszyka zostaje usunięty.

## Deinstalacja

Deinstalacja oznacza przewoźnika jako usuniętego i wyłączonego, usuwa klucze konfiguracji (`DATAFIREFLY_PICKUP_CARRIER_ID`, `DATAFIREFLY_PICKUP_CARRIER_REF`, `DATAFIREFLY_PICKUP_FEE`) oraz kasuje trzy tabele modułu. Zapisane sklepy zostają więc usunięte.

## Znane ograniczenia

- Punkt odbioru nie jest wstawiany do wiadomości e-mail z potwierdzeniem: pozostaje widoczny w panelu administracyjnym i w koncie klienta.
- Geokodowanie opiera się na Nominatim (OpenStreetMap), dlatego zalecane jest umiarkowane korzystanie z tej usługi, zgodnie z jej warunkami użytkowania.

## FAQ

### Czy do mapy potrzebny jest klucz API?

Nie. Mapa korzysta z Leaflet i kafelków OpenStreetMap, bez klucza API i bez konfiguracji zewnętrznej.

### Czy klient może zatwierdzić zamówienie bez wyboru sklepu?

Nie. Gdy wybrany jest przewoźnik odbioru, wskazanie sklepu jest konieczne, aby przejść etap dostawy.

### Co dzieje się z punktem odbioru, jeśli usunę sklep po złożeniu zamówienia?

Zamówienie zachowuje migawkę sklepu (nazwa, adres, godziny otwarcia) zapisaną w chwili zakupu. Pozostaje ona dostępna także po usunięciu sklepu.

### Czy moduł jest zgodny z PrestaShop 9?

Tak, moduł jest zgodny z PrestaShop 8.x i 9.x.
