Pièces et fournitures
Cette page décrit la gestion des pièces, consommables et équipements posés ou déposés lors d'une intervention SmartInterventions, telle qu'elle se présente côté back-office Dolibarr (poste fixe administrateur, chef d'atelier ou facturier).
Sur la fiche d'une intervention, un onglet "Pièces" liste toutes les lignes attachées à cette intervention. Le bouton "Ajouter une pièce" en haut à droite permet de créer une nouvelle ligne. Chaque ligne possède un état : Brouillon, Validée, ou Annulée.
Création et validation d'une ligne

Une ligne de pièce porte plusieurs blocs d'information :
- Identité : produit catalogue (optionnel), libellé, rôle (consommable, nouvel équipement posé, pièce de remplacement, dépose seule) et, pour les rôles "remplacement" ou "dépose seule", l'équipement parent concerné et le devenir de la pièce déposée (détruite, rapportée à l'entrepôt, renvoyée au fournisseur sous garantie, recyclée, laissée sur site).
- Quantité et stock : quantité prévue / posée, unité, numéro de série ou de lot, date de péremption éventuelle, entrepôt source, fournisseur d'achat et garantie en mois.
- Prix : prix unitaire de vente HT et taux de TVA. Le prix d'achat HT est lui réservé aux administrateurs.
- Notes : note publique imprimée sur le PDF d'intervention, et note privée interne jamais publiée.
- Statut : badge "Brouillon", "Validée" ou "Annulée" et boutons d'action contextuels.
Le passage à l'état "Validée" déclenche le snapshot des prix (le tarif catalogue est figé sur la ligne), la vérification des contraintes de traçabilité forte (numéro de série ou de lot, opérateur certifié, date de péremption) si le produit est marqué "à tracer", et selon la configuration une sortie automatique de stock.
Une ligne en brouillon peut être supprimée. Une ligne validée ne peut être qu'annulée par un administrateur, ce qui regénère un mouvement de stock inverse si nécessaire.
Permissions
Quatre permissions pilotent l'accès aux pièces :
read: voir l'onglet et les lignes (un technicien typique).write: créer et modifier les lignes en brouillon, et valider.delete: supprimer une ligne en brouillon (la suppression d'une ligne validée n'est jamais possible, seule l'annulation l'est).admin: modifier une ligne validée (avec journalisation), annuler une ligne validée, voir le prix d'achat HT et accéder à l'écran de recalcul des prix.
Une option de module SMARTINTERVENTIONS_HIDE_PRICES_FROM_TECH permet
de masquer le PU HT et le total HT aux utilisateurs qui n'ont pas la
permission admin, par exemple pour un atelier où les techniciens ne
doivent pas annoncer les prix au client. Par défaut cette option est
désactivée et le technicien voit le PU HT (mais jamais le PA HT).
Recalcul des prix avant facturation
L'écran partline_repricing.php (accessible aux administrateurs
uniquement) compare ligne à ligne le prix figé au moment de la
validation avec le tarif catalogue courant. L'écart est affiché en
pourcentage et les lignes au-dessus d'un demi-pourcent de drift sont
pré-cochées.
Cas d'usage typique : un technicien est intervenu il y a trois semaines, le catalogue a été actualisé depuis (promotion, hausse fournisseur), et le facturier veut renvoyer une facture cohérente avec le tarif courant plutôt qu'avec le tarif d'il y a trois semaines.
Chaque recalcul génère une ligne d'audit dans le journal Dolibarr :
REPRICED partline=42 subprice=12.00->15.00 cost=8.00->9.50 user=7
Ce format est volontairement extractible par un simple grep REPRICED
sur les logs.
Application mobile (PWA)
Depuis la v2 un bloc "Pièces et fournitures" dédié est affiché dans le compte rendu mobile du technicien, juste sous le temps passé et avant le bloc de clôture / signatures.
Ce bloc est distinct de la section "Produits/Services consommés"
historique (catalogue mobile lié aux lines_products). Les deux peuvent
cohabiter le temps de la migration : la nouvelle section persiste vers
la table llx_smartinter_partline et alimente directement la
facturation détaillée, le pilotage du stock par lot/série et les PDF.
Trois entrées d'ajout
Le bouton "Ajouter une pièce" ouvre une modale avec trois tuiles :
- Scanner : lecture caméra d'un code-barres EAN-13, CODE-128, QR
ou Data Matrix. Le code est résolu en cascade : produit par
barcode, puis par l'extrafieldsupplier_barcodes(codes fournisseur), puis sur le catalogue serveur viaGET /partline/resolve-barcode, et enfin sur l'option "hors catalogue". En l'absence de caméra (permission refusée, navigateur ancien), un sélecteur de fichier<input capture>permet de prendre une photo du code et de la décoder via @zxing/browser. - Rechercher : recherche texte (ref ou libellé) sur le catalogue offline stocké en IndexedDB. Le catalogue est synchronisé automatiquement au premier usage et plafonné à 2000 produits (LRU + expiration 30 jours, favoris épargnés).
- Hors catalogue : saisie d'un libellé libre quand la pièce n'est
pas (encore) référencée dans Dolibarr. La ligne porte un
fk_product = NULL; le facturier décide ensuite si la pièce doit être référencée ou facturée telle quelle.
Saisie du prix sur une ligne hors catalogue. Le champ "Prix unitaire HT" n'apparaît dans la modale que pour les utilisateurs qui détiennent le droit "devis" (devis sur site) ET lorsque la destination de la ligne est "À proposer au devis". Une ligne libre marquée "Pièce posée", ou saisie par un technicien sans le droit "devis", ne propose donc pas de champ prix : c'est volontaire. Dans ce cas, le tarif est fixé en back-office par le facturier au moment de la validation ou de la facturation (cf. la section "Permissions" plus haut et la page "Devis sur site"). Pour permettre à un technicien d'annoncer un prix directement sur site, lui attribuer le droit "devis" et choisir la destination "À proposer au devis".
Mode scan en rafale
Pour les produits sérialisés posés en nombre (ex : 5 luminaires), un bouton "Scan en rafale" accumule les N numéros de série dans la même modale, puis crée N lignes distinctes au tap "Valider". Les doublons sont signalés mais non insérés. Annuler la modale n'écrit rien.
Sélecteur 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 en FEFO (péremption croissante) avec un toggle FIFO pour
les consommables non périssables. La saisie libre est interdite sur les
SN et tolérée sur les lots uniquement si l'option
STOCK_ALLOW_NEGATIVE_TRANSFER est activée côté Dolibarr.
Fonctionnement hors ligne
Chaque ligne saisie est immédiatement persistée en IndexedDB avec un
identifiant client_uuid généré par la PWA (UUID v4 RFC 4122). Tant
que la connexion n'est pas rétablie, la ligne porte un badge "En
attente de synchronisation" et reste éditable / supprimable.
Au retour du réseau, ou via le bouton "Synchroniser" dans l'en-tête du
bloc, la PWA envoie chaque ligne à POST /partline avec l'en-tête
X-Offline-Sync: 1. Côté serveur, ce flag déclenche un recalcul
autoritaire du subprice à partir du catalogue courant : le prix saisi
hors ligne (subprice_offline_hint) est persisté tel quel pour
audit, mais c'est le prix serveur qui fait foi sur la ligne finale.
L'idempotence est garantie par la contrainte UNIQUE
(entity, client_uuid) : une ligne renvoyée deux fois (réseau
instable, retry manuel, deuxième terminal) produit toujours la même
ligne en base, jamais un doublon.
Produits à traçabilité forte (must_tracking)
Si le produit porte l'extrafield must_tracking = 1 (fluide
frigorigène, biocide, médicament vétérinaire, etc.), la modale affiche
un avertissement quand le numéro de lot, le numéro de série ou
l'opérateur certifié manquent. La ligne reste créable localement (le
technicien peut compléter plus tard avant la synchronisation finale)
mais le serveur refusera la commit avec une erreur claire si l'un
de ces champs reste vide.
Indicateur catalogue
L'en-tête du bloc affiche en permanence un compteur "Catalogue : X/Y" (produits stockés sur plafond), un badge "Catalogue tronqué" quand le serveur a renvoyé plus de produits que la PWA peut stocker, et la date de dernière synchronisation. Un bouton rafraîchit le catalogue à la demande.
Cycle complet bout en bout
Voici le parcours typique d'une pièce posée sur le terrain jusqu'à sa facturation :
- Saisie terrain (PWA) -- Le technicien ouvre la fiche
d'intervention sur son smartphone, ouvre le bloc "Pièces et
fournitures", scanne ou recherche le produit, complète quantité,
numéro de lot ou de série, prend une photo si nécessaire. Une ligne
en brouillon est immédiatement enregistrée localement avec un
identifiant
client_uuidqui garantit l'idempotence. - Synchronisation -- Au retour du réseau (ou via le bouton
"Synchroniser"), la ligne est poussée vers le serveur via
POST /partlineavec l'en-têteX-Offline-Sync: 1. Le serveur recalcule le prix de vente (subprice) à partir du catalogue courant et le prix d'achat (subprice_cost) à partir du PMP, puis conserve le prix saisi hors ligne danssubprice_offline_hintpour audit. - Validation -- Au moment de la signature client ou via l'action
"Valider" du back-office, la ligne passe de "Brouillon" à
"Validée". Cette transition déclenche :
- le snapshot final des prix,
- les contrôles de traçabilité forte (lot/série, opérateur
certifié, date de péremption) pour les produits marqués
must_tracking, - la sortie de stock automatique (entrepôt source par défaut),
- les effets de bord équipement (création / désinstallation / remplacement) selon le rôle de la ligne,
- les contrôles réglementaires fluides frigorigènes et biocides.
- Facturation -- À la transformation
fichinter -> facture, chaque ligne validée etbillable=1génère unefacturedetcorrespondante. Le lienelement_elementest créé entre la fiche d'intervention et la facture. Si la facture est ensuite supprimée, le triggerBILL_DELETEremetpartline.fk_facturedet = NULLet purge les liens. - Annulation rétroactive -- Si une ligne validée doit être
annulée (refus client, erreur), un administrateur clique
"Annuler" : la ligne passe en "Annulée", un mouvement de stock
inverse est généré, et les effets de bord équipement sont
propagés (un BAES installé puis annulé voit son équipement
désactivé et un événement
uninstalledconsigné).
Produits réglementés et registre opérateur
Pour les fluides frigorigènes (étiquette is_fluorinated_gas) et
les biocides (étiquette is_biocide), des règles supplémentaires
s'appliquent : un opérateur certifié doit être désigné via
fk_user_operator, la catégorie de certification minimale est
vérifiée (par défaut en mode avertissement, en mode strict via la
constante SMARTINTERVENTIONS_OPERATOR_CERT_ENFORCE=1), et la
saisie du dosage / surface traitée / cible est obligatoire pour les
biocides.
Toutes les lignes saisies par un opérateur certifié sont consultables et exportables via le registre opérateur. Voir la page dédiée Registre opérateur.