Udostępnij ten wpis
Wstęp
W dzisiejszym artykule omówię temat kalkulacji wartości dat przyjęcia (towarów lub usług), które pojawiają się na dokumentach zakupu. Na przykładzie dokumentu Zamówienia zakupu, przybliżę jakie są zależności między poszczególnymi datami, tj. w jaki sposób zmiana jednej wpływa na wartości kolejnych. Wyszczególnię też jakie wartości i ustawienia w aplikacji wpływają na obliczenia wartości dat przyjęcia zakupu.
Temat na pierwszy rzut oka wydaje się dosyć prosty – ot, daty na nagłówku i wierszach dokumentu zakupu, które pokazują kiedy towar/usługa zostaną przyjęte – aczkolwiek mnogość parametrów, które wpływają na automatyczne wyliczanie tych dat przez system i ciekawe zależności pomiędzy datami, powodują, że gdy bardziej się zagłębimy w to zagadnienie, odkryjemy niezwykle przydatną w codziennej pracy użytkownika funkcjonalność, która może służyć, a nie przeszkadzać.
Zagadnienie zostało opisane w dokumentacji BC: Calculate Dates for purchases ↗. Dostępny jest również moduł szkoleniowy dotyczący szacowania dat przyjęcia zakupu: Estimate purchase order receipt dates in Dynamics 365 Business Central ↗.
Pola dat przyjęcia zakupu
Zacznijmy od ustandaryzowania nomenklatury, którą posługuje się Business Central w celu określenia dat przyjęcia zakupu na dokumentach zakupu (i na wierszach zakupu). Poniższe opisy tworzę na przykładzie dokumentu i wierszy Zamówienia zakupu w sytuacji zamawiania zapasów, czyli wtedy gdy daty przyjęcia mają największe zastosowanie.
- Data zamówienia (obowiązkowa) – data kiedy zapasy zostały (lub powinny zostać) zamówione u Dostawcy; w ten dzień zamówienie powinniśmy wysłać do Dostawcy i w większości scenariuszy uznajemy tę datę jako datę, kiedy Dostawca otrzymał zamówienie
- Żądana data przyjęcia (opcjonalna) – data narzucona przez nas jako zamawiającego dla Dostawcy; na ten dzień chcemy, aby Dostawca dostarczył do nas zapasy pod drzwi magazynu (dopiero następnie rozpoczyna się sam proces przyjęcia zapasów przez magazyn, zatem lepszą nazwą byłoby Żądana data dostawy, ale cóż… jest jak jest)
- Uzgodniona data przyjęcia (opcjonalna) – data uzupełniana, gdy Dostawca nie jest w stanie dostarczyć zapasów na dzień określony w Żądanej dacie przyjęcia; na ten dzień Dostawca zobowiązuje się dostarczyć do nas zapasy pod drzwi magazynu – zwykle jest to data późniejsza niż Żądana data przyjęcia i gdy jest uzupełniona, staje się obowiązującą datą dostawy
- Planowana data przyjęcia (wynikowa) – data kiedy zapasy zostaną dostarczone przez Dostawcę; uwzględnia czas realizacji od chwili zamówienia (określonej w Dacie zamówienia), do chwili dostarczenia zapasów pod drzwi magazynu; data uwzględnia opcjonalne daty przyjęcia (Żądaną datę przyjęcia lub Uzgodnioną datę przyjęcia), jeżeli zostały uzupełnione (zatem tutaj również, podobnie jak w dwóch poprzednich przypadkach, mówimy bardziej o dacie dostawy, a nie dacie przyjęcia)
- Przewidywana data przyjęcia (wynikowa) – data kiedy zapasy będą przyjęte na stan przez magazyn (zakończenie procesu przyjęcia zapasów przez magazyn) i tym samym dostępne do podjęcia z magazynu; do Planowanej daty przyjęcia (czyli dostarczenia pod drzwi magazynu) dodawany jest czas potrzebny magazynowi na realizację przyjęcia

