ALBI B2B · interní zadání ← Rozcestník · verze 1.0 · 7. 10. 2026 · k revizi
S03 · stávající funkce

B2B košík a pokladna - co odběratel vidí navíc

Odběratel nakupuje po baleních, vidí ceny bez DPH, adresy jen ke čtení a zadává požadované datum dodání a své číslo objednávky. Starý B2B to umí, FrontAPI pro B2B zákazníka dnes košík ani objednávku nedokončí.

Jádro (FrontAPI) + obálka + SFX FrontAPI: 5 endpointů rozšířit Administrace: beze změny Závisí na blokeru Z1 Autor: Hana Ortmannová Prototyp: košík ↗
Co se dělá

Nový B2B běží na jádru s FrontAPI a na SFX. Jádro pro B2B zákazníka košík ani objednávku přes FrontAPI nedokončí, vyhodí výjimku. Zadání popisuje, co starý B2B v košíku ukazuje navíc proti B2C, a co se kvůli tomu doplní.

Kam patří. Jádro MasterShopu (větev front-api): B2B větev objednávky ve FrontAPI, B2B pole objednávky, balení a zaokrouhlení, volba aktivní adresy. B2B košík přes FrontAPI potřebuje každý B2B klient na headlessu. Dnes obálka: výpočet součtů AlbiB2BPricesService, seskupení podle cost levelu, volitelná povinná pole, vypnutí slev. U každého kusu je níže uvedeno, kde je dnes. Kde to není jasné, rozhodne produkt PragueBest. Názvy nových polí a kódů jsou pracovní, v jádru je pojmenuje programátor.

Otevřené otázky

Otázky jsou jen pro vývoj. Žádná nebrání začít s odblokováním B2B objednávky ve FrontAPI.

Klient

Rozhoduje ALBI

Otázky pro ALBI nejsou, chování se přebírá ze starého B2B.

Vývojář

Rozhoduje vývoj

#Otázka
D1Jak FrontAPI pozná aktivní doručovací adresu: košík, hlavička, nebo token (varianty v 05). Drží FrontAPI mezi voláními session, nebo padne vždy na výchozí adresu? Neověřeno během. Společné s S02.
D2B2B pole v POST /api-orders/order ploše v kořeni, nebo v objektu b2b.
D3Rozšíření DTO košíku v jádře, nebo přepisem v obálce. Balení a maximum jsou jádro, cost level a seskupení podle něj dnes obálka.
D4Balení: dnes jádro počet zaokrouhlí a zároveň vrátí varování. Chyba FrontApiCartItemUnsupportedDivisionB2BError existuje, ale nic ji nevytváří. Zůstat u varování + zaokrouhlení, nebo vrátit chybu bez úpravy košíku.
D5Slevové kódy pro B2B: PUT …/discount-codes vrátí chybu, nebo se endpoint pro B2B nezaregistruje.
D6Stav „objednávku nelze dokončit" jako pole v GET košíku, nebo samostatný endpoint. Musí sedět s S04.
D7Když nová obálka převezme přepis košíku s AlbiB2BPricesService, součty v DTO košíku se mají propsat samy. Ověřeno čtením kódu, ne během. Ověřit i SK (položky na 3 desetinná místa).

Workflow

