HOCO B2B
DesignScreen specificationsDelegate app

Profile and system

Messages and notifications, account hub, zone, settings, sync centre and system states of the delegate app (DA-23 to DA-28).

These screens hold the délégué's account and the app's own health: the inbox and the supervisor's messages, the profile and zone, the settings with the location transparency page, the sync centre that makes the offline queue visible (cahier §7.3 « L'utilisateur voit l'état : synchronisé, en attente ou en erreur »), and the system states that can interrupt any screen.

DA-23 — Messages & notifications

FieldValue
French title« Messages »
ReleaseV1
Design dayDay 14 — DES-14
Build taskMDA-11 — messages, settings & sync centre
RequirementsNOT-01 · NOT-07
Reference screenNone — the bell and the Messages tile of delegate-02-home are its entry points

Purpose. One inbox for the notifications the delegate receives (tours, follow-ups, invitations, orders, account validations) and the announcements sent by the back-office (Messages) (cahier §6 « Voir les objectifs du jour et les notifications », §6.1 « Accéder aux prospects, rapports et messages »; NOT-01, NOT-07).

Entry points & exits. Entry: bell of every tab root, quick access Messages on DA-05, Notifications on DA-24, push announcement.published (/messages/:announcementId). Exits: the target route of each notification (deep links), announcement detail.

Layout.

  1. App bar « Messages », overflow « Tout marquer comme lu ».
  2. Tabs Notifications (3) · Messages (1).
  3. Notification rows: category icon, title, body (2 lines), relative time, unread dot; grouped Aujourd'hui, Hier, Plus ancien.
  4. Message rows: sender (« Direction commerciale »), title, excerpt, date, unread dot; detail page with the full text, attachments and « J'ai lu ».

Data.

FieldAPI sourceOffline sourceFreshness
Notificationsnotifications.list (cursor, unread filter) → items[] (title, body, category, route, readAt, createdAt)notifications (last 100)On open; live through events.stream notification.created while the app is open; push otherwise
Unread badgenotifications.unreadCountLocal countOn open, on push
Announcementsannouncements.list → title, body, attachments, publishedAt, readAtannouncementsOn open + push

Actions. Tap a notification → mark read and open its route; notifications.markRead queued (idempotent by nature, sent with an Idempotency-Key). Tout marquer comme lu → notifications.markAllRead. Open a message → « J'ai lu » → announcements.markRead queued.

Rules. Only the delegate's own notifications and the announcements targeted to them. A notification whose target is gone or out of scope opens Home with « Élément introuvable ou retiré de votre périmètre ». Transactional and security notifications cannot be disabled (DA-26).

States. Empty (« Aucune notification » / « Aucun message ») · offline (cached, marking read queued) · loading (skeleton rows).

Copy. « Messages » · « Notifications » · « Tout marquer comme lu » · « J'ai lu » · « Aujourd'hui » · « Hier » · « Aucune notification ».

Acceptance criteria.

  1. A message sent from the back-office (BO-57) reaches the delegate as a push and appears under Messages; « J'ai lu » is visible in the back-office.
  2. Tapping a tour.updated notification opens the updated tour.
  3. The bell badge equals the number of unread notifications and messages, offline included.

DA-24 — Profile hub

FieldValue
French title« Compte »
ReleaseV1
Design dayDay 11 — DES-11
Build taskMDA-01 — home, profile, zone, objectives
RequirementsFLD-01
Reference screendelegate-01-login-profile — shown below
Client reference — the lower half (Aperçu du profil and the menu) is DA-24
Client reference — the lower half (Aperçu du profil and the menu) is DA-24 — client reference (cahier des charges)

Purpose. Show who the delegate is and what they cover — status, zone, wilayas, today's objective, unread notifications — and give access to their information, zone, objectives, notifications, settings, the sync centre and sign-out (cahier §6, FLD-01).

