Acceptance scenarios
The cahier's fifteen priority acceptance scenarios and thirty-two complementary ones as executable test scripts with seed data, steps, expected results, requirements covered and evidence — then the acceptance procedure up to the signed PV de recette.
Cahier §12 lists fifteen « scénarios de recette prioritaires » and the condition of acceptance: « La recette est considérée comme acceptée lorsque les scénarios prioritaires sont exécutés avec succès, que les anomalies bloquantes sont corrigées et que le procès-verbal de recette est signé » (OPS-05). This page turns each scenario into a script anyone can execute: objective, apps, preconditions and data, numbered steps with the expected result of each, the requirements covered and the evidence to keep. AT-01 to AT-15 are the cahier's priority scenarios; AT-16 to AT-47 cover V1 rules the cahier's list does not name, including the product decisions of 17 October 2026. The procedure — environments, who executes, severities, entry and exit criteria, the PV — closes the page.
The same scripts are used three times: by Akram on staging in the functional campaign (QA-03), by the team on staging with real devices (QA-01, run per the end-to-end test plan on the seeded staging data), and by HOCO's key users on pre-production for the client acceptance (QA-02).
Scenario index
| Id | Scenario | Cahier | Apps | Release |
|---|---|---|---|---|
| AT-01 | Reseller account: sign-up with customer type, validation | §12 Compte revendeur | RA · RW · BO | V1 |
| AT-02 | Catalog: only authorised products, prices and availability | §12 Catalogue | RA · RW · BO | V1 |
| AT-03 | Order: unique number, visible in the back-office, confirmed there | §12 Commande | RA · BO | V1 |
| AT-04 | Stock: reservation, deduction, automatic restock | §12 Stock | BO · RA | V1 |
| AT-05 | Tracking: back-office changes live in the app and notified | §12 Suivi | BO · RA · RW | V1 |
| AT-06 | Promotion: only authorised products, dates and targets | §12 Promotion | BO · RA | V1 |
| AT-07 | Loyalty: points credited, debited, historised | §12 Fidélité | RA · BO | V2 |
| AT-07a | V1 variant: promotions only, no loyalty surface | §12 Fidélité | RA · RW · BO | V1 |
| AT-08 | Tour: start, visits, closing with full summary | §12 Tournée | DA · BO | V1 |
| AT-09 | GPS: check-in tolerance, consented positions only | §12 GPS | DA · BO | V1 |
| AT-10 | Prospect: field record in the CRM without duplicate | §12 Prospect | DA · BO | V1 |
| AT-11 | Invitation: QR and link attribute to the right delegate | §12 Invitation | DA · RA · BO | V1 |
| AT-12 | First order: linked to the reseller and the source delegate | §12 Première commande | DA · RA · BO | V1 |
| AT-13 | Visit report: saved, visible, triggers the follow-up | §12 Rapport | DA · BO | V1 |
| AT-14 | Permissions: no access to unauthorised functions | §12 Permissions | BO · API | V1 |
| AT-15 | Offline: pending field data syncs when the network returns | §12 Hors ligne | DA · BO | V1 |
| AT-16 | Account claim without duplicate | — | RA · BO | V1 |
| AT-17 | Credit check blocking and approval | — | RA · BO | V1 |
| AT-18 | Assisted order expiry | — | DA · RA · BO | V1 |
| AT-19 | Controlled order modification with history | — | BO · RA | V1 |
| AT-20 | Stock override with permission | — | BO | V1 |
| AT-21 | Payment declaration and verification | — | RA · BO | V1 |
| AT-22 | A reseller never sees another reseller's prices or data | — | RA · RW · API | V1 |
| AT-23 | A delegate never sees an out-of-zone reseller | — | DA · API | V1 |
| AT-24 | Tour closing blocked until synced | — | DA | V1 |
| AT-25 | Tour reopened by the back-office | — | BO · DA | V1 |
| AT-26 | Import with an error report | — | BO | V1 |
| AT-27 | Export permission and traceability | — | BO | V1 |
| AT-28 | Forced app update | — | BO · RA · DA | V1 |
| AT-29 | Notification deep links | — | RA · DA | V1 |
| AT-30 | Live back-office (SSE) | — | BO | V1 |
| AT-31 | Arabic and RTL readiness smoke test | — | RA · DA · BO · RW | V1 |
| AT-32 | Suspended and disabled accounts | — | DA · BO | V1 |
| AT-33 | One-time codes, lockout, password reset | — | RA · API | V1 |
| AT-34 | Idempotent checkout | — | RA · API | V1 |
| AT-35 | Cancellation rules and automatic restock | — | RA · BO | V1 |
| AT-36 | Visit rules: mandatory photos, locked visit, unlock | — | DA · BO | V1 |
| AT-37 | Performance smoke test | — | RA · BO · API | V1 |
| AT-38 | Guest browsing without prices | — | RA · RW | V1 |
| AT-39 | Correct price per customer type | — | RA · RW · BO | V1 |
| AT-40 | Advanced filters with facets | — | RA · RW · BO | V1 |
| AT-41 | Stock quantities never shown to resellers | — | RA · RW · DA · API | V1 |
| AT-42 | Every order needs a back-office confirmation | — | RA · RW · DA · BO | V1 |
| AT-43 | Live order status on the reseller screen | — | BO · RA · RW | V1 |
| AT-44 | Regional WhatsApp number: signed in, location, picker | — | RA · RW · BO | V1 |
| AT-45 | After-sales claim: replacement, return, credit note, rejection | — | RA · BO | V1 |
| AT-46 | Return request: reception restocks automatically | — | RA · BO | V1 |
| AT-47 | Backup restore drill | — | OPS | V1 |
Test data — the recette seed
A fictional data set loaded on staging and pre-production by the recette seed (an extension of the demo seed of OPS-01). D is the day the scenario is executed; no calendar date is hard-coded. Test phone numbers are allow-listed for SMS in non-production environments; passwords are in the recette vault, never in this page.
Geography and zones
| Zone | Wilaya | Communes | Delegate |
|---|---|---|---|
| Oran Est | 31 Oran | Oran, Bir El Djir, Es Senia | Yacine (+213555000101) |
| Alger Est | 16 Alger | Bab Ezzouar, El Harrach | Samir (+213555000102) |
Support regions (two regions to exercise the feature; production may start with one, D-36): Ouest (wilaya 31…) WhatsApp +213550000301, Sunday–Thursday 08:30–17:00 · Centre (wilaya 16…) +213550000302 · default region National +213550000300.
Staff users
| User | Role | Used for |
|---|---|---|
| Lina | SUPER_ADMIN | Settings, roles, app versions, restore |
| Nadia | COMMERCIAL_ADMIN | Orders to confirm, validation queue, tours, promotions, support |
| Rachid | STOCK_MANAGER | Stock, returns reception, overrides (stock.validate) |
| Amel | FINANCE_MANAGER | Payments, credit (finance.validate) |
| Sofiane | DELIVERY_MANAGER | Preparation, shipping, proof of delivery |
| Mourad | DIRECTION | Dashboards (read-only) |
Resellers
| Store | Number | Phone | Commune | Customer type | Status | Delegate | Credit |
|---|---|---|---|---|---|---|---|
| Magasin El Wafa | REV-000101 | +213555000201 | Bir El Djir | DEMI_GROS | ACTIVE, segment Partenaires | Yacine | Limit 200 000,00 DA; unpaid invoice FAC-2026-000090 of 150 000,00 DA → available 50 000,00 DA |
| Phone Center Bahia | REV-000102 | +213555000202 | Oran | DETAIL | ACTIVE | Yacine | Limit 0 |
| Alger Mobile Store | REV-000103 | +213555000203 | Bab Ezzouar | SUPER_GROS | ACTIVE, segment Partenaires | Samir | Limit 0 |
| Bazar El Amel | REV-000104 | +213555000205 | Es Senia | — (prospect) | INTERESTED | Yacine | — |
| Galaxy Phone, Mobile Plus | REV-000105, REV-000106 | +213555000208, +213555000209 | Bir El Djir, Es Senia | DETAIL | ACTIVE | Yacine | Limit 0 |
| Created during the tests | — | +213555000204 (Accessoires Nour), +213555000206 (Téléphonie Belhadj), +213555000207 | Oran | Declared at sign-up | — | — | — |
Products (prices HT in DA; TTC = HT × 1.19 shown in brackets; VAT 19 %)
| Product | Category · attributes | Super-gros | Demi-gros | Détail | Physical stock (threshold) | Special |
|---|---|---|---|---|---|---|
| HOCO N32 30W | Chargeurs · 30 W, USB-C | 1 300,00 (1 547,00) | 1 400,00 (1 666,00) | 1 500,00 (1 785,00) | 120 (20) | Recommended price 2 600,00 TTC |
| BOROFONE BX51 câble USB-C 1 m | Câbles · USB-C→USB-C, 1 m, noir | 300,00 (357,00) | 330,00 (392,70) | 360,00 (428,40) | 600 (50) | Sold by 5 (step 5) |
| HOCO X88 câble Lightning 1 m | Câbles · USB-A→Lightning, 1 m, blanc | 250,00 (297,50) | 270,00 (321,30) | 290,00 (345,10) | 300 (50) | — |
| ACEFAST T6 écouteurs | Écouteurs · Bluetooth 5.3 | 2 800,00 (3 332,00) | 3 000,00 (3 570,00) | 3 200,00 (3 808,00) | 8 (10) | Below threshold (back-office alert only) |
| HOCO J101 powerbank 10 000 mAh | Powerbanks · 10 000 mAh | 1 900,00 (2 261,00) | 2 000,00 (2 380,00) | 2 100,00 (2 499,00) | 60 (10) | Daily offer on D at 2 190,00 TTC |
| HOCO CA75 support voiture | Supports voiture | 900,00 | 950,00 | 1 000,00 | 0 | OUT_OF_STOCK |
| BOROFONE BA21 casque | Audio | 1 700,00 | 1 850,00 | 2 000,00 | 40 (5) | Visible only to segment Partenaires |
| ACEFAST A55 65W | Chargeurs · 65 W, USB-C | — | — | — | 30 | DRAFT (never visible) |
Promotion « -15 % sur les câbles BOROFONE »: PERCENT_OFF 15 %, scope category Câbles and brand BOROFONE, audience wilaya 31, from D 00:00 to D+7 23:59, cap 200 units.
Settings (recette values): minimum order 10 000,00 DA TTC; stock.reserveOn = VALIDATED, stock.deductOn = SHIPPED; credit.overLimitPolicy = BLOCK; GPS tolerance 150 m, accuracy ≤ 100 m; assisted-order delay 72 h; return window 7 days; prices after sign-up per D-18 (default: declared type right away); payment methods all enabled.
Tour TRN-2026-000045 for Yacine on D, ordering mode RECOMMENDED, stops: S1 Magasin El Wafa (HIGH), S2 Phone Center Bahia, S3 Bazar El Amel (visit type Prospection: façade photo and report mandatory), S4 Galaxy Phone, S5 Mobile Plus. Visit type Visite commerciale: report mandatory, photos optional.
Priority scenarios (cahier §12)
AT-01 — Reseller account: sign-up with customer type, validation
| Item | Detail |
|---|---|
| Objective | « Une inscription valide apparaît dans le back-office et peut être approuvée » |
| Requirements | AUTH-03, AUTH-07, AUTH-08, AUTH-11, CRM-02, CRM-09, NOT-05 |
| Preconditions | Reseller app on a test phone with SIM +213555000206; no record with this phone; Nadia signed in on the back-office |
| # | Step | Expected result |
|---|---|---|
| 1 | Open the app, « Créer un compte », enter 0555 00 02 06, no invitation code | A code is sent; RA-04 shows a 60-second resend countdown |
| 2 | Enter a wrong code | « Code incorrect » with the remaining attempts (4) |
| 3 | Enter the right code | Phone verified; the store form RA-05 opens |
| 4 | Fill Téléphonie Belhadj, owner, wilaya Oran, commune Oran, address, business type, customer type Détail, password; submit | Account created, status PENDING_VALIDATION; RA-06 « Compte en attente de validation » |
| 5 | Browse the catalog, open HOCO N32 30W, try « Ajouter au panier » | Prices shown per D-18 (default: Détail price 1 785,00 DA); adding to the cart is refused with the explicit pending-validation message |
| 6 | Back-office: open the validation queue BO-13 | The account appears within 5 seconds without reload, source SELF_SIGNUP, phone +213555000206, declared type Détail, no duplicate hint |
| 7 | Nadia approves, confirming the customer type | Account ACTIVE; the journal shows VALIDATE with Nadia, time and the type |
| 8 | Reseller app | Push and SMS « Compte validé »; the cart now accepts products |
| 9 | Repeat steps 1–4 with +213555000207; Nadia rejects with a reason | RA-06 shows « Compte non validé » with the reason; push received |
Evidence: screenshots of RA-04, RA-05, RA-06 (pending and rejected), BO-13 before and after; journal rows; the SMS on the phone; the notification log entry (BO-58).
AT-02 — Catalog: only authorised products, prices and availability
| Item | Detail |
|---|---|
| Objective | « Le revendeur voit uniquement les produits, prix et stocks autorisés » |
| Requirements | CAT-04, CAT-05, CAT-07, CAT-08, PRC-02, PRC-05, STK-07 |
| Preconditions | Recette seed; Phone Center Bahia (DETAIL) and Magasin El Wafa (DEMI_GROS) signed in on two phones |
| # | Step | Expected result |
|---|---|---|
| 1 | Bahia opens the catalog | N32, BX51, X88, T6, J101 and CA75 listed; BA21 (segment rule) and A55 (DRAFT) absent |
| 2 | Bahia opens HOCO N32 30W | 1 785,00 DA TTC (détail), recommended price 2 600,00 DA, « En stock » — no quantity anywhere |
| 3 | Bahia opens ACEFAST T6 (8 in stock, below its threshold) | « En stock » only — the threshold is a back-office alert, not a reseller label |
| 4 | Bahia opens HOCO CA75 | « En rupture »; « Ajouter au panier » disabled |
| 5 | El Wafa opens HOCO N32 30W, then the catalog | 1 666,00 DA TTC (demi-gros); BA21 visible (segment Partenaires) |
| 6 | Back-office: Rachid hides BX51 | After a refresh both resellers no longer see BX51; a cart line of BX51 shows « Produit indisponible » |
| 7 | API: request BA21 with Bahia's token (catalog.products.get) | 404 NOT_FOUND |
Evidence: screenshots for both resellers; API responses (showing availability and no quantity field); BO-28 visibility settings.
AT-03 — Order: unique number, visible in the back-office, confirmed there
| Item | Detail |
|---|---|
| Objective | « Une commande validée reçoit un numéro et apparaît dans le back-office » — with the 17 October rule that no order is confirmed automatically |
| Requirements | ORD-01, ORD-02, ORD-03, ORD-05, ORD-14, ADM-04, SYN-07 |
| Preconditions | El Wafa signed in; Nadia on BO-41 « Commandes à confirmer » |
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa adds N32 × 3 and BX51 × 7 | BX51 corrected or refused to a multiple of 5 (QUANTITY_NOT_ALLOWED message) |
| 2 | Cart with N32 × 3 and BX51 × 5 (about 6 670 DA TTC) | Checkout blocked: « Le montant minimum de commande est de 10 000,00 DA » |
| 3 | N32 × 6, BX51 × 10; open the cart | Lines at demi-gros prices, -15 % on BX51, HT, VAT and TTC totals; delivery line per D-20 |
| 4 | Address, note, Paiement à la livraison, « Valider la commande » | RA-20 shows CMD-2026-NNNNNN; status « Envoyée » |
| 5 | Back-office BO-41 | The order appears within 5 seconds without reload, channel RESELLER_APP, controls green |
| 6 | Wait two minutes | The order is still SUBMITTED — nothing confirms it automatically |
| 7 | Nadia confirms | VALIDATED; the order leaves the queue; the reseller sees « Validée » |
| 8 | Place a second order | Its number is the next one in the sequence |
| 9 | Open the reseller's cart on a second device or the reseller web | The cart is empty everywhere (server-side cart) |
Evidence: RA-20, BO-41 before and after, BO-39 history, the two numbers, requestId of the checkout.
AT-04 — Stock: reservation, deduction, automatic restock
| Item | Detail |
|---|---|
| Objective | « Les quantités sont réservées ou déduites selon le statut configuré » |
| Requirements | STK-02, STK-03, STK-04, ORD-10 |
| Preconditions | HOCO N32 30W physical 120, reserved 0; Rachid on BO-33 and BO-34 |
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa submits an order with N32 × 10 | Physical 120, reserved 0, available 120 (reservation at confirmation) |
| 2 | Nadia confirms | Reserved 10, available 110; a RESERVATION movement in the journal with the order number |
| 3 | Sofiane moves the order to En préparation, then Prête | Quantities unchanged |
| 4 | Sofiane ships it | Physical 110, reserved 0, available 110; a SHIPMENT movement |
| 5 | A second order N32 × 5 is confirmed (reserved 5), then cancelled by Nadia with a reason | Reserved back to 0 automatically; a RESERVATION_RELEASE movement; no manual action |
| 6 | Reseller app during the whole scenario | Only « En stock » — never a number |
Evidence: BO-33 values after each step; BO-34 journal export; screenshots of the reseller app.
AT-05 — Tracking: back-office changes live in the app and notified
| Item | Detail |
|---|---|
| Objective | « Les changements du back-office sont visibles dans l'application et notifiés » |
| Requirements | ORD-06, ORD-07, ORD-12, ORD-15, NOT-01, NOT-02, DLV-01–DLV-03 |
| Preconditions | The confirmed order of AT-03; the reseller app closed on one phone; the reseller web open on the order page |
| # | Step | Expected result |
|---|---|---|
| 1 | Sofiane moves the order to En préparation | Within 5 s the open web page shows « En préparation » without reload; the closed app's phone receives a push; the inbox has a dated entry |
| 2 | Prête, then Expédiée with carrier Livreur HOCO, driver and phone | Same three effects for each status; tracker steps match the reseller view |
| 3 | Delivery proof (photo, recipient name) | « Livrée » live and notified; the invoice FAC-… downloadable from RA-22 through a short-lived link |
| 4 | Compare the timeline in the app with BO-39 | Same statuses, same dates and times (Africa/Algiers) |
| 5 | Open a notification on the phone, then the inbox on the web | The notification is read on both; the badge decrements |
Evidence: video of the web page updating; push screenshots; BO-39 history; the invoice PDF.
AT-06 — Promotion: only authorised products, dates and targets
| Item | Detail |
|---|---|
| Objective | « La remise s'applique uniquement aux produits, dates et cibles autorisés » |
| Requirements | PRM-01, PRM-02, PRM-04, PRM-05 |
| Preconditions | Promotion -15 % sur les câbles BOROFONE active; daily offer on HOCO J101 |
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa (Oran) adds BX51 × 20 and HOCO X88 × 10 | -15 % on BX51 only (BOROFONE cable); X88 (HOCO cable) at its normal price |
| 2 | Alger Mobile Store (Alger) adds BX51 × 20 | No discount; the promotion is not listed in its promotions screen |
| 3 | Nadia schedules a second promotion starting D+1 | Not applied on D; status Programmée |
| 4 | Nadia sets the cap of the first promotion so that 5 units remain; a reseller checks out 20 units | Per the cap rule, the promotion becomes Terminée when the cap is consumed; later carts show « Offre terminée » and the normal price |
| 5 | J101 on D | 2 190,00 DA with the countdown banner; on D+1 the normal price |
| 6 | Open a submitted order with the promotion | Lines keep the promotion label and discount after it ends |
Evidence: cart screenshots for both resellers; BO-50 settings; order detail after the promotion ended.
AT-07 — Loyalty: points credited, debited, historised (V2)
| Item | Detail |
|---|---|
| Objective | « Les points sont crédités, débités et historisés correctement » |
| Requirements | LOY-01–LOY-05 — V2 |
| Preconditions | V2 release; rules of D-05 |
| # | Step | Expected result |
|---|---|---|
| 1 | An order reaches the earning status (delivered or paid per setting) | EARN entry with the points of the rule; balance updated |
| 2 | Redeem a reward | REDEEM entry; unavailable rewards cannot be claimed |
| 3 | Cancel or return an order that earned points | REVERSAL of exactly the earned points |
| 4 | Run the expiry job on points past validity | EXPIRE entries, oldest first |
| 5 | Compare the reseller history (RA-38) and the back-office | Same entries, same balance |
Executed with the V2 acceptance; in V1 run AT-07a instead.
AT-07a — V1 variant: promotions only, no loyalty surface
| Item | Detail |
|---|---|
| Objective | V1 recommends « promotions simples » (cahier §14.1); loyalty is V2 (D-16) |
| Requirements | PRM-01, PRM-03, PRM-04 |
| # | Step | Expected result |
|---|---|---|
| 1 | Open the reseller home, account and promotions screens (app and web) | No points, level or rewards tile or menu |
| 2 | Create a promotion targeted at segment Partenaires on HOCO N32 30W | El Wafa (partner) gets it; Bahia does not |
| 3 | Two promotions on the same product | The stacking rule of PRM-03 applies (default: best discount only); the cart shows which one |
| 4 | Order detail and the promotion report | The applied promotion is traceable per line |
Evidence: screenshots; promotion report.
AT-08 — Tour: start, visits, closing with full summary
| Item | Detail |
|---|---|
| Objective | « Le délégué démarre, réalise les visites et clôture avec un bilan complet » |
| Requirements | FLD-03–FLD-06, FLD-08, FLD-09, FLD-12, FLD-13 |
| Preconditions | Tour TRN-2026-000045 TO_START on D; Yacine on site in Oran with the delegate app; Nadia on the live map BO-06 |
| # | Step | Expected result |
|---|---|---|
| 1 | Yacine opens DA-05 | Today's tour, 5 visits, objectives; « Démarrer la tournée » enabled |
| 2 | Start the tour | IN_PROGRESS, start time and position recorded; Yacine appears on BO-06 within 5 s |
| 3 | Programme list and map | Same five stops in the same order |
| 4 | Swap S3 and S4 | Accepted (RECOMMENDED); the new order is visible on BO-23 |
| 5 | S1: arrive, start, checklist, note, photo, report, end | Visit DONE and locked; home counters updated |
| 6 | S2 and S4: same | DONE |
| 7 | S3 (Prospection): try to end without the façade photo | Refused with the missing items; after the photo and report, DONE |
| 8 | S5: « Visite non réalisée », reason Magasin fermé | NOT_DONE with the reason |
| 9 | Open the closing preview | 4 done of 5, 1 not done with reason, sign-ups, orders, revenue, kilometres; no blocking item |
| 10 | Close with an end-of-day comment | COMPLETED; BO-23 shows the full summary; the delegate's performance and dashboards updated |
Evidence: screenshots of DA-05, DA-20, BO-23; the trail on the map; the final report.
AT-09 — GPS: check-in tolerance, consented positions only
| Item | Detail |
|---|---|
| Objective | « Le check-in respecte la tolérance et conserve les coordonnées autorisées » |
| Requirements | FLD-07, FLD-15, GEO-03, SEC-07 |
| Preconditions | Fresh install of the delegate app; tour with S1 at a known position; executed on site (mock locations are refused) |
| # | Step | Expected result |
|---|---|---|
| 1 | First sign-in | DA-04 explains what is collected, when, who sees it and for how long; accepting leads to the system prompt; the consent is recorded |
| 2 | About 400 m from S1, tap « Arrivé » | Refused: distance shown, out-of-tolerance state; no check-in recorded |
| 3 | Indoors with poor accuracy (above 100 m) | « Précision insuffisante » — wait or move |
| 4 | About 80 m from S1, good accuracy | Check-in accepted; BO-25 shows position, accuracy, distance and time |
| 5 | During the tour, screen off for 15 minutes while moving | Positions about every 5 minutes or 200 m on the BO-23 trail; the persistent notification « Tournée en cours » visible |
| 6 | Suspend the tour, wait 15 minutes, resume | No position recorded during the suspension |
| 7 | After closing, and before the next start | No position recorded; no location indicator on the phone |
| 8 | Enable a mock-location app and tap « Arrivé » | Refused (GPS_MOCK_LOCATION) |
Evidence: screenshots; BO-23 trail with timestamps; consent record.
AT-10 — Prospect: field record in the CRM without duplicate
| Item | Detail |
|---|---|
| Objective | « La fiche créée sur le terrain apparaît dans le CRM sans doublon » |
| Requirements | FLD-11, CRM-01–CRM-03, CRM-10, SYN-04 |
| # | Step | Expected result |
|---|---|---|
| 1 | Yacine creates Accessoires Nour, phone 0555 00 02 04, WhatsApp, wilaya, commune, address, type, potential, GPS, façade photo | Saved; in BO-09 with source DELEGATE_APP, delegate Yacine, position on BO-10, photo in documents |
| 2 | Create Nour Accessoires with +213 555 00 02 04 | Duplicate detected before saving; the existing record is offered |
| 3 | In airplane mode create Kiosque Test (+213555000210), then reconnect; force a second replay of the same item | One record only |
| 4 | Nadia creates a reseller with 0555000204 in the back-office | 409 PHONE_ALREADY_EXISTS with a link to the record |
| 5 | Samir (other zone) checks 0555000204 | « Numéro déjà enregistré » without revealing the store's details |
Evidence: BO-09 entry, duplicate messages, sync centre history.
AT-11 — Invitation: QR and link attribute to the right delegate
| Item | Detail |
|---|---|
| Objective | « Le QR code et le lien attribuent l'installation au bon délégué » |
| Requirements | IVT-01–IVT-04, AUTH-05 |
| Preconditions | Bazar El Amel (INTERESTED, Yacine); a test phone without the reseller app |
| # | Step | Expected result |
|---|---|---|
| 1 | Yacine opens DA-16 for Bazar El Amel | Code XXXX-XXXX, link https://app-preprod.hoco.dz/i/…, QR; step Invitation envoyée after sharing |
| 2 | Share by WhatsApp | WhatsApp opens with the prefilled French text and the link |
| 3 | Scan the QR with the test phone | Play Store page of the reseller app (not installed) |
| 4 | Install and open | The invitation code is prefilled at sign-up; DA-16 shows Application téléchargée within a minute |
| 5 | Sign up with +213555000205 | The prospect record is claimed (same REV-000104); steps Compte créé, Téléphone vérifié; Yacine gets a push |
| 6 | Browse the catalog | Catalogue consulté |
| 7 | With the app installed, open the link again | The app opens directly |
| 8 | Back-office invitation funnel | Attributed to Yacine |
Evidence: DA-16 step history, funnel report, screenshots of the WhatsApp message.
AT-12 — First order: linked to the reseller and the source delegate
| Item | Detail |
|---|---|
| Objective | « La commande est liée au revendeur et au délégué source » |
| Requirements | ORD-08, ORD-09, ORD-02, ORD-14 |
| Preconditions | Bazar El Amel's account validated (after AT-11) |
| # | Step | Expected result |
|---|---|---|
| 1 | Yacine opens DA-17, chooses products of the three brands, quantities, address | Re-priced at the reseller's customer type; same controls as a normal order |
| 2 | « Demander la confirmation » | Order PENDING, AWAITING_RESELLER, channel DELEGATE_ASSISTED, source delegate Yacine |
| 3 | Reseller phone | Push and SMS; RA-23 shows the lines and totals |
| 4 | Reseller confirms | SUBMITTED; the order enters the « Commandes à confirmer » queue; Yacine notified |
| 5 | Nadia confirms on BO-41 | VALIDATED; flagged Première commande; ResellerStatus FIRST_ORDER |
| 6 | Reports: first orders by delegate, Yacine's performance, the invitation funnel | Yacine +1 everywhere; funnel step Première commande |
Evidence: BO-39 (channel, source delegate, first-order flag); report extracts.
AT-13 — Visit report: saved, visible, triggers the follow-up
| Item | Detail |
|---|---|
| Objective | « Le rapport est enregistré, consultable et déclenche la relance » |
| Requirements | FLD-10, CRM-07, CRM-08 |
| # | Step | Expected result |
|---|---|---|
| 1 | During S2, fill the report: person met Gérant, interest Élevé, products N32 and J101, promotion -15 % câbles, issue Prix concurrent, next action Relance téléphonique at D+2 | Saved; the visit can end |
| 2 | Back-office reseller 360° BO-11 | The report on the timeline with all fields |
| 3 | BO-14 and DA-19 | A task Relance téléphonique due D+2, assigned to Yacine |
| 4 | On the due date at 08:00 (or with the due date set to D for the test) | Morning digest push « Vos relances du jour » |
| 5 | Complete the task with an outcome | DONE; an interaction on the timeline |
Evidence: BO-11 timeline, task record, push screenshot.
AT-14 — Permissions: no access to unauthorised functions
| Item | Detail |
|---|---|
| Objective | « Un utilisateur ne peut pas accéder aux fonctions non autorisées » |
| Requirements | ACL-01–ACL-05, AUD-01 |
| # | Step | Expected result |
|---|---|---|
| 1 | Rachid signs in to the back-office | Navigation shows only his modules; the finance URL typed by hand shows « Accès refusé » |
| 2 | With Rachid's session call admin.payments.list | 403 PERMISSION_DENIED |
| 3 | Mourad tries to confirm an order | No button; the API answers 403 |
| 4 | Sofiane opens a product | No purchase price field; the API response has no purchase price |
| 5 | Lina removes orders.validate from the commercial admin role | Nadia's confirm button disappears after refresh; the API refuses; the journal records PERMISSION_CHANGE; restore it |
| 6 | A delegate token calls /admin/orders; a reseller token calls /delegate/home | 403 |
| 7 | Attach the permission-sweep report of SRV-28 | Every route has a declared rule |
Evidence: screenshots, API responses, journal rows, sweep report.
AT-15 — Offline: pending field data syncs when the network returns
| Item | Detail |
|---|---|
| Objective | « Les données terrain en attente se synchronisent après retour du réseau » |
| Requirements | SYN-03–SYN-06 |
| # | Step | Expected result |
|---|---|---|
| 1 | Start the tour online, then switch to airplane mode | The tour, visits and points of sale stay available |
| 2 | Full visit at S1 (check-in works on GPS), checklist, note, two photos, report, end; create a prospect | Each action saved locally; DA-27 shows the pending count |
| 3 | Kill the app and reopen it | Pending items still there |
| 4 | Network back | Items replay in order; « Synchronisé » within a minute; photos uploaded |
| 5 | Back-office | The visit with occurredAt (device time) and a later receivedAt; no duplicate |
| 6 | Cut the network in the middle of a sync, then restore it | No duplicate; the queue resumes |
| 7 | While offline, Nadia edits the same prospect; the delegate edits it too | The conflict appears in the sync centre with an explanation |
Evidence: sync centre screenshots before and after, back-office visit record, server log of the batch (requestId).
Complementary V1 scenarios
AT-16 — Account claim without duplicate
Requirements: AUTH-05, CRM-03. Preconditions: Accessoires Nour created by Yacine in AT-10.
| # | Step | Expected result |
|---|---|---|
| 1 | Sign up in the reseller app with +213555000204, no invitation code, declare Détail | After the code, the existing record is claimed: same REV- number, visits and notes kept, delegate Yacine kept |
| 2 | Enter a different store name at sign-up | The validation queue shows the difference for Nadia to keep or update |
| 3 | Back-office | One record; timeline « Compte créé par le revendeur » |
AT-17 — Credit check blocking and approval
Requirements: FIN-05, ORD-02, D-04. Preconditions: El Wafa available credit 50 000,00 DA.
| # | Step | Expected result |
|---|---|---|
| 1 | Policy BLOCK: El Wafa checks out 62 000,00 DA with Crédit | Refused, « Crédit disponible : 50 000,00 DA »; paying on delivery works |
| 2 | Lina switches the policy to REQUIRE_APPROVAL; same checkout | Order PENDING with the credit control failed, in the queue |
| 3 | Amel confirms with an override and a reason | VALIDATED; journal OVERRIDE with Amel and the reason |
| 4 | Bahia (limit 0) opens the payment methods | Crédit not offered |
AT-18 — Assisted order expiry
| # | Step | Expected result |
|---|---|---|
| 1 | Lina sets the assisted-order delay to 1 hour; Yacine sends an assisted order for El Wafa | AWAITING_RESELLER, expiry shown on RA-23 |
| 2 | Wait for the expiry (job every 15 minutes) | Confirmation EXPIRED, order CANCELLED with « Délai de confirmation expiré »; Yacine pushed; reseller inbox entry |
| 3 | Reseller tries to confirm | Refused (409 ASSISTED_ORDER_EXPIRED); the confirm button is gone |
| 4 | With the 72-hour default, a seeded order created 49 hours ago | Reminder push 24 hours before expiry; restore the setting |
AT-19 — Controlled order modification with history
Requirements: ORD-05, ORD-06, AUD-02.
| # | Step | Expected result |
|---|---|---|
| 1 | Nadia changes N32 from 10 to 8 on a submitted order, reason Quantité disponible limitée, and removes another line | Totals recomputed; controls re-run |
| 2 | Reseller app (open) | Order updated live; push « Commande modifiée » with the new total |
| 3 | BO-39 history | Change with before/after, user, time, reason |
| 4 | Reseller tries to edit the lines | Not possible — only cancel while allowed |
AT-20 — Stock override with permission
| # | Step | Expected result |
|---|---|---|
| 1 | A reseller orders ACEFAST T6 × 12 (available 8) | Checkout refused (STOCK_INSUFFICIENT) — or, for a back-office order on behalf, the order stops with the stock control failed |
| 2 | Nadia (no stock.validate) tries to confirm the back-office order | Refused with the stock message |
| 3 | Rachid confirms with an override and a reason | VALIDATED; available −4 shown in red on BO-33; journal OVERRIDE |
AT-21 — Payment declaration and verification
Requirements: FIN-03, FIN-04, D-26.
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa declares a BaridiMob payment of 50 000,00 DA with a screenshot and a reference | PENDING_VERIFICATION, PAY-…; available credit unchanged |
| 2 | Amel opens it on BO-45 | Proof opens through a link that stops working after 5 minutes |
| 3 | Amel confirms and allocates it to FAC-2026-000090 | Invoice Partiellement payée, balance 100 000,00 DA; reseller pushed; RA-29 shows the new available credit |
| 4 | A second declaration with the same reference | Duplicate-reference warning; Amel rejects with a reason; reseller pushed |
AT-22 — A reseller never sees another reseller's prices or data
Requirements: PRC-05, ACL-03, SEC-04.
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa shares the product link of N32; Bahia opens it | Bahia sees her own détail price (1 785,00 DA), not El Wafa's |
| 2 | With Bahia's token, request El Wafa's order, invoice PDF link and return | 404 NOT_FOUND for each |
| 3 | Tamper with an order id in the reseller web URL | « Introuvable » page |
AT-23 — A delegate never sees an out-of-zone reseller
Requirements: ACL-03.
| # | Step | Expected result |
|---|---|---|
| 1 | Yacine searches Alger Mobile Store by name and phone | No result |
| 2 | Direct API call for its record and orders; an assisted order for it | 404 |
| 3 | Nadia assigns it to Yacine, then removes the assignment | It appears after the next sync, then disappears and its local copy is purged |
AT-24 — Tour closing blocked until synced
| # | Step | Expected result |
|---|---|---|
| 1 | Offline, finish a visit; leave one stop without status | The closing preview lists « 1 élément non synchronisé » and the stop without reason; « Terminer la tournée » unavailable |
| 2 | Give the reason, reconnect | Sync completes; closing allowed |
| 3 | Call the closing API with a stop still planned | 409 TOUR_CLOSING_BLOCKED with the blocking items |
AT-25 — Tour reopened by the back-office
| # | Step | Expected result |
|---|---|---|
| 1 | Sofiane (no field.validate) opens the closed tour | No Réouvrir action; the API answers 403 |
| 2 | Nadia reopens it with a reason | Tour back in progress; previous final report kept as a version; Yacine pushed; journal entry |
| 3 | Yacine completes the missing item and closes again | COMPLETED; indicators recomputed |
AT-26 — Import with an error report
| # | Step | Expected result |
|---|---|---|
| 1 | Import a 50-row products file with 3 errors (missing brand, wrong EAN-13 checksum, negative price) and one warning (super-gros above détail) | Dry-run report: 47 valid, 3 errors with row numbers and messages, 1 warning |
| 2 | Download the error rows | A file with only the 3 rows and an error column |
| 3 | Apply | 47 products created or updated with their three prices and attributes; import.finished notification; journal IMPORT |
| 4 | Apply the same file again | 0 created, 47 unchanged (idempotent) |
| 5 | Import resellers with a duplicate phone and one without customer type | Both rows rejected with explicit reasons |
AT-27 — Export permission and traceability
Requirements: ANA-05, ACL-02, AUD-01.
| # | Step | Expected result |
|---|---|---|
| 1 | Sofiane on the resellers list | No export button; the API answers 403 |
| 2 | Nadia exports the filtered list to XLSX | Job queued then done; « Export prêt »; the file opens in French Excel with correct accents and amounts |
| 3 | Another user requests the download link | Refused |
| 4 | Journal | EXPORT with filters and row count |
| 5 | A seeded export older than 7 days | Expiré, file gone |
AT-28 — Forced app update
Requirements: ADM-07, AUTH-09.
| # | Step | Expected result |
|---|---|---|
| 1 | Lina sets the reseller app's latest version above the installed one | A dismissible update banner |
| 2 | She sets the minimum above the installed version | Forced-update screen RA-36 with the store link; API calls answer 426 UPGRADE_REQUIRED |
| 3 | Delegate app with offline actions pending, same change | Forced update shown; after updating, the pending actions are still there and sync |
| 4 | Maintenance mode on | Maintenance screen in both apps; the delegate keeps working offline |
AT-29 — Notification deep links
Requirements: NOT-01, NOT-02; matrix in notifications.
| # | Step | Expected result |
|---|---|---|
| 1 | App killed: tap the push « Commande confirmée » | The app opens on that order (RA-22) |
| 2 | App in background, then in foreground | Same order; in the foreground an in-app banner instead of a system notification |
| 3 | Tap from the inbox | Same destination; read state synced |
| 4 | Delegate: push « Tournée modifiée » | Opens the tour (DA-06) |
| 5 | Notification for another account on a shared phone | « Cette notification concerne un autre compte » and nothing else |
| 6 | Unknown route (older app version) | The inbox opens |
AT-30 — Live back-office (SSE)
| # | Step | Expected result |
|---|---|---|
| 1 | BO-41 open; a reseller checks out | New row within 5 seconds, highlighted |
| 2 | Another staff member confirms an order | The row leaves the queue on every open screen |
| 3 | A delegate checks in | BO-06 marker and BO-23 progress update |
| 4 | Disconnect the back-office computer for 30 seconds, then reconnect | Missed events replayed, no duplicate |
| 5 | Rachid's browser event stream | No order events he is not allowed to see |
AT-31 — Arabic and RTL readiness smoke test
Requirements: NFR-06; rules in i18n.
| # | Step | Expected result |
|---|---|---|
| 1 | Enable the prepared ar locale on pre-production builds (RA, DA, BO, RW) | Layout mirrored: navigation, back arrows and chevrons on the right side |
| 2 | Ten key screens (home, catalog with filters, product, cart, order tracking, delegate home, visit, back-office queue, order detail, settings) | No clipped or overlapping text; untranslated strings fall back to French, never raw keys |
| 3 | Order numbers, phones and prices inside Arabic text | Displayed left-to-right correctly, Latin digits |
| 4 | Play, check and brand icons | Not mirrored |
| 5 | API error with Accept-Language: ar | Arabic message |
AT-32 — Suspended and disabled accounts
Requirements: AUTH-02, AUTH-08, SEC-06.
| # | Step | Expected result |
|---|---|---|
| 1 | Lina suspends Yacine while he is signed in | His next call fails; the app shows « Compte suspendu » with the contact; SMS received |
| 2 | Yacine tries to sign in | Refused with the same explicit message |
| 3 | Back-office | His tours, visits and journal entries intact and attributed |
| 4 | Reactivate, then disable | Access restored, then impossible; history still intact; the back-office warns about his assigned resellers |
AT-33 — One-time codes, lockout, password reset
Requirements: AUTH-04, AUTH-07, SEC-02.
| # | Step | Expected result |
|---|---|---|
| 1 | Ask for a code twice within 60 seconds | Second request refused with the countdown |
| 2 | Sixth code within an hour | Refused (RATE_LIMITED) |
| 3 | Use a code after 5 minutes; then 5 wrong codes | Expired; then « Trop de tentatives » |
| 4 | 5 wrong passwords | 15-minute lockout with an explicit message |
| 5 | Reset the password by code | Other sessions signed out; SMS « mot de passe modifié »; the old password fails |
AT-34 — Idempotent checkout
| # | Step | Expected result |
|---|---|---|
| 1 | Double-tap « Valider la commande » | One order |
| 2 | Through a proxy, drop the checkout response; the app retries | Same order returned with Idempotent-Replayed: true; one order in the back-office |
| 3 | Script: same Idempotency-Key, different body | 409 IDEMPOTENCY_KEY_REUSED |
AT-35 — Cancellation rules and automatic restock
| # | Step | Expected result |
|---|---|---|
| 1 | Reseller cancels a SUBMITTED order with a reason | CANCELLED; staff notified; no stock movement (nothing reserved yet) |
| 2 | After confirmation (VALIDATED) | No cancel button for the reseller; the API answers 409 ORDER_TRANSITION_NOT_ALLOWED |
| 3 | Nadia cancels a confirmed order (reserved 10) with a reason | Reserved quantities return to available automatically (RESERVATION_RELEASE); reseller notified live and by push |
| 4 | Try to cancel a shipped order | Refused — only a return is possible (AT-46) |
AT-36 — Visit rules: mandatory photos, locked visit, unlock
| # | Step | Expected result |
|---|---|---|
| 1 | End a Prospection visit without photo or report | VISIT_REQUIREMENTS_NOT_MET listing what is missing |
| 2 | Edit a finished visit | Read-only (VISIT_LOCKED) |
| 3 | Nadia unlocks it with a reason | Editable for 24 hours; journal entry; locks again at the next end |
| 4 | Non réalisée without a reason | Not possible |
AT-37 — Performance smoke test
Requirements: NFR-01; thresholds in performance.
| # | Step | Expected result |
|---|---|---|
| 1 | Reference phone, 4G-DZ conditions: cold start to home, 5 runs | Median ≤ 3 s, no run above 4 s |
| 2 | Search and combined filters, 5 runs | p90 ≤ 3 s to the first results |
| 3 | Checkout, 5 runs | ≤ 2 s to the confirmation |
| 4 | Back-office queue and orders list with filters | Rendered in ≤ 2 s |
| 5 | Attach the load-test report of SRV-28 | p95 reads under 300 ms and writes under 800 ms at 50 concurrent users |
AT-38 — Guest browsing without prices
Requirements: AUTH-10, PRC-02; screen RA-41.
| # | Step | Expected result |
|---|---|---|
| 1 | Fresh install, skip sign-in (« Découvrir le catalogue »); same on the reseller web without signing in | Home, catalog, product pages and promotions open |
| 2 | Open HOCO N32 30W | No price anywhere; the lock « Créez un compte pour voir les prix » |
| 3 | Tap « Ajouter au panier » | Sign-up prompt; nothing added |
| 4 | Filters | No price-range filter for guests; other filters work |
| 5 | API catalog calls without a session | price: null, availability only |
| 6 | Sign up from the lock | After sign-up the prices follow D-18 |
AT-39 — Correct price per customer type
Requirements: PRC-01, PRC-02, AUTH-11.
| # | Step | Expected result |
|---|---|---|
| 1 | Alger Mobile Store (SUPER_GROS), El Wafa (DEMI_GROS), Bahia (DETAIL) open HOCO N32 30W | 1 547,00 · 1 666,00 · 1 785,00 DA TTC respectively |
| 2 | Each adds 10 to the cart | Line totals 15 470,00 · 16 660,00 · 17 850,00 DA TTC; HT and VAT consistent on the order and the invoice |
| 3 | Promotion -15 % on BX51 for Oran | Applied on top of each type's price (El Wafa 392,70 → 333,80 DA TTC) |
| 4 | Nadia changes Bahia's type to Demi-gros | Journal entry; Bahia notified « Vos tarifs ont changé »; her cart re-priced at the next read; submitted orders keep their prices |
| 5 | Bahia tries to change her type in her profile | Not editable — « Contactez HOCO » |
AT-40 — Advanced filters with facets
Requirements: CAT-12, CAT-13; catalog.facets.
| # | Step | Expected result |
|---|---|---|
| 1 | Category Câbles | Sub-categories, brands and attributes (connector, length, colour) with counts |
| 2 | Connector USB-C→USB-C + length 1 m + brand BOROFONE | BX51 only; counts of the other values updated |
| 3 | Add En promotion and a price range (signed in) | Results and counts consistent; the range uses the user's own prices |
| 4 | Compare facet counts with the number of results | Equal for every value tried |
| 5 | Back-office: Rachid adds the value 2 m to the length attribute and sets it on a variant (BO-71) | The new value appears in the filter with its count |
| 6 | Same filters on the reseller web sidebar | Same results |
AT-41 — Stock quantities never shown to resellers
Requirements: STK-07.
| # | Step | Expected result |
|---|---|---|
| 1 | Review the catalog, product, cart, order and promotion screens on the reseller app, the reseller web and the delegate app's assisted order, for a product with 8 units and one with 0 | Only « En stock » or « En rupture »; no number, no « Plus que … » |
| 2 | Order 12 of a product with 8 units | The refusal does not reveal the available quantity |
| 3 | Inspect the JSON responses of the reseller and delegate operations used above | No stock-quantity field |
| 4 | Back-office | Quantities, reserved and available visible to staff with stock.view |
AT-42 — Every order needs a back-office confirmation
| # | Step | Expected result |
|---|---|---|
| 1 | Create one order per channel: reseller app, reseller web, assisted order (confirmed by the reseller), back-office order on behalf | All four arrive in BO-41 as SUBMITTED (or PENDING when on hold), oldest first, with their control results |
| 2 | Wait, then look for any automatic progress | None leaves the queue without a user |
| 3 | Sofiane tries to move one to En préparation | Not allowed before confirmation |
| 4 | Nadia confirms each | VALIDATED, reservation made, the order enters the delivery board |
| 5 | Leave one unconfirmed past the reminder threshold | « Commandes en attente de confirmation » reminder to the confirmers |
AT-43 — Live order status on the reseller screen
| # | Step | Expected result |
|---|---|---|
| 1 | Reseller app open on RA-22; Nadia confirms the order | Status changes on screen within 5 seconds without pull-to-refresh |
| 2 | Same with the reseller web open on RW-09 and the orders list | Both update live |
| 3 | Every following status (preparation, ready, shipped, delivered) | Live on screen and a push and an inbox entry each time |
| 4 | Put the phone in airplane mode for a minute, change the status, restore | On reconnection the screen shows the current status |
| 5 | App in background during a change | Push received; on opening, the screen is current |
AT-44 — Regional WhatsApp number: signed in, location, picker
Requirements: SUP-05, ADM-08; support.whatsapp.
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa (wilaya 31) taps the WhatsApp button | WhatsApp opens on +213550000301 (Ouest) with the prefilled text including the store name and REV-000101 |
| 2 | Alger Mobile Store (wilaya 16) | +213550000302 (Centre) |
| 3 | Guest in Oran, location allowed | Ouest number; the position is not stored (check the server data and logs) |
| 4 | Guest with location refused | Wilaya picker; choosing Alger gives Centre; the choice is remembered |
| 5 | Picker dismissed | Default National number |
| 6 | Nadia moves wilaya 31 to another region on BO-70 | El Wafa's button uses the new number immediately |
| 7 | Out of hours | The sheet shows the hours; WhatsApp still opens |
AT-45 — After-sales claim: replacement, return, credit note, rejection
Requirements: SUP-04, FIN-08; rules in D-35.
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa opens an after-sales claim on a delivered order: 2 × N32 Produit défectueux, photos | Ticket AFTER_SALES TKT-… with the order lines and quantities; staff notified |
| 2 | Nadia diagnoses and resolves Remplacement | A free replacement order is created, enters the « Commandes à confirmer » queue and follows the normal flow; reseller notified with its number |
| 3 | Second claim, resolved Retour | A return RET-… is created and linked (AT-46) |
| 4 | Third claim, resolved Avoir | Credit note issued without physical return; finance view updated |
| 5 | Fourth claim outside the warranty, resolved Refusée with a reason | Ticket REJECTED; reseller notified with the reason |
| 6 | Claim more units than were delivered | Refused |
AT-46 — Return request: reception restocks automatically
Requirements: ORD-13, STK-03, FIN-08.
| # | Step | Expected result |
|---|---|---|
| 1 | El Wafa requests a return of 3 × BX51 from an order delivered 2 days ago (RA-40) | RET-… REQUESTED; in the returns queue BO-69 |
| 2 | On an order delivered beyond the return window | Refused with the window |
| 3 | Nadia approves | APPROVED, then En retour; reseller notified live |
| 4 | Rachid records the reception: 3 accepted | RECEIVED; physical stock +3 automatically (RETURN movement); no manual adjustment |
| 5 | Credit note | Issued for the accepted lines; invoice balance reduced; return REFUNDED; reseller notified |
| 6 | Reception with 1 unit damaged and not resaleable | Only the accepted units re-enter stock, per D-35 |
AT-47 — Backup restore drill
Requirements: NFR-02, SEC-05; restore runbook.
| # | Step | Expected result |
|---|---|---|
| 1 | Restore last night's pre-production backup into a scratch database | Completed, duration recorded |
| 2 | Integrity checks | Migration status clean; row counts and last business numbers match |
| 3 | Point a test API at it and run AT-03 steps 1–5 | Works |
| 4 | Compare the duration with the 4-hour objective | Within it |
Requirement coverage
| Area | Scenarios |
|---|---|
| Accounts, access, audit (AUTH, ACL, AUD) | AT-01, AT-14, AT-16, AT-22, AT-23, AT-27, AT-32, AT-33, AT-38, AT-39 |
| Catalog, pricing, stock (CAT, PRC, STK) | AT-02, AT-04, AT-20, AT-26, AT-35, AT-39, AT-40, AT-41, AT-46 |
| Orders, delivery, finance (ORD, DLV, FIN) | AT-03, AT-05, AT-12, AT-17, AT-18, AT-19, AT-21, AT-34, AT-35, AT-42, AT-43, AT-45, AT-46 |
| Promotions, loyalty (PRM, LOY) | AT-06, AT-07, AT-07a |
| Field, invitations (FLD, GEO, IVT, CRM) | AT-08 to AT-13, AT-24, AT-25, AT-36 |
| Support, notifications (SUP, NOT) | AT-05, AT-29, AT-44, AT-45 |
| Sync, real time (SYN) | AT-15, AT-24, AT-30, AT-43 |
| Administration (ADM) | AT-26, AT-28, AT-44 |
| Non-functional and security (NFR, SEC) | AT-31, AT-32, AT-33, AT-37, AT-47 |
Acceptance procedure
Environments and builds
| Campaign | Environment | Builds | Data |
|---|---|---|---|
| Functional campaign (QA-03) | Staging | Latest dev deployments; staging app builds from Firebase App Distribution | Recette seed |
| End-to-end tests (QA-01) | Staging | A frozen candidate of every app; real devices of the tier-1 list | Recette seed, reset before the run |
| Client acceptance (QA-02) | Pre-production | Release candidate vX.Y.Z-rc.N of the API, back-office and reseller web; app builds pointed at pre-production, distributed to HOCO's testers | Recette seed plus HOCO's real catalog from the import rehearsal (deployment) |
Who executes
| Role | People | Does |
|---|---|---|
| Recette lead (HOCO) | Named at the cadrage | Plans HOCO's sessions, decides severities with the coordinator, signs or refuses the PV |
| Testers (HOCO) | A commercial admin, the stock, finance and delivery managers, a support agent, two pilot delegates, two or three pilot resellers | Execute the scenarios of their role with the scripts of this page |
| Recette coordinator | Anis | Prepares the environment and accounts, runs the daily triage, assigns fixes, deploys new candidates |
| Fixers | Anis (server, back-office, web), Imad (apps) | Fix defects within the times below |
| Support | Akram | Assists testers, checks the design, records evidence |
Timing within the three-month frame
The three campaigns run back to back at the end of the build: the functional campaign as builds land, the end-to-end tests right after, then HOCO's acceptance, with the PV signed the working day before Production go-live. They fall over the last working days of December and the first of January:
| Task | Name | Owner | Phase | Dates | Effort | Depends on |
|---|---|---|---|---|---|---|
QA-03 | Functional test campaign — scripted scenarios on staging | Akram | P1 | Sun 20 Dec → Mon 21 Dec | 2 d | DQA-04, MOB-12, DQA-05 |
QA-01 | End-to-end integration testing on staging | Anis | P2 | Wed 23 Dec → Thu 24 Dec | 1.5 d | SRV-28, MOB-14, QA-03, WEB-05 |
QA-02 | Client acceptance (recette) on pre-production & PV | Anis | P2 | Thu 24 Dec → Mon 28 Dec | 2 d | QA-01 |
3 tasks · 5.5 d of open effort. Dates are computed — Sunday–Thursday weeks, holidays excluded.
- HOCO books its recette lead, testers and PV signatory at the cadrage, with a named back-up for each, because the period includes the year end.
- Testers receive their scenario list and accounts a week before; a 30-minute briefing opens the recette.
- Sessions run in parallel by role (field scenarios on site with the pilot delegates, back-office scenarios in HOCO's office, reseller scenarios on testers' phones), so the whole list fits in the planned days.
- One main round, a daily triage at the end of each day, fixes deployed as a new candidate overnight, re-tests of the failed steps the next morning. A Blocker found late in the recette moves go-live by the time of its fix — the levers to keep the date are in D-38.
Defect severities and fix times during the recette
| Severity | Definition | Examples | Fix time during the recette |
|---|---|---|---|
| Blocker | A priority scenario cannot be executed; data loss or corruption; a security breach (another user's data visible); crash at start | Checkout impossible; the delegate app loses offline visits; a reseller sees another reseller's invoice | Fixed and redeployed within 1 working day |
| Critical | A step of a priority scenario fails with no acceptable workaround; wrong amounts, stock or permissions | Wrong customer-type price; stock not reserved at confirmation; live status not updating | Within 2 working days |
| Major | A function fails with a workaround, or a complementary scenario fails | Export failing for one report; a filter count off by one | In the next candidate, at the latest before generalisation, per the PV reservations |
| Minor | Cosmetic, wording, alignment, minor UX | Truncated label, inconsistent icon | Backlog, scheduled with HOCO |
Anomalies bloquantes in the cahier's sense are Blockers and Criticals. During operations the same scale maps to the support priorities P1–P4 (support model).
Defect report
Each defect carries: id, title, scenario and step (AT-12 #4), environment and build numbers (API, back-office, web, app version), device, OS or browser, account used, steps to reproduce, expected and actual result, evidence (screenshot or video, requestId of the failing call), proposed severity, status (Nouveau, Confirmé, En correction, Corrigé dans le build …, Vérifié, Fermé, Rejeté, Reporté). HOCO's testers report in a shared recette sheet; the coordinator mirrors each confirmed defect as a GitHub issue labelled recette and sev:<level> in the right repository and links it back.
Entry criteria
- Milestone Staging integration complete reached; the functional campaign and the end-to-end tests executed with every priority scenario passed on staging.
- No open Blocker or Critical from those campaigns.
- The release candidate deployed to pre-production; recette seed and the rehearsed catalog import loaded; accounts delivered to every tester.
- App builds installed on the testers' phones; the known-issues list shared.
- Testers briefed; the recette sheet ready.
Exit criteria
- AT-01 to AT-15 executed and passed (AT-07a in place of AT-07 for V1).
- AT-16 to AT-47 executed; at least 90 % passed; every failure classified and none Blocker or Critical.
- No open Blocker or Critical.
- Every open Major has an agreed fix date, written as a reservation in the PV.
- Evidence archived for every scenario.
- The PV signed by HOCO's authorised representative.
PV de recette template
The acceptance report is a French document signed by both parties (OPS-05).
| Rubrique | Contenu |
|---|---|
| Projet | Écosystème B2B HOCO — version V1 |
| Références du cahier des charges | Version 1.0, juillet 2026; décisions du registre appliquées |
| Versions recettées | Tags de l'API, du back-office et du web revendeur; versions et numéros de build des applications revendeur et délégué |
| Environnement | Préproduction — URLs |
| Période de recette | Dates de début et de fin |
| Participants | HOCO : noms et fonctions; prestataire : noms et fonctions |
| Périmètre | Liste des scénarios AT-01 à AT-47 avec le résultat de chacun : Conforme, Conforme avec réserve, Non conforme, Non exécuté (motif) |
| Anomalies | Nombre par sévérité, ouvertes et fermées; liste des anomalies ouvertes avec leur identifiant |
| Réserves | Chaque réserve : description, sévérité, engagement de correction et date |
| Décision | Recette prononcée · Recette prononcée avec réserves · Recette refusée (motifs) |
| Conditions de mise en production | Ce qui doit être fait avant la mise en production (par exemple : import final, levée d'une réserve) |
| Signatures | Représentant autorisé de HOCO; représentant du prestataire — nom, fonction, date, signature |
| Annexes | Index des preuves, export des anomalies, jeu de données utilisé |
Smart notifications
HOCO's document 03 (Smart Notifications) treated as a change request: the 24 notification types, the Notification Centre, the action button, the Top 3 and the promotion tabs, each with its trigger, audience, channel, group, action and release, plus anti-fatigue rules, data and API impact and the French and Arabic copy.
End-to-end test plan
QA-01 on staging: the fifteen priority scenarios and the 17 October decision scenarios run on the seeded data, step by step per app with the API operations, the cross-app and returns / after-sales runs, the device matrix, the defect scale and daily triage, the hardening checks and the test-data reset.