---
title: "Pièces et fournitures"
weight: 40
description: "Gestion des pièces, consommables et équipements posés ou déposés lors d'une intervention SmartInterventions, côté back-office Dolibarr."
---

# 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)](screenshots/pieces-backoffice-ligne.webp)

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](/smartinterventions/registre-operateur).
