Firma má hlavní účet z AlbiLine. Ten v e‑shopu zakládá a spravuje další uživatele. Podúčet vidí jen svou pobočku a nespravuje nic. Starý B2B to umí, FrontAPI ani SFX zatím ne.
Reverzní zadání podle starého b2b.albi.cz.
Kam patří. Jádro MasterShopu (větev front-api): hlavní účet a podúčty jsou v klasickém jádře, FrontAPI je jen nezpřístupňuje. Endpointy, kontrola role a uzlu firmy, rozšíření profilu patří do jádra. Obálka backendu ALBI: zámek Hlavního zákazníka (is_master_from_al), měkké smazání (ms_deleted), mazání podúčtů synchronizací z AlbiLine. Detail po kusech v tabulce v sekci 06. Obálka SFX: obrazovky. Názvy nových endpointů a polí jsou pracovní, v jádru je pojmenuje programátor.
Pro ALBI otázky NEJSOU. Otázky pro vývoj nebrání začít. D2, D5 a D6 se týkají bezpečnosti a rozhodují se před nasazením.
Žádné otevřené otázky. Chování je převzaté ze starého B2B a v zadání je jako pravidlo „stejně jako starý B2B“.
| # | Otázka |
|---|---|
| D1 | Duplicita e‑mailu se kontroluje jen mezi aktivními účty, stejně jako starý B2B. Účet se stejným e‑mailem jako neaktivní nebo smazaný účet tak založit jde. Ověřit: jak přihlášení přes FrontAPI vybere účet, když dva účty mají stejný e‑mail (jeden neaktivní, nebo oba aktivní po opětovné aktivaci). Technické řešení rozhodne programátor, pravidlo pro uživatele se NEMĚNÍ. |
| D2 | Odmítne přihlášení přes FrontAPI neaktivní účet, účet blokované firmy a smazaný účet? Stará obálka to řeší v CustomersAuthenticator.php:23-34. Návrh: ověřit. Chybějící kontrolu doplnit: aktivní a blokace v jádru, smazaný podle toho, kde skončí měkké smazání. |
| D3 | Role v profilu i v tokenu (x_user_data)? Příznaky, nebo jedno pole role? Návrh: v obou. SFX z tokenu sestaví menu bez dalšího volání. Formu rozhodne programátor. |
| D4 | Seznam poboček v modálním okně: znovu použít GET …/delivery-addresses (hlavnímu účtu vrací celou firmu), nebo samostatný seznam poboček firmy? Výběr musí ukázat i neaktivní adresy s příznakem. Rozhodne programátor. |
| D5 | Access token platí 3600 s, refresh 24 h. Deaktivovaný, smazaný nebo zbavený práv účet tak pracuje dál. Návrh: endpointy správy berou roli z databáze, ne z tokenu. Obnova tokenu ověří, že účet je aktivní a nesmazaný. |
| D6 | Existující DELETE /api-users/users/{userId} smaže vlastní účet. Starý B2B smazání sebe sama nemá. Návrh: pro B2B zákazníka vrátit 403. |
| D7 | Výchozí pobočka mastera po přihlášení: starý B2B bere první aktivní doručovací adresu firmy a pole „Pobočka“ z formuláře mastera ignoruje. Má nový web u mastera použít pobočku z formuláře jako výchozí? Návrh: stejně jako starý B2B. Rozhodne vývoj s produktem PragueBest, na ALBI to NENÍ. |
Jedna firma z AlbiLine = jeden uzel (customers_nodes). Všechny účty firmy sdílí uzel, adresy patří uzlu, ne účtu.
Snímky starého B2B jsou u wireframů v části StorefrontX, vedle nového návrhu.
Všechna práva jsou stejná jako na starém B2B. Rozsah dat podle role je už v jádru a platí i pro FrontAPI. V SFX přibývá jen menu podle role. Hlavní zákazník a Master uživatel mají stejná práva, liší se jen zámkem.
| Oblast | Hlavní zákazník | Master uživatel | Podúčet |
|---|---|---|---|
| Příznaky v databázi | is_master = 1, is_master_from_al = 1 | is_master = 1, is_master_from_al = 0 | is_master = 0 |
| Objednávky (přehled, detail) | celá firma | celá firma | jen na svou pobočku |
| Faktury, zásilky | celá firma | celá firma | jen doklady své pobočky |
| Doručovací adresy | všechny aktivní adresy firmy, přepíná v horní liště (workflow H) | všechny aktivní adresy firmy, přepíná v horní liště (workflow H) | jen svá pobočka, NEPŘEPÍNÁ |
| Stránka Doručovací adresy, tlačítko „Upravit doručovací adresy" | ano | ano | NE, tlačítko se NEZOBRAZÍ |
| Správa uživatelů | ano | ano | NE, položka v menu NENÍ |
| Kopírování objednávky | ano | ano | dnes NE, řeší F01 K1 |
| Import objednávky, XML feed | ano | ano | ano |
| Nastavení účtu, změna hesla | ano | ano | ano |
| Katalog a ceník | podle zvolené doručovací adresy (S02) | podle své pobočky | |
| Upravit sám sebe | NE, údaje spravuje AlbiLine | jméno, telefon, pobočka; „Aktivní" a „Master uživatel" zamčené | NE, jméno a telefon mu mění hlavní účet ve Správě uživatelů |
| Smí ho upravit jiný master | NE | ano | ano |
| Smí ho smazat | nikdo | jiný master, NE sám sebe | hlavní účet nebo master |
customers s vazbou na uzel customer_node_id, pobočka je delivery_address_id. Obálka ALBI má navíc is_master_from_al a ms_deleted.GET /api-users/users/auth, rozšířený), fakturační adresu a aktivní doručovací adresu.
GET …/sub-accounts.
POST …/sub-accounts. Tlačítko je do odpovědi neaktivní (technická nutnost proti dvojímu odeslání).
PUT …/sub-accounts/{id}.
DELETE …/sub-accounts/{id}.
PUT /api-users/users/{userId}/change-password.
app/Modules/Customers/src/models/customers/BaseCustomer.php:227-239, app/Modules/Customers/src/models/ActualDeliveryAddress.php:34-87. D7Dvě stránky v Můj účet a tři modální okna. Vzhled podle design systému ALBI. Rozložení drží starý B2B: Správa uživatelů jako karty, ne tabulka. Prototyp ukazuje podúčty zjednodušeně (tabulka, pozvánka e‑mailem, podúčet bez faktur). Platí toto zadání.
| Komponenta jádra SFX | Použití v S01 |
|---|---|
molecules/Modal/Modal.vue | Všechna tři okna. Stejné nastavení jako karta adresy: ModalVariant.SECONDARY, ModalPosition.CENTER, ModalSize.S (config-ui/ADDRESS_CARD.ts). Spouštěč přes slot trigger, obsah přes slot content. |
molecules/AddressCard/AddressCard-modalAdd.vue, -modalEdit.vue, -modalRemove.vue | Vzor pro kartu uživatele s okny Přidat, Upravit, Smazat. Použití v organisms/MyAccountDeliveryAddresses/MyAccountDeliveryAddresses-items.vue: id okna se skládá s id záznamu, po úspěchu se seznam načte znovu. |
molecules/Confirm/Confirm.vue s ConfirmAction.REMOVE | Potvrzení smazání. Vzor organisms/MyAccountAddressRemove/MyAccountAddressRemove.vue: chyby nad textem, po úspěchu hláška místo otázky. |
organisms/MyAccountPassword/MyAccountPassword-form.vue | Změna hesla 1:1, jen texty ALBI. |
templates/MyAccountProfile.vue, organisms/MyAccountProfile/MyAccountProfile-form.vue | Kostra Nastavení účtu. Formulář jádra je editovatelný a NEMÁ telefon, číslo zákazníka ani firmu. Na B2B se blok zobrazí jen ke čtení. |
config-ui/MY_ACCOUNT_NAVIGATION.ts | Menu účtu. Dnes pevný seznam, přibývá filtr podle role. |
customer/types/customer/Customer.ts | Typ zákazníka bez role, telefonu a uzlu. Rozšířit o pole z sekce 06. |
organisms/TestCenterFormModal/TestCenterFormModal.vue (stejné nastavení okna, formulář jako obsah).
Podúčet vidí stejnou stránku bez odkazu „Změnit dodací adresu" a bez tlačítka „Upravit doručovací adresy". Menu podúčtu viz sekce 03. Počty v Přehledech: celkový počet ze seznamů objednávek, faktur a zásilek (S06). Když seznam celkový počet nevrací, rozhodne programátor, odkud ho vzít.
Nové: „Založit nového uživatele" otevře modální okno místo rozbaleného formuláře. Karta drží údaje a pořadí starého B2B. Štítek „Neaktivní" u pobočky = doručovací adresa je v AlbiLine neaktivní. Přihlášená je Marie, proto u ní NENÍ „Smazat".
Stav po neúspěšném odeslání: chyba u pole, okno zůstává otevřené. „Aktivní“ zaškrtl uživatel, při otevření okna je nezaškrtnuté, stejně jako starý B2B. Předvolba telefonu podle jazyka prezentace jako na starém B2B (+420, +421, +48). Neaktivní pobočka jde vybrat, je označená. „Zrušit“ a „ד jen zavřou okno, patří k modálnímu oknu. Formulář má jeden sloupec, na mobilu okno přes celou šířku podle nastavení Modal.
Úprava se dnes rozbalí přímo pod kartou uživatele. Pole jsou stejná jako při založení, bez e‑mailu a hesla.
E‑mail jen ke čtení, heslo v okně NENÍ. Úprava sebe sama: „Aktivní" a „Master uživatel" zamčené (šedé). Hlavní zákazník: všechna pole zamčená, tlačítko „Upravit údaje“ NENÍ. „Zrušit“ a „ד jen zavřou okno, patří k modálnímu oknu.
Smazání se dnes potvrzuje oknem prohlížeče s otázkou „Opravdu si přejete uživatele smazat?“.
Stejná otázka jako na starém B2B, forma okna podle komponenty Confirm jádra SFX. „Zrušit“ a „ד jen zavřou okno. Po úspěchu se okno zavře a na stránce je „Uživatel byl smazán". Při chybě zůstane okno s hláškou „Uživatele se nepodařilo smazat".
Čtyři nové endpointy a rozšířený profil v jádru MasterShopu, modul FrontApi, skupina api-users. Logiku založení a úpravy má jádro hotovou (BaseB2BCustomerSaver), FrontAPI ji jen nevolá. Nový endpoint potřebuje tag v EndpointTagType, bez něj se nezaregistruje.
| Endpoint | Stav | Kdo smí | Tělo a odpověď v kostce |
|---|---|---|---|
GET /api-users/users/auth + token x_user_data | existuje · rozšířit | přihlášený | Doplnit name, phone_number, is_master, customer_node_id, číslo zákazníka node_number (= customers_nodes.sync_id), delivery_address_id. Obálka doplní is_master_from_al. D3 |
GET /api-users/users/{userId}/sub-accounts | nový | jen master, jen vlastní firma | Seznam nesmazaných účtů uzlu: customer_id, name, username, phone_number, active, is_master, is_master_from_al, is_self, delivery_address (id, popis, aktivní). Pořadí převzít z výpisu starého B2B (CustomersNodes.php). |
POST /api-users/users/{userId}/sub-accounts | nový | jen master, jen vlastní firma | Tělo: name, username, phone_number, password, password_confirm, active, is_master, delivery_address_id. Účet vznikne v uzlu přihlášeného. 201 + účet, 422 + chyby po polích (texty v sekci 08). |
PUT /api-users/users/{userId}/sub-accounts/{subAccountId} | nový | jen master, jen účet vlastní firmy | Tělo: name, phone_number, active, is_master, delivery_address_id. E‑mail a heslo se NEMĚNÍ. U sebe se active a is_master ignorují. Hlavní zákazník → 422 „Hlavního zákazníka nelze editovat". Deaktivace = active: false. |
DELETE /api-users/users/{userId}/sub-accounts/{subAccountId} | nový | jen master, jen účet vlastní firmy | Měkké smazání + active = 0. Sebe ani Hlavního zákazníka NELZE → 422. 204 při úspěchu. |
GET /api-users/users/{userId}/delivery-addresses | existuje | přihlášený | Hlavnímu účtu vrací adresy celé firmy, podúčtu jen jeho pobočku. Kandidát na seznam poboček v modálním okně. D4 |
GET /api-users/users/{userId}/billing-address | existuje | přihlášený | Fakturační údaje v Nastavení účtu. |
PUT /api-users/users/{userId}/change-password | existuje | přihlášený | oldPassword, newPassword. Potvrzení nového hesla jádro bere rovné novému heslu, shodu proto kontroluje SFX. |
POST /api-users/users/login, /token-refresh | existuje | - | Beze změny, jen ověřit kontroly. D2 D5 |
DELETE /api-users/users/{userId} | existuje | - | Smazání vlastního účtu. Pro B2B zákazníka zakázat. D6 |
PUT /api-users/users/{userId} | beze změny | - | Umí jen birthday. Jméno a telefon NEPŘIBÝVAJÍ: vlastní údaje se v Nastavení účtu NEMĚNÍ, stejně jako starý B2B. |
{userId} = přihlášený uživatel. Hlídá existující FrontApiCustomerPathJwtAuthenticator.is_master = 1, jinak 403. Obdoba _checkMasterAccess ze starého frontu.subAccountId patří do uzlu přihlášeného a není smazaný, jinak 404. Odpověď NEPROZRADÍ, že účet jiné firmy existuje.| Kus | Kde je dnes | Na novém B2B |
|---|---|---|
Uzel firmy, is_master, pobočka účtu | jádro, Customers/define/__customers.php:5-46 | jádro beze změny |
| Validace založení a úpravy | jádro, BaseB2BCustomerSaver.php | jádro volat z nových endpointů |
| Rozsah objednávek a dokladů podle role | jádro, BaseOrders.php, AbstractOrderDocumentSqlHelper.php; FrontAPI ho už používá | jádro beze změny |
Zámek sebe sama (active, is_master) | stará obálka, B2BCustomerSaver.php:49-64 | jádro obecné pravidlo, patří k endpointům |
Zámek Hlavního zákazníka (is_master_from_al) | stará obálka, sloupec z migrace obálky, validace B2BCustomerSaver.php:13-24 | obálka Příznak plní synchronizace z AlbiLine. Jak ho jádro pustí ke slovu: (a) obálka přepíše validaci endpointu jako dnes přepisuje saver, (b) jádro zavede obecný příznak „účet NELZE spravovat z webu". Rozhodne produkt PragueBest. |
Měkké smazání (ms_deleted) | stará obálka, sloupec jen v B2B databázi, smazání B2BController.php:145-174, skrytí ve výpisu CustomersNodes.php a v administraci AdminCustomers.php:73, přihlášení CustomersAuthenticator.php:32-34 | rozhodne produkt (a) měkké smazání přejde do jádra jako obecné, (b) jádro smaže svým způsobem a obálka ALBI to přepíše na měkké. Rozhodne produkt PragueBest, technické řešení programátor. |
| Mazání podúčtů synchronizací z AlbiLine | stará obálka, CustomersSynchronization.php:258-268, 324-347, 379-420 | obálka zůstává v synchronizaci ALBI beze změny, pravidla v sekci 08. |
| Založení a obnova Hlavního zákazníka, registrační e‑mail | stará obálka, Local/Modules/AL/src/Models/Customers/Synchronizations/CustomersSynchronization.php:103, 281-367 | obálka zůstává v synchronizaci ALBI beze změny |
Blokace firmy při přihlášení (IsBlocked) | příznak plní synchronizace, kontrolu volá stará obálka Local/Modules/Authenticators/src/models/CustomersAuthenticator.php:25-30, metoda je v jádru (BaseCustomers.php:344) | jádro kontrola v přihlášení FrontAPI podle D2 |
| Menu podle role | kostra v jádru (BaseUserZoneMenu.php), položky ve staré obálce | SFX z role v profilu |
[
{ "customer_id": 1201, "name": "Marie Krásová", "username": "marie.krasova@ulipy.cz",
"phone_number": "+420777888999", "active": true, "is_master": true,
"is_master_from_al": true, "is_self": true,
"delivery_address": { "id": 501, "label": "Lípová 12, 120 00 Praha 2", "active": true } },
{ "customer_id": 1388, "name": "Jana Nováková", "username": "jana.novakova@ulipy.cz",
"phone_number": "+420774211777", "active": true, "is_master": false,
"is_master_from_al": false, "is_self": false,
"delivery_address": { "id": 502, "label": "Nádražní 4, 602 00 Brno", "active": true } }
]
is_self a is_master_from_al řídí, jestli SFX ukáže „Smazat" a zamčená pole. Server to hlídá znovu.snake_case).delivery_address_id v profilu a ve výpisu = pobočka z formuláře. U mastera to NENÍ aktivní ani výchozí adresa (workflow H). Aktivní adresu vrací a přepíná FrontAPI podle S02. D7Beze změny. Uživatelé firmy se spravují na webu. Jedna poznámka, co by bylo dobré dodělat.
AdminCustomers.php:73). Na novém B2B to platí podle toho, kam přejde měkké smazání (sekce 06).is_master = 1 (Hlavní zákazník, Master uživatel). Jinak 403 a hláška „Nemáte oprávnění provést požadovanou akci". Starý B2B má v textu překlep „opravávnění", na novém B2B se opravuje.IsBlocked u firmy v AlbiLine): NEPŘIHLÁSÍ se NIKDO z firmy - Hlavní zákazník, master ani podúčty. V administraci se blokace NENASTAVUJE. D2delivery_address_id jiné firmy → „Zadána neplatná pobočka", nic se neuloží.GET …/sub-accounts → 403, stránka Správa uživatelů přesměruje na Nastavení účtu.PUT na id účtu jiné firmy → 404, nic se nezmění.PUT na sebe s active: false → uloží se jméno a telefon, „Aktivní" zůstane Ano. DELETE na sebe → odmítnuto.PUT → „Hlavního zákazníka nelze editovat". DELETE → odmítnuto. V okně Upravit jsou pole zamčená.IsBlocked z AlbiLine se nepřihlásí Hlavní zákazník, master ani podúčet firmy.