Application mobile (PWA)

L'application mobile SmartInterventions est une PWA (Progressive Web App). Elle s'installe directement depuis le navigateur d'un smartphone sans passer par un magasin d'applications, fonctionne hors ligne et se resynchronise automatiquement quand le réseau revient.

Cette page récapitule les fonctionnalités côté terrain ; pour les écrans back-office (saisie chef d'atelier, recalcul des prix, registre opérateur, etc.), voir les pages dédiées Pièces et fournitures et Registre opérateur.

Installation et premier lancement

L'URL de l'application est imprimée sur la fiche d'intervention papier ou collée à l'écran d'un poste d'atelier. Au premier lancement, le navigateur propose d'ajouter l'icône à l'écran d'accueil. Une fois l'icône installée, l'application s'ouvre en plein écran comme une application native.

À la première connexion, le technicien saisit son adresse e-mail et son mot de passe puis nomme son appareil (par exemple "Téléphone Marie") afin que l'historique des connexions soit lisible côté administrateur. Si la même personne utilise plusieurs appareils, elle choisit son appareil dans la liste à la connexion suivante.

Liste et fiche d'intervention

Écran d'accueil de l'application mobile avec les compteurs-raccourcis vers les listes d'interventions du technicien

Au lancement, l'écran d'accueil affiche jusqu'à cinq compteurs-raccourcis :

  • Vos interventions à faire aujourd'hui,
  • Vos interventions de la semaine,
  • Les interventions marquées urgentes,
  • Les interventions non assignées,
  • Les interventions urgentes non affectées.

Les deux derniers ne s'affichent que pour les profils équipés du droit "voir les interventions non assignées".

Cliquer sur l'un des compteurs ouvre la liste correspondante. Chaque ligne montre la référence de l'intervention, le tiers, la date prévue et un badge si l'intervention est urgente.

En haut de la liste, des étiquettes permettent de choisir ce qui est affiché. Aux étiquettes de source (Mes inter, Non affectées, Urgentes) s'ajoutent deux étiquettes de filtre par statut :

  • Terminées : masquées par défaut pour désencombrer la liste. Cliquez sur l'étiquette pour réafficher les interventions terminées.
  • À compléter : affichées par défaut. Cliquez sur l'étiquette pour les masquer.

Le compteur entre parenthèses indique le nombre d'interventions concernées, et votre choix est mémorisé sur l'appareil.

La fiche d'intervention regroupe tout ce que le technicien a besoin sur le terrain : description, contact du client, photos prises lors de visites précédentes, formulaire technique éventuellement piloté par un schéma, photos avant / pendant / après, signatures technicien et client, et depuis la v2.0 le bloc "Pièces et fournitures".

Bloc "Pièces et fournitures"

Le bloc apparaît sous la section "Temps passé" et juste au-dessus du bloc de clôture / signatures. Il liste les pièces déjà saisies pour cette intervention et propose un bouton "Ajouter une pièce".

Trois entrées d'ajout

Modale d'ajout d'une pièce sur mobile avec ses trois tuiles : Scanner caméra, Rechercher au catalogue et Hors catalogue

Le bouton "Ajouter une pièce" ouvre une modale avec trois tuiles :

  • Scanner caméra : lecture EAN-13, CODE-128, QR, Data Matrix. Le code lu est résolu en cascade : barcode produit, code fournisseur, catalogue serveur, puis option "hors catalogue" si aucune correspondance.
  • Rechercher : recherche texte sur le catalogue offline local.
  • Hors catalogue : saisie d'un libellé libre quand la pièce n'est pas (encore) référencée.

Quand l'appareil n'a pas de caméra accessible (permission refusée, navigateur ancien), un sélecteur de fichier <input capture> permet de photographier le code-barres et de le décoder via la bibliothèque ZXing embarquée.

Mode scan en rafale

Pour les produits sérialisés posés en nombre (cinq luminaires LED, trois capteurs identiques, etc.), un bouton "Scan en rafale" accumule les numéros de série lus dans la même modale. Au tap "Valider", N lignes distinctes sont créées d'un coup. Les doublons sont signalés mais non insérés deux fois.

Choix du rôle de ligne

Pour chaque ligne, un sélecteur définit le rôle métier :

  • Consommable : utilisé et non récupérable (filtre, joint, etc.).
  • Nouvel équipement : pose d'un appareil qui devient partie du parc client (BAES, extincteur, climatiseur, etc.). Création automatique d'un équipement dans le parc.
  • Pièce de remplacement : remplacement d'un composant sur un équipement existant. Le sélecteur "équipement parent" liste les équipements du client, et le devenir de la pièce déposée (détruite, renvoyée à l'entrepôt, renvoyée au fournisseur sous garantie, recyclée, laissée sur site) est saisi.
  • Pièce déposée seule : retrait d'une pièce sans pose. Utile pour documenter une récupération de fluide frigorigène, par exemple.

Saisie SN / lot

