HOCO B2B
Mobile (Flutter)

Build and release

Versions, release trains aligned with the plan, the Play Console setup, tracks and staged rollouts, store assets, data-safety answers and declarations, signing, forced updates, the pilot hotfix procedure and the post-pilot iOS path.

Both apps ship to Android through Google Play; iOS comes after the pilot if HOCO decides it. This page covers store readiness (MOB-14), the go-live (LCH-01), the pilot (LCH-03B), the public release at generalisation (LCH-05) and iOS (MOB-16). Shared release rules (environments, deployment order, feature flags) are in environments and releases.

Versions

ItemRule
Version lineOne semantic version for both apps, tagged vX.Y.Z on master of hoco-mobile (git workflow); an app that did not change is not uploaded
versionNameFrom the tag (1.0.0); -dev / -stg suffixes come from the flavor
versionCodeThe CI run number (--build-number=${{ github.run_number }}) — always increasing, never typed by hand
X-App-VersionversionName without suffix, compared by the server with AppVersionPolicy
MAJORA change that needs a new minimum API or breaks local data compatibility (rare)
MINORFeatures — including V2 features, which are product scope, not breaking changes
PATCHFixes and hotfixes

Each release PR (release/x.y.z → master) bumps version: in both apps' pubspec.yaml, updates CHANGELOG.md (user-facing French release notes for the store, technical notes for the team) and records the pinned contract version.

Release trains

Aligned with the plan's milestones (dates on the timeline):

Plan momentBuildFlavor and environmentDistribution
Foundations and feature build (P0–P1)Every push to devstaging → staging APIFirebase App Distribution, group team (Imad, Anis, Akram); weekly Thursday build after the internal demo with release notes for HOCO's testers group
Mobile apps V1 feature-complete → Staging integration completeRelease candidates 1.0.0 from release/1.0.0staging; field test builds for MOB-13App Distribution groups team, field-test
Store readiness (MOB-14)First prod AABprod → production API (not yet open)Play internal testing track: proves signing, listing and review
Client acceptance (QA-02)Same commit as the candidate, built twicestaging flavor with env/preprod.json → pre-productionApp Distribution group hoco-acceptance
Production go-live (LCH-01)v1.0.0prodPlay closed testing track for the pilot group (D-32)
Pilot (two weeks)v1.0.x hotfixesprodClosed track; in-app update prompt
Generalisation (LCH-05)v1.1.0 with the pilot improvements (MOB-18)prodProduction track, staged rollout
After generalisationiOS if decided; V2 features as minor versionsprodApp Store (TestFlight first); Play production

Play Console

  • Account — an organisation developer account owned by HOCO (D-25): it needs a D-U-N-S number, identity verification and the one-time registration fee paid with an internationally accepted card; start at the cadrage (PRJ-03) because verification can take weeks. Imad: admin for releases; Anis: admin. A personal account would have to run a closed test with at least 12 testers for 14 days before production access — the two-week pilot on the closed track could satisfy it, but production access then waits for Google's review.
  • Two apps: HOCO Revendeur (dz.hoco.reseller) and HOCO Délégué (dz.hoco.delegate), default language French (Algeria/France), country availability Algeria.
  • App access (both apps are behind sign-in): reviewer instructions with demo accounts on production — a validated reseller « Magasin Démo » and a delegate with a demo tour of three stops — flagged as test data and excluded from KPIs by Anis. Reviewers cannot receive SMS, so the demo reseller signs in with a password.
  • Delegate app visibility: it is useless without an account created by HOCO. Assumption — published like the reseller app with « Réservée aux délégués commerciaux HOCO » in the listing; a private (managed Google Play) distribution would need HOCO to run an enterprise mobility setup.

Tracks and staged rollouts

TrackWhoUse
Internal testingUp to 100 named testers (team, HOCO IT)Every prod candidate; instant availability, no review delay
Closed testingPilot delegates and resellers (Google accounts or a Google Group)The pilot; hotfixes
ProductionEveryone in AlgeriaFrom generalisation; staged rollout

Production rollouts are staged: 10 % → 25 % → 50 % → 100 %, one step per day at least, each step only if crash-free sessions stay ≥ 99.5 % in Sentry, Play vitals are normal and no severity-1 ticket is open. Halt rollout in Play Console is the first reflex when a regression appears; a fix ships as the next patch (Play has no rollback to an older versionCode).

