Kontekst
Rondo Distribution jest dystrybutorem hurtowym współpracującym z wieloma markami outdoorowymi i lifestyle’owymi. Projekt obejmuje dwa powiązane elementy: portal B2B dla klientów biznesowych składających zamówienia oraz panel zarządzania, który pozwala dystrybutorowi utrzymywać jeden katalog produktów dla wielu sklepów WooCommerce.
Najpierw powstał portal B2B, a panel zarządzania produktami został rozwinięty jako drugi etap po ustaleniu wzorców integracji. Oba rozwiązania są zbudowane na WordPressie i WooCommerce oraz połączone z tym samym ekosystemem zewnętrznym: systemem ERP Navireo, obsługiwanym przez zewnętrznego partnera IT. Dzięki temu oba elementy mają spójną architekturę, zamiast funkcjonować jako osobne narzędzia.
Projekt realizowałem jako niezależny developer we współpracy z Mapi Media, które prowadziło kontrakt z Rondo.
Najpierw powstał portal B2B, a panel zarządzania produktami został rozwinięty jako drugi etap po ustaleniu wzorców integracji. Oba rozwiązania są zbudowane na WordPressie i WooCommerce oraz połączone z tym samym ekosystemem zewnętrznym: systemem ERP Navireo, obsługiwanym przez zewnętrznego partnera IT. Dzięki temu oba elementy mają spójną architekturę, zamiast funkcjonować jako osobne narzędzia.
Projekt realizowałem jako niezależny developer we współpracy z Mapi Media, które prowadziło kontrakt z Rondo.
Rozszerzone REST API do integracji zewnętrznej
Podstawą portalu jest zestaw własnych endpointów REST rozszerzających natywne API WooCommerce. Endpointy zostały przygotowane dla zewnętrznego partnera IT dystrybutora, firmy Bielbit, która odpowiada za dwustronną synchronizację z Navireo — systemem ERP obsługującym magazyn i ceny. Bielbit odpowiada za stronę ERP, a ja zbudowałem warstwę API, która umożliwia tę integrację.
Endpointy obsługują operacje kluczowe dla procesu sprzedaży hurtowej: zamówienia są pobierane z portalu do ERP w celu dalszej obsługi, ceny są cyklicznie wypychane z ERP do WooCommerce, produkty są włączane lub wyłączane na podstawie flag w ERP, pozycje są automatycznie przenoszone między głównym katalogiem a kategorią outlet, a kolory statusów magazynowych aktualizują się wraz ze zmianami dostępności.
Taki podział utrzymuje ERP jako źródło prawdy dla cen i stanów magazynowych, podczas gdy portal odpowiada za składanie zamówień, prezentację oferty i dostarczanie dokumentów. W praktyce WordPress działa tutaj jako warstwa usługowa: stabilna powierzchnia API sterowana przez zewnętrzny system, a nie zamknięta strona sprzedażowa.
Endpointy obsługują operacje kluczowe dla procesu sprzedaży hurtowej: zamówienia są pobierane z portalu do ERP w celu dalszej obsługi, ceny są cyklicznie wypychane z ERP do WooCommerce, produkty są włączane lub wyłączane na podstawie flag w ERP, pozycje są automatycznie przenoszone między głównym katalogiem a kategorią outlet, a kolory statusów magazynowych aktualizują się wraz ze zmianami dostępności.
Taki podział utrzymuje ERP jako źródło prawdy dla cen i stanów magazynowych, podczas gdy portal odpowiada za składanie zamówień, prezentację oferty i dostarczanie dokumentów. W praktyce WordPress działa tutaj jako warstwa usługowa: stabilna powierzchnia API sterowana przez zewnętrzny system, a nie zamknięta strona sprzedażowa.
Reguły zamówień hurtowych
Sprzedaż B2B działa według innych zasad niż sprzedaż detaliczna, dlatego portal egzekwuje te reguły w całym procesie zakupowym, zamiast traktować je jako miękkie ustalenia.
Każda kategoria reprezentuje jedną markę, a jedno zamówienie może zawierać produkty tylko z jednej marki naraz. Dodanie produktu z innej marki rozpoczyna nowy koszyk. Każdy produkt oferuje dwa tryby zakupu: zamówienie z magazynu dla produktów dostępnych od razu oraz preorder z oknem dostawy ustawianym per produkt przez administratora, z odpowiednim oznaczeniem w notatkach zamówienia. Checkout również został dostosowany do kontekstu B2B: danych firmowych nie można edytować na etapie koszyka, alternatywne adresy dostawy są przekazywane przez notatki do zamówienia zamiast osobnego pola, a proces nie przechodzi przez bramki płatności, ponieważ rozliczenia odbywają się w ramach istniejącej relacji hurtowej.
Widoczność stanów magazynowych została uproszczona do trzech kolorów zamiast liczbowych stanów: zielony oznacza dostępny, czerwony niedostępny, a pomarańczowy produkt w drodze. Te statusy są sterowane przez ERP przez API. Kategoria outlet dla końcówek kolekcji jest uzupełniana automatycznie, gdy produkty są oznaczone jako wycofane, ale nadal mają stan magazynowy. Zakupy z outletu są ograniczone wyłącznie do zamówień z magazynu.
Każda kategoria reprezentuje jedną markę, a jedno zamówienie może zawierać produkty tylko z jednej marki naraz. Dodanie produktu z innej marki rozpoczyna nowy koszyk. Każdy produkt oferuje dwa tryby zakupu: zamówienie z magazynu dla produktów dostępnych od razu oraz preorder z oknem dostawy ustawianym per produkt przez administratora, z odpowiednim oznaczeniem w notatkach zamówienia. Checkout również został dostosowany do kontekstu B2B: danych firmowych nie można edytować na etapie koszyka, alternatywne adresy dostawy są przekazywane przez notatki do zamówienia zamiast osobnego pola, a proces nie przechodzi przez bramki płatności, ponieważ rozliczenia odbywają się w ramach istniejącej relacji hurtowej.
Widoczność stanów magazynowych została uproszczona do trzech kolorów zamiast liczbowych stanów: zielony oznacza dostępny, czerwony niedostępny, a pomarańczowy produkt w drodze. Te statusy są sterowane przez ERP przez API. Kategoria outlet dla końcówek kolekcji jest uzupełniana automatycznie, gdy produkty są oznaczone jako wycofane, ale nadal mają stan magazynowy. Zakupy z outletu są ograniczone wyłącznie do zamówień z magazynu.


