---
title: "Application mobile (PWA)"
weight: 32
description: "Guide de l'application mobile PWA SmartInterventions pour les techniciens de terrain : installation, fonctionnement hors ligne, prise de photos, signatures, calendrier."
---

# 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](pieces-fournitures) et
[Registre opérateur](registre-operateur).

## 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](screenshots/accueil-smartphone.webp)

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](screenshots/mobile-ajout-piece-modale.webp)

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.