Quand le produit choisi est sérialisé (tobatch = 2), un sélecteur liste les SN disponibles dans l'entrepôt en FIFO (date d'entrée croissante). Quand il est suivi par lot (tobatch = 1), le sélecteur liste les lots avec quantité disponible, ordonnés en FEFO (péremption croissante) avec un toggle FIFO pour les consommables non périssables.

Pour les produits à traçabilité forte (must_tracking = 1 : fluides frigorigènes, biocides, médicaments vétérinaires...), l'application affiche un avertissement quand le numéro de lot, l'opérateur certifié ou la date de péremption manquent. La ligne reste éditable localement pour permettre une saisie partielle sur le terrain, mais le serveur refusera la validation finale si l'un de ces champs reste vide.

Recalcul de prix au commit

Le prix de vente affiché en mode hors ligne provient du catalogue local et peut être périmé. Au moment de la synchronisation, le serveur recalcule le prix de vente HT et le prix d'achat HT à partir du catalogue courant. Le prix saisi hors ligne est conservé séparément (subprice_offline_hint) pour permettre un audit ultérieur des écarts.

Ce comportement garantit qu'une intervention saisie il y a une semaine hors ligne est facturée au prix actuel et non au prix obsolète stocké sur le smartphone.

Fonctionnement hors ligne

L'application fonctionne intégralement hors ligne. Tout ce qui est nécessaire au terrain est stocké localement :

  • La liste des interventions assignées (mise à jour à chaque synchronisation).
  • Le catalogue des pièces et fournitures, défini dans la configuration du module (réglages "Pièces" : catégories de produits/services à pousser vers l'application). Il est téléchargé en une seule fois puis mis à jour de façon incrémentale à chaque synchronisation.
  • Les pièces déjà saisies sur l'intervention en cours, en attente de synchronisation.
  • Les photos prises (envoyées comme blob binaire, jamais en base64).

Chaque saisie locale reçoit un identifiant client_uuid (UUID v4) qui garantit l'idempotence : la même ligne renvoyée plusieurs fois (réseau instable, retry manuel, deuxième terminal) produit toujours la même ligne en base, jamais un doublon. Ce mécanisme protège du cas "réseau flaky -> retente POST -> serveur l'avait déjà persisté".

Indicateur de synchronisation

L'en-tête du bloc "Pièces et fournitures" affiche en permanence :

  • Un compteur Catalogue : N produit(s) (nombre de produits en cache local).
  • La date de dernière synchronisation.
  • Un bouton de rafraîchissement manuel.

Quand une ligne est en attente de synchronisation (saisie hors ligne ou erreur réseau au moment du POST), elle porte un badge "En attente de synchronisation". Elle reste éditable et supprimable tant qu'elle n'a pas atteint le serveur.

Synchronisation au retour du réseau

Quand le navigateur détecte le retour du réseau (window.online event), la file d'attente est traitée automatiquement. Les lignes sont envoyées une par une avec l'en-tête X-Offline-Sync: 1 qui dit au serveur "recalcule les prix toi-même, ne fais pas confiance à ce que je t'envoie côté pricing".

En cas d'échec (HTTP 4xx ou 5xx), la ligne reste en queue avec un état "Erreur de synchronisation" et un message explicite. Le technicien peut consulter, corriger, retenter ou supprimer la ligne directement depuis la fiche.

Photos et signatures

Le bloc photos accepte tous les champs configurés en photo dans les extrafields du module, par défaut "photo avant", "photo pendant" et "photo après". Les photos sont compressées en local avant envoi et montées sur l'infrastructure d'upload binaire commune (route POST /upload de smartauth. Aucune photo n'est jamais transmise en base64 dans le corps JSON principal.

Le bloc signatures gère deux signatures distinctes :

  • Signature technicien : posée par le technicien à la fin de l'intervention.
  • Signature client : posée par le client sur l'écran du smartphone, ou récupérée par un lien e-mail temporaire de pseudo-signature (la fonction "Envoyer le lien de signature").

Les deux signatures sont stockées dans des colonnes distinctes (si_sign_tech et si_sign_customer) et rendues côte à côte sur le PDF d'intervention.

Synchronisation manuelle

Le bouton de synchronisation du menu (icône cyclique en haut à gauche) provoque une resynchronisation complète : interventions, catalogue, lignes de pièces en queue. Utile au retour d'une tournée sans réseau pour vérifier que tout est bien parti côté serveur.

Compatibilité

L'application fonctionne sur :

  • Android 8+ via Chrome, Firefox ou un navigateur basé Chromium (Edge, Brave, Vivaldi...).
  • iOS 14+ via Safari (les autres navigateurs sur iOS sont des enrobages de Safari et héritent de ses capacités).
  • Tablette Android, tablette iPad, PC fixe ou portable -- l'application propose trois interfaces distinctes (smartphone, tablette, bureau), choisies automatiquement selon le type d'appareil ou réglables à la main via Réglages > Vue. Voir la page "Interface multi-appareils".

Le mode hors ligne nécessite que la PWA ait été installée et qu'elle ait été ouverte au moins une fois avec une connexion réseau, afin que le service worker et les caches soient initialisés.