Stock magasin de vélo : inventaire scan + BLE, fournisseurs Veloconnect, rétrocessions multi-magasins

Un magasin de vélos, c’est typiquement 100 k€ à 500 k€ de stock immobilisé à un instant T — des vélos en exposition, des pièces dans la réserve, des accessoires dans les vitrines. Mal géré, ce stock coûte cher : rupture sur le modèle phare du moment (vente perdue), surstock sur des coloris invendables (marge rognée), inventaire annuel qui prend trois jours (et qui se révèle incohérent par rapport à Sage). CRM Cycles aborde le stock comme un module first-class avec mouvements temps réel, inventaire scan + Bluetooth, commandes EDI fournisseurs et — pour les enseignes multi-magasins — rétrocessions inter-boutiques.

Stock temps réel, pas de batch nocturne

Chaque action métier qui touche aux marchandises crée immédiatement un mouvement de stock. Aucune resynchro batch, aucune « mise à jour stock » manuelle :

  • Réception fournisseur validée — Effet : + stock · Déclencheur : Clic « Valider » sur la réception
  • Validation facture de vente — Effet : − stock · Déclencheur : Clic « Valider » sur la facture (si non issue d’une commande confirmée)
  • Confirmation commande — Effet : − stock (réservation) · Déclencheur : Clic « Confirmer » sur la commande
  • Création d’un avoir — Effet : + stock (retour) · Déclencheur : Création de l’avoir (validation auto)
  • Sortie interne — Effet : − stock · Déclencheur : Validation de la sortie
  • Assemblage « Vélo à la Carte » — Effet : − composants, + produit fini · Déclencheur : Validation de l’assemblage

Sur chaque fiche produit, l’onglet Mouvements trace la chronologie complète (date, type, quantité +/−, quantité résultante, document source cliquable, utilisateur). Cet historique est non modifiable — il constitue la traçabilité comptable des marchandises. En cas de contrôle ou de doute (« d’où vient ce surplus de 3 dérailleurs Shimano XT ? »), l’audit prend deux minutes.

Inventaire physique : scan douchette + détection BLE

L’inventaire annuel — ou trimestriel, selon la rigueur du magasin — est traditionnellement une opération lourde : deux journées de fermeture, comptage manuel sur clipboard papier, saisie dans Excel, comparaison avec Sage, écarts inexpliqués. CRM Cycles propose un module dédié avec scan douchette et détection Bluetooth.

À la création, on configure :

  • Mode : Fermé (magasin fermé, référence figée) ou Ouvert (activité continue, les mouvements de la journée s’intègrent dans le calcul des écarts).
  • Périmètre : produits simples seulement, vélos sérialisés seulement, ou tout.
  • Filtres optionnels : par marque, famille de produits, zone du magasin.

Un instantané des quantités au moment de la création sert de référence. Numéro auto-généré INV-AAAA-NNNN. Statuts : En coursTerminéValidé.

L’écran de scan affiche quatre compteurs en temps réel — Total, Comptés, Inconnus, Écarts — et travaille en mode keyboard-wedge : la douchette se comporte comme un clavier, on scanne, le logiciel cherche en cascade (EAN → SKU → numéro de série → tag BLE). Match = la quantité s’incrémente (produits simples) ou le vélo est marqué présent (sérialisé). Pas de match = ajout dans la liste « Codes inconnus » pour traitement à part.

Pour les vélos équipés de tags BLE (cf article catalogue/BLE), le bouton Appliquer BLE détecte automatiquement les vélos vus dans les 30 dernières minutes et les marque « présents » sans action manuelle. Le rapport d’inventaire distingue les détections BLE des scans manuels pour audit.

À la clôture, le rapport d’écarts compare référence vs comptage : quantité attendue, quantité réelle, écart (positif = surplus, négatif = manquant), valeur de l’écart (écart × prix d’achat HT). Un filtre « lignes avec écart uniquement » focalise sur les anomalies. Validation = mouvements de stock correctifs créés automatiquement, type Ajustement inventaire. Pour les vélos sérialisés, pas d’ajustement quantitatif (la présence est actée individuellement).

Commandes fournisseurs : workflow et Veloconnect EDI

Une commande fournisseur passe par les statuts :

Brouillon ──[Envoyer]──→ Envoyée ──[Confirmer]──→ Confirmée ──[Réceptionner]──→ Partiellement reçue / Reçue
                                       │
                                  Annulée

Pour les fournisseurs supportant Veloconnect (cf article catalogue), l’envoi se fait en EDI direct — le bon de commande arrive dans le système du grossiste sans email PDF à traiter, et l’accusé de réception retourné par le fournisseur fait basculer le statut en « Confirmée » automatiquement (avec Transaction ID + N° de commande fournisseur stockés).

Réceptions fournisseur : stock = au moment de la réception, pas de la commande

Principe : seule la validation d’une réception augmente le stock. Tant qu’un colis n’est pas arrivé et saisi, les produits n’existent pas en stock — même si la commande fournisseur est confirmée. Évite la confusion classique « j’ai commandé 5 cadres mais je ne sais pas s’ils sont là ».

Une réception porte les informations bordereau de livraison (transporteur, N° de suivi, nombre de colis), la facture fournisseur associée (souvent jointe au colis), et les lignes : SKU, désignation, quantité reçue, prix d’achat HT, TVA, et — pour les vélos — numéro de série obligatoire. Impossible de valider une réception contenant un produit sérialisé sans avoir saisi son N° de cadre. C’est le moment naturel où le commerçant grave le FNUCI sur le cadre et le saisit.

Si une réception validée est supprimée par erreur, le système restaure le stock automatiquement (mouvement inverse).

Rapprochement de factures fournisseur

