Wprowadzenie
W Odoo modele określają strukturę danych zapisywanych w bazie. Każdy element działalności — zamówienie sprzedaży, przesunięcie magazynowe, operacja magazynowa — ma swoje odwzorowanie w modelu, który zarządza polami, relacjami i zachowaniem tych danych.
Znajomość modeli Odoo jest niezbędna zarówno dla konsultantów funkcjonalnych, jak i programistów. To one stanowią trzon architektury danych: definiują jakie informacje są przechowywane, jak się łączą i jakie reguły biznesowe obowiązują.
Ten artykuł skupia się na jednym z najważniejszych modeli w aplikacji Magazyn — stock.picking. Niezależnie od tego, czy tworzysz moduły magazynowe na zamówienie, integrujesz zewnętrzne systemy czy konfigurujesz procesy, prędzej czy później trafisz na ten model.
Czym jest model stock.picking
Model stock.picking w Odoo odwzorowuje przesunięcia towarów. To centralny rekord, w którym śledzone są operacje magazynowe — każda pozycja to pojedynczy transfer z jednej lokalizacji do drugiej.
W module magazynowym stock.picking pojawia się przy przyjęciach, wydaniach i przemieszczeniach wewnętrznych. Potwierdzenie zamówienia sprzedaży, zaksięgowanie przyjęcia od dostawcy czy przemieszczenie pomiędzy magazynami generuje lub aktualizuje zapis stock.picking.
Model jest zdefiniowany w module stock, a pozostałe moduły go rozszerzają przez dziedziczenie modeli. Moduł Sprzedaż doda pola związane z dostawą, Zakupy — obsługę przyjęć, Produkcja — ruchy surowców i wyrobów. Dzięki temu rdzeń pozostaje wspólny, a nowe funkcje są doklejane modułowo.
stock.picking dziedziczy po mail.thread i mail.activity.mixin, co pozwala na śledzenie zmian, korzystanie z chattera oraz umawianie aktywności bezpośrednio na przesyłkach.
Kluczowe pola w modelu
Poniżej znajdziesz przegląd najważniejszych pól modelu stock.picking. Zrozumienie ich znaczenia ułatwi pracę z zamówieniami, rezerwacjami i operacjami magazynowymi.
1. name
Typ: Char. Numer referencyjny przesyłki. Zwykle generowany automatycznie przez sekwencję (np. WH/OUT/00001). Pokazywany w nagłówku dokumentu i służy jako główny identyfikator przemieszczenia.
2. origin
Typ: Char. Oznaczenie dokumentu źródłowego — na przykład numer zamówienia sprzedaży lub zakupu. Ułatwia śledzenie, skąd pochodzi dana przesyłka.
3. state
Typ: Selection. Status przesyłki. Możliwe wartości: Draft, Waiting Another Operation, Waiting, Ready, Done, Cancelled. Od stanu zależą dostępne akcje; wartość jest wyprowadzana na podstawie powiązanych ruchów magazynowych.
4. picking_type_id
Typ: Many2one (stock.picking.type). Typ operacji — przyjęcie, wydanie lub przemieszczenie wewnętrzne. Pole wymagane; każdy typ ma domyślne lokalizacje źródłową i docelową.
5. move_ids
Typ: One2many (stock.move). Ruchy magazynowe — każda linia opisuje produkt i ilość do przemieszczenia. To sedno przesyłki; na tych rekordach działa logika rezerwacji i dostępności.
6. move_line_ids
Typ: One2many (stock.move.line). Szczegółowe operacje: numery partii, numery seryjne, konkretne miejsca i opakowania. Wykorzystywane przy kompletacji, pakowaniu i walidacji.
7. location_id
Typ: Many2one (stock.location). Lokalizacja źródłowa — skąd pobierane są produkty. Pole wymagane; dla wydania zazwyczaj magazyn, dla przyjęcia — lokalizacja dostawcy.
8. location_dest_id
Typ: Many2one (stock.location). Lokalizacja docelowa — gdzie trafiają produkty. Pole wymagane; dla wydania to lokalizacja klienta, dla przyjęcia — magazyn.
9. partner_id
Typ: Many2one (res.partner). Kontrahent powiązany z przesyłką — klient przy wydaniu, dostawca przy przyjęciu. Wpływa na adresy dokumentów i integrację z przewoźnikami.
10. scheduled_date
Typ: Datetime. Zaplanowana data realizacji przesyłki. Służy do planowania i priorytetyzacji — ustawienie jej ustawia przewidywany termin dla powiązanych ruchów.
11. date_deadline
Typ: Datetime. Termin wykonania — często pochodzi z zamówienia sprzedaży lub zakupu. Przydatne w raportowaniu opóźnień i obietnicach dostaw dla klientów.
12. date_done
Typ: Datetime. Data zatwierdzenia lub anulowania przesyłki. Pole tylko do odczytu — wypełniane automatycznie po wykonaniu.
13. priority
Typ: Selection. Poziom priorytetu. Przy rezerwacji to transfery z wyższym priorytetem mają pierwszeństwo — używane przy obsłudze pilnych zamówień.
14. move_type
Typ: Selection. Polityka wysyłki — As soon as possible (częściowe dostawy dozwolone) lub When all products are ready (wszystko albo nic). Wpływa na moment, kiedy przesyłka może być realizowana.
15. user_id
Typ: Many2one (res.users). Użytkownik odpowiedzialny. Przydatne do rozdziału zadań i śledzenia obciążenia pracą; domyślnie ustawione na twórcę rekordu.
16. company_id
Typ: Many2one (res.company). Firma, do której należy przesyłka. W konfiguracjach wielofirmowych określa właściciela operacji i polityki księgowe/magazynowe.
17. group_id
Typ: Many2one (procurement.group). Grupa zamówień/procurements łącząca powiązane ruchy. Przydatne, gdy kilka przesyłek pochodzi z tego samego zamówienia.
18. backorder_id
Typ: Many2one (stock.picking). Link do oryginalnej przesyłki, gdy tworzony jest dokument uzupełniający (backorder) po częściowym zatwierdzeniu.
19. backorder_ids
Typ: One2many (stock.picking). Lista backorderów stworzonych z tego dokumentu — używana, gdy część towarów została zrealizowana, a reszta wymaga osobnej operacji.
20. return_id
Typ: Many2one (stock.picking). Jeżeli przesyłka jest zwrotem, to pole wskazuje pierwotną przesyłkę — istotne w procesach reklamacyjnych i zwrotach.
21. note
Typ: Html. Notatki wewnętrzne widoczne dla użytkowników magazynu — instrukcje specjalne, uwagi dotyczące obsługi przesyłki itp.
22. signature
Typ: Image. Podpis zarejestrowany przy odbiorze dostawy — dowód doręczenia przechowywany jako załącznik.
23. is_signed
Typ: Boolean. Pole obliczane na podstawie obecności podpisu — informuje, czy przesyłka została opatrzona podpisem.
24. owner_id
Typ: Many2one (res.partner). Właściciel towaru przypisywany przy walidacji — używane przy konsygnacji lub gdy towar należy do strony trzeciej.
25. package_level_ids
Typ: One2many (stock.package_level). Poziomy pakowania przy korzystaniu z funkcji "put in pack" — grupowanie linii ruchów w opakowania.
26. create_date
Typ: Datetime. Data utworzenia rekordu. Automatycznie zarządzana przez Odoo; pole bazowe.
27. write_date
Typ: Datetime. Data ostatniej zmiany rekordu. Automatycznie aktualizowana; przydatna do audytu.
28. active
Typ: Boolean. Flaga archiwizacji — gdy False, rekord jest zarchiwizowany zamiast usuwany. Pole dziedziczone z modelu bazowego.
Jak model wykorzystuje się w procesach biznesowych
1. Sprzedaż i wydania
Po potwierdzeniu zamówienia sprzedaży system generuje dokument wydania (stock.picking), powiązany z zamówieniem poprzez origin. Magazyn kompletuje i pakuje towary, a stan dokumentu przechodzi od draft przez ready do done po walidacji.
2. Zakupy i przyjęcia
Po zatwierdzeniu zamówienia zakupu powstaje przyjęcie przychodzące — przesyłka, która przenosi towar z lokalizacji dostawcy do magazynu. partner_id wskazuje dostawcę, a zatwierdzenie aktualizuje stany magazynowe.
3. Przemieszczenia wewnętrzne
Transfery między magazynami lub lokalizacjami generują wewnętrzne pickingi; picking_type_id ma typ 'internal', a oba miejsca (źródło i cel) to lokalizacje wewnętrzne.
4. Zwroty i backordery
W przypadku zwrotu sprzedaży tworzony jest dokument zwrotny powiązany polem return_id z oryginalnym wydaniem. Gdy przesyłka jest częściowo zrealizowana, resztę pracy reprezentują backorder_ids.
5. Produkcja i wytwarzanie
Zamówienia produkcyjne tworzą przesyłki dla pobrań surowców i przyjęć wyrobów. Moduł Produkcja rozszerza model stock.picking, aby obsłużyć specyfikę przepływu materiałów i gotowych produktów.
Jak programiści rozszerzają ten model
Programiści rozszerzają stock.picking stosując kilka sprawdzonych wzorców; podstawowym narzędziem jest dziedziczenie modeli w Odoo.
Dziedziczenie modelu
W praktyce używasz _inherit = 'stock.picking' by dodać własne pola, nadpisać metody lub dodać ograniczenia. Dzięki temu modyfikacje pozostają w osobnym module, co ułatwia późniejsze aktualizacje systemu.
Dodawanie pól
W rozszerzonym modelu deklarujesz nowe pola zgodnie z ich przeznaczeniem: Char, Many2one, Boolean, Integer, Text, Selection. Przy projektowaniu pamiętaj o polach zależnych od firmy w konfiguracjach wielofirmowych.
Rozszerzenia w Pythonie
Nadpisuj metody takie jak button_validate, action_assign czy _create_backorder, jeśli chcesz dopiąć logikę biznesową. Zawsze wywołuj super(), aby zachować oryginalne zachowanie — szczególnie tam, gdzie Odoo zarządza przejściami stanów i tworzeniem ruchów.
Odoo Studio
Odoo Studio umożliwia dodawanie pól bez pisania kodu — szybkie rozwiązanie na mniejsze potrzeby, jak dodatkowe notatki czy etykiety. Dla zaawansowanych integracji lub złożonej logiki lepszym wyborem są moduły customowe.
Dobre praktyki
- Zawsze ustawiaj picking_type_id przy ręcznym tworzeniu przesyłek — to od niego zależą domyślne lokalizacje i zachowanie dokumentu.
- Korzystaj z pola origin do śledzenia dokumentu źródłowego — ułatwia to raportowanie i debugowanie procesów.
- Przy integracjach przez API model stock.picking jest w pełni dostępny — twórz ruchy przez relację move_ids, ale unikaj tworzenia pustych picków bez ruchów.
- Wykorzystuj scheduled_date do planowania realizacji — wpływa ona na rezerwacje i priorytetyzację operacji.
- Dla własnych pól stosuj prefiks x_ lub prefiks modułu, aby zmniejszyć ryzyko konfliktów z przyszłymi wydaniami Odoo.
Częste błędy
- Tworzenie przesyłek bez ustawienia picking_type_id — może prowadzić do błędnych domyślnych lokalizacji i nieprawidłowego zachowania.
- Modyfikowanie move_ids po potwierdzeniu bez zrozumienia maszyny stanów — przejścia stanowe i tworzenie ruchów są złożone i łatwo wprowadzić niespójności.
- Zapominanie o ustawieniu partner_id przy wydaniach — brak kontrahenta może uniemożliwić integrację z przewoźnikami i poprawne generowanie dokumentów.
- Nadpisywanie button_validate bez wywołania super() — ryzyko zepsucia tworzenia backorderów i kolizji z innymi modułami.
- Zakładanie, że move_ids i move_line_ids zawsze będą zsynchronizowane — linie ruchu powstają przy rezerwacji lub przy operacjach szczegółowych, więc ich stan może się różnić.
Podsumowanie
Model stock.picking to serce modułu magazynowego w Odoo — przechowuje wszystkie przesunięcia, wydania i przyjęcia. Znajomość jego pól i sposobu rozszerzania pozwala lepiej konfigurować, dostosowywać i integrować system.
Czy jesteś konsultantem mapującym procesy magazynowe, czy programistą tworzącym rozszerzenia — solidne zrozumienie stock.picking oszczędzi czas i ograniczy ryzyko błędów.
Gotowy zoptymalizować magazyn w Odoo?
Dasolo wspiera firmy we wdrożeniach, dostosowaniach i optymalizacji Odoo. Specjalizujemy się w integracjach API i rozwoju modułów — mamy szerokie doświadczenie w architekturze danych Odoo oraz pracy z modelami jak stock.picking.
Jeśli potrzebujesz wsparcia przy wdrożeniu Odoo, tworzeniu niestandardowych modułów magazynowych lub integracji systemów, chętnie pomożemy. Umów demo aby omówić Twój projekt.