Platforma B2B dla dystrybutorów - zakres i miejsce w ERP

Platforma B2B Humansoft jest internetowym narzędziem zamówieniowym, które rozszerza systemy ERP HermesSQL i Corax. Dystrybutor składa zamówienie sam, o dowolnej porze, a dostawca nie przepisuje niczego z telefonu ani z poczty. Ten artykuł prowadzi przez sam proces zamówienia. Zaczyna od cennika przypisanego do konta, a kończy na zapisie dokumentu w ERP. Szerszy obraz współpracy Humansoft z handlem internetowym pokazuje tekst o wsparciu Humansoft dla sklepów internetowych, a samoobsługę kontrahentów w logistyce opisuje artykuł o module internetowym dla kontrahentów.

Platformę można porównać ze sklepem internetowym, ale zaprojektowanym pod handel hurtowy. Zamiast jednego cennika dla wszystkich działa cennik kontrahenta, a zamiast płatności kartą - limit kredytowy i rozrachunki. Różnicę widać w tabeli.

KryteriumZamówienie telefoniczne lub mailoweZamówienie w platformie B2B
Dostępnośćtylko w godzinach pracy handlowca24 godziny na dobę, 7 dni w tygodniu
Czas trafienia do ERPzależny od obciążenia działu handlowegobezpośredni, bez pośrednika
Ryzyko pomyłkiwysokie, bo dane przepisuje człowiekniższe, bo dane wprowadza sam kontrahent
Kontrola limitu kredytowegoweryfikacja po stronie handlowcaautomatyczna, w trakcie składania zamówienia

Producent, firma Humansoft, publikuje informacje o systemach ERP na stronie humansoft.pl. Opis w tym artykule opiera się na zakresie platformy przedstawionym w dotychczasowej treści SoftwarePedii i na ogólnych mechanizmach zamówień hurtowych.

Cennik indywidualny i rabaty po zalogowaniu

Po zalogowaniu platforma rozpoznaje kontrahenta i wyświetla przypisany mu cennik oraz aktualny limit kredytowy. Rabaty widać obok cen. Każda decyzja zakupowa opiera się więc na warunkach obowiązujących w danym dniu, a nie na wydruku sprzed kilku tygodni. System oblicza także indywidualne rabaty i uwzględnia trwające promocje.

Skąd platforma bierze cenę

Cena pozycji nie jest zapisana w koszyku na stałe. Platforma pobiera ją z ERP w chwili wyświetlenia oraz ponownie w chwili zatwierdzenia, więc zmiana cennika w systemie centralnym działa od razu na ekrany dystrybutorów. Dla dostawcy oznacza to jedno źródło prawdy o cenach, a dla kontrahenta pewność, że kwota z koszyka zgadza się z dokumentem, który powstanie w ERP. Kontrolę zapasów po stronie ERP opisuje artykuł o bilansie zamówień i rezerwacji w HermesSQL.

Reguła: cena i rabat pochodzą z ERP w chwili zatwierdzenia zamówienia, a nie z kopii zapisanej w koszyku.

Rabaty i promocje w cenie końcowej

Rabat indywidualny i promocja czasowa mogą obowiązywać jednocześnie, więc kolejność ich stosowania trzeba ustalić w ERP. Typowy układ zaczyna od ceny z cennika kontrahenta, dolicza promocję na dany okres, a rabat wartościowy stosuje na końcu. Platforma powinna pokazywać w koszyku wynik tego wyliczenia oraz źródło każdej obniżki, bo dystrybutor porównuje kwotę z własnymi ustaleniami handlowymi i reklamuje każdą rozbieżność.

Koszyk ze wzorami i wyszukiwanie towaru

Dystrybutor przegląda zawartość koszyka, a pozycje dodaje lub usuwa. Do zamówień cyklicznych zapisuje wzory koszyków. Jedno kliknięcie odtwarza wcześniej użyty zestaw produktów, co sprowadza powtarzalne zamówienie do kilku kliknięć. Wyszukiwać można po nazwie i numerze katalogowym oraz po symbolu, kodzie kreskowym albo fragmencie nazwy.