Entry points & exits. Entry: Compte tab. Exits: Mes informations (sub-page), DA-25, DA-22, DA-23, DA-27, DA-26, DA-02 after sign-out.

Layout.

  1. Aperçu du profil card — avatar, name, « Délégué commercial », AccountStatus pill (« Actif »), then rows Zone attribuée (Oran), Wilayas couvertes (Oran, Aïn Témouchent, Mascara), Objectifs du jour (« 12 visites prévues »), Notifications (« 3 non lues »).
  2. Menu (56 dp rows with chevrons) — Mes informations · Ma zone · Mes objectifs · Notifications (badge) · Synchronisation (state: « À jour », « 3 en attente », red « 1 erreur ») · Paramètres · Aide (« Appeler mon responsable », support contacts).
  3. Se déconnecter (destructive text button), version line.
  4. Mes informations (sub-page) — name, phone, email, delegate code (DLG-007), supervisor with a call button, « Depuis le 12 oct. 2026 »; « Modifier la photo » (me.update avatarFileId); « Changer le mot de passe » (auth.password.change); « Appareils connectés » (auth.sessions.list, revoke with auth.sessions.revoke).

Data.

FieldAPI sourceOffline sourceFreshness
Identity, status, codeme.get → displayName, avatar, status, delegate.code; delegate.profile → title, phone, email, supervisor, sinceprofileAt sign-in, daily, on open when online
Zone and wilayasdelegate.profile → zones[] (name, isPrimary), wilayas[]profileSame
Today's objectivedelegate.profile → objectivesToday[]objectivesOn open
UnreadunreadNotificationsLocal countLive
Sync state—outbox, upload_queue, location_pings, sync_stateLive-local

Actions.

  • Se déconnecter → if the outbox, upload queue or ping queue is not empty: dialog « 5 éléments ne sont pas encore synchronisés. Synchronisez avant de vous déconnecter. » with « Synchroniser » and a destructive « Se déconnecter et supprimer ces données » (second confirmation typing SUPPRIMER). Otherwise « Se déconnecter ? » → auth.logout (revokes the session and the push token) when online; the local database, photos and secure storage are wiped; sampling stops; → DA-02 with the phone prefilled.
  • Password change: current + new + confirmation; other sessions revoked by the server; snackbar « Mot de passe modifié ».

Rules. The delegate cannot change their zone, code or status (back-office BO-18). Sign-out while a tour is IN_PROGRESS warns « Votre tournée est en cours : la localisation sera arrêtée. »

States. Offline (cached profile; password change and sessions unavailable) · avatar upload failing (retry).

Copy. « Aperçu du profil » · « Délégué commercial » · « Zone attribuée » · « Wilayas couvertes » · « Objectifs du jour » · « Mes informations » · « Ma zone » · « Mes objectifs » · « Synchronisation » · « Paramètres » · « Aide » · « Se déconnecter » · « Changer le mot de passe » · « Appareils connectés ».

Acceptance criteria.

  1. The card shows the zone and wilayas configured in the back-office for the delegate.
  2. Sign-out with pending items is refused unless the destructive path is confirmed; nothing is lost silently.
  3. After sign-out, no data of the delegate remains readable on the phone.

DA-25 — My zone

FieldValue
French title« Ma zone »
ReleaseV1
Design dayDay 11 — DES-11
Build taskMDA-01 — home, profile, zone, objectives
RequirementsGEO-02 · FLD-01
Reference screenNone — the Zone attribuée rows of delegate-01-login-profile are its entry

Purpose. Show the zones, wilayas and communes the delegate covers, with the number of points of sale, prospects and active resellers per commune, to organise trips (cahier §6 « Consulter le profil et la zone attribuée »; GEO-02, FLD-01).

Entry points & exits. Entry: Ma zone on DA-24. Exit: DA-13 filtered by the chosen commune.

Layout. Map fitted to the zone bounds with commune markers sized by count; below, per zone (primary first) and wilaya, the communes with Total · Prospects · Revendeurs · Actifs · Non assignés.

