User flows
Every journey across the reseller app, the reseller web, the delegate app and the back-office — flowcharts, sequence diagrams and the reseller lifecycle, traced to requirements, screens and API operations.
This page draws the journeys that the PRD describes as user stories. Each diagram is followed by a numbered explanation that names the screens (RA-xx reseller app, RW-xx reseller web, DA-xx delegate app, BO-xx back-office), the API operations (op ids such as cart.checkout) and the requirements involved, each linked to its page. Statuses are the API values of enums.json; their transition tables are on lifecycles and statuses, which is authoritative when a diagram simplifies.
Four product decisions of 17 Oct 2026 shape most journeys: no order is confirmed automatically — every order waits for a person in the back-office (ORD-14); resellers see status changes live and as notifications (ORD-15); resellers, guests and delegates see availability only, never a stock quantity (STK-07); prices depend on the customer type declared at sign-up, and guests see none (PRC-02, AUTH-10).
Diagram conventions: rounded boxes are entry points, diamonds are decisions, dotted arrows are notifications or background effects; labels in French are UI labels.
At a glance
Who uses which interface, and how every interface reaches the single API (cahier §2).
- Guests use the reseller app or web without an account; the guest operations —
catalog.products.list,catalog.facets,banners.list,promotions.list,support.whatsapp— accept anonymous calls and never return a price (AUTH-10). - Resellers use the same two interfaces signed in; the same account, cart and orders are shared by app and web (RWA-02). Their own event stream
events.streamkeeps order, return and ticket screens live while open (ORD-15). - Delegates only use the delegate app, which works offline and replays its actions through
sync.batch(SYN-04, SYN-05). - Back-office roles — commercial administration, stock, finance, delivery, direction, super administration — share one back-office whose menus and actions follow their permissions (ACL-02, ACL-05); the back-office stream
admin.events.streamfeeds the confirmation queue, the live field map and the alerts (SYN-07).
Reseller journeys
From guest to account with a customer type
- The app checks its version and the maintenance flag with
appConfig.geton RA-01; below the minimum version every call answers426 UPGRADE_REQUIREDand RA-36 forces the update (ADM-07, AUTH-09). - Without a session the visitor is a guest (RA-41, RW-01): home with banners and daily offers, catalog with the advanced filters, product pages and promotions — prices replaced by « Créez un compte pour voir les prix », availability shown as En stock / En rupture, no cart (AUTH-10, STK-07). The WhatsApp button resolves the support region from the device location when allowed (
support.whatsapp, SUP-05). - Any priced action leads to RA-02. Sign-up starts with the phone on RA-03 (the invitation code is prefilled when the app was opened from an invitation) and the SMS code on RA-04 (
auth.otp.send,auth.otp.verify, AUTH-03, AUTH-07). - A phone that already has a reseller user goes to sign-in; a phone that matches a field-created record claims it — no duplicate, the delegate keeps the attribution (AUTH-05, CRM-03).
- RA-05 collects store details, password and the customer type;
auth.signup.resellercreates the accountPENDING_VALIDATION, the recordACCOUNT_CREATEDand returns a session (AUTH-11, CRM-04). - Pending resellers see the prices of their declared type at once (default of D-18); checkout, assisted-order confirmation and payment declarations wait for validation (AUTH-08).
- The
account.pendingevent puts the account in BO-13, where the reviewer confirms or changes the customer type and approves (admin.resellers.validate) or rejects with a reason shown on RA-06 (CRM-09). - The reseller web runs the same flow on RW-01 (RWA-01).
Ordering: search, filters, cart rules and checkout
- Search (RA-10,
catalog.products.suggest), barcode (RA-11,catalog.products.byBarcode) and the catalog (RA-12) lead to the product page (RA-14,catalog.products.get) (CAT-07, CAT-10). - The filter sheet RA-13 (sidebar on RW-03) combines category and sub-category, brand, price range, the category's attributes, availability, promotion and new arrivals; every value carries its count from
catalog.facets(CAT-12, CAT-13). - Prices are those of the reseller's customer type, promotions on top; availability is En stock or En rupture only, and an En rupture variant cannot be added (PRC-02, STK-07).
cart.items.addenforces minimum, step and maximum per order;cart.getre-prices and re-checks at every view and returns blocking issues (ORD-01, ORD-02, PRC-05).ORDER_MIN_AMOUNT_NOT_METshows the missing amount;STOCK_INSUFFICIENTsays the quantity cannot be served without revealing what is left; products that became invisible must be removed (ORD-02, STK-07, CAT-05).- RA-18 uses
cart.checkoutOptionsfor addresses (RA-19), enabled payment methods, delivery fee and available credit; over-limit credit orders are blocked by default (D-04) (FIN-02, FIN-05, DLV-06). cart.checkoutrequires anIdempotency-Key: a retry with the same key replays the same order; a change found at submission returns to the cart instead of creating the order (ORD-03).- The order is
SUBMITTED— never confirmed automatically — and enters BO-41 live; RA-20 says HOCO will confirm it (ORD-14, SYN-07). The full sequence is in checkout.
Live tracking, cancellation and assisted-order confirmation
- While order screens are open, the app and the web keep
events.stream;order.status_changedandorder.modifiedupdate RA-21 counters and the RA-22 timeline at once, and a lost connection resumes withLast-Event-ID(ORD-15, SYN-07). - Every change is also a notification — push and inbox RA-26 — whether the app is open or not (NOT-01, NOT-02, NOT-05).
orders.getreturns the allowed actions:orders.cancelwhileSUBMITTEDorPENDINGwith a reason, which releases any reservation automatically (ORD-10, STK-03); documents viaorders.document(ORD-12);orders.reorder(ORD-07).- On a
DELIVEREDorder the reseller can open an after-sales claim or a return (SUP-04, ORD-13). - Assisted orders arrive on RA-23 (web RW-09):
orders.confirmAssistedmakes themSUBMITTED— still waiting for the back-office confirmation —,orders.rejectAssistedcancels them with a reason, and after 72 h without answer they expire (D-23) (ORD-08, ORD-14).
Payment declaration
- RA-29 and RA-30 read
finance.summaryandinvoices.list; credit notes from returns and after-sales appear against the invoices they reduce (FIN-10, FIN-08). - RA-31 declares a transfer, CCP or BaridiMob payment with a private proof uploaded through
files.createUploadandfiles.completeUpload(FIN-03, SEC-04); proof, amount, date and reference are mandatory by default (D-26). payments.declarecreates aPENDING_VERIFICATIONpayment; nothing changes in the balance until finance confirms on BO-45 withadmin.payments.verifyand allocates withadmin.payments.allocate(FIN-03, FIN-04).- A rejection carries a reason from
PAYMENT_REJECT_REASON; both outcomes are notified (NOT-05).
After-sales claim (SAV)
- A claim starts from a delivered order or from RA-32; RA-33 (web RW-14) asks for the lines and quantities, the issue (
AfterSalesIssue), a description and at least one photo (SUP-04). tickets.createwith typeAFTER_SALESchecks that the order isDELIVERED, that the claim is within the after-sales window (D-35) and that quantities are not already claimed or returned (SUP-04).- The claim is flagged SAV in BO-55 and listed on BO-69; BO-56 shows the order, the claimed lines, the photos and the reseller's claim history; agents can ask for more information, which reaches the reseller live and by push (
admin.tickets.reply, SUP-02, ORD-15). admin.tickets.resolve(permissionsupport.validate) applies one resolution: a free replacement order that enters BO-41 like any order, a return already approved, a credit note, a repair, or a rejection with a reason (SUP-04, ORD-13, FIN-08, ORD-14).- The reseller sees the resolution and its effect, may contest a rejection once, and closes the ticket with a rating (
tickets.close) or it auto-closes (SUP-01).
Return with automatic restock
- From a
DELIVEREDorder, RA-40 (web RW-14) sendsreturns.createwith lines, quantities (at most delivered minus already returned or claimed), a reason and photos, inside the return window — 7 days by default (D-35) (ORD-13). - Returns also start from an after-sales resolution
RETURN(alreadyAPPROVED) and from a refusal at the door (alreadyIN_TRANSIT) (SUP-04, DLV-03). - The commercial administration decides on BO-69 with
admin.returns.decide: acceptance sends instructions (bring to the depot or a collection date); refusal needs a reason (ORD-13). - The stock team records the reception with
admin.returns.receive(received and accepted quantities per line, a reason for each refused unit); accepted quantities re-enter stock automatically asRETURNmovements, defective and damaged units are not re-entered (STK-03, STK-04). - In the same operation a credit note is issued for the accepted invoiced lines and the return becomes
REFUNDED; the reseller follows every step live and by notification (FIN-08, ORD-15,returns.get).
Support and regional WhatsApp
- The WhatsApp button is fixed on the reseller app and web screens, for guests and signed-in resellers (SUP-05).
support.whatsappreturns the number, thewa.melink and the hours of the support region: the region of the declared wilaya when signed in, of the device location for a guest who allows it, otherwise a wilaya picker and the default number (SUP-05, ADM-08). Regions are managed on BO-70; one national region applies until HOCO defines more (D-36).- Written requests go through RA-32 and RA-33 (
tickets.create); agents answer from BO-55 and BO-56 (admin.tickets.reply,admin.tickets.update); the reseller answers on RA-34 (tickets.reply) and every reply arrives live and by push (SUP-01, SUP-02, ORD-15).
Delegate journeys
A day in the field, from sign-in to closing
- DA-01 checks the version (
appConfig.get); DA-02 signs in with phone and password and refuses suspended accounts explicitly (AUTH-02, AUTH-08). - On first launch DA-04 explains the location policy — sampling only during a tour in progress, every 5 min or 200 m, kept 90 days — and records consent (SEC-07, FLD-15, D-07).
sync.deltaloads the day's snapshot (tour, visits, resellers in scope, tasks, reference lists) into the local database; without network the last snapshot is used and the offline banner shows (SYN-04,delegate.tours.today).- DA-05 shows the day (
delegate.home, FLD-05). « Commencer la tournée » appears only for the delegate's ownTO_STARTtour;delegate.tours.startworks offline through the outbox, and the back-office receivestour.startedonce synced (FLD-04, SYN-05). - DA-06 runs the visit loop; a break uses
delegate.tours.suspendanddelegate.tours.resume, and stops sampling meanwhile (FLD-04, FLD-15). delegate.tours.closingPreviewon DA-20 lists stops without an outcome (fixed on DA-11,delegate.visits.notDone) and unsynced items (DA-27);delegate.tours.closethen setsCOMPLETEDand returns the final report (FLD-09, FLD-12, SYN-06).
A visit at a point of sale
- DA-08 shows the next destination with ETA and distance and opens the phone's navigation app (FLD-07, INT-01).
- « Arrivé » sends
delegate.visits.arrivewith position, accuracy andoccurredAt; within 150 m and with accuracy ≤ 100 m the visit opens, otherwise DA-28 shows the distance and the visit stays closed (blocking by default, D-06) (FLD-07, GEO-03). Details in check-in. - DA-10 runs the visit: timer (
delegate.visits.start), checklist of the visit type (delegate.visits.checklist, FLD-16), note of up to 300 characters (delegate.visits.note), photos (delegate.visits.addPhoto), call (FLD-08). - Opportunities lead to DA-14, DA-16 or DA-17 — see the conversion funnel.
- DA-12 saves the structured report (
delegate.visits.report); a next action with a date creates the follow-up on DA-19 (FLD-10, CRM-08). delegate.visits.endrefuses to finish while required photos or report are missing; a finished visit is locked until a back-office unlock (admin.visits.unlock, FLD-08). Everything in this loop works offline.
Prospect → invitation → install → account → first order
- DA-14 runs
delegate.resellers.checkPhonethendelegate.resellers.create(offline-safe, client UUIDv7); the record carries the delegate, the position and a proposed customer type (FLD-11, CRM-03, AUTH-11). - DA-16 gets the active invitation from
delegate.invitations.createand records the share channel withdelegate.invitations.markShared(SENT) (IVT-01, IVT-02). - The link opens the app through Android app links when installed, otherwise the landing
invitations.landingsends the visitor to the Play Store with the code in the referrer; the first open reports it withinvitations.attribute(APP_INSTALLED) (IVT-04). Details in invitation attribution. - Sign-up claims the delegate's record and records
ACCOUNT_CREATEDandPHONE_VERIFIED; the first catalog read of the new account recordsCATALOG_VIEWED(AUTH-05, IVT-03). - The first order — placed by the reseller or prepared by the delegate on DA-17 and confirmed — is flagged first and attributed to the delegate (
FIRST_ORDER); like every order it waits for the back-office confirmation; the reseller becomesACTIVEwhen an order is delivered (ORD-09, ORD-14, CRM-04). - The delegate sees the steps tick on DA-16 (
delegate.invitations.get); the back-office follows the funnel per delegate withadmin.invitations.list(ANA-04).
Back-office journeys
Account validation with customer-type review
- Pending sign-ups arrive live through
account.pending; field-created points of sale wait in the same queue BO-13 (admin.resellers.validation.list, CRM-09, FLD-14). - Duplicate hints come with each entry; real duplicates are rejected and pointed to the existing record — the merge tool is V2 (CRM-03, CRM-13).
- The reviewer confirms or changes the declared customer type (a change needs a reason and is audited) before approving with
admin.resellers.validate(AUTH-11, AUD-01); who validates is D-30. - Approval activates the account and notifies the reseller and the creating delegate; a rejection is shown with its reason on RA-06 (NOT-05).
Tour planning
- BO-21 plans tours per delegate and date, or a recurring series, with
admin.tours.create(FLD-03). - BO-22 adds stops from the delegate's zone with time slots and priorities; the recommended mode computes a nearest-neighbour order with
admin.tours.recommendOrder(FLD-17);admin.tours.setStopssaves them (FLD-06). - A planned tour reaches the delegate at the next
sync.delta; it can be edited until it starts (admin.tours.update) or cancelled with a reason (admin.tours.cancel, FLD-04). - The daily job sets
TO_START; the delegate starts and closes it; BO-23 and BO-06 follow it live (admin.tours.get,admin.live.delegates, FLD-13); reopening a closed tour needs the validate permission (admin.tours.reopen, FLD-12).
Order confirmation queue: controls, hold, override
- Every channel lands in
SUBMITTED— reseller app and web (cart.checkout), assisted orders once confirmed (orders.confirmAssisted,admin.orders.confirmAssisted), phone orders (BO-40,admin.orders.create, ORD-11) and after-sales replacements (admin.tickets.resolve). None is confirmed automatically (ORD-14). - BO-41 lists
SUBMITTEDandPENDINGorders oldest first with their control results (admin.orders.toConfirm); new orders arrive live throughorder.to_confirm(SYN-07). - BO-39 shows the stock, price, credit and address controls (
admin.orders.get, ORD-05). When everything passes, Valider is one click (admin.orders.validate). - When stock is short, the confirmer reduces the quantity with a reason (
admin.orders.modify, ORD-06) or overrides with the stock-validate permission; credit over the limit needs a finance override; every override is logged asOVERRIDE(STK-08, FIN-05, AUD-01). - Mettre en attente holds the order in
PENDINGwith a reason; Refuser ends itREFUSEDwith a reason fromORDER_REFUSAL_REASON(admin.orders.refuse). - Confirmation reserves stock and creates the delivery record
TO_PREPARE(D-22); the reseller sees the change live and by push (ORD-15). See the confirmation sequence.
Stock: receipts, alerts, inventories and returns
- Alerts arrive as
stock.alertevents on BO-07; BO-33 shows physical, reserved and available quantities per warehouse — quantities that only the back-office ever sees (admin.stock.levels, STK-02, STK-05, STK-07). - Receipts (
admin.stock.receipt) and adjustments with a reason (admin.stock.adjust, BO-35) post movements to the journal BO-34 (admin.stock.movements, STK-04, STK-06); a variant back above 0 returns its product fromOUT_OF_STOCKtoACTIVE(CAT-04). - Inventory sessions on BO-36 (
admin.inventory.crud) are validated withadmin.inventory.validate, which postsINVENTORYmovements for the differences only (STK-06). - Restock is automatic: cancellations release reservations, and return receptions on BO-69 (
admin.returns.receive) postRETURNmovements for accepted units, without any manual adjustment (STK-03, ORD-13).
Delivery
- A confirmed order appears on BO-42 as
TO_PREPARE(admin.deliveries.list, DLV-01); the picking list is printed withadmin.deliveries.pickingList. - Preparation and readiness move the order through
admin.orders.transition; each status reaches the reseller live (ORD-04, ORD-15). admin.deliveries.updaterecords the mode (Livreur HOCO, Société de livraison, Retrait au dépôt), the carrier and the tracking number (DLV-02, DLV-04);SHIPPEDdeducts stock and the delivery note is available (STK-03, ORD-12).admin.deliveries.proofstores the photo and the recipient and marks the orderDELIVERED(DLV-03); the first delivered order makes the resellerACTIVE(CRM-04).- A refusal at the door turns the order
RETURNEDand creates a return already in transit, whose reception restocks and credits automatically (ORD-13).
Finance
- Declarations from RA-31 and RW-13 are verified on BO-45 (
admin.payments.list,admin.payments.verify); cash and other payments are recorded with their allocation (admin.payments.record,admin.payments.allocate) (FIN-03, FIN-04). - Credit notes from return receptions and after-sales resolutions reduce the invoice they relate to (FIN-08).
- A daily job sets
OVERDUE(FIN-01); reminders are V2 (FIN-07). - BO-46 sets limits and blocks (
admin.credit.update), applied at the next checkout (FIN-05); BO-08 summarises expected payments, credit used and unpaid amounts (ANA-01).
Direction
- Direction signs in on BO-01 and lands on BO-04 with the cards of cahier §4.1, filtered by date, wilaya, commune, delegate, brand and category (
admin.dashboard.kpis, ANA-01, ANA-02). - The sales, field and finance dashboards (BO-05, BO-06, BO-08) and the reports library BO-59 (
admin.reports.run) give the essential reports and the success indicators with the PRD's formulas (ANA-03, ANA-04). - Exports run in the background (
admin.exports.create) and are downloaded from BO-60; every export is in the activity journal (ANA-05, AUD-01).
Sequence diagrams
Checkout
- « Valider la commande » on RA-18 or RW-07 sends
cart.checkoutwith a requiredIdempotency-Key; a retry with the same key and body replays the original response, a different body with the same key is refused with409 IDEMPOTENCY_KEY_REUSED(ORD-03). - The server re-prices with the customer-type price and promotions, re-checks availability without exposing quantities, checks credit for credit orders and the cart rules (PRC-02, PRC-05, STK-07, FIN-05, ORD-02).
- Any failure returns a stable
422code with the issues and creates nothing; success writes the orderSUBMITTED, its number, lines, history and outbox events in one transaction (ADM-04, ORD-06). - The worker dispatches
order.createdandorder.to_confirmto the back-office stream — the order is now in BO-41 waiting for a person — and notifies the reseller (ORD-14, SYN-07, NOT-05). Nothing confirms the order automatically.
Back-office confirmation and live status to the reseller
- The confirmer works from BO-41 (
admin.orders.toConfirm) and BO-39 (admin.orders.get);admin.orders.validaterequires theorders.validatepermission (ORD-14, ORD-05). - Confirmation reserves stock, creates the delivery record and writes the outbox event in the same transaction (STK-03, DLV-01).
- The worker updates the back-office queue and publishes
order.status_changedon the reseller's own streamevents.stream, filtered to that reseller only; an open RA-21, RA-22, RW-08 or RW-09 updates in place (ORD-15, SYN-07). - The push and the inbox entry are sent in every case — the stream is a convenience while the app is open, the notification is the guaranteed channel (NOT-02, NOT-05).
- Reconnection uses
Last-Event-ID, and a foreground refresh withorders.getguarantees the status shown equals the back-office status (ORD-07). The same mechanism carries hold, refusal, modification, preparation, shipment, delivery, returns and ticket replies.
Assisted order
delegate.assisted.createanddelegate.assisted.updatebuild a draft priced at the reseller's customer type with availability only; assisted orders need a connection (ORD-08, PRC-02, STK-07).delegate.assisted.submitruns the same controls as a checkout, flags the first order for the delegate and asks the reseller for confirmation on RA-23 (ORD-02, ORD-09).- The reseller confirms (
orders.confirmAssisted) or refuses with a reason (orders.rejectAssisted); the administration may confirm for a reseller who agreed by phone (admin.orders.confirmAssisted, BO-41); after 72 h the confirmation expires (D-23). - A confirmed assisted order is
SUBMITTEDand still waits for the back-office confirmation like every order (ORD-14); the delegate follows it on DA-18 (delegate.orders.list).
Visit check-in with GPS tolerance
- « Arrivé » captures a fresh position; an accuracy worse than 100 m asks for a new measurement (GEO-03, FLD-07).
- Online,
delegate.visits.arrivecomputes the distance on the server; within 150 m the visit becomesCHECKED_INand DA-10 opens with Position confirmée; outside, DA-28 shows the distance and the visit stays closed — blocking by default (D-06) (FLD-08). - Offline, the app applies the same rule against the cached shop position and queues the mutation; the server evaluates it again on replay and flags a disagreement (SYN-04, SYN-05).
- The back-office receives
visit.checked_inon BO-06 and BO-23 (FLD-13, SYN-07).
Offline replay through /sync/batch
- Offline actions are written to the local outbox with a client UUIDv7, an
Idempotency-KeyandoccurredAt; implausible times (more than 5 min ahead, older than 72 h) are rejected withOCCURRED_AT_OUT_OF_RANGE(SYN-04, SYN-05). sync.batchreplays up to 50 items in order with one result per item; a lost response is harmless: the resent items come backREPLAYEDwith their original results (SYN-05).- An item whose target changed on the server returns
CONFLICTand is shown in DA-27, never retried silently;REJECTEDitems are not retried,RETRYitems are retried with backoff (SYN-06). sync.deltathen pulls the server's changes so the local state matches (SYN-01). The full design is in the offline sync design.
Invitation attribution with the Play install referrer
delegate.invitations.createreturns the active code (AB12-CD34), the linkhttps://app.hoco.dz/i/AB12CD34and the QR payload;delegate.invitations.markSharedrecords the channel (IVT-01, IVT-02).- Installed apps open the link directly through verified Android app links; otherwise
invitations.landingredirects to the Play Store with the code in thereferrer, which the app reads on first open (IVT-04). On a computer or an iPhone the landing opens the web sign-up instead (RW-01). invitations.attributerecordsAPP_INSTALLEDfor the inviting delegate;invitations.resolveshows the store name and the delegate's first name on the sign-up screen (IVT-03).auth.signup.resellerwith the code claims the delegate's record with the declared customer type; a reseller who installed without the link is still attributed through the typed code or the phone match (AUTH-05, AUTH-11).
Cross-journey lifecycle of a reseller
One record follows a point of sale through every journey above. ResellerStatus is its commercial lifecycle; it is distinct from the account status (PENDING_VALIDATION, ACTIVE, SUSPENDED, DISABLED) and from the validation status.
- Records start as
NEW_PROSPECT(delegate app, back-office, import — the customer type is captured on every path) or directly asACCOUNT_CREATEDwhen a shop signs up by itself (CRM-02, AUTH-11). - Qualification statuses (
TO_CONTACT,INTERESTED,NOT_INTERESTED,TO_FOLLOW_UP) are set by delegates and the back-office with reasons, plus two system rules: planning a visit or call setsTO_CONTACT, inactivity setsTO_FOLLOW_UP(CRM-04,delegate.resellers.update,admin.resellers.setStatus). - The funnel statuses are automatic only and move forward from any qualification status: install attributed →
APP_INSTALLED(invitations.attribute), record claimed →ACCOUNT_CREATED(auth.signup.reseller), first order submitted →FIRST_ORDER, an order delivered →ACTIVE(admin.deliveries.proof) (IVT-03, ORD-09). - Two automatic moves go backwards: a first order that ends refused or cancelled reverts
FIRST_ORDER, and the daily inactivity scan movesACTIVEorACCOUNT_CREATEDtoTO_FOLLOW_UPafter 60 days without a confirmed order (setting) with a follow-up task for the delegate; the next confirmed order restoresACTIVE(CRM-08). SUSPENDED(unpaid, fraud, closure) is a back-office decision from any status: checkout, assisted orders and return requests are refused, sign-in and reading still work; lifting it restores the previous status (CRM-04). The full transition tables are on lifecycles and statuses.
What is not a flow and where it lives
Configuration and administration screens support the journeys without being journeys themselves.
| Topic | What it configures | Screen | API | Specified in |
|---|---|---|---|---|
| Business settings | Order minimums, reservation status, GPS tolerance and frequency, credit policy, stacking, payment methods, delivery fees, return and after-sales windows, prices before validation | BO-64 | admin.settings.update | ADM-03 |
| Support regions | Wilayas per region, WhatsApp number and hours | BO-70 | admin.supportRegions.crud | ADM-08 |
| Product attributes | Filterable attributes per category | BO-71 | admin.attributes.crud | CAT-13 |
| Reference lists | Business types, reasons, issue tags | BO-65 | admin.referenceLists.crud | ADM-05 |
| Users, roles and permissions | Staff and delegate accounts, the role × permission matrix | BO-61, BO-62 | admin.users.create, admin.roles.updatePermissions | ADM-01, ADM-02 |
| Activity journal | Who did what, when, from which app | BO-63 | admin.audit.list | AUD-01, AUD-03 |
| Data imports | Products, resellers (with customer type), users, stock — dry run then apply | BO-32, BO-67 | admin.products.import, admin.imports.create | CAT-06, ADM-06 |
| App versions and maintenance | Minimum and latest version per app and platform | BO-66 | admin.appVersions.crud | ADM-07 |
| Notification templates and rules | Event → channel → recipient, localised texts | BO-58 | admin.notifications.rules, admin.notifications.templates | NOT-04 |
| Announcements | Messages to delegates or resellers by target | BO-57 | admin.announcements.send | NOT-07 |
| Zones, objectives, visit types | Delegate scope, targets, checklists | BO-19, BO-20, BO-26 | admin.zones.crud, admin.objectives.crud, admin.visitTypes.crud | GEO-02, FLD-02, FLD-16 |
| Segments, carriers, warehouses | Targeting, delivery companies, stock locations | BO-15, BO-43, BO-37 | admin.segments.crud, admin.carriers.crud, admin.warehouses.crud | CRM-06, DLV-04, STK-01 |
| Sessions and preferences | Active sessions, notification categories, language | BO-68, RA-35, DA-26 | auth.sessions.list, notifications.preferences.update | AUTH-06, NOT-06 |
Product requirements (PRD)
Why the HOCO B2B ecosystem is built, for whom and in which release — goals, personas, user stories with acceptance criteria, scope boundaries, risks and success metrics.
Software requirements specification
What the SRS of the HOCO B2B ecosystem contains, how to use it, the baseline in numbers, the map of its pages and the change-control rule.