Transactions
Les transactions créent une piste d'audit immuable de chaque mouvement d'inventaire, consommation, réception et ajustement. Les transactions ne peuvent pas être éditées ou supprimées - les corrections ajoutent de nouvelles transactions d'ajustement.
Types de Transactions
Flux de Transaction :
Réception Transfert Collecte Consommation Ajustement
↓ ↓ ↓ ↓ ↓
Nouveau Stock Site A→Site B QR Tâche-Ressource Le Travail Épuise Correction Manuelle
(Achat) (Dépl. générique) (Scan pour collecter) (Soumis rapport) (Comptage cyclique)
Page des transactions montrant la piste d'audit de tous les mouvements d'inventaire
Réception
Nouvel inventaire arrive à un site (achats, retours du terrain).
Champs :
toSite- Site destinationresource- Ce qui est arrivétoVolume- Nouveau solde d'élément de stock après réceptionuom- Unité de mesure
Exemple : 100m de câble arrive à l'entrepôt
type: "receipt"
toSite: Entrepôt Central
resource: Câble Cat6
toVolume: 600m (était 500m, maintenant 600m)
Transfert
L'inventaire se déplace entre sites (entrepôt → travailleur, travailleur → site terrain).
Champs :
fromSite- Emplacement sourcetoSite- Emplacement destinationresource- Ce qui s'est déplacéfromVolume- Solde source après transferttoVolume- Solde destination après transfertpickupCode- JWT scanné (si transfert basé QR)scannerUserId- Qui a scanné QRscanMethod- "self" (travailleur) ou "staff" (personnel d'entrepôt)scanLocation- Coordonnées GPS où le scan s'est produit
Exemple : Le travailleur retire 10m de câble via scan QR
type: "transfer"
fromSite: Entrepôt Central
toSite: Inventaire Personnel de John
resource: Câble Cat6
fromVolume: 590m (entrepôt réduit de 600m)
toVolume: 10m (nouvel élément de stock de John)
pickupCode: "eyJhbGc..." (JWT)
scannerUserId: john_id
scanMethod: "self"
scanLocation: { lat: 40.7128, lng: -74.0060 }
Consommation
Le travail sur le terrain épuise l'inventaire (création automatique lors de la soumission du rapport).
Champs :
fromSite- D'où les matériaux ont été consommés (généralement site personnel du travailleur)resource- Ce qui a été consomméfromVolume- Solde restant après consommationreportId- Lien vers le rapport de travail (pour calcul de paiement)
Exemple : Le travailleur utilise 8m de câble en terminant la tâche
type: "consumption"
fromSite: Inventaire Personnel de John
resource: Câble Cat6
fromVolume: 2m (réduit de 10m)
reportId: report_abc123
Ajustement
Correction manuelle des niveaux de stock (comptages cycliques, dommage, perte).
Champs :
stockItemId- Quel élément de stock ajustéresource- Ce qui a été ajustéfromVolume- Solde précédenttoVolume- Nouveau soldereason- Explication requise (par exemple, "Correction de comptage physique", "Endommagé en transit")
Exemple : Le comptage cyclique trouve un écart
type: "adjustment"
stockItemId: stock_xyz
resource: Câble Cat6
fromVolume: 2m (solde enregistré)
toVolume: 0m (comptage physique réel)
reason: "Comptage cyclique 2026-02-10 - extrémité de rouleau jetée"
Collecte
Collecte de matériau liée à une tâche, créée automatiquement lorsqu'un travailleur scanne le code QR d'une ressource de tâche.
Une transaction de collecte enregistre la ressource collectée, le volume, le site source, la personne qui a scanné (collecteur effectif), ainsi qu'un lien vers la tâche et la ligne de ressource spécifique au sein de cette tâche (context: { taskId, taskResourceIdx }). La collecte se distingue du transfert : un transfert déplace de l'inventaire entre sites de façon générique ; une collecte est un transfert avec contexte de tâche — elle rattache directement la déduction de stock à un poste de travail planifié spécifique. Ce lien contextuel permet d'interroger « quelle quantité de cette ressource a été collectée pour la tâche X » en agrégeant les transactions de collecte, plutôt qu'en maintenant un total courant sur la tâche elle-même.
Les codes QR de collecte sont à usage unique (la réutilisation est rejetée avec une erreur de conflit). Les codes peuvent être annulés (stock restitué via une transaction de retour) ou régénérés (nouveau code émis, ancien code invalidé) de façon indépendante.
Champs de Transaction
Communs à Tous les Types :
type- receipt, transfer, consumption, adjustmentresource- Référence de définition de ressourceuom- Unité de mesurecreatedAt- Horodatage (auto-généré)createdBy- Utilisateur qui a initié (auto-capturé)properties- JSON flexible pour données personnalisées
Spécifiques au Type :
fromSite/toSite- Points d'extrémité de mouvementfromVolume/toVolume- Changements de soldereportId- Lien vers rapport de travail (consommation)pickupCode- JWT scanné (transferts protégés)scannerUserId- Qui a scanné (transferts)scanMethod- Auto-retrait vs assisté par le personnelscanLocation- GPS au moment du scanreason- Explication (ajustements)
Immuabilité des Transactions
Ne Peuvent Pas Être Éditées :
- Les transactions sont en écriture seule
- Pas d'opérations de mise à jour ou suppression
- Préserve l'intégrité de la piste d'audit
Faire des Corrections :
- N'essayez pas d'éditer la mauvaise transaction
- Créez une nouvelle transaction
adjustment - Incluez une raison détaillée expliquant la correction
- Les deux transactions restent dans l'historique
Exemple de Flux de Correction :
Jour 1 : La réception montre 100 unités arrivées
→ Crée transaction : toVolume = 100
Jour 2 : Découvre que seulement 95 unités reçues réellement
→ Crée ajustement : fromVolume = 100, toVolume = 95
→ Raison : "Erreur de comptage de réception - seulement 95 unités dans l'expédition"
Résultat : Les deux transactions visibles dans la piste d'audit
Création Automatique de Transactions
Depuis la Soumission de Rapport
Lorsque le travailleur soumet un rapport avec le champ consumedFrom :
- Le système valide la disponibilité du stock à chaque élément de stock
- Crée atomiquement des transactions de consommation pour chaque ressource
- Lie les transactions au rapport via
reportId - Épuise les volumes d'éléments de stock
- Si stock insuffisant → rejette le rapport OU invite à consommation partielle
Avantages :
- Le stock toujours précis (impossible d'oublier d'enregistrer la consommation)
- Rapport + transaction validés ensemble (atomique)
- Le calcul de paiement a des données fiables
Depuis le Scan de Retrait QR
Lorsque le travailleur scanne le QR de retrait d'attribution :
- Valide la signature JWT et l'expiration
- Vérifie que le scanner est le destinataire autorisé OU a
canFacilitatePickups - Vérifie la disponibilité du stock au site source
- Crée automatiquement la transaction de transfert
- Enregistre l'identité du scanner, la méthode, l'emplacement GPS
Avantages :
- Pas d'entrée manuelle de transaction
- GPS prouve la présence physique
- La piste d'audit montre qui a autorisé le transfert
Voir les Transactions
Journal Global des Transactions :
- Naviguer vers Inventaire → Transactions
- Filtrer par type, plage de dates, site, ressource
- Exporter pour rapprochement ou conformité
Historique d'Élément de Stock :
- Naviguer vers un élément de stock spécifique
- "Historique des Transactions" montre tous les mouvements affectant cet élément
- Tracer la lignée (d'où venaient les matériaux, où sont-ils allés)
Consommation de Rapport :
- Naviguer vers le rapport de travail
- La section "Matériaux Utilisés" lie aux transactions de consommation
- Vérifier ce qui a été réellement épuisé de l'inventaire
Activité du Site :
- Naviguer vers le site
- "Transactions Récentes" montre réceptions, transferts, consommations
- Surveiller le débit de l'entrepôt
Cas d'Usage
Audit de Conformité
- Montrer tous les mouvements de matériaux contrôlés
- Prouver la chaîne de garde (réception → transfert → consommation)
- Exporter le journal des transactions pour les rapports réglementaires
Prévention des Pertes
- Comparer les réceptions aux consommations au fil du temps
- Identifier les écarts nécessitant une enquête
- Suivre les patterns d'ajustement (ajustements fréquents = problèmes potentiels)
Calcul de Paiement
- Consommations liées aux rapports via
reportId - Calculer les coûts de matériaux pour le travail terminé
- Vérifier que le travailleur a utilisé les matériaux assignés (pas le stock personnel)
Rapprochement d'Inventaire
- Comparer les soldes basés sur transactions aux comptages physiques
- Identifier la contraction ou les erreurs de comptage
- Créer des ajustements pour corriger les écarts
Responsabilité du Travailleur
- Voir l'historique de retrait et consommation du travailleur individuel
- Identifier qui a scanné l'inventaire protégé
- La validation GPS montre où les matériaux ont été transférés
Meilleures Pratiques
Toujours Inclure la Raison pour les Ajustements :
- "Correction de comptage physique" est mieux que pas de raison
- "Matériaux endommagés jetés - événement tempête 2026-02-08" encore mieux
- Aide les futurs auditeurs à comprendre les corrections
Utiliser les Plus Petits Types de Transaction :
- N'utilisez pas d'ajustements quand réception/transfert approprié
- Les ajustements devraient être l'exception, pas la routine
- Les réceptions/transferts préservent un contexte plus riche
Rapprochement Régulier :
- Hebdomadaire : Examiner les ajustements (devraient être rares)
- Mensuel : Comptage cyclique des éléments de stock majeurs
- Trimestriel : Rapprochement complet d'entrepôt
Tirer Partie du GPS pour les Transferts :
- Examiner
scanLocationpour l'inventaire protégé - Détecter les anomalies (scan 100km de l'entrepôt)
- La validation de géofence empêche le partage QR à distance
Surveiller le Volume des Transactions :
- Taux d'ajustement élevé = problèmes de processus
- Faible consommation avec retraits élevés = accumulation ou vol
- Inadéquation réception/consommation = problèmes de prévision de demande
Permissions de Transaction
Créer des Transactions :
transactionsCreate- Peut créer des réceptions, ajustements- Les transactions auto-créées (depuis rapports, scans QR) ne nécessitent pas de permission
- Les permissions spécifiques au site peuvent limiter qui crée des réceptions à quels sites
Voir les Transactions :
- Tous les utilisateurs peuvent voir les transactions pour leurs propres éléments de stock
- Les restrictions de rôle peuvent masquer les transactions pour certaines ressources/sites
viewDeletedpermet de voir les transactions supprimées logiquement (si jamais implémenté)
Pas de Permission de Suppression :
- Les transactions ne peuvent pas être supprimées par quiconque
- Maintient l'intégrité de la piste d'audit
- Seulement l'administrateur de base de données pourrait supprimer (urgence opérationnelle seulement)
Saisie de Transaction Manuelle avec Numérisation de Code QR
Pour les expéditions arrivant sur des sites où les articles n'ont pas d'existant codes QR, le personnel de terrain peut utiliser le Formulaire de Transaction Manuel avec numérisation QR intégrée pour accepter rapidement l'inventaire en utilisant un livre de référence physique de codes QR de ressources.
Création d'un Livre de Référence Physique de Ressources
Configuration Admin (Une Fois) :
- Naviguer vers Admin → Codes QR de Ressource (
/admin/resource-qr-codes) - Filtrer par type de ressource si nécessaire (Matériel, Main-d'œuvre, Équipement)
- Rechercher des ressources spécifiques à inclure
- Cliquer sur Imprimer pour générer une feuille de codes QR imprimable
- Imprimer sur du papier standard lettre/A4
- Laminer les pages et relier en livre de référence
- Placer le livre au quai de réception ou station d'entrepôt
Format de Code QR : Chaque code QR contient des données JSON :
{
"type": "resource",
"id": "resource_id_123",
"name": "Câble Cat6",
"defaultUom": "m",
"resourceType": "material"
}
Workflow Mobile pour l'Acceptation d'Expéditions
Processus du Personnel de Terrain :
- Ouvrir le Formulaire de Transaction Manuel
- Naviguer vers Inventaire → Transactions
- Cliquer sur le bouton "Ajouter une Transaction Manuelle"
- Nécessite la permission
canFacilitatePickups
- Activer le Mode Lot (Optionnel mais Recommandé)
- Basculer le commutateur "Mode Lot" en haut du formulaire
- Permet de scanner et saisir plusieurs articles avant la soumission finale
- Économise du temps quand l'expédition contient 5+ articles différents
- Scanner le Code QR de Ressource
- Cliquer sur le bouton de scan (📷 icône) à côté du champ Nom de Ressource
- La caméra s'ouvre sur l'appareil mobile
- Pointer la caméra vers le code QR du livre de référence
- Les données QR se remplissent automatiquement : Nom de Ressource, ID de Ressource, UOM par Défaut
- Saisir les Détails de Quantité
- Champ Volume : Saisir la quantité reçue (par exemple, "50")
- Champ UOM : Pré-rempli à partir du QR, ajuster si nécessaire (par exemple, "m" pour mètres)
- Site : Glisser-déposer le site de destination ou utiliser l'emplacement actuel
- Ajouter au Lot (Si Mode Lot Activé)
- Cliquer sur le bouton "Ajouter au Lot"
- L'article apparaît dans la liste de lot ci-dessous
- Le formulaire se vide pour l'article suivant
- Répéter les étapes 3-5 pour chaque article de l'expédition
- Soumettre les Transaction(s)
- Mode unique : Cliquer sur "Soumettre" (crée une transaction)
- Mode lot : Cliquer sur "Soumettre Lot (N articles)" (crée N transactions atomiquement)
- Notification de succès montre combien d'articles ont été acceptés
- Si certains articles échouent, le système rapporte le nombre mais ne rollback pas les autres
Exemple de Workflow Lot :
Une expédition arrive avec 5 matériaux différents :
1. Scanner "Câble Cat6" QR → Saisir 50m → Ajouter au Lot
2. Scanner "Conduit 1in" QR → Saisir 20 unités → Ajouter au Lot
3. Scanner "Boîte de Jonction" QR → Saisir 15 unités → Ajouter au Lot
4. Scanner "Collier de Câble" QR → Saisir 500 unités → Ajouter au Lot
5. Scanner "Fil de Terre" QR → Saisir 100m → Ajouter au Lot
6. Soumettre Lot (5 articles)
→ Crée 5 articles de stock + 5 transactions de réception instantanément
Gestion des Ressources Inconnues
Si l'expédition contient des articles pas dans le livre de référence :
- Taper le Nom de Ressource Manuellement
- Saisir le nom dans le champ Nom de Ressource (pas de scan QR)
- Le système recherche une ressource existante par nom
- Si non trouvée → place automatiquement dans la ressource "Holding/Staging"
- Workflow Holding/Staging
- Les propriétés de transaction incluent
originalResourceName(ce que vous avez tapé) - Toast d'avertissement : "Ressource non trouvée. Placée dans Holding/Staging"
- Article de stock créé avec ressource Holding/Staging
- Plus tard : Le personnel de bureau alloue à la ressource appropriée (voir Allocation d'Inventaire Mis en Attente ci-dessous)
- Les propriétés de transaction incluent
- Avantages de l'Auto-Mise en Attente
- L'acceptation du personnel de terrain n'est jamais bloquée
- L'inventaire est physiquement accepté et suivi immédiatement
- La catégorisation des ressources se produit de manière asynchrone
- Pas de délais bloquants pour les expéditions urgentes
Fonctionnalités du Mode Lot
Table des Articles en Ligne :
- Montre tous les articles scannés avant soumission
- Affiche : Nom de Ressource, Volume, UOM
- Supprimer des articles individuels avec le bouton X
- Vue visuelle claire de ce qui sera engagé
Soumission :
- Traitement de lot atomique (tout-ou-rien où possible)
- Échecs d'articles individuels rapportés mais n'empêchent pas les autres
- Nombre de succès : "5 transactions créées avec succès"
- Gestion des échecs partiels : "2 articles n'ont pas pu être traités"
Optimisation Mobile :
- Grand bouton de scan tactile
- Accès caméra avec basculement du flash
- Fonctionne hors ligne avec mise en cache PWA
- Sauvegarde automatique du lot dans localStorage (survit au rafraîchissement de page)
Allocation d'Inventaire Mis en Attente
Après que le personnel de terrain ait accepté des ressources inconnues dans Holding/Staging :
- Naviguer vers les Articles de Stock
- Filtrer par "Site : Holding/Staging" (si implémenté)
- Chercher des articles avec
isHoldingResource: true
- Ouvrir le Modal d'Allocation
- Cliquer sur le bouton "Allouer l'Inventaire Mis en Attente" sur l'article de stock
- Montre : Volume actuel, Nom original saisi par le personnel de terrain
- Sélectionner la Ressource Appropriée
- Option A : Glisser une ressource existante depuis la table des ressources
- Option B : Basculer "Créer une Nouvelle Ressource" et saisir les détails
- Saisir la raison d'allocation (par exemple, "Identifié comme câble Cat6A, pas Cat6")
- Soumettre l'Allocation
- Met à jour atomiquement :
- Champ ressource de l'article de stock (Holding → Approprié)
- Crée une transaction d'ajustement avec la raison d'allocation
- Préserve
originalResourceNamedans la transaction
- Met à jour atomiquement :
Avantages :
- L'acceptation sur le terrain n'est jamais bloquée
- La catégorisation du bureau préserve la piste d'audit
- Aucun inventaire "disparaît" pendant la transition
- Les notes du travailleur de terrain original sont préservées
Visualisation des Transactions
Journal Global des Transactions :
- Naviguer vers Inventaire → Transactions
- Filtrer par type, plage de dates, site, ressource
- Exporter pour réconciliation ou conformité
Historique d'Article de Stock :
- Naviguer vers un article de stock spécifique
- "Historique des Transactions" montre tous les mouvements affectant cet article
- Tracer la lignée (d'où viennent les matériaux, où vont-ils)
Consommation de Rapport :
- Naviguer vers le rapport de travail
- Section "Matériaux Utilisés" lie aux transactions de consommation
- Vérifier ce qui a été réellement dépensé de l'inventaire
Activité du Site :
- Naviguer vers le site
- "Transactions Récentes" montre réceptions, transferts, consommations
- Surveiller le débit d'entrepôt
Cas d'Usage
Audit de Conformité
- Montrer tous les mouvements de matériaux contrôlés
- Prouver la chaîne de responsabilité (réception → transfert → consommation)
- Exporter le journal des transactions pour reporting réglementaire
Prévention de Perte
- Comparer réceptions à consommations au fil du temps
- Identifier des écarts nécessitant investigation
- Créer des ajustements pour corriger les écarts
Calcul de Paiement
- Consommations liées à des rapports via
reportId - Calculer les coûts de matériaux pour le travail terminé
- Vérifier que le travailleur a utilisé les matériaux assignés (pas le stock personnel)
Réconciliation d'Inventaire
- Comparer les soldes basés sur transactions aux comptages physiques
- Identifier contraction ou erreurs de comptage
- Créer des ajustements pour corriger les écarts
Responsabilité du Travailleur
- Voir l'historique de retrait et consommation individuel du travailleur
- Identifier qui a scanné l'inventaire protégé
- Validation GPS montre où les matériaux ont été transférés
Meilleures Pratiques
Toujours Inclure une Raison pour les Ajustements :
- "Correction de comptage physique" est mieux qu'aucune raison
- "Matériaux endommagés jetés - événement tempête 2026-02-08" encore mieux
- Aide les auditeurs futurs à comprendre les corrections
Utiliser les Plus Petits Types de Transaction :
- Ne pas utiliser d'ajustements quand réception/transfert approprié
- Les ajustements devraient être exception, pas routine
- Réceptions/transferts préservent un contexte plus riche
Réconciliation Régulière :
- Hebdomadaire : Examiner les ajustements (devraient être rares)
- Mensuel : Comptage de cycle des articles de stock majeurs
- Trimestriel : Réconciliation complète d'entrepôt
Tirer Partie du GPS pour les Transferts :
- Examiner
scanLocationpour l'inventaire protégé - Détecter des anomalies (scan 100km de l'entrepôt)
- Validation de géofence empêche le partage QR distant
Surveiller le Volume de Transaction :
- Volume d'ajustement élevé = problèmes de processus
- Consommation faible avec retraits élevés = accumulation ou vol
- Écart réception/consommation = problèmes de prévision de demande
Permissions de Transaction
Créer des Transactions :
transactionsCreate- Peut créer des réceptions, ajustements- Les transactions auto-créées (depuis rapports, scans QR) ne nécessitent pas de permission
- Les permissions spécifiques au site peuvent limiter qui crée des réceptions à quels sites
Voir les Transactions :
- Tous les utilisateurs peuvent voir les transactions pour leurs propres éléments de stock
- Les restrictions de rôle peuvent masquer les transactions pour certaines ressources/sites
viewDeletedpermet de voir les transactions supprimées logiquement (si jamais implémenté)
Pas de Permission de Suppression :
- Les transactions ne peuvent pas être supprimées par quiconque
- Maintient l'intégrité de la piste d'audit
- Seulement l'administrateur de base de données pourrait supprimer (urgence opérationnelle seulement)