Wyszukiwarka nie powinna odpytywać serwera przy każdym naciśnięciu klawisza. Typowy wzorzec to opóźnienie kilkuset milisekund od ostatniego znaku i minimalna długość frazy, co zmniejsza liczbę zapytań do bazy.

// przykładowe wyszukiwanie towaru z opóźnieniem 300 ms
let timer;
document.querySelector('#szukaj').addEventListener('input', (e) => {
  clearTimeout(timer);
  timer = setTimeout(async () => {
    const fraza = e.target.value.trim();
    if (fraza.length < 3) return;
    const odp = await fetch('/api/przyklad/towary?q=' + encodeURIComponent(fraza));
    renderujListe(await odp.json());
  }, 300);
});

Kod jest ilustracją techniki, a nie fragmentem platformy Humansoft. Funkcja renderujListe jest w nim symbolicznym miejscem wstawienia wyników do widoku. Po stronie bazy takie wyszukiwanie zwykle korzysta z indeksów na kolumnach symbolu i kodu kreskowego, bo dopasowanie po fragmencie nazwy jest droższe od dopasowania po kluczu.

Wzór koszyka a zmiany w asortymencie

Wzór zapisany kilka miesięcy temu może zawierać pozycję, która od tego czasu zmieniła cenę albo zniknęła z oferty. Odtworzenie wzoru nie powinno więc kopiować starych wartości. Dobrą praktyką jest zapisywanie w nim wyłącznie identyfikatorów towarów oraz ilości. Cenę i dostępność pobiera się na nowo z ERP w chwili odtworzenia. Wtedy pozycja wycofana zostaje oznaczona i nie trafia do zamówienia bez wiedzy kupującego.

Kobieta w słuchawkach przy dwóch monitorach z widokiem kodu i danych systemu zamówień
Zamówienie z koszyka trafia do ERP jako dokument, więc dane tej samej pozycji widzi zarówno kontrahent, jak i dział handlowy. Temat rezerwacji szerzej omawia artykuł o zamówieniach i rezerwacjach w ERP.

Limit kredytowy i rozrachunki przy zatwierdzeniu

Po zatwierdzeniu koszyka platforma sprawdza limit kredytowy oraz stan rozrachunków kontrahenta. Dopiero potem przekazuje zamówienie do realizacji w dziale handlowym. System informuje o kwotach przeterminowanych, zanim dokument ruszy dalej, co ogranicza ryzyko zatorów płatniczych i ułatwia windykację.

-- przykładowa kontrola limitu kredytowego w chwili zatwierdzenia koszyka
DECLARE @KontrahentId int = 1042,
        @WartoscZamowienia decimal(18,2) = 12500.00;

SELECT k.LimitKredytowy,
       ISNULL(SUM(r.Saldo), 0) AS Zadluzenie,
       ISNULL(SUM(CASE WHEN r.TerminPlatnosci < CAST(GETDATE() AS date)
                       THEN r.Saldo END), 0) AS Przeterminowane,
       CASE WHEN ISNULL(SUM(r.Saldo), 0) + @WartoscZamowienia > k.LimitKredytowy
            THEN 1 ELSE 0 END AS PrzekroczonyLimit
FROM dbo.KontrahentPrzyklad AS k
LEFT JOIN dbo.RozrachunekPrzyklad AS r
       ON r.KontrahentId = k.Id AND r.Saldo > 0
WHERE k.Id = @KontrahentId
GROUP BY k.LimitKredytowy;

Zapytanie liczy zadłużenie z otwartych rozrachunków, wydziela kwoty po terminie i porównuje sumę z limitem. Nazwy tabel są przykładowe, a logika odpowiada mechanizmowi opisanemu w artykule. Ważne, aby limit był wyliczany w tym samym momencie co zapis zamówienia. Wtedy dwa równoległe koszyki tego samego kontrahenta nie przekroczą łącznie granicy, którą każdy z nich osobno mieścił.

Reguła: zamówienie przekraczające limit nie znika z systemu - wymaga zdefiniowanej ścieżki wyjątku po stronie dostawcy.

