Moduł Obsługa Zlecenia

Tworzenie zlecenia

Okno Nowe zlecenie (2000:301) — kroki, walidacje, procedura f_save_order i tabele zasilane przy tworzeniu zlecenia.

Tworzenie zlecenia odbywa się w oknie Nowe zlecenie (2000:301), obsługiwanym głównie przez NOWE_ZLECENIE_PKG. To samo okno działa w trzech trybach:

TrybOpis
1. Nowe zlecenieaktywne tylko pole ID; po wyborze kontrahenta ładują się jego dane, ustawienia, trasy i alerty
2. Edycjawczytane zlecenie do modyfikacji (jeśli status edytowalny)
3. Kopiowanieczęść pól zasilona ze zlecenia źródłowego — zob. Kopiowanie zlecenia
Kopiowanie i edycja korzystają z tej samej logiki i tej samej procedury zapisu f_save_order co tworzenie — różni je tryb wejścia i to, czy P301_ID_ZLECENIA jest puste (INSERT) czy ustawione (UPDATE).

Diagram procesu

flowchart TD
  classDef proc fill:#eaf1f9,stroke:#1f5fa6,color:#19222f;
  classDef dec fill:#efeafa,stroke:#6b4fa6,color:#19222f;
  classDef block fill:#fbeced,stroke:#a8252c,color:#7d2329;
  classDef alert fill:#fdf4e3,stroke:#9a6b12,color:#6b521a;
  classDef ok fill:#e7f2ec,stroke:#2c7350,color:#235e41;

  A(["Otwórz okno Nowe zlecenie (2000:301)"]) --> B["Wybór kontrahenta<br/>p_p301_ajax_load_client"]
  B -. "alerty niblokujące" .-> AL["Spekulacja · ryzyko · spedycja<br/>ważność PARAM_FIN · książka instrukcji"]
  B --> C["Adresy: skąd / dokąd + trasy"]
  C --> D["Towar + grupa towarowa<br/>MD accept · wartość · KONTROL_TEMP"]
  D --> E["WWZ: pojazd, zabudowa, ADR"]
  E --> F["Dane ogólne + fakturowanie"]
  F --> G{"Walidacje pól OK?"}
  G -- "NIE: błąd, powrót" --> F
  G -- TAK --> H{"Edycja: status edytowalny?"}
  H -- NIE --> X["ex_order_not_editable (blokada)"]
  H -- "TAK / nowe" --> I["HERE Maps: trasa + km<br/>+ cena sugerowana"]
  I --> J["INSERT: ZLECENIE (status 1) → FAKTUROWANIE →<br/>DANE_ADRESOWE → TOWAR → WWZ → KLIENT_PRZEWOZNIK"]
  J --> K["Stawka VAT (VAT_SOMMELIER_PKG)"]
  K --> L{"Towar wartościowy / podatny?"}
  L -- TAK --> M["E-mail MD · ZLECENIE_OH02 · OH2_NARUSZENIE"]
  L -- NIE --> N["COMMIT"]
  M --> N
  N --> O["E-mail potwierdzenia (jeśli PP_ZLEC)"]
  O --> P(["Status Nowe (1) → przestrzeń Planowanie"])

  class B,C,D,E,F,I,J,K,N,O proc;
  class G,H,L dec;
  class X block;
  class AL alert;
  class A,P ok;

Elementy okna

  1. Dane kontrahenta — po wyborze klienta ładowane są dane finansowe: parametr finansowy, specyfikacje i faktury, niezapłacone w terminie, zagrożone (>30 dni), płaci po 12m / 2m, obrót 12m, windykacje/straty; mogą pojawić się alerty kontrahenta.
  2. Załadunki/rozładunki, trasy, mapa — zarządzanie adresami; podpowiedzi „trasy najczęstsze / ostatnie” (dwuklik zasila Skąd/Dokąd); po wyborze adresu region tras chowa się, a pokazuje mapa.
  3. Grupy towarowe — pozycje towaru (grupa, towar, nr załadunku, wartość EUR, podatność na kradzież, „Więcej”).
  4. Informacje dodatkowe — instrukcja kierowcy, notatka dla sekcji, e-mail potwierdzenia.
  5. BBS — „Odśwież cenę BBS” wywołuje wyznaczenie proponowanej ceny z HERE Maps (trasa ładowana na mapę).
  6. Warunki Wykonania Zlecenia (WWZ) — pojazd/zabudowa, wyposażenie, pozostałe warunki.
  7. Parametry zlecenia — typ zlecenia (zob. niżej).
  8. Dane fakturowania — waluta, termin, dokument dostawy, poziom fakturowania itd.