Store listing assets

Delivered by Akram in DQA-01:

AssetSpecification
App icon512 × 512 PNG (32-bit), plus the adaptive launcher icon (foreground, background and monochrome layers for themed icons) and the dev/staging ribbon variants
Feature graphic1024 × 500 PNG or JPEG
Phone screenshots4–8 per app, portrait, in French, from the release candidate on the reference phone (status bar cleaned), with short captions
Notification iconWhite-on-transparent glyph, 24 dp, ic_stat_hoco
SplashAndroid 12+ splash icon (flutter_native_splash), background colour from tokens
Short and full descriptionsFrench, 80 and up to 4 000 characters, written with HOCO; Arabic later (D-09)

Declarations and data safety

Play Console → App content, completed in MOB-14 for each app:

DeclarationReseller appDelegate app
Privacy policy URLsettings.legal.privacyUrl (https://app.hoco.dz/confidentialite), text validated by HOCO (SEC-08, Law 18-07)Same URL; it includes the location section shown on DA-04
App accessDemo reseller accountDemo delegate account with a demo tour
AdsNoneNone
Content ratingQuestionnaire: business app, no user-to-user public contentSame
Target audience18 and over18 and over
Financial featuresNone of the listed consumer financial services (B2B invoices, payment declarations and trade credit are not lending) — confirm the wording with HOCONone
Account deletionRequired: users create accounts in the app, so an in-app path (« Supprimer mon compte » in RA-35) and a web URL must exist (D-11); legally required records (invoices) are kept and disclosedNot required (accounts are created by HOCO) — the privacy policy still explains how to request deletion
Foreground service—Foreground service type location: description (tour tracking while a tour is in progress, started by the user, visible notification) and a short video of starting a tour and the notification
Background locationNot requestedNot requested (D-24); if HOCO chooses option 2: location permissions declaration, prominent-disclosure screenshots and a video
Photo and video permissionsNone — the system photo picker is usedNone — camera only

The in-app account-deletion path for resellers needs an operation and a back-office handling step: to agree with Anis (it is not in the endpoint catalogue yet).

Data safety answers

Everything is encrypted in transit (HTTPS). Data is not sold and not shared with third parties for their own purposes; Firebase and Sentry act as service providers.

Data type (Play category)Reseller appDelegate appPurposeOptional?
NameOwner nameDelegate name (account)Account management, app functionalityRequired
Phone numberAccount phone, WhatsApp numberAccount phone; prospects' phones are business records entered by the delegateAccount management, app functionalityRequired
Email addressOptional store email—Account managementOptional
AddressStore and delivery addressesProspects' store addressesApp functionalityRequired
Precise locationOptional pin on the delivery addressCheck-in, tour start and sampling during toursApp functionality, fraud prevention (proof of visit)Reseller: optional · Delegate: required for field work
Approximate locationWhatsApp region for guests who accept—App functionalityOptional
PhotosPayment proofs, store photos, after-sales and return photosVisit and façade photosApp functionalityOptional (reseller) · per visit type (delegate)
Files and docsStore documents (RC, NIF, ID), payment proofs in PDFStore documents uploaded for a prospectApp functionality, account managementOptional
Purchase historyOrders, returns, invoices, paymentsAssisted ordersApp functionalityRequired
Other in-app messagesSupport tickets and after-sales conversations—App functionality, customer supportOptional
App interactionsOnly if analytics are enabled (assumption)SameAnalytics—
Crash logs, diagnosticsSentrySentryApp functionality (stability)Required
Device or other IDsInstall id (X-Device-Id), FCM tokenSameApp functionality (push, sessions), fraud preventionRequired

Android platform requirements

  • Target SDK: Google Play requires targeting an API level released within the last year for new apps and updates — follow Flutter's targetSdkVersion and check it is at least the required level before MOB-14.
  • 16 KB memory pages: apps targeting Android 15+ must ship native libraries aligned for 16 KB pages. Recent Flutter engines are; every plugin with native code (maps, camera, scanner, SQLite) must be too — check the release AAB in Android Studio's APK Analyzer or with zipalign -c -P 16 -v 4 on the APKs.
  • Edge-to-edge is enforced on recent targets: screens use SafeArea and the system-bar insets; check bottom sheets and the bottom navigation on gesture and three-button navigation.
  • Predictive back on recent Android versions: go_router pops must behave with the back gesture; dialogs with unsaved data use PopScope.
  • Foreground-service types and permissions declared as on location; POST_NOTIFICATIONS requested at runtime.

Signing

  • Play App Signing is mandatory for AAB uploads: Google holds the app-signing key; the team holds one upload key per app (repository › signing). Loss of an upload key is recoverable through Play support (days).
  • Fingerprints to copy from Play Console → App integrity once each app exists:
FingerprintWhere it goes
App-signing key SHA-256assetlinks.json of the reseller web (App Links)
App-signing key SHA-1, upload key SHA-1, debug key SHA-1Google Maps API key restrictions (Android apps) per flavor
Upload key SHA-256assetlinks.json too, so internal-track builds open App Links
  • Keystores and passwords: vault (Mobile collection) and GitHub Actions secrets only.

Forced and suggested updates

AppVersionPolicy per app and platform (edited by Anis on BO-66) reaches the app through appConfig.get at cold start and on resume after an hour, and through 426 UPGRADE_REQUIRED on any call (ADM-07):

AnswerApp behaviour
forceUpdate: true (or any 426)Blocking screen RA-36 / DA-28 « Mise à jour obligatoire »; « Mettre à jour » starts Play's immediate in-app update (in_app_update) when installed from Play, otherwise opens storeUrl. The delegate app keeps its outbox and replays it after the update
updateAvailable: trueDismissible banner with releaseNotes, once per version; Play flexible update when available
maintenance.enabledMaintenance screen with message and until; the delegate app keeps working offline

Rules for raising minVersion (owned by Anis, agreed with Imad):

  1. Only after the new version is available on the track the users are on (closed during the pilot, production after).
  2. Never during field hours: a delegate forced to update with a weak network cannot sync until the download finishes. Raise it in the evening, after a suggested-update period of at least two days when possible.
  3. Old versions must keep working until then: contract changes are additive (API integration › contract change).

Hotfixes during the pilot

The pilot runs on the closed track for two weeks with Imad on call (LCH-03B).

Triage — daily with Anis: Sentry issues, Play vitals, pilot feedback (WhatsApp group of the pilot, support tickets). Severity 1: an order, a visit or synced data is lost or wrong, the app crashes on a main flow, sign-in impossible — fix the same day. Severity 2: a workaround exists — next weekly patch. Severity 3: backlog for MOB-18.

Branch — hotfix/1.0.x from the v1.0.y tag on master; the fix with a regression test; PR into master with Anis's review.

Build — tag v1.0.x; release.yml builds the prod AAB, uploads symbols to Sentry and pushes to the internal track; smoke-test on the reference phone (sign-in, one order or one offline visit, sync).

Promote — internal → closed track (closed-track reviews are usually quick but not instant: ship severity-1 fixes early in the day). If the bug corrupts data, raise minVersion once the fix is live, outside field hours.

Close — merge master back into dev; note the fix in CHANGELOG.md and in the pilot log.

Server-side mitigations come first when they exist (a setting, a feature flag, an API fix by Anis) because they reach every phone at once.

iOS — after the pilot, on HOCO's decision

iOS is out of the three-month V1 frame: MOB-16 starts after the pilot improvements, only if HOCO confirms it (D-10). Keep the ios/ folders building locally so the work is a port, not a rewrite.

StepDetail
AccountsApple Developer Program as an organisation under HOCO (D-U-N-S again, annual fee); Imad as admin; App Store Connect apps dz.hoco.reseller, dz.hoco.delegate
Build machineA Mac, or a hosted macOS CI (macOS minutes on GitHub cost ten times more; Codemagic is an alternative)
SigningAutomatic signing locally; certificates and profiles for CI (fastlane match or the hosting service's signing)
FlavorsXcode schemes and build configurations per flavor; GoogleService-Info.plist per flavor
Permissions stringsNSLocationWhenInUseUsageDescription, NSCameraUsageDescription, NSPhotoLibraryUsageDescription in French, matching the Android rationale screens
PushAPNs authentication key uploaded to each Firebase project; explicit permission prompt with context
Delegate toursBackground location on iOS requires the location background mode and Always authorisation, with stricter App Review — decide whether iOS delegates exist at all
LinksUniversal Links with apple-app-site-association on the reseller web; no install referrer (fallback)
ReviewTestFlight for the team and HOCO, then App Review with the demo accounts and notes

On this page