Čtyři kroky jako starý B2B. Předpoklad: zákazník je přihlášený na B2B prezentaci a má zvolenou doručovací adresu (S02). Košík patří této adrese.

  1. Krok 1 Přehled košíku. Zákazník otevře košík. SFX načte košík a stav dopravy zdarma. Zobrazí položky, lištu dopravy zdarma a souhrn: počet kusů, celkem bez DPH, celkem s DPH.
    • Objednávku nelze dokončit (isOrderAllowed = false): alert s hláškou podle důvodu, „Pokračovat" je neaktivní, další kroky nejsou klikací. Košík jde dál upravovat. Dlužník: S04. Neaktivní adresa, zákazník nebo blokovaný uzel: „Nelze provést objednávku". Adresa bez povolené platby: „Pro Váš účet neevidujeme žádnou povolenou dopravu."
    • Objednávku lze dokončit: „Pokračovat" je aktivní.
  2. Zákazník změní množství v poli, tlačítkem „+1 balení" / „+2 balení" nebo odebere položku „×". SFX pošle nový počet do košíku a načte košík znovu.
    • Počet je násobek balení a do maxima: košík se přepočítá.
    • Počet není násobek balení: jádro zaokrouhlí NAHORU na násobek balení (nad maximum dolů) a vrátí varování. SFX ukáže toast „Není možné nakoupit tento počet kusů produktu „%s". Počet kusů musí být dělitelný číslem %d." a zobrazí opravený počet. D4
    • Počet je nad maximum: jádro ořízne na maximum. Toast „Není možné nakoupit více než %s ks produktu „%s"."
    • Produkt už není skladem nebo v sortimentu: položka zmizí. Hláška „Produkt „%s" již není skladem a byl z košíku odebrán."
  3. Zákazník klikne na „Pokračovat". SFX přejde do kroku 2.
  4. Krok 2 Dodací podmínky. Zákazník vybere dopravu a platbu. Nabídka obsahuje jen dopravy a platby povolené na zvolené adrese.
    • Žádná povolená platba: stav jako v kroku 1, zákazník se vrátí do košíku s hláškou.
    • Doprava a platba vybrané: pokračuje se.
  5. SFX ukáže fakturační adresu (s IČ a DIČ) a doručovací adresu jen ke čtení. Zákazník je NEMŮŽE upravit ani v košíku přepnout, stejně jako starý B2B. Doručovací adresa = aktivní adresa košíku.
  6. Zákazník vyplní nepovinná B2B pole: „Požadované datum dodání", „Interní číslo vaší objednávky", Poznámka. Kalendář nabídne jen dny od nejbližšího data doručení zvolené dopravy do jejího maxima. „Pouze kompletní zásilka" se NENABÍZÍ, stejně jako starý B2B.
  7. Zákazník klikne na „Pokračovat". SFX přejde do kroku 3. Pole se odešlou až s objednávkou.
  8. Krok 3 Souhrn objednávky. SFX ukáže položky seskupené podle cost levelu, „Přehled sazeb DPH", „Sumarizace" (doprava, platba, celkem) a „Údaje firmy". U tlačítka „Odeslat objednávku" je věta „Odesláním objednávky souhlasím s obchodními podmínkami." Seskupení podle cost levelu a přehled DPH jsou stejně jako starý B2B.
  9. Zákazník klikne na „Odeslat objednávku". SFX pošle objednávku s dopravou, platbou, poznámkou a B2B poli. Adresy NEPOSÍLÁ, server je doplní sám. Tlačítko je do odpovědi neaktivní.
    • Úspěch: objednávka vznikne, cena se po vytvoření už nepřepočítává. Objednávka jde do AlbiLine s interním číslem a požadovaným datem. Košík se vyprázdní. Pokračuje se krokem 4.
    • Blokace (dlužník, blokovaný zákazník, adresa nebo uzel, nepovolená platba se změnila během nákupu): server objednávku odmítne s vlastním kódem. SFX ukáže hlášku a vrátí zákazníka do kroku 1. Dlužník: S04.
    • Neplatné datum dodání: server vrátí kód chyby data. SFX vrátí zákazníka do kroku 2 a u pole ukáže „Datum doručení musí být v pracovní den" nebo „Toto datum doručení není u zvolené dopravy možné".
    • Jiná chyba odeslání (výpadek, chyba serveru): hláška „Objednávku se nepodařilo odeslat, zkuste to znovu." Objednávka nevznikla, košík se NEMĚNÍ, zákazník zůstane v kroku 3.
  10. Krok 4 Objednávka odeslána. SFX ukáže číslo objednávky, celkovou cenu s DPH i bez DPH, „Zbývá k úhradě", dopravu, platbu, interní číslo a požadované datum.

StorefrontX

Jádro SFX má kroky košíku, součet bez DPH a zobrazení varování z FrontAPI. B2B podobu skládá obálka SFX. Vzhled podle design systému ALBI, chování podle prototypu.

Prototyp ukazuje přepínač adresy v košíku a volbu kompletní zásilky. Platí zadání, prototyp se opraví.

Kroky a trasy

Krok B2BTrasa jádra SFXCo obálka změní
1 Přehled košíku/cartŘádek položky s balením, cena bez DPH hlavní, bez slevového kódu, alert blokace.
2 Dodací podmínky/shipping-and-paymentPod dopravu a platbu přidá adresy jen ke čtení a B2B pole.
3 Souhrn objednávky/shipping-addressFormulář adres (BasketOrderForm) nahradí souhrn: cost levely, přehled DPH, údaje firmy. Souhlas s podmínkami jako věta.
4 Objednávka odeslána/order-confirmationDoplní ceny bez DPH, interní číslo a požadované datum.

Názvy kroků ve stepperu jsou překladové klíče BASKET_STEPPER.steps.*. Kroky „Přehled košíku", „Dodací podmínky", „Souhrn objednávky", „Objednávka odeslána" jako dnes.