Data.

FieldAPI sourceOffline sourceFreshness
Zones, wilayas, communes, countsdelegate.zone → zones[] (name, isPrimary, bounds, center, totals, wilayas[].communes[] with center and counts)Last response cached in profileOn open; offline « Mis à jour à … »

Actions. Tap a commune → DA-13 with the commune filter. Read-only.

Rules. Counts cover only the delegate's scope. Zone geometry is a viewport hint, not a boundary drawn to the metre.

States. Offline (cached) · loading (skeleton) · no zone assigned (« Aucune zone ne vous est attribuée. Contactez votre responsable. »).

Copy. « Ma zone » · « Prospects » · « Revendeurs » · « Actifs » · « Non assignés ».

Acceptance criteria.

  1. The communes listed equal the zone configured on BO-19.
  2. Tapping a commune opens the prospects list filtered on it with the same count.

DA-26 — Settings

FieldValue
French title« Paramètres »
ReleaseV1
Design dayDay 11 — DES-11
Build taskMDA-11 — messages, settings & sync centre
RequirementsNOT-06 · FLD-15
Reference screenNone — the Paramètres row of delegate-01-login-profile is its entry

Purpose. Let the delegate set what they are allowed to set — language, notification preferences, photo upload on mobile data — and see, transparently, what the app records about their location (cahier §6 « Gérer les paramètres autorisés », §10; NOT-06, FLD-15).

Entry points & exits. Entry: Paramètres on DA-24; the location chip's explanation sheet; DA-28 states. Exits: DA-04 (« Revoir le consentement »), Android settings.

Layout.

  1. Langue — Français; العربية and English listed as « Bientôt disponible » until settings.i18n.enabledLocales enables them.
  2. Notifications — one switch per category: Commandes et compte and Sécurité (locked on), Activité terrain, Annonces; Android notification permission state with « Ouvrir les réglages ».
  3. Localisation et transparence — status (« Autorisée — position exacte »), consent date and version, what is recorded, when, how often (« toutes les 5 min ou tous les 200 m pendant une tournée en cours »), retention (« 90 jours »), who sees it; « Politique de confidentialité »; « Revoir le consentement »; « Retirer mon consentement » (destructive).
  4. Photos — « Envoyer les photos uniquement en Wi-Fi » (off by default; a warning explains it can delay the closing).
  5. Stockage — space used by photos and data; « Libérer de l'espace » (deletes only synced photo files older than 7 days).
  6. À propos — version, « Rechercher une mise à jour », device id (for support).

Data.

FieldAPI sourceOffline sourceFreshness
LocalesappConfig.get → settings.i18n.enabledLocales; me.update localeapp_config, profileReference
Notification preferencesnotifications.preferences.get / notifications.preferences.updateLast values in profileOnline to change
Location valuesappConfig.get → settings.field.locationIntervalSeconds, .locationDistanceMeters, .locationRetentionDays; me.get → consents.locationTrackingVersion, .locationTrackingAcceptedAtapp_config, profileReference
Permission statesAndroid—On resume

Actions. Language → me.update locale and immediate UI switch. Preference switch → notifications.preferences.update (online; offline the switch is disabled with « Connexion requise »). Retirer mon consentement → confirmation « La localisation sera arrêtée et vous ne pourrez plus démarrer de tournée ni enregistrer vos arrivées. » → me.update consents.locationTracking.accepted = false queued; sampling stops immediately.

Rules. Transactional and security notifications cannot be disabled. Transparency values come from the settings, never hard-coded. Withdrawing consent while a tour is IN_PROGRESS stops sampling but does not suspend the tour.

States. Offline (preferences read-only) · permission denied (status line in danger tone with « Ouvrir les réglages »).

