Wiki
Silnik cenowy
Jak deterministyczny silnik cenowy QuoteNode wylicza sumy ofert, rabaty, VAT i waluty.
Silnik cenowy
QuoteNode używa deterministycznego silnika cenowego, który gwarantuje powtarzalne i audytowalne wyliczenia. Każda cena, każdy rabat i każdy podatek są przetwarzane w określonej kolejności i zapisywane do weryfikacji.
Kolejność obliczeń
Silnik liczy ceny dokładnie w tej sekwencji:
- Cena jednostkowa pozycji — cena bazowa z katalogu albo wpisana ręcznie dla pozycji niestandardowej
- Ocena reguł cenowych — automatyczne korekty zależne od klienta lub grupy klientów
- Mnożenie przez ilość —
unit_price × quantity = line_subtotal - Rabat na poziomie pozycji — procentowy albo kwotowy rabat od
line_subtotal = line_net - VAT pozycji —
line_net × VAT_rate = line_vat - Brutto pozycji —
line_net + line_vat = line_gross - Subtotal — suma wszystkich
line_net - Rabat na poziomie oferty — procentowy albo kwotowy rabat od subtotal
- Dostawa — dodawana do subtotal po rabacie jako wartość netto
- Razem NETTO — subtotal po rabacie plus dostawa
- Razem VAT — suma VAT per pozycja, przeliczona ponownie po rabacie globalnym, jeśli dotyczy
- Razem BRUTTO —
total_net + total_vat
Reguły cenowe
Reguły cenowe pozwalają automatycznie korygować ceny na podstawie relacji z klientem.
Cel reguły
- Per customer — dla konkretnego klienta
- Per customer group — dla wszystkich klientów z określonej grupy
Zakres reguły
- All products — dla całego katalogu
- Specific product group — tylko dla produktów z konkretnej grupy
Typy reguł
- Percentage discount — rabat procentowy od ceny bazowej
- Percentage markup — narzut procentowy
- Fixed amount discount — stała kwota rabatu per jednostka
- Fixed amount markup — stała kwota narzutu per jednostka
Priorytety i konflikty
Gdy do tej samej kombinacji klient-produkt pasuje więcej niż jedna reguła:
- reguły są sortowane po priorytecie,
- wygrywa reguła o najwyższym priorytecie,
- reguły nie sumują się ze sobą.
Okres ważności
Każda reguła może mieć zakres dat valid_from i valid_to oraz flagę aktywności. Ewaluowane są tylko reguły aktywne i mieszczące się w swoim okresie ważności.
Multi-currency
QuoteNode wspiera oferty w dowolnej skonfigurowanej walucie:
- Base currency — domyślna waluta tenanta używana w raportach
- Offer currency — waluta wybrana dla konkretnej oferty
- FX rate — kurs pomiędzy walutą oferty a walutą bazową
Gdy oferta powstaje w walucie innej niż bazowa:
- ceny produktów są przechowywane w katalogu w walucie bazowej,
- przy tworzeniu oferty system przelicza je według aktualnego kursu,
- użyty kurs jest zapisywany w snapshotcie oferty,
- raporty pipeline przeliczają wartości z powrotem do waluty bazowej na podstawie tego właśnie kursu.
Na dziś kursy FX są zarządzane ręcznie przez administratora. Automatyczna integracja NBP/ECB pozostaje planowana.
Obsługa VAT
Grupy VAT
Grupy VAT definiują dostępne stawki podatkowe dla tenanta:
- standardowe stawki, takie jak 23%, 8%, 5%, 0%,
- stawkę zwolnioną,
- stawki niestandardowe dla specyficznych jurysdykcji.
Każdy produkt należy do grupy VAT. Jedna grupa jest oznaczona jako domyślna i trafia na nowe produkty oraz niestandardowe pozycje.
VAT per pozycja
VAT liczony jest per wiersz, a nie jako płaska stawka od sumy całkowitej. To konieczne przy ofertach mieszających produkty o różnych stawkach podatku.
Oferta zawiera zestawienie VAT pokazujące łączną wartość dla każdej stawki.
Tryby prezentacji cen
Każda oferta może działać w jednym z trzech trybów:
- NET — klient widzi wyłącznie wartości netto
- GROSS — klient widzi tylko wartości brutto
- NET + VAT + GROSS — pełne rozbicie na poziomie pozycji i sum
Tryb ustawiany jest per oferta i wpływa zarówno na PDF, jak i na stronę linku publicznego.
Rabaty
Rabaty na poziomie pozycji
Każda pozycja może mieć swój własny rabat:
- procentowy,
- kwotowy.
Rabat per pozycja działa po przemnożeniu ceny przez ilość, ale przed VAT.
Rabat na poziomie oferty
Na całą ofertę można nałożyć rabat globalny:
- procentowy,
- kwotowy.
Taki rabat jest stosowany po zsumowaniu pozycji, ale przed dostawą i VAT.
Prezentacja rabatów
System szablonów obsługuje trzy tryby pokazywania rabatów:
- BAKED_IN — klient widzi już cenę końcową
- SHOW_COLUMN — rabat pokazuje się jako osobna kolumna
- HIDDEN — rabat działa, ale nie jest eksponowany osobną kolumną
Zaokrąglenia
Wszystkie obliczenia pieniężne używają zaokrąglenia HALF_UP. Zaokrąglenia są stosowane:
- per pozycja po rabacie i przed VAT,
- per kwota VAT,
- per sumy końcowe oferty.
Spójny model zaokrągleń gwarantuje, że sumy pozycji zgadzają się z wynikiem całej oferty.
Utrwalone sumy
Wyliczone sumy są przechowywane w zdenormalizowanej tabeli offer_totals, aby wspierać:
- szybkie queryowanie w raportach i listach,
- weryfikację audytową,
- historyczną spójność nawet wtedy, gdy reguły cenowe zmienią się później.