Stock : consultation, ajustements, comptages et transferts
Consultez le stock sur bureau et mobile, passez des ajustements directs, lancez des comptages cycliques (dont ABC auto) et transférez entre entrepôts.
Le stock utilise un grand livre en ajout seul (wms_inventory_ledger) comme source unique de vérité : chaque mouvement écrit une ligne avec un qty_change positif/négatif ; les soldes ne sont jamais modifiés directement. La projection des soldes est maintenue par le système et le livre interdit UPDATE/DELETE au niveau base.
Consulter le stock#
- Bureau WMS → Inventory : vue détail (filtres SKU, emplacement, statut, lot, série, canal…) et vue synthèse (quantités par article + statut + type).
- Page stock mobile : recherche par SKU ou nom ; les cartes affichent SKU/nom/emplacement/quantité (lecture seule).
- Le stock par lot est trié par péremption croissante (FEFO). Les alertes de péremption (expiry-alerts?days=90) listent le stock available dont la péremption est dans aujourd’hui+jours, avec days_to_expiry.
Ajustements de stock (mode direct)#
Les ajustements sont écrits directement dans le livre : pas de machine à états de « document d’ajustement » ni de flux d’approbation. Le point d’entrée actuel est l’API (POST /api/wms/inventory/adjust) ; pas encore de page bureau dédiée, et la permission wms.inventory_adjust est requise.
- Obligatoire : warehouse_id, location_id, item_id, reason_code (texte libre type damage/lost/found ; pas de référentiel de codes).
- Quantité, au choix : qty_after (ajuster à une valeur cible) ou qty_delta (variation non nulle). Les deux ou aucune échoue la validation ; qty_after avec delta zéro renvoie {adjusted:false} sans écriture.
- Le statut ne peut être que available / hold / damaged (défaut available). Les ajustements négatifs valident d’abord le disponible (WMS_STOCK_001 si insuffisant) ; emplacements verrouillés par un comptage → LOCATION_LOCKED.
- Une ligne est écrite avec transaction_type=adjust, qty_change=delta (positif = augmentation, négatif = diminution) et reason_code obligatoire.
Comptages cycliques#
- Créez la tâche (bureau/API) : scope cycle (comptage cyclique), full (auto-génère jusqu’à 5000 lignes) ou spot (échantillon) ; count_type blind ou open (défaut open). Un instantané system_qty est enregistré ; chevaucher les emplacements d’un comptage inachevé rejette la création (c’est là que le verrou agit).
- Exécutez sur mobile : saisissez la quantité comptée par ligne → enter-count envoie une ligne à la fois (les lignes comptées affichent système/compté/écart ; ressaisir marque recounted). La tâche passe en in_progress.
- Approuvez sur bureau : approve fait passer les lignes en approved ou les renvoie en pending (compté et écart effacés) pour recompter.
- Comptabilisez : post ne traite que les lignes approved (écart zéro ignoré). Excédents → adjust avec reason_code=found, manquants → lost (reference_type=count_task). Une fois terminé, la tâche se clôt et les verrous sont libérés.
- Comptages auto ABC : POST /api/wms/count-tasks/abc génère des tâches cycle à l’échéance de l’intervalle de la classe ABC. Défaut A=7 jours, B=30, C=90 ; surchargeable par entrepôt ou par appel. Déclenché par cron ou manuellement.
Transferts inter-entrepôts#
Les transferts sont documentaires (brouillon → soumettre → approuver → expédier → réceptionner), actuellement API uniquement ; pas encore de page bureau. Numéro : TRF-YYYYMMDD-XXXX. Le déplacement entre deux emplacements du même entrepôt est autorisé.
- Créer → draft ; submit → submitted.
- approve : approved valide le disponible de chaque ligne en source (insuffisant → WMS_STOCK_001) ; rejected termine le flux.
- ship → in_transit : revalide le disponible → écrit la double jambe (source available −qté / même emplacement in_transit +qté).
- receive → completed : source in_transit −qté / destination available +qté ; lignes à done. Annulation possible seulement depuis draft/submitted/approved ; in_transit ne se termine qu’en réceptionnant.
Statuts du stock#
available → allocated lors de la réservation pour picking/sortie → shipped à l’expédition. Les blocages qualité vont en hold, les casses en damaged ; après expédition d’un transfert, la source passe en in_transit. Les ajustements n’acceptent que available/hold/damaged.