Panel zarządzania produktami dla wielu sklepów
Po wdrożeniu portalu B2B projekt został rozszerzony o drugi problem: utrzymywanie jednego katalogu produktów w kilku sklepach WooCommerce bez ręcznego powielania pracy w każdym panelu administracyjnym. Panel rozwiązuje to, działając ponad sklepami jako centralne źródło danych produktowych.
Każdy połączony sklep jest rejestrowany w panelu razem z danymi dostępowymi WooCommerce REST API i adresem bazowym. Produkty tworzone lub edytowane w panelu są następnie wysyłane do każdego połączonego sklepu tak, jakby zostały utworzone bezpośrednio w nim, razem z atrybutami, wariantami, kategoriami, markami, opisami, cenami i zdjęciami. Nowe marki i kategorie tworzone w panelu są propagowane w ten sam sposób.
Jedna granica została ustalona celowo: panel nie zarządza stanami magazynowymi. Magazyn pozostaje synchronizowany przez istniejącą integrację ERP w każdym sklepie, więc panel odpowiada za to, czym produkt jest, a nie ile sztuk jest aktualnie dostępnych.
Przy dużych katalogach edycja pojedynczych produktów nie wystarcza. Panel obsługuje masowy import z plików CSV lub XLS na podstawie ustalonego szablonu, z obrazami pobieranymi ze skonfigurowanej ścieżki FTP albo z publicznych adresów URL podczas importu. Obrazy są przechowywane centralnie w panelu i kopiowane do sklepów docelowych, zastępując ręczne wgrywanie zdjęć osobno do każdego sklepu.
Każdy połączony sklep jest rejestrowany w panelu razem z danymi dostępowymi WooCommerce REST API i adresem bazowym. Produkty tworzone lub edytowane w panelu są następnie wysyłane do każdego połączonego sklepu tak, jakby zostały utworzone bezpośrednio w nim, razem z atrybutami, wariantami, kategoriami, markami, opisami, cenami i zdjęciami. Nowe marki i kategorie tworzone w panelu są propagowane w ten sam sposób.
Jedna granica została ustalona celowo: panel nie zarządza stanami magazynowymi. Magazyn pozostaje synchronizowany przez istniejącą integrację ERP w każdym sklepie, więc panel odpowiada za to, czym produkt jest, a nie ile sztuk jest aktualnie dostępnych.
Przy dużych katalogach edycja pojedynczych produktów nie wystarcza. Panel obsługuje masowy import z plików CSV lub XLS na podstawie ustalonego szablonu, z obrazami pobieranymi ze skonfigurowanej ścieżki FTP albo z publicznych adresów URL podczas importu. Obrazy są przechowywane centralnie w panelu i kopiowane do sklepów docelowych, zastępując ręczne wgrywanie zdjęć osobno do każdego sklepu.
Zakres techniczny
Portal B2B został zbudowany jako dedykowany motyw WordPress i WooCommerce napisany od podstaw, z szablonami i komponentami dopasowanymi do projektu referencyjnego dostarczonego przez klienta. Szablony WooCommerce i logika koszyka zostały nadpisane tam, gdzie wymagały tego reguły B2B, między innymi dla koszyków ograniczonych do jednej marki, zablokowanych pól checkoutu oraz podwójnego modelu zakupu: z magazynu lub w preorderze. Własne endpointy REST zostały zarejestrowane przez natywną infrastrukturę WordPress REST API, z autoryzacją i obsługą żądań dopasowaną do potrzeb zewnętrznego integratora. Konta użytkowników w portalu są tworzone wyłącznie przez administratora, a symbol klienta z ERP jest przenoszony do portalu, aby faktury i zamówienia mogły być konsekwentnie powiązane. Faktury przypisane do klienta są wyświetlane w jego panelu konta na podstawie strukturalnego wzorca nazw plików — PDF-y są generowane zewnętrznie przez ERP, wgrywane na FTP, a następnie dopasowywane do właściwego klienta przez portal.
Panel zarządzania działa na tym samym stosie WordPress i WooCommerce jako środowisko administracyjne, z dodaną własną warstwą UI i logiką wysyłki danych do sklepów. WooCommerce został użyty jako baza, ponieważ jego model danych już odpowiada temu, co jest wysyłane do sklepów docelowych: produktom, wariantom, atrybutom i kategoriom. Dzięki temu nie trzeba budować dodatkowej warstwy tłumaczącej dane między panelem a sklepami. Wysyłka danych działa przez WooCommerce REST API, z danymi dostępowymi dla każdego sklepu zapisanymi w ustawieniach panelu. Oba elementy zostały zbudowane bez płatnych wtyczek.
Panel zarządzania działa na tym samym stosie WordPress i WooCommerce jako środowisko administracyjne, z dodaną własną warstwą UI i logiką wysyłki danych do sklepów. WooCommerce został użyty jako baza, ponieważ jego model danych już odpowiada temu, co jest wysyłane do sklepów docelowych: produktom, wariantom, atrybutom i kategoriom. Dzięki temu nie trzeba budować dodatkowej warstwy tłumaczącej dane między panelem a sklepami. Wysyłka danych działa przez WooCommerce REST API, z danymi dostępowymi dla każdego sklepu zapisanymi w ustawieniach panelu. Oba elementy zostały zbudowane bez płatnych wtyczek.
Efekt
Portal B2B działa jako hurtowa platforma sprzedażowa Rondo Distribution, połączona z systemem ERP dystrybutora przez dedykowaną warstwę integracyjną, którą zewnętrzny partner obsługuje od strony magazynu. Panel zarządzania produktami jest w końcowej fazie rozwoju jako drugi element tego samego projektu.