Náhled FE: krok 1, 2 a 3 nového B2B

Čárkovaný rámeček = B2B prvek, který jádro SFX nemá.

WF-S1

Krok 1 Přehled košíku

Starý B2B · dnes
Starý B2B, krok 1 Přehled košíku: lišta dopravy zdarma, dvě položky s kódem, cost levelem, EAN, balením, polem množství, tlačítky +1 a +2, cenou bez DPH a spodní lištou s počtem kusů a součty
Starý B2B: krok 1 Přehled košíku. Kód | cost level | EAN, „1 ks v balení", tlačítka „+1" a „+2", cena bez DPH, spodní lišta s počtem kusů a součty.
Nový B2B · SFX
Lípová 12, Praha 2 · ceny bez DPH
1Přehled košíku2Dodací podmínky3Souhrn objednávky4Odesláno
Máte dopravu zdarma
Puzzle Karak 500 dílků
P‑4412 | K12 | 8590228012345
skladem · 6 ks v balení
−12++6+12
1 548,00 Kčbez DPH · 1 873,08 Kč s DPH ×
Hrnek Kočka 330 ml
HR‑7701 | D07 | 8590228067890
skladem · 6 ks v balení
−18++6+12
2 682,00 Kčbez DPH · 3 245,22 Kč s DPH ×
Přání k narozeninám
P‑6601 | P03 | 8590228055501
skladem · 25 ks v balení
−25++25+50
725,00 Kčbez DPH · 812,00 Kč s DPH ×
Počet kusů55 ks Celkem za nákup bez DPH4 955,00 Kč Celkem za nákup s DPH5 930,30 Kč
← Zpět do obchoduPokračovat →

Řádek: kód | cost level | EAN, sklad, „X ks v balení". Pole množství má krok = balení. Tlačítka přičtou 1 a 2 balení, popisek je počet kusů jako dnes. Hlavní cena je bez DPH. Pole pro slevový kód NENÍ. Při blokaci je nad položkami červený alert a „Pokračovat" je šedé.

WF-S2

Krok 2 Dodací podmínky

Starý B2B · dnes
Starý B2B, krok 2 Dodací podmínky: platba Faktura s textem o neuhrazených fakturách, fakturační a doručovací adresa jen ke čtení, pole Požadované datum dodání, Interní číslo vaší objednávky a Poznámka
Starý B2B: krok 2 Dodací podmínky. Platba „Faktura", adresy jen ke čtení, „Požadované datum dodání", „Interní číslo vaší objednávky", Poznámka, rekapitulace vpravo.
Nový B2B · SFX
Košík › Dodací podmínky
✓Přehled košíku2Dodací podmínky3Souhrn objednávky4Odesláno
Doprava
Firemní zásilka PPL/DPD/GeisZdarma
Vlastní rozvoz ALBIZdarma od 5 000 Kč
Platba
FakturaObjednané zboží bude zasláno spolu s fakturou k zaplacení.
Fakturační adresajen ke čtení
Papírnictví u Lípy s. r. o., Lípová 12, 120 00 Praha 2 · IČ 27604977 · DIČ CZ27604977
Doručovací adresajen ke čtení
Pobočka Lípová, Lípová 12, 120 00 Praha 2
Požadované datum dodáníVyberte datum
Interní číslo vaší objednávkyZadejte číslo objednávky
PoznámkaZde můžete napsat poznámku či připomínku k objednávce.
Rekapitulace
3 položky · 55 ks
Doprava zdarma · Platba zdarma
Celkem bez DPH4 955,00 Kč Celkem s DPH5 930,30 Kč
← ZpětPokračovat →

Adresy NEJSOU formulář, jen text. Data z GET /api-users/users/{userId}/billing-address a aktivní doručovací adresy. Kalendář má rozsah od deliveryDate do maxDeliveryDate zvolené dopravy. „Pouze kompletní zásilka" NENÍ, stejně jako starý B2B.

WF-S3

Krok 3 Souhrn objednávky

