ALBI B2B · interní zadání ← Rozcestník · verze 1.0 · 25. 9. 2026 · k revizi
F07 + P6 · fáze 1 · nové

Odstupňované ceny podle množství - pásma nad ceníkem adresy

Na kartě produktu tabulka: od 1 balení základní cena, od 6 balení nižší, od 12 ještě nižší. Košík počítá cenu podle množství. Pásma přicházejí z AlbiLine jako všechny ceny, e‑shop je ukládá k ceníku a neumožňuje je zadávat ručně.

Jádro + obálka (import) + SFX + AlbiLine FrontAPI: DTO produktu a košíku rozšířit Administrace: náhled pásem Závisí na blokeru Z1 Autor: Hana Ortmannová
Co se dělá

Odběratel má vidět, kolik ušetří, když objedná víc. Ceníky ALBI dnes drží jednu cenu na ceník, produkt a měnu, bez vazby na množství. Množstevní sleva v jádře neexistuje, modul VolumeDiscounts je sleva podle hodnoty košíku, a stará B2B obálka slevy v košíku zakazuje natvrdo. Pásma jsou proto nová datová struktura na třech místech: v AlbiLine, v e‑shopu a na frontendu.

Kam patří. Jádro MasterShopu (větev front-api): tabulka pásem, výpočet ceny podle množství v košíku, pásma v datech produktu a košíku, náhled v administraci. Množstevní ceny jsou obecný B2B požadavek. Obálka: import pásem v modulu AL ze synchronizace AlbiLine, tabulka pásem na detailu a štítek v košíku v SFX. Názvy nových tabulek a endpointů jsou pracovní, v jádru je pojmenuje programátor.

Otevřené otázky

K1 a K2 jsou obchodní pravidla, bez nich se nedá dokončit výpočet. K3 je závazek AlbiLine. Frontend a DTO jdou stavět hned.

Klient

Rozhoduje ALBI

#Otázka a náš návrh
K1Platí pásmo za položku, nebo za celou objednávku napříč produkty? Návrh: za položku. Je to jednoduché na pochopení i na výpočet a odpovídá tabulce na kartě produktu.
K2Počítají se pásma v baleních, nebo v kusech? Návrh: v baleních, protože B2B objednává po baleních a tabulka „od 6 balení" je čitelnější než „od 36 ks".
K3Dodá AlbiLine pásma novou tabulkou podle sekce 03? Bez toho funkce nemá data. Kdo a kdy na straně ALBI.
K4Modul množstevních slev je na dnešním B2B vypnutý natvrdo. Je to záměr, který má platit dál (žádné jiné slevy v B2B), nebo jen stav?
Vývojář

Rozhoduje vývoj

#Otázka
D1Ceník z doručovací adresy načítá jen stará obálka. Jádro ani obálka albi.eu kontext z adresy neplní a albi.eu sloupec customers_addresses.pricelist_id záměrně nemá. Nová obálka musí tuhle vazbu přenést dřív, než mají pásma smysl. Patří to k přenosu stávajících funkcí (odhad, blok B), tady jen připomínka.
D2Výpočet ceny položky v košíku pro B2B ve FrontAPI dnes neexistuje (bloker Z1). Kam přesně pásma zapojit, se rozhodne s řešením blokeru. Navrhujeme override cenové služby v obálce, jako to dělá stará obálka pro násobení balením.
D3Velikost balení není v DTO produktu ani v DTO položky košíku. Přidat pole piecesInPackage do produktové karty přes override konvertoru v obálce. Potřebují to i F01 a F05.
D4V synchronizaci ceníkových cen je v cyklu podezřelý return místo continue. Ověřit před tím, než se na stejný kód navěsí import pásem.

Shrnutí

Data a AlbiLine

Jak vypadají ceníky dnes

Nová tabulka v jádru

TabulkaSloupcePoznámka
b2b_price_list_tiersprice_list_id, product_id, currency_code, min_packages (int, od kolika balení), price (bez DPH za kus), update_timeUnikát (ceník, produkt, měna, min_packages). Řádek pro min_packages = 1 se NEUKLÁDÁ, to je ceníková cena.

Co má dodat AlbiLine K3

Nová tabulka PriceListTier ve stejném duchu jako PriceListSpecialItem, aby import mohl použít stejné mapování produktu přes cost level.

PoleVýznam
PriceListCodeKód ceníku, stejný jako v PriceList.
CostLevelCodeKód cenové hladiny produktu, stejný klíč jako u ceníkové ceny.
CurrencyCodeMěna.
MinPackagesOd kolika balení pásmo platí. Celé číslo větší než 1.
PriceCena za kus bez DPH v pásmu.

Workflow