Copy. « Paramètres » · « Langue » · « Notifications » · « Localisation et transparence » · « Revoir le consentement » · « Retirer mon consentement » · « Envoyer les photos uniquement en Wi-Fi » · « Libérer de l'espace » · « Rechercher une mise à jour ».

Acceptance criteria.

  1. The transparency page shows the sampling frequency, distance and retention configured in the back-office.
  2. Withdrawing consent stops location pings within one interval and disables « Commencer la tournée ».
  3. The Commandes et compte and Sécurité switches cannot be turned off.

DA-27 — Sync centre

FieldValue
French title« Synchronisation »
ReleaseV1
Design dayDay 14 — DES-14
Build taskMDA-11 — messages, settings & sync centre
RequirementsSYN-05 · SYN-06
Reference screenNone — specified from cahier §7.3 (synchronisé, en attente, en erreur)

Purpose. Make the offline queue visible and controllable: what is waiting, what failed and why, what the delegate must do, and how fresh the data on the phone is — so nothing recorded in the field is lost or silently duplicated (cahier §7.3, SYN-05, SYN-06).

Entry points & exits. Entry: the global sync indicator of every tab root, Synchronisation on DA-24, error badges, the blocking items of DA-20, the 48-hour local notification (/sync). Exits: the record behind an item (DA-10, DA-09, DA-15…), back.

Layout (top to bottom).

  1. App bar — « Synchronisation ».
  2. Status header — large icon and one of: « Tout est synchronisé » (success) · « 3 éléments en attente » (info) · « 1 erreur à traiter » (danger) · « Hors ligne depuis 10:12 — 5 éléments en attente » (neutral) · « Synchronisation en cours… 12 / 20 » (progress). Sub-lines « Envoi : il y a 2 min » and « Réception : il y a 5 min ».
  3. Age warning (when the oldest pending item is 48 h old) — « Des données attendent depuis 2 jours. Elles seront refusées après 72 h : connectez-vous dès que possible. »
  4. Primary button « Synchroniser maintenant » (disabled offline, with « Connexion requise »).
  5. À traiter (errors, red section) — one card per item in error: icon, label, subject, time of the action, the server message, what to do, and the actions of the table below.
  6. En attente — ordered list (oldest first): type icon, label (table below), subject (store name), action time, state (« En attente », « Envoi… », « Nouvel essai à 10:45 », « Bloqué par : Nouveau revendeur — Magasin X »), attempts.
  7. Photos — per file: thumbnail, size (« 1,2 Mo »), progress bar, state; « 12 photos · 18,4 Mo ».
  8. Positions — « 14 positions en attente » (one line, no detail).
  9. Données reçues — freshness per scope: Tournée du jour (07:42), Points de vente (07:40), Relances (07:40), Listes de référence (hier), Catalogue (hier); « Tout recharger » (only when nothing is pending).
  10. Diagnostic — app version, device id, last cursor time, clock offset (« Horloge du téléphone : +3 s »); « Envoyer un diagnostic » (logs and queue metadata — never the content of reports or photos — to Sentry with a reference given to support).

Item labels.

OperationLabelSubject
delegate.tours.start · suspend · resumeDémarrage · Suspension · Reprise de tournéeTour number
delegate.tours.reorder · delegate.tours.addVisitNouvel ordre des visites · Visite ajoutéeTour / store
delegate.tours.closeClôture de tournéeTour
delegate.visits.arrive · start · endArrivée · Début de visite · Fin de visiteStore
delegate.visits.checklist · note · reportChecklist · Note rapide · Rapport de visiteStore
delegate.visits.addPhotoPhoto de visiteStore
delegate.visits.notDoneVisite non réaliséeStore
delegate.resellers.create · delegate.resellers.updateNouveau revendeur · Modification de ficheStore
delegate.resellers.addNote · delegate.resellers.addPhotoNote · Photo du magasinStore
delegate.invitations.markSharedPartage d'invitationStore
delegate.tasks.update · delegate.tasks.completeRelance reprogrammée · Relance terminéeStore
me.update (consent)Consentement localisation—
notifications.markRead, announcements.markReadNot listed (silent)—