Planowanie wg przewidywanej daty przyjęcia
Warto też zaznaczyć (i zapamiętać), że to właśnie data przedstawiona w polu Przewidywanej daty przyjęcia jest pobierana przez system do wyliczania dostępności zapasu na magazynie. Wszystkie funkcje Dostępności zapasu wg opierają się na wartości właśnie z tego pola.

Oczywiście na Zamówieniach zakupu mamy również inne pola dat, tj.: Data dokumentu, Data księgowania, Data przyjęcia faktury, Termin płatności, Data rabatu terminowego, a w ramach pakietów lokalizacyjnych, np. Polish Localization jeszcze kolejne… Nie dotyczą one jednakże kalkulowania daty przyjęcia towarów lub usług na dokumencie, ani nie uczestniczą w żaden sposób w procesie przyjęcia, dlatego nie omawiam ich w tym artykule.
Pola uczestniczące w kalkulacji i szacowaniu dat przyjęcia, które wylistowałem i opisałem powyżej, znajdują się zarówno na nagłówku jak i na wierszach zakupu (wyjątkiem jest Planowana data przyjęcia, która występuje tylko na wierszach). Zachowanie systemu jest tutaj standardowe dla BC, czyli analogiczne do innych obszarów, gdzie mamy powielone pola pomiędzy nagłówkiem, a wierszami dokumentu. Mianowicie, wartości pól z nagłówka służą głównie odpowiedniej prezentacji całego dokumentu, natomiast to wartości pól z wierszy biorą udział w logice systemu i są używane przez większość funkcjonalności oraz pobierane do wyliczeń dokumentu wiersz-po-wierszu. Aby prezentacja była spójna z logiką, każda zmiana wartości pola w nagłówku powoduje wyświetlenie standardowego komunikatu dialogowego z pytaniem do użytkownika, czy system powinien nanieść zmianę również na wiersze dokumentu czy nie.
Domyślna widoczność pól z datami przyjęcia zakupu
Jeżeli nie widzisz któregokolwiek z wyżej wylistowanych pól w nagłówku lub wierszu dokumentu, a chcesz z nich korzystać, jako użytkownik możesz je dodać do swojego widoku za pomocą Personalizacji, a jeżeli jesteś administratorem, możesz dodać je użytkownikom danego profilu za pomocą Dostosowywania.
Kalkulacja bez żądanej daty przyjęcia
Domyślny sposób kalkulacji, nie wymagający od użytkownika żadnych dodatkowych działań, to wyliczanie dat przyjęcia zakupu bez wprowadzania Żądanej daty przyjęcia, czyli daty którą narzucilibyśmy Dostawcy jako datę, w której chcemy otrzymać dostawę.
Jest to zatem metoda odpowiednia dla scenariusza, gdy zapasy zamawiamy zwykle z wyprzedzeniem (w stosunku do zapotrzebowania), a sam moment przyjęcia nie jest w tej chwili priorytetem. Rekomenduję używanie tej metody dla zakupu zapasów, dla których mamy regularne dostawy, zapasów, których poziom magazynowy jest stale uzupełniany (sugerowane ustawienia uzupełniania i planowania: Metoda uzupełnień = Zakup, Zasady ponownego zamawiania = Stała ilość ponownego zamówienia lub Maksymalna ilość w Kartotece zapasu lub Jednostce składowania zapasu) i nie musimy obsłużyć żadnych ostrzeżeń planowania o nagłych wypadkach czy wyjątkach.
Wyliczenie Planowanej daty przyjęcia oraz Przewidywanej daty przyjęcia bazuje przede wszystkim na Dacie zamówienia, odbywa się metodą w przód oraz bierze pod uwagę parametry odpowiadające za czas realizacji (tzw. lead time), bufor na czas realizacji (ang. safety lead time) oraz czas realizacji przyjęcia w magazynie (czas przeprocesowania czynności magazynowych). Automatyczne wyliczenie odpowiednich wartości przez system odbywa się wg następujących działań:
- Data zamówienia = automatycznie podczas tworzenia dokumentu przybiera wartość Daty roboczej; użytkownik może edytować datę, aby określić dzień, w którym zamówienie będzie przesłane Dostawcy do realizacji
- Planowana data przyjęcia = Data zamówienia (wyliczona/wprowadzona powyżej) + Formuła cyklu realizacji (patrz wyjaśnienie parametrów czasu realizacji ↓)
- Przewidywana data przyjęcia = Planowana data przyjęcia (wyliczona powyżej) + Czas czynności mag. na wejściu + Tolerancja czasu realizacji (patrz wyjaśnienie parametrów czasu realizacji ↓)
Procedury realizujące w kodzie AL
Wyliczenie wartości pola Planowanej data przyjęcia realizowane jest przez procedurę UpdatePlannedReceiptDateFromOrderDate w obiekcie tabeli 39 – Purchase Line. Jest ona wywoływana podczas uruchomienia wyzwalacza OnValidate na polu Daty zamówienia (w którym wartość jest automatycznie wprowadzana lub którą użytkownik edytuje ręcznie). Następnie, wyliczenie wartości Przewidywanej data przyjęcia odbywa się dalej na poziomie ww. wyzwalacza.
Wyjaśnienie parametrów czasu realizacji
- Formuła cyklu realizacji – określa czas realizacji zamówienia dla zapasu lub zapasów, liczony od Daty zamówienia do daty dostarczenia zapasu przez Dostawcę; wpisujemy więc ile trwa standardowy czas realizacji dostawy; w polu określa się formułę czasu, przykładowo: 5D dla 5 dni, 1T dla 1 tygodnia, itd.; wartość może być definiowana dla zapasu lub zapasów w kilku miejscach, zgodnie z kolejnością priorytetu:
- Katalog dostawców zapasu
- Kartoteka jednostki składowania zapasu
- Kartoteka zapasu
- Kartoteka dostawcy
Gdzie uzupełnić formułę cyklu realizacji
Jeżeli dla danego Dostawcy czas dostawy jest zawsze taki sam, niezależnie od tego jakie zapasy zamawiamy – standardowy czas dostawy przypisujemy Dostawcy, zatem uzupełnijmy go na Kartotece dostawcy. Jeżeli czas dostawy danego zapasu z jakiegoś powodu NIE zależy od Dostawcy i jest zawsze taki sam, niezależnie od kogo go zamówimy – standardowy czas dostawy przypisujemy zapasowi, zatem pole Formuły cyklu realizacji powinniśmy uzupełnić na Kartotece zapasu lub na Jednostce składowania zapasu (jeżeli istnieją SKU z różnymi lokalizacjami, wariantami i różnymi metodami uzupełnień). Jeżeli natomiast czas dostawy jest różny dla danego zapasu, w zależności od tego od którego Dostawcy go zamawiamy lub jeżeli dany zapas jest wyjątkiem od standardowego czasu realizacji wprowadzonego już w Kartotece dostawcy lub Kartotece zapasu, wówczas powinniśmy wprowadzić czas realizacji w polu Formuły cyklu realizacji w Katalogu dostawców zapasu.
- Tolerancja czasu realizacji – określa tolerancję dla standardowego czasu realizacji dostawy, która traktowana będzie jako dodatkowy bufor czasu realizacji dla opóźnień w dostawie; w polu określa się formułę czasu, przykładowo: 5D dla 5 dni, 1T dla 1 tygodnia, itd.; wartość może być definiowana w kilku miejscach z kolejnością priorytetu:
- Kartoteka jednostki składowania zapasu
- Kartoteka zapasu
- Ustawienia produkcji – pole Domyślna tolerancja czasu real.
- Czas czynności mag. na wejściu – określa czas potrzebny magazynowi do realizacji procesu przyjęcia zapasu od chwili dostarczenia go do magazynu przez Dostawcę do chwili udostępnienia zapasu do podjęcia z magazynu; w polu określa się formułę czasu (niestety dla tego przypadku, jedynie z dokładnością do 1 dnia), przykładowo: 1D dla 1 dnia, 1T dla 1 tygodnia, itd.; wartość czasu potrzebnego na przyjęcie towaru przez magazyn jest definiowana dla danego magazynu w Kartotece lokalizacji.
Wszystkie powyższe parametry czasu realizacji są kopiowane na dokument zakupu, zatem ręczna zmiana wartości dla każdego z tych pól przez użytkownika w nagłówku lub wierszu zakupu będzie miała automatycznie najwyższy priorytet – nadpisze wartość pobraną wg kolejności priorytetu z ustawień. Użytkownik może zatem obsłużyć sytuacje, gdy od standardowych czasów realizacji występują wyjątki, definiując (nadpisując) wartości pól bezpośrednio na nagłówku lub w wierszach Zamówieniu zakupu, którego dany wyjątek dotyczy.
Zmiana daty zamówienia
Powyżej opisane obliczenia odbywają się nie tylko w chwili tworzenia nowego zamówienia lub dodawania kolejnych wierszy. Każdorazowa ręczna zmiana Daty zamówienia spowoduje automatyczne powtórne przeliczenie wartości w polach Planowana data przyjęcia oraz Przewidywana data przyjęcia.
Wsteczne wyliczenie daty zamówienia
Pomimo, że Planowana data przyjęcia oraz Przewidywana data przyjęcia są polami, gdzie przechowywany jest wynik powyższych działań, pola te nadal pozostają edytowalne. Ręczna zmiana wartości daty w jednym z tych pól przez użytkownika spowoduje wsteczne wyliczenie pozostałych dat (kalkulacja dat metodą wstecz).
W opisanym scenariuszu nie jest to częsty przypadek, ale jak najbardziej możliwy do realizacji. Jeżeli dla pojedynczego zamówienia użytkownik chciałby sprawdzić kiedy powinien złożyć zamówienie, aby (wg wprowadzonych do systemu parametrów czasu realizacji) zapasy były dostępne do podjęcia z magazynu w określonym przez niego dniu, może wprowadzić taką datę w pole Przewidywana data przyjęcia, a system odpowiednio wyliczy (odejmując Czas czynności mag. na wejściu oraz Tolerancję czasu realizacji) wartość w polu Planowana data przyjęcia, a następnie (odejmując jeszcze wartość Formuły cyklu realizacji) wartość w polu Data zamówienia. Wyliczona w ten sposób Data zamówienia jest datą, kiedy użytkownik powinien złożyć zamówienie do Dostawcy, aby zapas był dostarczony na czas oraz aby był dostępny do podjęcia z magazynu we wskazanej przez niego dacie.
Procedury realizujące w kodzie AL
Wyliczenie metodą wstecz wartości pola Daty zamówienia realizowane jest przez procedurę UpdateOrderDateFromPlannedReceiptDate w obiekcie tabeli 39 – Purchase Line. Jest ona wywoływana podczas uruchomienia wyzwalacza OnValidate na polu Planowanej daty przyjęcia, który jest z kolei wywoływany podczas uruchomienia wyzwalacza OnValidate na polu Przewidywanej daty przyjęcia (w którym wartość jest wprowadzana ręcznie przez użytkownika) z użyciem procedury ValidatePlannedReceiptDateWithCustomCalendarChange.
Wymagana data zamówienia na poziomie wiersza zakupu
Wyliczona metodą wstecz Data zamówienia jest aktualizowana jedynie w wierszu Zamówienia zakupu, natomiast Data zamówienia w nagłówku pozostaje bez zmian. Dzięki temu Data zamówienia z nagłówka może być wykorzystana jako data oficjalnego złożenia/wysłania zamówienia do Dostawcy, a widoczna jedynie użytkownikom BC (niewidoczna np. na wydruku zamówienia) Data zamówienia z wiersza, informuje użytkownika o dacie, w której zamówienie powinno zostać złożone/wysłane, aby spełnić ustaloną przez niego datę przyjęcia.
Kalkulacja z żądaną datą przyjęcia
Innym sposobem wyliczania dat przyjęcia zakupu jest użycie opcjonalnego pola Żądanej daty przyjęcia (oraz siłą rzeczy również Uzgodnionej daty przyjęcia), które pozwoli na narzucenie Dostawcy daty, w której chcielibyśmy, aby ten dostarczył do nas zapasy.
Jest to zatem metoda odpowiednia dla scenariusza, gdy zamawiamy zapasy zgodnie z metodą JIT, zapasy, które uzupełniamy jedynie pod zamówienie (sugerowane ustawienia uzupełniania i planowania: Metoda uzupełnień = Zakup, Zasady ponownego zamawiania = Zamówienie w Kartotece zapasu lub Jednostce składowania zapasu) lub zapasy, które uzupełniamy ad-hoc pod pojawiające się zapotrzebowanie przekraczające stan magazynowy, którego nie uzupełniamy regularnie (sugerowane ustawienia uzupełniania i planowania: Metoda uzupełnień = Zakup, Zasady ponownego zamawiania = Partia za partię w Kartotece zapasu lub Jednostce składowania zapasu), a także w przypadku konieczności obsługi ostrzeżeń planowania o nagłych wypadkach.
W tej metodzie, po wprowadzeniu wartości Żądanej daty przyjęcia, standardowe wyliczanie Planowanej daty przyjęcia (patrz w ¶ Kalkulacji bez żądanej daty przyjęcia) przestaje obowiązywać. Planowana data przyjęcia przyjmuje po prostu wartość wprowadzonej Żądanej daty przyjęcia. Automatyczne wyliczenie odpowiednich wartości przez system odbywa się wg następujących działań po wprowadzeniu wartości w pole Żądanej daty przyjęcia:
- Data zamówienia (w wierszu) = Żądana data przyjęcia – Formuła cyklu realizacji
- Przewidywana data przyjęcia = Żądana data przyjęcia + Czas czynności mag. na wejściu + Tolerancja czasu realizacji
Wyliczanie bazuje więc na wprowadzonej Żądanej dacie przyjęcia i metodą wstecz wyliczana jest Data zamówienia (w wierszu), czyli data, w której użytkownik powinien zamówić zapasy u Dostawcy, aby ten miał wystarczająco czasu na realizację dostawy na podany termin.
Procedury realizujące w kodzie AL
Wyliczenie metodą wstecz wartości pola Daty zamówienia realizowane jest przez procedurę UpdateOrderDateFromRequestedReceiptDate w obiekcie tabeli 39 – Purchase Line. Jest ona wywoływana podczas uruchomienia wyzwalacza OnValidate na polu Żądanej daty przyjęcia (w którym wartość jest automatycznie wprowadzona z zapotrzebowania lub którą użytkownik wprowadza ręcznie). Następnie, wyliczenie wartości Przewidywanej data przyjęcia odbywa się podczas uruchomienia wyzwalacza OnValidate na polu Daty zamówienia przez ww. procedurę.
Przeszła data zamówienia
W związku z tym, że Data zamówienia wyliczana jest wstecznie, w stosunkowo łatwy sposób użytkownicy mogą doprowadzać do sytuacji, gdy wyliczona Data zamówienia (w wierszu) będzie wskazywała na dzień przeszły! Chociaż w biznesie zamówienia na wczoraj to przecież normalka ;). Dzieje się to często podczas ostrzeżeń planowania o nagłych wypadach. Wprowadzona lub wyliczona przez istniejące zapotrzebowania Żądana data dostawy jest po prostu zbyt bliska dacie bieżącej i czas od dnia dzisiejszego do Żądanej daty dostawy jest krótszy niż standardowy czas realizacji (z pola Formuła cyklu realizacji).
Oczywiście zdarzyć się może, że będzie to świadome i celowe działanie użytkownika – chęć zmuszenia Dostawcy do dostarczenia zapasów szybciej niż standardowo.
Najważniejsze jednak, że jako użytkownik jesteśmy w stanie kontrolować takie przypadki. Zobaczymy po Dacie zamówienia w wierszu, że ta jest wcześniejsza niż Data zamówienia z nagłówka (data wysłania zamówienia do Dostawcy). Dodatkowo, otrzymamy komunikat, jeżeli po wprowadzeniu Żądanej daty przyjęcia wyliczona wartość Daty zamówienia będzie wcześniejsza niż data bieżąca (w tym przypadku Data robocza):

