Tworzenie 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:
| Tryb | Opis |
|---|---|
| 1. Nowe zlecenie | aktywne tylko pole ID; po wyborze kontrahenta ładują się jego dane, ustawienia, trasy i alerty |
| 2. Edycja | wczytane zlecenie do modyfikacji (jeśli status edytowalny) |
| 3. Kopiowanie | część pól zasilona ze zlecenia źródłowego — zob. Kopiowanie zlecenia |
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
- 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.
- 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.
- Grupy towarowe — pozycje towaru (grupa, towar, nr załadunku, wartość EUR, podatność na kradzież, „Więcej”).
- Informacje dodatkowe — instrukcja kierowcy, notatka dla sekcji, e-mail potwierdzenia.
- BBS — „Odśwież cenę BBS” wywołuje wyznaczenie proponowanej ceny z HERE Maps (trasa ładowana na mapę).
- Warunki Wykonania Zlecenia (WWZ) — pojazd/zabudowa, wyposażenie, pozostałe warunki.
- Parametry zlecenia — typ zlecenia (zob. niżej).
- Dane fakturowania — waluta, termin, dokument dostawy, poziom fakturowania itd.
Kroki tworzenia (skrót)
- Wybór kontrahenta (
p_p301_ajax_load_client) → załadowanie domyślnych WWZ, tras, zasad fakturowania, alertów. - WWZ — domyślne ładuje
p_p301_load_default_wwz(zPRODUKT_WWZ+KONTRAHENT_WWZ); edycja w oknie WWZ (p_p305_save_wwz). - Towar — siatka zasilająca kolekcję APEX
S_TOWARY(p_p301_ajax_add_row_towary_col, edycja/p_p302_save_cargo_coldla wymiarów/ADR/OCP). - Adresy — kolekcja adresów (min. 2: załadunek + rozładunek), z datami/godzinami i e-mailem awizacji.
- Dane ogólne i fakturowania — kwota, waluta, instrukcje, dane FK.
- 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)
| Pole | Walidacja |
|---|---|
P301_WARTOSC, P301_KWOTA, P301_ILOSC | not null |
P301_WALUTA_FAKTUROWANIA | not null |
P301_TERMIN_PLATNOSCI | not null + wartość numeryczna |
P301_SKAD, P301_DOKAD | not null (adres na fakturze) |
P301_TEMP_TRANSPORTU | not null (warunkowo) + numeryczna |
P301_TEMP_TOWARU | numeryczna |
P301_INSTRUKCJA_DLA_KIEROWCY | maks. długość 2200 |
BBS_KWOTA | not null oraz nie mniej niż 50% ceny sugerowanej (przy wysyłce do BBS) |
Walidacje siatki towaru (CARGO / S_TOWARY)
| Walidacja | Reguła |
|---|---|
| CARGO – Grupa towarowa | każdy towar ma grupę (f_p301_validate_cargo_group: count(*) = count(C001)) |
| CARGO – Towar | każdy towar ma opis (f_p301_validate_cargo_value: count(*) = count(C002)) |
| CARGO – Wartość EUR | każ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 towaru | każdy towar ma przypisany adres (walidacja NOT_EXISTS — nie może istnieć towar bez adresu) |
| Formularz ADR | gdy towar oznaczony ADR → komplet pól ADR (f_p301_validate_adr: nr UN, klasa, grupa pakowania, forma przewozu, ilość, miara) |
| ADR vs WWZ | spójność: jeśli WWZ ma ADR, musi istnieć towar ADR (f_p301_validate_wwz_adr) |
Walidacje adresów i WWZ
| Walidacja | Reguł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 interes | not null oraz walidacja progu (> 100K) |
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:
| Komunikat | Funkcja | Warunek |
|---|---|---|
| Opłata spekulacyjna (słaba historia płatnicza) | f_get_speculative_fee_message | PARAM_FIN <= 0 (kwota wg sekcji XX/VV z VAN_PARAMS) |
| Ryzyko większe od założonego | f_get_speculative_percent_message | PARAM_FIN < (specyfikacje i faktury) → obciążenie PROCENT_WARTOSCI_FRACHTU % frachtu |
| Kontrahent jest spedycją | f_get_shipping_message | PODMIOT.SPEDYCJA_STAN = 1 → forward fee w BSC |
| Kończy się ważność parametru finansowego | f_get_param_fin_valid_message | ważność PARAM_FIN < sysdate + PARAM_FIN_INFO_KONIEC |
| Kontrahent z książką instrukcji | f_get_ksiazka_instrukcji_message | istnieje 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
| Procedura | Działanie |
|---|---|
p_p301_ajax_check_md_accept / f_p301_check_md_accept | czy 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_values | autopodpowiedź: 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_control | auto-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ść:
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).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.ZLECENIE_DANE_ADRESOWE— adresy (typS/D, data podstawienia, e-mail awizacji); powiązane instrukcje wZLECENIE_KSIAZKA_INSTRUKCJI.ZLECENIE_TOWAR— towary (grupa, opis, wymiary, ilość, waga, flagi palet/monitoring, ADR, OCP); kody wZLECENIE_TOWAR_ADR/ZLECENIE_TOWAR_EXT_OCP.ZLECENIE_WWZ— warunki: kody z kolekcji mapowane naS_WWZ(f_get_wwz_id_by_code).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_editablesprawdzaS_ZLECENIE_STATUS.EDYCJA; jeśli0→ wyjątekex_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 sekcjiXX/VV); wynik zasilaZLECENIE.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 doZLECENIE_OH02, aZLECENIE.OH2_NARUSZENIE=1(e-mail wysłany) lub2(jest akceptacja ryzyka, e-mail pominięty). - E-mail potwierdzenia — gdy WWZ wymaga potwierdzenia (
PP_ZLEC), pocommitwysył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 doZLECENIE_HISTORIA_ZMIAN(stara → nowa wartość).
Wyjątki / kody błędów (przykładowe)
| Wyjątek | Kod | Znaczenie |
|---|---|---|
ex_order_not_editable | −1001 | status nie pozwala na edycję |
ex_dup_idx_* | −1002…−1005 | naruszenie unikalności (zlecenie/fakturowanie/adresy/towar) |
ex_no_order_found | −1099 | brak 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(typTYP_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):
| Kolekcja | Przeznaczenie | Wybrane kolumny |
|---|---|---|
S_TOWARY | towary | C001 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_ZZ | adresy | C001 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_COL | warunki WWZ | C002 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ść |
ALERTS | ostrzeżenia kontrahenta | C001 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.
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.