Kroki tworzenia (skrót)

  1. Wybór kontrahenta (p_p301_ajax_load_client) → załadowanie domyślnych WWZ, tras, zasad fakturowania, alertów.
  2. WWZ — domyślne ładuje p_p301_load_default_wwz (z PRODUKT_WWZ + KONTRAHENT_WWZ); edycja w oknie WWZ (p_p305_save_wwz).
  3. Towar — siatka zasilająca kolekcję APEX S_TOWARY (p_p301_ajax_add_row_towary_col, edycja/p_p302_save_cargo_col dla wymiarów/ADR/OCP).
  4. Adresy — kolekcja adresów (min. 2: załadunek + rozładunek), z datami/godzinami i e-mailem awizacji.
  5. Dane ogólne i fakturowania — kwota, waluta, instrukcje, dane FK.
  6. Zapis → walidacje → f_save_order.

Walidacje pól (blokujące zapis)

Zapis (Submit) jest blokowany, dopóki nie przejdą walidacje. Pochodzą z dwóch warstw: walidacje APEX na stronie 301 oraz funkcje PL/SQL na kolekcjach.

Walidacje pól nagłówka i fakturowania (APEX)

PoleWalidacja
P301_WARTOSC, P301_KWOTA, P301_ILOSCnot null
P301_WALUTA_FAKTUROWANIAnot null
P301_TERMIN_PLATNOSCInot null + wartość numeryczna
P301_SKAD, P301_DOKADnot null (adres na fakturze)
P301_TEMP_TRANSPORTUnot null (warunkowo) + numeryczna
P301_TEMP_TOWARUnumeryczna
P301_INSTRUKCJA_DLA_KIEROWCYmaks. długość 2200
BBS_KWOTAnot null oraz nie mniej niż 50% ceny sugerowanej (przy wysyłce do BBS)

Walidacje siatki towaru (CARGO / S_TOWARY)

WalidacjaReguła
CARGO – Grupa towarowakażdy towar ma grupę (f_p301_validate_cargo_group: count(*) = count(C001))
CARGO – Towarkażdy towar ma opis (f_p301_validate_cargo_value: count(*) = count(C002))
CARGO – Wartość EURkażdy towar ma wartościowość (f_p301_validate_eur_value: count(*) = count(C004))
CARGO – Podatnośćkażdy towar ma podatność na kradzież (f_p301_validate_susceptibility: count(*) = count(C005))
Pusty adres dla towarukażdy towar ma przypisany adres (walidacja NOT_EXISTS — nie może istnieć towar bez adresu)
Formularz ADRgdy towar oznaczony ADR → komplet pól ADR (f_p301_validate_adr: nr UN, klasa, grupa pakowania, forma przewozu, ilość, miara)
ADR vs WWZspójność: jeśli WWZ ma ADR, musi istnieć towar ADR (f_p301_validate_wwz_adr)

Walidacje adresów i WWZ

WalidacjaReguła
Adresy (skąd/dokąd)min. 2 adresy, każdy z wybranym adresem (f_p301_validate_addresses: count(*) >= 2 and count(*) = count(N001))
WWZ – Pojazd„Not null vehicle” — pojazd wymagany
WWZ – Zabudowa„Not null if trailer in lorry” — zabudowa wymagana dla zestawu
Specjalny interesnot null oraz walidacja progu (> 100K)
Walidacje funkcyjne liczą wprost na kolekcji S_TOWARY / ADRESY_ZZ wzorem count(*) = count(Cxxx) — czyli „wszystkie wiersze mają wypełnione pole”. ADR ma dwie walidacje: kompletność formularza ADR oraz spójność z WWZ.

Komunikaty przy wyborze kontrahenta (alerty, niblokujące)

Po wyborze kontrahenta p_p301_ajax_load_client + p_p301_ajax_load_notification_for_client ładują dane finansowe i zasilają kolekcję ALERTS (typ „warning”). To ostrzeżenia informacyjne — nie blokują zapisu:

KomunikatFunkcjaWarunek
Opłata spekulacyjna (słaba historia płatnicza)f_get_speculative_fee_messagePARAM_FIN <= 0 (kwota wg sekcji XX/VV z VAN_PARAMS)
Ryzyko większe od założonegof_get_speculative_percent_messagePARAM_FIN < (specyfikacje i faktury) → obciążenie PROCENT_WARTOSCI_FRACHTU % frachtu
Kontrahent jest spedycjąf_get_shipping_messagePODMIOT.SPEDYCJA_STAN = 1 → forward fee w BSC
Kończy się ważność parametru finansowegof_get_param_fin_valid_messageważność PARAM_FIN < sysdate + PARAM_FIN_INFO_KONIEC
Kontrahent z książką instrukcjif_get_ksiazka_instrukcji_messageistnieje książka instrukcji dla podmiotu

PARAM_FIN przy edycji bierze się z ZLECENIE_FAKTUROWANIE.PRAM_FIN_ORG, a przy nowym — z WNIOSKI (wnioski_pkg.f_get_param_fin).

Sprawdzenia przy wyborze grupy towarowej

ProceduraDziałanie
p_p301_ajax_check_md_accept / f_p301_check_md_acceptczy pokazać checkbox akceptacji MD — gdy S_GRUPY_TOWAROWE.AKCEPTACJA_MD = 1 lub kontrahent ma RYZYKO_AKCEPT_STAN = 1
p_p301_ajax_check_cargo_susceptibility_and_valuesautopodpowiedź: podatność i wartość towaru (f_count_cargo_value = pojemność × wartość palety / kurs EUR → kod z S_WARTOSC_TOWARU), oraz notatki/instrukcje sekcji zależne od krajów tras (PL / UE / poza UE)
p_p301_ajax_check_temperature_controlauto-dodanie/usunięcie warunku KONTROL_TEMP w WWZ, gdy towar ma OCP „kontrola temperatury”

Zapis — f_save_order

Procedura NOWE_ZLECENIE_PKG.f_save_order zapisuje zlecenie i jego elementy. Przy pi_order_id IS NULL (nowe) wykonuje INSERT-y; przy ustawionym ID — UPDATE (po sprawdzeniu f_is_status_editable). Kolejność:

  1. ZLECENIE — nagłówek: kontrahent, numer klienta, wartość/ilość/kwota/waluta, typ zlecenia, sekcja, instrukcja/notatka, spedytor, sugerowane km i cena z HERE Maps, ID_STATUS = 1 (Nowe).
  2. ZLECENIE_FAKTUROWANIE — dane FK: Skąd/Dokąd, dokument dostawy, typ faktury, termin płatności, waluta i kurs (ID_KURS_DZIEN), poziom fakturowania (M/S), uwagi FV, filia, PRAM_FIN_ORG/SPEC_FAK_ORG.
  3. ZLECENIE_DANE_ADRESOWE — adresy (typ S/D, data podstawienia, e-mail awizacji); powiązane instrukcje w ZLECENIE_KSIAZKA_INSTRUKCJI.
  4. ZLECENIE_TOWAR — towary (grupa, opis, wymiary, ilość, waga, flagi palet/monitoring, ADR, OCP); kody w ZLECENIE_TOWAR_ADR / ZLECENIE_TOWAR_EXT_OCP.
  5. ZLECENIE_WWZ — warunki: kody z kolekcji mapowane na S_WWZ (f_get_wwz_id_by_code).
  6. ZLECENIE_KLIENT_PRZEWOZNIK — trasy (kombinacje adresów skąd–dokąd).

Po zapisie zlecenie ma status Nowe (1) i pojawia się w przestrzeni Planowanie.

Weryfikacje i automaty w tle (przy zapisie)

Oprócz INSERT-ów f_save_order wykonuje szereg czynności „w tle”:

  • Edytowalność statusu — przy edycji istniejącego zlecenia f_is_status_editable sprawdza S_ZLECENIE_STATUS.EDYCJA; jeśli 0 → wyjątek ex_order_not_editable (zapis zablokowany).
  • Trasa i kilometraż (HERE Maps) — z adresów budowana jest trasa przez van_pricing.here_maps_pkg.f_get_route (z uwzględnieniem kontroli temperatury i kodu sekcji XX/VV); wynik zasila ZLECENIE.KM_SUGEROWANE, HERE_VIA_LAT/LNG, HERE_ROUTE_JSON. Błąd liczenia trasy nie blokuje zapisu.
  • Sugerowana cena — gdy są km, a użytkownik nie podał ceny (f_p301_get_price_new_order), cena jest wyliczana i zaokrąglana.
  • Stawka VAT — wyznaczana przez VAT_SOMMELIER_PKG (na podstawie kierunku/krajów).
  • Procedura OH02 (towar wartościowy / podatny) — jeśli którykolwiek towar ma wartość C004 ∈ ('200','201') lub podatność C005 = 'TAK', ustawiana jest flaga i wysyłany e-mail do MD (p_send_md_email), zapis do ZLECENIE_OH02, a ZLECENIE.OH2_NARUSZENIE = 1 (e-mail wysłany) lub 2 (jest akceptacja ryzyka, e-mail pominięty).
  • E-mail potwierdzenia — gdy WWZ wymaga potwierdzenia (PP_ZLEC), po commit wysyłany jest PDF zlecenia (p_send_confirmation_email) na adres z formularza + kopia do pracownika. Commit przed wysyłką, bo e-maila nie da się wycofać.
  • Historia zmian — przy edycji każda zmiana pól ZLECENIE / ZLECENIE_FAKTUROWANIE / adresów jest logowana do ZLECENIE_HISTORIA_ZMIAN (stara → nowa wartość).