Sposób obsługi takich wyjątków ustala się na etapie analizy przedwdrożeniowej. Trzeba wybrać, czy zamówienie jest wstrzymywane do decyzji handlowca, czy odrzucane z komunikatem, oraz kto dostaje powiadomienie. Warto też skonfigurować powiadomienia e-mail o zmianie statusu zamówienia, żeby dystrybutor nie sprawdzał postępu ręcznie w panelu.

Rezerwacja stanu w transakcji

Kontrola należności jest jedną bramką, a dostępność towaru drugą. Dystrybutor widzi stan magazynowy każdej pozycji na bieżąco, żeby nie zamawiać towaru chwilowo niedostępnego. Przy zatwierdzeniu koszyka rezerwację stanu robi się w jednej transakcji, aby dwaj kupujący nie zajęli tej samej ostatniej sztuki.

-- przykładowa rezerwacja stanu przy zatwierdzeniu koszyka
DECLARE @KoszykId int = 501;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;

UPDATE s
SET    s.Zarezerwowano = s.Zarezerwowano + p.Ilosc
FROM   dbo.StanPrzyklad AS s WITH (UPDLOCK, ROWLOCK)
JOIN   dbo.KoszykPozycjaPrzyklad AS p ON p.TowarId = s.TowarId
WHERE  p.KoszykId = @KoszykId
  AND  s.Ilosc - s.Zarezerwowano >= p.Ilosc;

IF @@ROWCOUNT < (SELECT COUNT(*) FROM dbo.KoszykPozycjaPrzyklad
                 WHERE KoszykId = @KoszykId)
BEGIN
    ROLLBACK TRANSACTION;
    THROW 50001, 'Brak pełnego stanu dla pozycji koszyka.', 1;
END;

COMMIT TRANSACTION;

Blokada UPDLOCK trzyma wiersz stanu do końca transakcji, a warunek w klauzuli WHERE odrzuca pozycje, których nie da się w pełni zarezerwować. Gdy liczba zmienionych wierszy jest mniejsza niż liczba pozycji koszyka, całość się wycofuje. Opis poziomów izolacji znajduje się w dokumentacji Microsoft o SET TRANSACTION ISOLATION LEVEL.

Statusy zamówienia i powiadomienia

Zamówienie z platformy przechodzi przez kilka stanów, a dystrybutor powinien widzieć bieżący z nich bez dzwonienia do handlowca. Ograniczenie liczby telefonów i wiadomości o status zamówienia oszczędza czas działu sprzedaży, który można przeznaczyć na rozwój relacji z istotnymi klientami. Poniższy podział jest przykładem, a rzeczywiste statusy zależą od konfiguracji ERP i procesu w danej firmie.

Status przykładowyZnaczenieKto może zmienić
Koszykpozycje dodane, brak zatwierdzeniaużytkownik kontrahenta
Zatwierdzonelimit sprawdzony, dokument zapisany w ERPsystem po kontroli
Wstrzymaneprzekroczony limit albo kwoty po terminiehandlowiec dostawcy
W realizacjitowar kompletowany w magazyniedział handlowy i magazyn

Zmiana statusu może wysyłać wiadomość e-mail do osoby, która złożyła zamówienie. Ważne, aby adresatów powiadomień powiązać z rolami z następnej części: księgowość dostaje informację o wstrzymaniu z powodu należności, a dział zakupów o kompletowaniu towaru. Dzięki temu każdy komunikat trafia do osoby, która może na niego zareagować.

Konta i uprawnienia użytkowników kontrahenta

Duży dystrybutor korzysta z platformy przez kilka osób: właściciela, osobę odpowiedzialną za zakupy i księgowość kontrolującą płatności. Platforma pozwala nadać każdej z nich osobne konto z określonym zakresem uprawnień. Dostęp do danych wrażliwych, takich jak historia płatności czy indywidualny cennik, można wtedy ograniczyć do wskazanych pracowników.

Rola po stronie kontrahentaTypowy dostępDane ukryte przed rolą
Właścicielpełny wgląd w zamówienia oraz w płatności i cennikbrak ograniczeń
Osoba odpowiedzialna za zakupykoszyk, wzory koszyków, składanie zamówieńhistoria płatności, jeśli tak ustawiono
Księgowośćrozrachunki i przeterminowane należnościskładanie zamówień, jeśli tak ustawiono