Data.

FieldAPI sourceOffline sourceFreshness
Pending and failed itemsPer-item results of sync.batch (SyncItemResult, HTTP status, error envelope)outbox (op, entity, occurredAt, status, attempts, nextAttemptAt, lastErrorCode, lastErrorMessage, dependencies)Live-local
Photosfiles.createUpload, files.completeUploadupload_queue (local path, size, progress, state)Live-local
Positionssync.locationPingslocation_pings (count only)Live-local
Received datasync.delta cursors per scope; delegate.tours.today snapshot timesync_stateLive-local
Clock offsetappConfig.get → serverTimesync_stateEach call
ValueUI label (fr)Meaning
APPLIEDSynchronisé
REPLAYEDDéjà synchroniséSame Idempotency-Key seen before; original result returned.
CONFLICTConflitState changed on the server; the client must show it in the sync centre.
REJECTEDRejetéValidation or permission error; never retried automatically.
RETRYÀ réessayerTransient server error; retried with backoff.

Actions.

  • Synchroniser maintenant → uploads first, then sync.batch in batches of 50 (new batch Idempotency-Key per request, items keep theirs), then sync.locationPings, then sync.delta for every scope; progress in the header.
  • Réessayer maintenant (item waiting for a retry) → resends with the same key.
  • Corriger (rejected item that the delegate can fix: duplicate phone, invalid field) → opens the record (DA-15 for a reseller, DA-12 for a report); saving rebuilds the item with the corrected body and a new key; dependants are released after it is applied.
  • Réessayer (rejected item whose cause was external, e.g. scope restored by the back-office) → new key, same body.
  • Garder la version du serveur (conflict) → drops the local item, reloads the record from the server, and drops dependants that no longer make sense (with a summary of what was discarded).
  • Réappliquer ma modification (conflict on an editable record: reseller fields, checklist, note, report before lock) → new item on the current server version, new key.
  • Abandonner (any error) → destructive confirmation « Cette action sera définitivement perdue. »; the local change is reverted to the server state.
  • Contacter mon responsable (errors only the back-office can settle: OCCURRED_AT_OUT_OF_RANGE, check-in refused after replay, tour cancelled) → call the supervisor; the item stays until resolved or abandoned.
  • Libérer / Tout recharger / Envoyer un diagnostic as described in the layout.

Rules.

  • Automatic sync triggers: network regained, app foreground, 2 s after any recorded action, every 5 min in the foreground while online, every 15 min in the background (WorkManager) while a tour is IN_PROGRESS or items are pending, and on push data messages.
  • Order and dependencies as on the overview; an item never jumps ahead of an earlier item of the same record.
  • Results: APPLIED and REPLAYED remove the item (a replay proves the server already had it — never a duplicate); RETRY backs off 5 s, 10 s, 20 s… up to 10 min (±20 % jitter); REJECTED is never retried automatically; CONFLICT waits for a decision.
  • What the delegate sees for each conflict family:
SituationServer answerShown asChoices
Duplicate phone on a new prospect409 PHONE_ALREADY_EXISTS« Doublon : ce numéro existe déjà (Magasin El Wafa, REV-000123) »Corriger le numéro · Ouvrir la fiche existante · Abandonner
Record edited elsewhere409 VERSION_CONFLICT« Fiche modifiée entre-temps » with both values side by sideGarder la version du serveur · Réappliquer ma modification
Visit locked or cancelled meanwhile409 VISIT_LOCKED« Visite terminée ou annulée : modification refusée »Garder la version du serveur · Contacter mon responsable
Tour cancelled, reassigned or not startable409 TOUR_TRANSITION_NOT_ALLOWED, 403 NOT_ASSIGNED_DELEGATE« Tournée annulée ou réaffectée »; its visit items blockedContacter mon responsable · Abandonner
Check-in refused at replay422 GPS_OUT_OF_TOLERANCE / GPS_ACCURACY_TOO_LOW« Arrivée refusée par le serveur (420 m) »; the visit's other items blockedContacter mon responsable
Reorder on a changed tour409 VERSION_CONFLICT« L'ordre a été modifié par votre responsable »Automatic: server order kept, item dropped
Store reassigned403 OUT_OF_SCOPE« Point de vente retiré de votre périmètre »Abandonner
Action too old422 OCCURRED_AT_OUT_OF_RANGE« Action enregistrée il y a plus de 72 h »Contacter mon responsable · Abandonner
Same key, different body409 IDEMPOTENCY_KEY_REUSEDNever shown: logged to Sentry; the item is rebuilt with a new key—
  • The detailed protocol (batch format, cursors, conflict codes) is owned by the sync API and offline sync; this screen only displays it.
  • Nothing is deleted from the phone without either a server acknowledgement or an explicit Abandonner by the delegate.

States.

StateUI
All syncedSuccess header, empty lists collapsed, freshness section
Pending, onlineInfo header, items progressing
OfflineNeutral header with the offline time; « Synchroniser maintenant » disabled
ErrorsDanger header; errors first; the Compte tab shows a red dot
Maintenance / forced update« Synchronisation en pause : maintenance jusqu'à 14:00 » / « Mettez l'application à jour pour envoyer vos données » (the queue survives the update)
Session expired« Reconnectez-vous pour envoyer vos données » → DA-02, queue kept

Copy. « Synchronisation » · « Tout est synchronisé » · « éléments en attente » · « erreur à traiter » · « Hors ligne depuis » · « Synchroniser maintenant » · « À traiter » · « En attente » · « Nouvel essai à » · « Bloqué par » · « Corriger » · « Réessayer » · « Garder la version du serveur » · « Réappliquer ma modification » · « Abandonner » · « Contacter mon responsable » · « Données reçues » · « Envoyer un diagnostic ».

Acceptance criteria.

  1. In airplane mode, a check-in, a photo and a note show three items « En attente » plus one photo; the global indicator shows « 3 en attente ».
  2. When the network returns, the items are sent in order without any action, disappear one by one, and the server holds exactly one record per action; replaying the same batch returns REPLAYED for every item (cahier §12 Hors ligne).
  3. A prospect with a duplicate phone appears under À traiter with Corriger; its photo item shows « Bloqué par » until the correction is applied.
  4. An item pending for 48 h triggers the warning banner and a local notification.
  5. « Synchroniser maintenant » is disabled offline and explains why.
  6. Abandonner asks for confirmation and restores the server state of the record.

DA-28 — System states

FieldValue
French title« États système »
ReleaseV1
Design dayDay 14 — DES-14
Build taskMOB-10 — Location, maps & consent foundation
RequirementsSYN-06 · FLD-07 · ADM-07
Reference screenNone — catalogue of overlays and banners shared by every screen

Purpose. Define once how the app behaves when the network, the GPS, a permission, the version policy, the session, the clock or the storage gets in the way — so every screen reacts the same way and the delegate always knows what to do (SYN-06, FLD-07, ADM-07).

Entry points & exits. Raised by any screen or by the background services; each state names its exit below.

