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

Onglet Pièces d'une intervention en back-office : liste des lignes attachées avec leur rôle, leur quantité, leur prix et leur état (Brouillon, Validée, Annulée)

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'extrafield supplier_barcodes (codes fournisseur), puis sur le catalogue serveur via GET /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 :

  1. 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_uuid qui garantit l'idempotence.
  2. Synchronisation -- Au retour du réseau (ou via le bouton "Synchroniser"), la ligne est poussée vers le serveur via POST /partline avec l'en-tête X-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 dans subprice_offline_hint pour audit.
  3. 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.
  4. Facturation -- À la transformation fichinter -> facture, chaque ligne validée et billable=1 génère une facturedet correspondante. Le lien element_element est créé entre la fiche d'intervention et la facture. Si la facture est ensuite supprimée, le trigger BILL_DELETE remet partline.fk_facturedet = NULL et purge les liens.
  5. 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 uninstalled consigné).

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.