Výpočet ceny za kus

  1. Vstup: produkt, ceník doručovací adresy zákazníka, měna, množství v baleních q.
  2. Základ: ceníková cena za kus bez DPH podle dnešní logiky jádra (konkrétní cena z ceníku, jinak procento). To je pásmo pro q = 1.
  3. Pásmo: z b2b_price_list_tiers pro daný ceník, produkt a měnu se vezme řádek s nejvyšším min_packages ≤ q.
    • Žádný řádek: platí základ.
    • Řádek existuje: platí jeho cena. Nikdy se NEKOMBINUJE s procentem ceníku, pásmo je konečná cena za kus.
  4. Cena položky = cena za kus × počet kusů (q × balení). Bez DPH, DPH se přičítá až v souhrnu košíku podle sazby produktu.
  5. Změna množství v košíku přepočítá pásmo a cenu položky. Změna doručovací adresy přepočítá ceník i pásma všech položek.
  6. Odeslání objednávky uloží cenu za kus, která platila v okamžiku odeslání. Objednávka se pro B2B NIKDY nepřepočítává, i když se ceník nebo pásma později změní.

⚠️ Dev: výpočet ceny položky v košíku pro B2B zákazníka ve FrontAPI dnes končí výjimkou v jádře (bloker Z1). Pásma se zapojí do řešení blokeru, ne vedle něj. D2

Zobrazení na FE

Podle prototypu: detail produktu a košík. Design system ALBI.

MístoPrvek a chování
Detail produktuPod cenou tabulka „Cena podle množství": sloupce Od množství (bal.), Sleva (% proti základu, spočítané SFX), Cena za kus, Cena za balení. Řádek platného pásma je zvýrazněný a mění se při změně množství v poli. Pod tabulkou věta „Ceny bez DPH, pro vaši adresu Lípová 12".
Detail produktu bez pásemTabulka se NEVYKRESLÍ. Cena je jako dnes.
Výpis kategorie, kartaPod cenou drobný text „od 6 bal. 123 Kč/ks", jen když produkt má pásma. Tabulka ve výpisu NENÍ.
Košík, položkaCena za kus podle pásma. Štítek „−5 % od 6 bal." u položky v pásmu. Nápověda pod položkou: „Přidejte ještě 2 balení a cena klesne na 116 Kč/ks", jen když další pásmo existuje a chybí do něj nejvýše polovina jeho prahu.
Košík, souhrnBeze změny. Součty jsou z cen položek.
Detail objednávkyCena za kus uložená při odeslání. Štítek pásma se NEUKAZUJE, objednávka je historie.
Náhled FE: tabulka pásem a položka košíku
WF-F1

Detail produktu, tabulka pásem při 8 baleních

Puzzle Karak 500 dílků P-4412
Od množstvíSlevaCena za kusCena za balení
1 bal.—129 Kč774 Kč
6 bal.−5 %123 Kč738 Kč
12 bal.−10 %116 Kč696 Kč
Balení 6 ks · objednává se po baleních · ceny bez DPH pro adresu Lípová 128 bal. = 48 ks
5 904 KčDo košíku

Nová je tabulka a zvýraznění platného řádku. Procento slevy počítá SFX ze základu, backend posílá jen ceny.

WF-F2

Košík, položka s nápovědou k dalšímu pásmu

Puzzle Karak 500 dílků
6 ks v balení · 123 Kč/ks −5 % od 6 bal.
8 bal. · 5 904 Kč
Přidejte ještě 4 balení a cena klesne na 116 Kč/ks.

FrontAPI

Žádný nový endpoint. Rozšiřují se odpovědi existujících endpointů produktu a košíku přímo v jádru.

EndpointStavCo se přidá
Produktová karta a detail (GET /api-products/…)rozšířit DTOpiecesInPackage (int) a price.tiers[]: { minPackages, minPieces, price, priceWithVat }, seřazeno od nejnižšího prahu, bez řádku pro 1 balení. Prázdné pole, když pásma nejsou. Ceny podle ceníku z hlavičky X-PB-Price-List-Id. D3
Košík (GET/PUT /api-carts/carts/{token})rozšířit DTOU položky appliedTier { minPackages, price } nebo null, a nextTier { minPackages, price, packagesMissing } nebo null. Cena položky je podle pásma. Závisí na blokeru Z1. D2
Detail objednávkybeze změnyCena za kus je uložená při odeslání, pásmo se nepřenáší.

Příklad ceny v DTO produktu

"price": {
  "priceWithoutVat": 129, "priceWithVat": 156.09, "currencyCode": "CZK", "priceListId": 7,
  "tiers": [
    { "minPackages": 6,  "minPieces": 36, "price": 123, "priceWithVat": 148.83 },
    { "minPackages": 12, "minPieces": 72, "price": 116, "priceWithVat": 140.36 }
  ]
},
"piecesInPackage": 6

Administrace

Jen náhled, žádné zadávání. Zdrojem pravdy je AlbiLine.

Náhled administrace: záložka Ceny u produktu
WF-A1

Produkty → detail → Ceny

Puzzle Karak 500 dílků
P-4412 · cost level CL-17
ZákladníCenySkladObrázky…
Ceníkové ceny
CeníkMěnaCena bez DPH
Velkoobchod BCZK129,00
Velkoobchod CCZK137,00
Množstevní pásma jen ke čtení · z AlbiLine
CeníkMěnaOd baleníCena za kusSynchronizace
Velkoobchod BCZK6123,0025. 9. 2026 04:10
Velkoobchod BCZK12116,0025. 9. 2026 04:10
Pásma přicházejí z AlbiLine. Ruční úprava není možná.

Pravidla a validace

Mimo rozsah a nasazení

Mimo rozsah

Nasazení

Kontrola po nasazení