Starý B2B · dnes
Starý B2B, krok 3 Souhrn objednávky: položky seskupené podle cost levelu s kruhem kódu, přehled sazeb DPH, údaje firmy a tlačítko Odeslat objednávku se souhlasem s obchodními podmínkami
Starý B2B: krok 3 Souhrn objednávky. Karty podle cost levelu s cenou bez i s DPH, „Přehled sazeb DPH", „Údaje firmy", „Odeslat objednávku".
Starý B2B, krok 3 níže: Sumarizace s dopravou Firemní zásilka PPL/DPD/Geis, platbou Faktura a řádkem Celkem za nákup
Starý B2B: krok 3 níže. „Sumarizace": doprava „Firemní zásilka PPL/DPD/Geis", platba „Faktura", „Celkem za nákup".
Nový B2B · SFX
Košík › Souhrn objednávky
✓Přehled košíku✓Dodací podmínky3Souhrn objednávky4Odesláno
Položky košíku
K12
Puzzle
12 ks
Cena bez DPH: 1 548,00 Kč
Cena s DPH: 1 873,08 Kč
D07
Hrnky
18 ks
Cena bez DPH: 2 682,00 Kč
Cena s DPH: 3 245,22 Kč
P03
Přání
25 ks
Cena bez DPH: 725,00 Kč
Cena s DPH: 812,00 Kč
Přehled sazeb DPH
Sazba DPH: 21 %Celkem bez DPH: 4 230,00 Kč · s DPH: 5 118,30 Kč
Sazba DPH: 12 %Celkem bez DPH: 725,00 Kč · s DPH: 812,00 Kč
Sumarizace
Doprava - Firemní zásilka PPL/DPD/GeisZdarma
Platba - FakturaZdarma
Celkem za nákup5 930,30 Kč
Údaje firmy
Fakturační adresa
Papírnictví u Lípy s. r. o.
Lípová 12, 120 00 Praha 2
Doručovací adresa
Pobočka Lípová
Lípová 12, 120 00 Praha 2
K objednávce
Požadované datum: 14. 10. 2026
Vaše číslo: OBJ‑2026‑114
← ZpětOdesláním objednávky souhlasím s obchodními podmínkami.Odeslat objednávku ✓

Karta cost levelu: kód v kruhu (prázdný kód = „PP", „Produkty podpory"), název cost levelu, počet kusů, cena bez a s DPH. Data z costLevelSummary[] a vatSummary[]. Blok „K objednávce" zopakuje B2B pole z kroku 2. Seskupení a přehled DPH stejně jako starý B2B.

Co převzít z jádra SFX a co chybí

ČástStavPoznámka
Kroky košíku, stepper, spodní navigacepřevzítBasketStepper, BasketStickyNavigationSimple. Texty kroků přes překlady.
Součet bez DPHpřevzítTOTAL_PRICE má řádek bez DPH zapnutý, ale jako doplňkový pod cenou s DPH. Obálka prohodí důraz.
Varování z FrontAPI jako toastpřevzítBasketCard-quantity chytí varování po změně počtu a přeloží klíčem WARNINGS.UPDATE_CART.{typ}. Doplnit klíč WARNING_CART_COUNT_ERROR_PIECES_IN_PACKAGE_B2B (proměnné currentValue, b2bDivisorValue, itemName). Bez něj se ukáže holý klíč.
Poznámka k objednávcepřevzítJde do message.
Cena položky bez DPHupravitMapper položky bere cenu z karty produktu, cenu položky bez DPH z DTO nečte.
Pole množství po baleníchupravitDnes min 0, max = sklad, bez kroku. Doplnit krok, minimum a maximum z košíku, tlačítka „+1" a „+2" balení.
Načtení košíku po změně počtuupravitOdpověď PUT SFX nečte, košík přenačte jen v chybové větvi. Po zaokrouhlení se musí přenačíst vždy.
Adresy jen ke čtenínovéFormulář kroku 3 počítá s ručním vyplněním a nákupem bez registrace. B2B ho nepoužije.
B2B pole objednávkynovéTyp vstupů objednávky ani payload je nemají.
Cost level, seskupení, přehled DPHnovéTypy košíku a položky je nemají.
Blokace objednávkynovéAlert v kroku 1, neaktivní „Pokračovat". Blok BasketAlerts je dnes prázdný. Dlužník: S04.

Jádro MasterShop (FrontAPI)

Pořadí = závislosti. Bez bodu 1 nefunguje nic dalšího. Kde je víc cest, rozhodne programátor.

EndpointStavCo se mění
POST /api-orders/orderrozšířitB2B větev bez výjimky, B2B pole, adresy ze serveru, nové chybové kódy.
GET /api-carts/carts/{token}rozšířitBalení, maximum, cost level u položky. Aktivní adresa, přehled DPH, seskupení, stav objednatelnosti u košíku.
PUT /api-carts/carts/{token}rozšířitSjednotit varování o balení. D4
GET /api-transports/transports/{token}rozšířitK deliveryDate přidat maxDeliveryDate.
PUT /api-carts/carts/{token}/discount-codesrozšířitPro B2B chyba, nebo nezaregistrovat. D5
Volba aktivní doručovací adresynový podle variantyVarianta a) přidá endpoint, b) a c) ne. D1
GET /api-carts/carts/{token}/free-shippingexistujeLišta „Máte dopravu zdarma". Beze změny.
GET /api-payments/payments/{token}/{transportId}existujePlatby. Filtr podle adresy dodá obálka. Beze změny.
GET /api-users/users/{userId}/billing-address, …/delivery-addressesexistujeAdresy ke čtení v kroku 2 a 3. Beze změny.
GET /api-orders/order/{hash}existujePotvrzení: customerOrderCode, požadované datum, priceToPay. Beze změny.

