MRA-08 — Reseller app — notifications & support
Notification inbox with deep links and badge, announcements, tickets and after-sales claims (order items, issue, photos), conversation, and the regional WhatsApp support button.
| Field | Details |
|---|---|
| Task code | MRA-08 |
| Phase | P1 — V1 build & integration |
| Product scope | V1 |
| Status | Planned |
| Start | Thu 19 Nov 2026 |
| Due | Sun 22 Nov 2026 |
| Responsible | Imad — Mobile developer (Flutter) |
| Co-responsible | — |
| Effort | 1.25 person-day(s) planned · 4 from scratch · size S |
| Area · app | Reseller app · mobile |
| Depends on | MOB-08, DES-10 |
| Unblocks | MRA-11 |
| Milestones | — |
Summary
Notification inbox with deep links and badge, announcements, tickets and after-sales claims (order items, issue, photos), conversation, and the regional WhatsApp support button.
Description
Resellers need one place for what HOCO tells them and one place to ask for help; the 17 Oct decisions add after-sales claims with photos in V1 (SUP-04) and a fixed WhatsApp button that opens the support number of the user's region (SUP-05). Scope: notification inbox RA-26 with announcements, deep links and badge; support hub RA-32 (tickets, contacts and FAQ, WhatsApp); new ticket or after-sales claim RA-33 (order, affected lines and quantities, AfterSalesIssue, photos); ticket conversation RA-34 with the claim's resolution; and the regional WhatsApp button used across the app. Region resolution follows decision 8: the declared wilaya's region when signed in, otherwise the device location, otherwise a wilaya picker or the default number — all resolved by support.whatsapp (auth optional). It needs notifications.*, announcements.*, tickets.*, support.contacts, support.whatsapp (SRV-24, SRV-20) and Akram's DES-10 frames. Returns are MRA-10; live ticket replies arrive through MRA-10's SSE client and MOB-08 push.
Subtasks
| # | Subtask | Owner |
|---|---|---|
| 1 | NotificationsScreen RA-26: GET /notifications (cursor, « Non lues » filter), tap → markRead + deep link, « Tout marquer comme lu » (POST /notifications/read-all), badge provider shared with the home bell | Imad |
| 2 | Announcements tab « Annonces » (GET /announcements, POST /announcements/{id}/read) with rich text and images | Imad |
| 3 | SupportHubScreen RA-32: my tickets (GET /tickets) with TicketStatus pills (« Ouverte », « En cours de traitement », « En attente de votre réponse », « Résolue »…), contacts and FAQ (GET /support/contacts), WhatsApp card | Imad |
| 4 | WhatsAppSupportButton (fixed FAB on home, catalog, product, order detail and support): GET /support/whatsapp → number, wa.me link and hours; prefilled message with store name, REV number and the current order or product; hours notice outside opening hours | Imad |
| 5 | Region resolution for guests and missing wilaya: ask location only on tap (coarse fix sent as lat/lng), on denial a wilaya picker (wilayaCode), else the default number; resolved region cached for the session | Imad |
| 6 | NewTicketScreen RA-33: TicketType picker (« Service après-vente (SAV) », « Problème de commande », « Problème de livraison », « Facturation », « Question », « Autre »), subject, message, related order, attachments → POST /tickets with an Idempotency-Key | Imad |
| 7 | After-sales claim flow (type AFTER_SALES): pick a delivered order, select affected lines with quantity steppers capped at the delivered quantity, issue per line (« Produit défectueux », « Produit endommagé », « Mauvais article », « Article manquant », « Non conforme », « Autre »), description, photos via MOB-11 (TICKET_ATTACHMENT) | Imad |
| 8 | TicketConversationScreen RA-34: GET /tickets/{id} public messages, reply with attachments (POST /tickets/{id}/messages), close with rating (POST /tickets/{id}/close) | Imad |
| 9 | Claim resolution card: AfterSalesResolution « Remplacement » (link to the free replacement order), « Retour » (link to the return RET-…), « Avoir » (credit note PDF), « Réparation », « Refusée » with the reason | Imad |
| 10 | Entry points: « Signaler un problème » on RA-22 opens RA-33 prefilled with the order; claim photo requirements per issue confirmed with Anis | Imad |
Deliverables
- apps/reseller/lib/src/features/notifications/ (inbox, announcements)
- apps/reseller/lib/src/features/support/ (hub, new ticket, after-sales claim, conversation)
- packages/hoco_catalog/lib/src/widgets/whatsapp_support_button.dart (shared with any future reseller surface)
- Widget tests for the claim line selector and the region-resolution fallbacks
Acceptance criteria
- Unread badge, inbox and « Tout marquer comme lu » stay consistent across the bell and the inbox (NOT-01)
- A signed-in reseller from Oran gets the West region's number; a guest who grants location gets the number of the nearest wilaya's region; a guest who refuses picks a wilaya; with nothing, the default number opens (SUP-05)
- The WhatsApp button opens WhatsApp (or wa.me in the browser) with a prefilled message, from every screen where it is shown
- An after-sales claim cannot be sent without at least one line and quantity within the delivered quantity, and it reaches the back-office with lines, issues and photos (SUP-04)
- The claim's resolution is shown with a link to the replacement order, the return or the credit note
- A retried ticket creation does not create two tickets (Idempotency-Key)
Requirements covered
| Requirement | Title | Release |
|---|---|---|
| NOT-01 | In-app notification inbox with read/unread in every app | V1 |
| NOT-07 | Announcements from the back-office to delegates or resellers by target ('Messages') | V1 |
| SUP-01 | Reseller tickets: type, related order, message, attachments, conversation, statuses | V1 |
| SUP-03 | Support contacts and FAQ | V1 |
| SUP-04 | After-sales service (SAV): a reseller opens a claim on an order (items, quantities, issue, photos); the back-office handles it from diagnosis to resolution (replacement, return, credit note, rejection) | V1 |
| SUP-05 | Regional WhatsApp support: a fixed WhatsApp button in both reseller apps opens the support number of the user's region — declared region when signed in, device location otherwise | V1 |
Screens
| Screen | Name | App |
|---|---|---|
| RA-26 | Notifications | RA |
| RA-32 | Support: tickets, after-sales claims & WhatsApp | RA |
| RA-33 | New ticket / after-sales claim | RA |
| RA-34 | Ticket conversation | RA |
API surface
| Endpoint group | Operations |
|---|---|
| Notifications & announcements | 10 |
| Support tickets | 7 |
Test measures
- Unit tests of the WhatsApp region resolution order (signed-in, location, picker, default)
- Widget tests of the after-sales line selector (caps, required issue, photo requirement)
- Integration test: order detail → « Signaler un problème » → claim with 2 photos → ticket visible in RA-32
Risks
- Asking guests for location just to route WhatsApp feels intrusive — request it only on tap and always offer the wilaya picker
- Photo-heavy claims on weak networks — compress via MOB-11 and show per-photo upload progress before enabling « Envoyer »
KPI
- Delivered by Sun 22 Nov 2026 within 1.25 person-day(s).
- Every acceptance criterion above demonstrated before hand-off; linked requirements' acceptance criteria pass.
- Zero open critical defects, permission gaps or data-integrity regressions at sign-off.
Generated from content/plan/tasks.json by scripts/generate-team-tasks.mjs. Dates are computed by the scheduler (Sunday–Thursday weeks, holidays excluded) — change the plan, not this page.
MRA-07 — Reseller app — account, store, finance & settings
Account hub, store profile and documents, balance and credit, invoices, payments and payment declaration with proof, settings.
MRA-09 — Reseller app — invitation attribution
App links for /i/{code}, Play install-referrer read on first open, code prefill at sign-up, catalog-viewed signal.