Wyjątki / kody błędów (przykładowe)

WyjątekKodZnaczenie
ex_order_not_editable−1001status nie pozwala na edycję
ex_dup_idx_*−1002…−1005naruszenie unikalności (zlecenie/fakturowanie/adresy/towar)
ex_no_order_found−1099brak zlecenia do zapisania

Inne wyjątki domenowe: gc_no_podmiot_found (kontrahent bez podmiotu), gc_not_valid_section (nieprawidłowa sekcja).

Typ zlecenia i uprawnienia

ZLECENIE.TYP_ZLECENIA: D Drogowe (domyślny) / M Morskie-Lotnicze / P Promowe. Dostępność typów:

  • admin → wszystkie,
  • sekcja z produktu 2 (5. znak kodu sekcji) → Morskie/Lotnicze,
  • sekcja XXGAS1 → Promowe,
  • w innym wypadku → wg dodatkowych uprawnień PRACOWNIK_SEKCJA_UPRAWNIENIA (typ TYP_ZLECENIA).

Zmiana typu czyści pole „Poziom fakturowania”.

WWZ — domyślne źródła

p_p301_load_default_wwz łączy PRODUKT_WWZ (warunki produktu/sekcji) + KONTRAHENT_WWZ (warunki kontrahenta), filtrując po statusie. Automatyka: gdy towar ma OCP „kontrola temperatury”, do WWZ dopisywany jest odpowiedni warunek (p_p301_ajax_check_temperature_control).

Kolekcje APEX (stan formularza przed zapisem)

Dane formularza przed zapisem żyją w kolekcjach APEX (kolumny Cxxx/Nxxx):

KolekcjaPrzeznaczenieWybrane kolumny
S_TOWARYtowaryC001 grupa, C002 opis, C004 kod wartości, C005 podatność, C007 opakowanie, C008–C013 ilość/waga/wymiary/kubatura, C014 flagi (PW:PP:M:OP:ADR:OCP), C016 kody OCP, C017–C022 dane ADR (UN, klasa, grupa pakowania, forma, ilość, miara)
ADRESY_ZZadresyC001 typ (SKAD/DOKAD), D001 data podstawienia, C002/C003 godz. od/do, C004 kontrahent, C005 uwagi, C006 e-mail awizacji, N001 ID adresu, N004 LP
ZLECENIE_WWZ_COLwarunki WWZC002 sposób załadunku, C003 norma euro, C004 wyposażenie, C005 flagi (ADR:KONTROL_TEMP:…), C006/C007 pojazd/zabudowa, C008 specjalny interes, N001–N005 wymiary/ładowność
ALERTSostrzeżenia kontrahentaC001 tekst, C002 typ (warning), C003 ikona, C004 ID alertu

Parametry VAN_PARAMS używane przy tworzeniu

OPLATA_SPEK_KRAJ / OPLATA_SPEK_MIEDZYNARODOWA (+ _WALUTA), PROCENT_WARTOSCI_FRACHTU, PARAM_FIN_INFO_KONIEC — wykorzystywane w komunikatach finansowych (spekulacja, ważność parametru). Zob. też Spekulacja.

Numer wewnętrzny zlecenia to ZLECENIE.ID (identity). NUMER_ZLECENIA_KONTRAHENTA to opcjonalny numer z systemu klienta (nie jest unikalny). Zlecenia mogą też powstawać przez API (z platformy Ładunki) — trafiają wtedy również do Planowania i są edytowane jak zwykłe.
Copyright © 2026