StateTriggerUICopyExit
OfflineNo network or every call timing out (10 s)Banner under the app bar, neutral tone, never blocking« Hors ligne — vos actions sont enregistrées et seront envoyées automatiquement. »Disappears when a call succeeds
Weak networkCalls slower than 5 s three times in a rowSame banner, info tone« Réseau faible — envoi en arrière-plan. »Normal calls
GPS offLocation services disabledCard on the screen needing a position; chip in danger tone during a tour« Localisation désactivée. Activez-la pour enregistrer vos arrivées. » · « Activer » (system dialog)Services on
Permission deniedLocation permission denied or approximate onlyCard with explanation« Autorisez la position exacte pour valider vos arrivées. » · « Ouvrir les réglages »Permission granted
Accuracy too lowBest fix above field.gpsMaxAccuracyMeters after 30 sInline progress then dialog« Position trop imprécise (± 180 m). Placez-vous à découvert et réessayez. »Better fix, or the out-of-tolerance path when allowed
Out of toleranceDistance above field.gpsToleranceMetersDialog of DA-10« Vous êtes à 420 m du point de vente (tolérance 150 m). »Retry, justification (when allowed), not done
Mock locationFix flagged mockBlocking dialog« Position simulée détectée : désactivez l'application de localisation fictive. »Real fix
Forced updateVersion below minVersion or 426 UPGRADE_REQUIREDFull-screen, blocking« Mise à jour obligatoire — vos données en attente seront envoyées après la mise à jour. » · « Mettre à jour » (storeUrl)Updated app
Update availableupdateAvailableDismissible sheet once per version« Une nouvelle version est disponible »Dismiss or update
Maintenancemaintenance.enabled or 503 MAINTENANCEBanner; sync paused; app usable offline« Maintenance en cours jusqu'à 14:00. Vous pouvez continuer hors ligne. »until reached
Session expired401 UNAUTHENTICATEDSheet over the current screen« Votre session a expiré. Reconnectez-vous : vos données en attente sont conservées. »DA-02, same delegate resumes the queue
Account suspended403 ACCOUNT_SUSPENDEDFull-screen, blocking; local data kept but locked« Votre compte est suspendu. Contactez votre responsable. »Reactivation, then sign-in
Temporary password403 PASSWORD_CHANGE_REQUIREDChange-password sheet« Choisissez un nouveau mot de passe pour continuer. »Password changed
Wrong clockOffset to serverTime above 5 minBanner, warning tone« L'heure du téléphone semble incorrecte (écart de 12 min). Activez l'heure automatique. » · « Ouvrir les réglages »Offset under 5 min; actions keep the corrected time meanwhile
Old pending dataOldest outbox item 48 h oldBanner + local notification« Synchronisez vos données : elles seront refusées après 72 h. »Queue sent
Storage fullFree space under 200 MB or a write failureBanner; camera disabled« Espace de stockage insuffisant. Libérez de la place pour continuer à prendre des photos. »Space freed
Battery saver killing the samplerForeground service stopped by the system during IN_PROGRESSBanner when the app resumes« La localisation a été interrompue par le téléphone. Autorisez HOCO Délégué à fonctionner en arrière-plan. » · « Voir comment »Exemption set (DA-04 step 4)
Start-up errorDatabase cannot be openedFull-screen« Impossible d'ouvrir les données de l'application. » · « Réessayer » · « Envoyer un rapport »Retry succeeds or support
Generic error500 INTERNAL_ERROR on an online-only callSnackbar with retry« Une erreur est survenue. Réessayez. » (+ requestId in the diagnostic)Retry
Empty statesNo data for a listIllustration, one sentence, one actionPer screenAction

Rules.

  • Offline is a normal state, not an error: no red, no blocking dialog; only actions that truly need the network are disabled, each with its reason.
  • Blocking full-screen states are limited to forced update, suspended account and start-up error.
  • Banners stack in order of severity and never hide the primary action of the screen.
  • Every state is reachable in the widget gallery of MOB-04 for design QA (DQA-03).

Acceptance criteria.

  1. Turning the network off on any screen shows the offline banner within 10 s and every offline-capable action keeps working.
  2. With minVersion above the installed version the forced-update screen blocks the app, and the queued items are sent after updating.
  3. With the phone clock set 15 min ahead, the wrong-clock banner appears and queued actions are not refused by the server.
  4. A sampler stopped by the system during a tour is reported to the delegate on the next resume.
  5. Every state above has a French message that tells the delegate what to do.

On this page