1. Odblokovat B2B košík a objednávku

2. Aktivní doručovací adresa

Bez aktivní adresy nefunguje ceník, katalog, dopravy ani platby. Jádro ji dnes nastaví při ověření tokenu na výchozí adresu. Podúčet má jedinou, hlavní účet dostane nejnovější a přepnout ji přes FrontAPI nejde. Varianty, rozhodne programátor: D1

3. Rozšíření GET košíku

{
  "deliveryAddressId": 812,
  "isOrderAllowed": true,
  "orderBlockReasons": [],
  "cartItems": [
    { "productId": "4412", "code": "P-4412", "inCartCount": 12,
      "piecesInPackage": 6, "maxOrderCount": 600, "costLevelCode": "K12" }
  ],
  "vatSummary": [
    { "vatRate": 21, "priceWithoutVat": 4230.00, "priceWithVat": 5118.30 },
    { "vatRate": 12, "priceWithoutVat": 725.00, "priceWithVat": 812.00 }
  ],
  "costLevelSummary": [
    { "code": "K12", "name": "Puzzle", "count": 12,
      "priceWithoutVat": 1548.00, "priceWithVat": 1873.08 }
  ]
}
PoleKde dnesVýznam
piecesInPackagejádroKusů v balení pro B2B. Také do karty produktu, ať ji SFX má i na detailu.
maxOrderCountjádroMaximum na produkt, zarovnané dolů na balení. Také do karty produktu.
costLevelCodednes obálkaCost level produktu. Produkt má právě jeden.
deliveryAddressIdjádroAktivní doručovací adresa košíku.
vatSummary[]dnes obálkaSoučty po sazbách DPH. Hodnoty stejně jako starý B2B, tedy výpočet obálky jako AlbiLine. Jádrová tabulka DPH košíku se NEPOUŽIJE.
costLevelSummary[]dnes obálkaKód, název, počet kusů, ceny bez a s DPH za cost level. Prázdný kód = „PP".
isOrderAllowed, orderBlockReasons[]jádro + dnes obálkaHodnoty BAD_PAYER (S04), CUSTOMER_BLOCKED (neaktivní adresa, zákazník nebo uzel), NO_ALLOWED_PAYMENT, NO_DELIVERY_ADDRESS. Které důvody do jádra, rozhodne produkt PragueBest. D6

Rozšíření v jádře, nebo přepisem DTO v obálce: D3. Obálka albi.eu už podobně přepisuje DTO i služby FrontAPI.

4. B2B pole v POST objednávky

{
  "cartToken": "c3f1…",
  "paymentId": 7,
  "transport": { "id": 3 },
  "message": "Prosíme dodat do 10:00.",
  "customerOrderCode": "OBJ-2026-114",
  "requestedDeliveryDate": "2026-10-14"
}

5. Chybové kódy objednávky

Dnes FrontAPI všechny chyby validace objednávky vrací jako ORDER_CUSTOMER_INVALID_ADDRESS. Chyba data dodání by tak přišla jako „neplatná adresa". Kódy a HTTP status rozhodne programátor, níže pracovní názvy.

KódStavKdy
ORDER_CUSTOMER_BAD_PAYERnovýFirma je dlužník. Detail S04.
ORDER_CUSTOMER_BLOCKEDnovýNeaktivní adresa, zákazník nebo blokovaný uzel.
ORDER_INVALID_REQUESTED_DELIVERY_DATEnovýDatum není pracovní den nebo je mimo rozsah zvolené dopravy.
ORDER_PAYMENT_NOT_AVAILABLEexistujePlatba není na adrese povolená.
ORDER_TRANSPORT_NOT_AVAILABLEexistujeDoprava není pro adresu nebo skupinu povolená.

6. Doprava, balení, slevy, povinná pole

Administrace

Beze změny. Nic nového se nepřidává.

Pravidla a validace

Ceny a součty

Množství a balení

Adresy, doprava, platba

B2B pole objednávky

Blokace a odeslání

Mimo rozsah a nasazení

Mimo rozsah

Nasazení

Kontrola po nasazení