Podział w tabeli jest przykładowy, bo zakres uprawnień nadaje się indywidualnie dla każdego konta. Logowanie odbywa się przez połączenie szyfrowane, a każda zmiana w koszyku i każde złożone zamówienie trafia do historii aktywności. Taki zapis wyjaśnia rozbieżności, na przykład gdy dwie osoby jednocześnie zmieniają ten sam koszyk. Administrator po stronie dostawcy może zablokować pojedynczego użytkownika bez wpływu na pozostałe konta tego samego kontrahenta.

Dla działu handlowego oznacza to mniej pracy przy zmianach kadrowych u odbiorców. Nowy pracownik dystrybutora dostaje własne konto w kilka minut, bez czekania na dane dostępowe przekazane ręcznie przez handlowca. Podobny mechanizm w ujęciu ogólnym opisuje artykuł o Pulpicie Kontrahenta.

Integracja z HermesSQL oraz Corax - przepływ zamówienia

Zamówienia złożone przez dystrybutorów trafiają automatycznie do systemu centralnego firmy, bez ręcznego przepisywania. Dział handlowy dostaje natychmiastową informację o nowym zamówieniu i może zacząć realizację bez zwłoki. Integracja eliminuje podwójne wprowadzanie danych, które w tradycyjnym obiegu bywa głównym źródłem pomyłek. Ogólny zarys programu Corax dla sprzedaży przedstawia strona o module podstawowym Corax.

DaneKierunekMoment wymiany
Zamówienie z koszykaplatforma do ERPpo zatwierdzeniu i kontroli limitu
Stan magazynowyERP do platformyczas rzeczywisty po obu stronach
Cena i rabatERP do platformyprzy wyświetleniu i zatwierdzeniu
Limit i rozrachunkiERP do platformyczas rzeczywisty po obu stronach

Uzgodnienia przed startem projektu dotyczą czterech obszarów.

  • Zakres integracji - które dane ERP są publikowane na platformie i w jakim trybie odświeżania.
  • Ścieżka wyjątków - co dzieje się z zamówieniem powyżej limitu lub z kwotami po terminie.
  • Role użytkowników - jakie uprawnienia dostają konta u kontrahentów i kto je nadaje.
  • Powiadomienia - które zmiany statusu generują e-mail i do jakiej roli trafiają.

Firmy planujące wdrożenie powinny na etapie analizy ustalić zakres integracji z posiadanym ERP i sposób obsługi wyjątków, na przykład zamówień powyżej limitu. Kontakt z zespołem wdrożeniowym SoftwareStudio pomaga dopasować konfigurację do branży i istniejącej infrastruktury.

Praca handlowca z platformą i analityka sprzedaży

Przeniesienie części zamówień na platformę odciąża handlowców od rutyny, czyli spisywania zamówień z telefonu i przepisywania ich z poczty. Czas zyskany w ten sposób można przeznaczyć na rozmowy z priorytetowymi klientami. Handlowiec negocjuje też warunki i pozyskuje nowych dystrybutorów. Jeden handlowiec obsłuży wtedy więcej kontrahentów bez utraty jakości relacji.

Dwie osoby przy stojaku z odzieżą w sklepie, jedna z nich trzyma smartfon
Przedstawiciel handlowy pokazuje ofertę i składa zamówienie na urządzeniu mobilnym, a system centralny widzi je od razu.

Platforma działa też na smartfonach i tabletach, więc przedstawiciel może prezentować asortyment i składać zamówienia w trakcie spotkania. Automatyczna synchronizacja z systemem centralnym sprawia, że zamówienie jest od razu widoczne w dziale handlowym. Dział sprzedaży dostaje ponadto historię transakcji każdego kontrahenta oraz raporty sprzedażowe, na podstawie których planuje promocje i wychwytuje dystrybutorów o spadającej sprzedaży. Raporty w środowisku SQL Server omawia artykuł o raportowaniu w HermesSQL, a analizę wyników sprzedaży - tekst o HermesSQL w analizie sprzedaży. Korzyści ERP w hurcie zestawia strona o oprogramowaniu ERP w handlu i dystrybucji.