Case Study: Automatyzacja przetwarzania dokumentów logistycznych dla firmy FMCG - File to order
Wyzwanie
Europejska firma z branży FMCG działająca na polskim rynku poświęcała znaczną część czasu pracowników na ręczne przepisywanie dokumentów logistycznych do formatów wymaganych przez operatora 3PL — firmę Raben. Proces obejmował dwa kluczowe obiegi:
Zamówienia wychodzące — firma otrzymuje zamówienia zakupowe od swoich partnerów handlowych. Każdy partner wysyła zamówienia w zupełnie innym formacie: jedni jako arkusze Excel, inni jako pliki PDF, a jeden jako pliki tekstowe. Każde zamówienie musiało być ręcznie przepisane do ustandaryzowanego 48-kolumnowego szablonu Raben, zanim można było zaplanować wysyłkę.
Dostawy przychodzące — awiza dostawcze od dostawcy przychodziły jako dwujęzyczne dokumenty PDF o złożonej zagnieżdżonej strukturze: bloki produktów zawierające wiele partii, każda z własną datą przydatności i liczbą kartonów. Dane te musiały być przetworzone do 21-kolumnowego szablonu Raben.
Kluczowe problemy
- 25+ różnych formatów wejściowych — każdy partner handlowy stosuje własny układ dokumentu, nazewnictwo kolumn, identyfikatory produktów i formaty dat
- Ręczne tłumaczenie kodów SKU — kody produktowe klientów musiały być wyszukiwane w wewnętrznej matrycy, aby znaleźć prawidłowe kody magazynowe
- Rozpoznawanie adresów wielu magazynów — ponad połowa partnerów dostarcza do wielu centrów dystrybucji; prawidłowy identyfikator magazynu musiał być wyszukiwany ręcznie dla każdego zamówienia
- Przeliczanie ilości — niektórzy partnerzy raportują ilości w kartonach, inni w sztukach, co wymagało mnożenia dla każdego produktu
- Wysoki poziom błędów — ręczne przepisywanie setek linii produktowych dziennie prowadziło do częstych pomyłek
- Presja czasowa — terminy logistyczne wymagały przetworzenia zamówień tego samego dnia
Rozwiązanie
Zbudowałem aplikację desktopową w Pythonie, która w pełni automatyzuje oba procesy. Narzędzie działa wyłącznie na lokalnym komputerze klienta — żadne dane nie są wysyłane do zewnętrznych serwisów ani chmury.
Jak to działa
Użytkownik wrzuca pliki źródłowe do wyznaczonego folderu, klika jeden przycisk i w ciągu kilku sekund otrzymuje gotowy plik XLSX zgodny z szablonem Raben. Przetworzone pliki są automatycznie archiwizowane według daty.
Wewnętrzna logika aplikacji:
- Identyfikacja źródła — analiza struktury pliku, sygnatur zawartości i formatu w celu określenia, od którego z partnerów handlowych (lub dostawcy) pochodzi dokument
- Ekstrakcja danych — dedykowany parser dla każdego formatu odczytuje odpowiednie pola za pomocą dopasowywania wzorców, ekstrakcji tabel i logiki maszyny stanów
- Rozwiązywanie kodów produktowych — tłumaczenie identyfikatorów produktów specyficznych dla klienta na wewnętrzne kody SKU magazynu na podstawie matrycy danych master
- Rozwiązywanie adresów dostawy — dla partnerów z wieloma magazynami, system określa prawidłowy identyfikator magazynu Raben na podstawie adresu dostawy, wykorzystując wielopoziomowy mechanizm rozmytego dopasowywania (kody pocztowe, nazwy miast, kody magazynów, znormalizowane dopasowywanie tekstu)
- Generowanie pliku wyjściowego — zapis kompletnego, gotowego do przesłania pliku XLSX z wszystkimi wartościami stałymi, sekwencyjnymi numerami zamówień i przeliczonymi ilościami
- Archiwizacja — przeniesienie przetworzonych plików do folderów z datą; pliki z błędami trafiają do kolejki do weryfikacji
Wyzwania techniczne
Kryptograficzne dekodowanie PDF — system jednego z partnerów handlowych generuje pliki PDF z niestandardowym kodowaniem czcionek (CID), w którym znaki zastąpione są kodami numerycznymi. Standardowe biblioteki PDF zwracają nieczytelny tekst. Opracowałem technikę, która wykorzystuje znane wzorce tekstowe osadzone w dokumencie (ścieżki plików, numery zamówień) do automatycznej rekonstrukcji mapowania znaków — de facto metoda known-plaintext, która dekoduje dokument bez żadnej interwencji ręcznej.
Parser dwujęzycznych awiz dostawczych — dwujęzyczne awiza PDF mają zagnieżdżoną strukturę, gdzie pojedynczy produkt może obejmować wiele partii, każda z inną datą przydatności i ilościami wyrażonymi w kartonach zamiast sztuk. Parser wykorzystuje maszynę stanów do śledzenia kontekstu między wierszami i prawidłowo przelicza ilości sztuk z liczby kartonów i współczynników pakowania.
Inteligentne dopasowywanie adresów — system rozwiązywania adresów radzi sobie z realnymi problemami: polskie znaki diakrytyczne gubione przez ekstrakcję PDF (Wyszków → Wyszkow), wiele magazynów w tym samym mieście wymagające rozróżnienia po kodach magazynowych, kolizje między klientami, gdy różne firmy mają magazyny w tym samym mieście. System wykorzystuje indeksy filtrowane po kliencie ze znormalizowanym dopasowywaniem tekstu.
Dwuprocesowy GUI — przejrzysty interfejs z zakładkami pozwala pracownikom nietechnicznym przełączać się między przetwarzaniem zamówień wychodzących a dostaw przychodzących. Wbudowane zarządzanie numeracją, podgląd postępu i raportowanie błędów.
Rezultaty
| Wskaźnik | Przed | Po |
|---|---|---|
| Czas przetwarzania partii | 45–90 min (ręcznie) | Poniżej 10 sekund |
| Poziom błędów | Częste (ręczne przepisywanie) | Bliski zeru (automatyczna walidacja) |
| Obsługiwane formaty | Wymagana wiedza specjalistyczna | W pełni automatyczna identyfikacja |
| Bezpieczeństwo danych | Nie dotyczy | 100% przetwarzanie lokalne, zero ekspozycji w chmurze |
| Zależność od pracownika | Wymagany przeszkolony operator | Każdy członek zespołu może obsługiwać |
Co się zmieniło
- Odzyskane godziny tygodniowo — to, co wcześniej pochłaniało znaczną część dnia koordynatora logistyki, teraz zajmuje sekundy
- Eliminacja błędów ludzkich — automatyczne rozwiązywanie kodów SKU i przeliczanie ilości usunęły najczęstsze źródło pomyłek
- Zniwelowanie tzw. 'wąskiego gardła' — wcześniej tylko jedna przeszkolona osoba mogła przetwarzać zamówienia; teraz każdy w zespole może kliknąć przycisk
- Skalowalność — zastąpienie skomplikowanego procesu, który podczas nieobecności głównego specjalisty generował błędy, prostą automatyzacją
- Odporność na zmiany — gdy dostawca zmienił układ swojego PDF, modularna architektura pozwoliła na celową poprawkę bez wpływu na resztę systemu
Technologia
| Element | Szczegóły |
|---|---|
| Język | Python 3.11+ |
| GUI | Tkinter (natywny, bez przeglądarki) |
| Przetwarzanie PDF | pdfplumber |
| Obsługa Excel | openpyxl, xlrd |
| Architektura | Modularny pipeline z wymiennymi parserami |
| Wdrożenie | Lokalna aplikacja, bez serwera, bez chmury |
| Bezpieczeństwo danych | Przetwarzanie wyłącznie na urządzeniu; dane nie opuszczają komputera |
To rozwiązanie zostało zbudowane jako dedykowany projekt automatyzacji procesów biznesowych. Aplikacja działa wyłącznie na lokalnym sprzęcie klienta, co gwarantuje, że wrażliwe dane handlowe — ceny, wolumeny zamówień, relacje z klientami — nigdy nie opuszczają jego kontroli.