Dostawca negocjuje termin dostawy
Naturalnie może się zdarzyć, że Dostawca po otrzymaniu od nas zamówienia z określonymi Żądanymi datami przyjęcia, nie jest w stanie ich spełnić. Zwłaszcza w sytuacjach, w których czas do Żądanej daty przyjęcia jest krótszy niż standardowy lub uzgodniony wcześniej termin realizacji u tego Dostawcy (patrz ¶ Przeszła data zamówienia powyżej).
Gdy Dostawca odpowiada propozycją zmiany terminu dostawy (na późniejszy) i zakładając, że zgadzamy się na nowy termin, użytkownik powinien wprowadzić go do pola Uzgodniona data przyjęcia. Zauważ, że do tego celu przeznaczone osobne pole, tj. nie musimy zmieniać wartości pierwotnej w polu Żądana data przyjęcia. Dzięki temu mamy zachowany komplet informacji w zamówieniu – datę pierwotną, na którą chcieliśmy otrzymać dostawę oraz datę, którą ostatecznie wynegocjował Dostawca i która teraz jest i powinna być datą obowiązującą.
Wprowadzając wartość w polu Uzgodniona data przyjęcia przejmuje ona rolę pola Żądanej daty przyjęcia. Planowana data dostawy przyjmuje wartość pola Uzgodniona data przyjęcia i jednocześnie teraz to Uzgodniona data przyjęcia jest podstawą do wyliczania wartości pola Przewidywanej daty dostawy.
Kalendarze podstawowe
Jest jeszcze jedna rzecz, o której nie wspomniałem, a która jest istotna w funkcjonalności kalkulacji i szacowania dat przyjęcia. Są to Kalendarze podstawowe bądź Kalendarze dostosowane (kalendarze podstawowe z wprowadzonymi dodatkowymi wyjątkami dla danej lokalizacji lub Dostawcy), które ustawić możemy w Kartotece lokalizacji i/lub Kartotece dostawcy bądź w Danych firmy (jako kalendarz domyślny).
W kalendarzach definiować możemy dni pracujące oraz dni wolne (świąteczne), co w przypadku użycia funkcjonalności kalendarzy przy funkcjonalności kalkulacji i szacowania dat przyjęcia, znacząco wpływa na wszelkie obliczenia dat oraz parametrów długości czasu realizacji. Liczone są one jedynie w ramach dni pracujących z obowiązujących dane zamówienie kalendarzy, a termin dostawy nigdy nie będzie wyliczony na dzień wolny. Należy więc obowiązkowo ustawić Kalendarze podstawowe czy Kalendarze dostosowane, aby system mógł szacować daty przyjęcia zgodnie z pracą naszych magazynów i/lub naszych Dostawców.
Zakończenie
Uważam, że znajomość znaczenia każdego z pól dotyczących dat przyjęcia zakupu oraz znajomość zależności pomiędzy nimi, pozwoli na umiejętne wykorzystanie jakże przydatnej funkcjonalności systemu Business Central odpowiedzialnej za automatyczną kalkulację oraz szacowanie dat dostawy i przyjęcia lub daty zamówienia.
Osobiście napotkałem przypadki, kiedy użytkownicy BC – pracownicy działów zakupów i zaopatrzenia, nie zwracali uwagę na wartości w polach dat na Zamówieniach zakupu, ponieważ najczęściej wskazywały one wszystkie i tak dokładnie tę samą datę (brak ustawień parametrów czasu realizacji) lub wyliczanie dat i ich aktualizacja była nie zrozumiała i oceniona była przez użytkowników jako przypadkowa (brak wiedzy o znaczeniu każdej z dat i tego jak system je wylicza). Uzupełnienie ustawień wraz z użytkownikami oraz wyjaśnienie im jak działa system w kontekście kalkulacji i szacowania dat, za każdym razem skutkowało znaczącym wzrostem wydajności pracy w systemie dla tych osób.
Na koniec dodam, że w obszarze Sprzedaży, daty odpowiedzialne za określanie terminu wydania i terminu dostawy zapasów do klienta pod Zamówienie sprzedaży kierują się podobną logiką i posiadają analogiczną funkcjonalność jak ta opisana w tym artykule. Postaram się opisać zależności pól dat wydania i dostawy dla dokumentów sprzedaży w osobnym artykule.
Terminowych dostaw! 🚚