Plusieurs réceptions peuvent être groupées sur une seule facture fournisseur (typique quand le grossiste expédie une commande en 2-3 colis sur 10 jours mais facture une seule fois). Le module Rapprochement permet de sélectionner les réceptions concernées (même N° de facture fournisseur), créer la facture comptable récapitulative, et marquer les réceptions comme « Rapprochées » — non modifiables ensuite, ce qui sécurise la comptabilité fournisseur.

Multi-magasins : visibilité du stock et rétrocessions

Pour les enseignes avec plusieurs boutiques (typique des réseaux de vélocistes franchisés ou des chaînes régionales), CRM Cycles fonctionne sur des bases de données indépendantes par magasin mais propose deux mécanismes inter-boutiques :

1. Visibilité du stock

Configuration Administration → Paramètres Produits → Magasins suivis : on coche les boutiques qu’on veut surveiller. Ensuite, sur les lignes produit d’un devis, d’une commande ou d’une facture, une colonne Stock affiche :

  • ✅ vert — stock suffisant localement
  • ⚠️ orange — stock partiel local
  • ❌ rouge — rupture locale
  • 🏷️ — produit déjà affecté à un autre document

En cas de rupture locale, des badges bleus indiquent le stock disponible dans les autres magasins (ex : 3 = 3 unités disponibles dans la boutique « Formation »). Tooltip au survol : nom du magasin. Lecture seule — pour déclencher un transfert, il faut passer au module Rétrocessions.

2. Rétrocession inter-magasins

Workflow d’une rétrocession :

Magasin demandeur               Magasin fournisseur
─────────────────               ────────────────────
Crée la demande                 Voit la demande "À fournir"
(status: En demande)    ──→     (status: À fournir)
                                    │
                              Refuse ou facture
                                    │
                         ┌──────────┴──────────┐
                      Refusée              Clôturée
                                       (Facture créée)
                                       Stocks ajustés
                                    dans les bases concernées

Concrètement : depuis un devis avec rupture locale, le commerçant clique Rétrocession, sélectionne les lignes à transférer et les quantités. La rétrocession est créée simultanément dans les bases des deux magasins (via un pont d’API inter-bases). Le magasin fournisseur la voit dans son onglet « À fournir » et peut soit refuser, soit créer une facture inter-magasins (prix d’achat HT pré-rempli, sans marge — c’est du transfert, pas de la revente entre magasins).

Pour les vélos sérialisés, le magasin fournisseur sélectionne obligatoirement l’exemplaire précis (par S/N) qu’il transfère — pas juste « un Trek Domane SL5 ». La facture clôt la rétrocession et les stocks s’ajustent dans les deux bases.

Sous le capot

  • Modèles Yii2 : StockMovement (log central de tous les mouvements, immuable), Inventory + InventoryLine, SupplierOrder + SupplierOrderLine, Reception + ReceptionLine, SupplierInvoice, Retrocession.
  • Quantité en stock = vue agrégée : la quantité n’est pas un champ stocké sur Product mais calculée à la volée via SUM(quantity) FROM stock_movement WHERE product_id=X. Garantit la cohérence : la quantité affichée est par définition la somme des mouvements, impossible d’avoir une dérive.
  • Inventaire mode « Ouvert » : à la clôture, le système calcule quantité_compte − quantité_attendue_avec_mouvements_de_la_journée. Algo classique de réconciliation, idéal pour un magasin qui ne peut pas fermer 2 jours.
  • Détection BLE : requête SQL SELECT * FROM ble_tag WHERE last_seen_at > NOW() - INTERVAL 30 MINUTE. Les détections viennent de l’app Flutter qui POST sur /api/ble/detections (cf article catalogue).
  • Veloconnect : classe VeloconnectClient qui parle XML aux endpoints standards OrderSubmit, OrderConfirm, OrderStatus. Job en file d’attente avec retry exponentiel en cas d’échec réseau.
  • Rétrocession inter-base : le mécanisme le plus délicat. Implémenté via une API HTTP signée (HMAC SHA-256) entre les deux instances CRM Cycles. La création atomique des deux côtés (magasin demandeur + magasin fournisseur) utilise un protocole 2-phase commit léger : phase 1 = preflight check côté fournisseur (a-t-il le stock ?), phase 2 = double-écriture coordonnée. Échec = rollback des deux côtés.
  • Mouvements de stock immuables : la table stock_movement est en append-only, jamais d’UPDATE/DELETE. Une « correction » = un nouveau mouvement de type Ajustement inventaire. C’est la base de l’audit comptable.

Ce qu’on gagne au quotidien

  • Stock toujours juste, en temps réel : la quantité affichée est la somme des mouvements, impossible d’avoir une « stock Excel » qui diverge.
  • Inventaire 4 à 10 fois plus rapide : scan douchette + BLE pour les vélos = en 2 heures au lieu de 2 jours.
  • Pas de surstock invisible : le rapport d’écart de l’inventaire valorise les surplus/manquants en euros — un coup d’œil suffit pour voir où sont les anomalies.
  • Commandes EDI sans email PDF : Veloconnect transmet les commandes aux grossistes directement, on récupère 24-48h de délai en moyenne.
  • Multi-magasins fluide : le commercial voit le stock des autres boutiques pendant qu’il établit un devis, et peut déclencher une rétrocession en deux clics si rupture locale.
  • Traçabilité comptable parfaite : chaque mouvement est lié à son document source. L’audit annuel se fait en lecture seule, pas en chasse aux fantômes.

Le prochain article couvrira le pilotage : rapports financiers, objectifs de vente par commercial, planning des emplois du temps, gestion des absences. Comment passer du quotidien « je vends, je facture » au pilotage « qu’est-ce qui marche, qui performe, et où ai-je un trou dans l’agenda atelier ».

Retour en haut