Se rendre au contenu

Stock par variante dans Odoo 19 CE — quants, orderpoints et routes différenciées

Saison 9 · Article 3/3 — Configurateur Produit
26 avril 2026 par
Stock par variante dans Odoo 19 CE — quants, orderpoints et routes différenciées
B.Mustapha

Saison 9 · Article 3/3 — Configurateur Produit

Stock par variante dans Odoo 19 CE

6 variantes du même produit, 6 stocks totalement indépendants. Le bestseller Noir / Réglables 4D part en rupture, le Bleu / Fixes dort à 15 unités. Comment Odoo 19 gère cette asymétrie ? Quants, orderpoints différenciés par PTAV, routes MTO ou MTS, scheduler automatique. Démo chiffrée sur la Chaise InfoChair Pro et sa réappro auto P00017 à 808 500 DZD.

Ce que tu vas apprendre

Stock par variante

Chaque product.product a ses propres stock.quant. Un template = 6 colonnes de stock distinctes.

Orderpoints différenciés

Min/max indépendants par variante — bestsellers à 10/30, modèles standards à 5/20, niches sans orderpoint.

Routes MTO ou MTS

Réappro à la commande pour les variantes premium, stock tampon pour les classiques. Une décision par variante.

1. La rupture qui fait revenir Inès dans le bureau de Karim

Karim vient de boucler le devis Cabinet Architecture de l'article précédent — 20 chaises InfoChair Pro réparties en grille, 408 500 DZD HT. Pendant qu'il prépare la confirmation, Inès débarque. Elle vient du parc commercial Bab Ezzouar : trois clients pro repartent les mains vides parce que la Noir / Réglables 4D est en rupture en magasin, alors que la Bleu / Fixes empile 15 chaises au sol qui ne tournent pas.

« On a 6 références dans Odoo », ouvre Inès. « 6 stocks, 6 vélocités, 6 marges. Mais tu en gères combien ? Une, parce que tu raisonnes au niveau du template. Sauf qu'Odoo, lui, sait raisonner au niveau de chaque variante. On va ouvrir l'app Inventaire et regarder ce qui s'y passe vraiment. »

Liste des 6 variantes Chaise InfoChair Pro Odoo 19 — stock par variante différencié 12, 0, 8, 3, 15, 6 unités, prix de vente 18500 DA pour Fixes et 22000 DA pour Réglables 4D, total 44 unités
Le bouton Variantes sur le template Chaise — 6 lignes, 6 stocks, total 44 unités à l'instant T.
Variante Stock disponible Diagnostic terrain
Noir / Fixes (variant 44)12OK confortable
Noir / Réglables 4D (variant 45)0RUPTURE — bestseller
Gris anthracite / Fixes (variant 46)8Modèle moyen
Gris anthracite / Réglables 4D (variant 47)3Niche, peu commandée
Bleu marine / Fixes (variant 48)15Stock haut, rotation lente
Bleu marine / Réglables 4D (variant 49)6Sous le seuil min
📖 Les 3 modèles ORM en jeu
  • stock.quant — la cellule élémentaire du stock. Quantité par couple (product.product, location). Un quant n'existe que si le stock est non nul.
  • stock.warehouse.orderpoint — la règle de réapprovisionnement. Min, max, déclencheur (manuel ou auto), route, sur une variante précise.
  • stock.route + stock.rule — l'algorithme de réappro. Acheter, fabriquer, MTO (commander à la demande), via un ou plusieurs entrepôts.

2. Les quants — un stock totalement indépendant par variante

Quand tu actives les variantes sur un template, Odoo crée immédiatement N product.product séparés. Chacun a sa propre fiche, sa propre référence interne, son propre stock. Le stock du template est juste une somme calculée, pas une vérité.

Voir les quants par variante

Chemin : Inventaire → Produits → Chaise ergonomique InfoChair Pro, puis bouton smart Variantes en haut. Tu obtiens la liste des 6 variantes avec colonne Disponible. C'est la capture ci-dessus — note le 0,00 en orange sur la Noir/Réglables 4D : Odoo signale visuellement la rupture quand un quant atteint zéro.

Comprendre le contenu d'un quant

Un stock.quant est défini par 3 champs minimum :

  • product_id — la variante exacte (product.product, pas product.template)
  • location_id — l'emplacement physique (ALG/Stock, ALG/Sortie, etc.)
  • quantity — la quantité réelle en stock

Tu peux multiplier les quants : la même variante peut être à la fois sur ALG/Stock, ALG/Réception, ALG/Sortie. Le stock disponible de la variante est la somme de tous ses quants sur les emplacements internes du périmètre.

💡 Inventaire physique = créer/ajuster les quants — si tu lances un inventaire sur la Chaise (menu Opérations → Inventaire physique), Odoo génère une ligne par variante × emplacement que tu valides ou corriges. Une ligne par (product.product, location), pas une ligne par template. Cela peut faire beaucoup pour les catalogues riches — d'où l'intérêt d'utiliser les filtres pour ne traiter qu'une variante à la fois.

3. Orderpoints différenciés par PTAV

Un orderpoint, c'est une règle de réapprovisionnement avec deux seuils : quantité min en dessous duquel Odoo déclenche un réappro, et quantité max jusqu'à laquelle il monte. Et la magie de la v19 : tu peux créer un orderpoint sur une variante précise, pas seulement sur le template. Donc 6 stratégies de stock différentes pour 6 variantes du même produit.

Chez InfoSphere — la stratégie variantes Chaise

Karim et Inès posent les seuils avec un raisonnement business :

Variante Min Max Justification
Noir / Réglables 4D 10 30 Bestseller — jamais en rupture, stock tampon haut
Bleu / Réglables 4D 8 25 Standard premium, demande régulière
Noir / Fixes 5 20 Modèle d'entrée volume modéré
Bleu / Fixes 5 20 Idem — pas de différence vs Noir/Fixes
Gris anthracite / Fixes Niche, on ne stocke pas — route MTO seule
Gris anthracite / Réglables 4D Niche × premium, jamais en stock

4 orderpoints créés, 2 variantes laissées sans (les Gris anthracite, modèles peu commandés que l'entreprise refuse de stocker — elles seront commandées à la demande via la route MTO décrite à la section 4).

Liste des règles de réapprovisionnement Odoo 19 — 5 orderpoints visibles dont 4 sur les variantes Chaise InfoChair Pro avec colonnes Disponible, Min, Max, À commander, deux lignes en orange avec bouton Commander pour les variantes Noir Réglables 4D et Bleu Réglables 4D nécessitant un réapprovisionnement de 30 et 19 unités
La vue Règles de réapprovisionnement — 4 OPs Chaise visibles, 2 nécessitent action immédiate (à commander = 30 et 19).

Le formulaire d'un orderpoint

Si tu cliques sur OP/00004 (la Noir / Réglables 4D), tu obtiens une fiche minimaliste mais complète : produit, entrepôt, emplacement de stock, quantité min, quantité max. Optionnellement un multiple (saisir par lots de 5 par exemple) et un déclencheur (manuel ou automatique).

Formulaire orderpoint OP/00004 Odoo 19 — produit Chaise ergonomique InfoChair Pro Noir Réglables 4D, quantité min 10 unités, quantité max 30 unités, entrepôt Entrepôt Alger, emplacement ALG/Stock
OP/00004 — la règle qui surveille le bestseller. Min 10, Max 30, déclencheur automatique.

Le calcul `qty_to_order_computed`

Quand le scheduler tourne (par défaut chaque nuit, ou sur déclenchement manuel), Odoo calcule pour chaque orderpoint :

qty_to_order = max(0, max_qty - virtual_available) si virtual_available < min_qty
sinon qty_to_order = 0

Sur OP/00004 : virtual_available = 0 (rupture totale), donc 0 < 10 (min) → on commande max - virtual = 30 - 0 = 30 unités. Sur OP/00005 (Bleu/4D) : virtual = 6 < 8 (min) → on commande 25 - 6 = 19 unités. Sur OP/00006 (Noir/Fixes) : virtual = 12 > 5 (min) → 0 à commander.

Diagramme du flux stock par variante Odoo 19 — template Chaise InfoChair Pro avec 6 variantes différenciées par stock (rupture, OK, sous-min), scheduler quotidien et décision réappro générant le PO P00017 vers TechFourniss DZ pour 808 500 DZD
Le flux complet — 6 variantes avec leur stratégie, 4 orderpoints, 1 scheduler, 1 PO factorisé.

4. Routes différenciées — MTO sur les premiums, MTS sur les classiques

La route indique comment Odoo va réapprovisionner. Trois grandes options en CE :

  • Acheter (Buy) — auto-attribuée à tous les produits avec purchase_ok=True. Génère une demande de prix vers le fournisseur défini sur la fiche.
  • Réapprovisionner sur commande (MTO) — chaque vente déclenche immédiatement une commande fournisseur, sans attendre le scheduler. Pas de stock tampon.
  • Fabriquer — disponible si l'app MRP est installée. Génère un ordre de fabrication.

Et la flexibilité v19 : les routes peuvent être assignées à la variante (champ route_ids sur product.product), pas seulement au template. Donc tu peux mixer : Réglables 4D en MTO seul, Fixes en MTS via Acheter, sur le même template. La doc officielle détaille tous les cas d'usage dans le guide de réapprovisionnement Odoo 19.

Fiche produit variante Chaise InfoChair Pro Gris anthracite Réglables 4D Odoo 19 — onglet Inventaire avec section Opérations affichant la route Réapprovisionner sur commande MTO cochée, stock disponible 3 unités, aucune règle de réapprovisionnement définie
La variante Gris / Réglables 4D en route MTO seule — 3 u en stock, jamais de réappro automatique, on commande quand un client commande.

Stratégie InfoSphere appliquée

  • Bestsellers (Noir/4D, Bleu/4D) : Acheter + orderpoint min/max — stock tampon pour répondre aux pics
  • Standards (Noir/Fixes, Bleu/Fixes) : Acheter + orderpoint plus modeste
  • Niches (Gris anthracite, deux variantes) : MTO seul — on ne stocke pas, le client attend le délai fournisseur (1 jour chez TechFourniss DZ)
⚠️ MTO sans fournisseur = blocage commande — si une variante en MTO n'a pas de fournisseur rattaché à son template, la SO se bloque sur erreur procurement. Vérifie l'onglet Achats du template avant de basculer une variante en MTO. Pour la Chaise InfoChair, TechFourniss DZ est défini avec un prix de 16 500 DZD et un délai d'1 jour — toutes les variantes en héritent.

5. Le scheduler génère le PO automatique

Le scheduler de réappro est un cron quotidien qui balaye tous les orderpoints et déclenche les actions nécessaires. Tu peux aussi le forcer manuellement via le menu développeur, ou ligne par ligne via le bouton Commander dans la liste des règles. C'est ce qu'on a vu sur la capture précédente : 2 boutons orange en regard des orderpoints qui réclament action.

Le PO P00017 généré pour InfoSphere

Une fois le réappro déclenché sur OP/00004 (Noir/4D, 30 u) et OP/00005 (Bleu/4D, 19 u), Odoo crée une seule demande de prix (les 2 lignes ont le même fournisseur TechFourniss DZ). Si les fournisseurs étaient différents, on aurait 2 PO distincts.

Demande de prix P00017 Odoo 19 fournisseur TechFourniss DZ — 2 lignes Chaise ergonomique InfoChair Pro Noir Réglables 4D 30 unités à 16500 DA et Bleu marine Réglables 4D 19 unités à 16500 DA, origine réappro suite OP/00004 et OP/00005, montant hors taxes 808500 DA TVA 19% 153615 DA total 962115 DA
P00017 — la demande de prix générée par le scheduler. 2 variantes regroupées chez le même fournisseur, total 962 115 DZD TTC.
Ligne PO Qté PU Sous-total HT Origine OP
Chaise (Noir / Réglables 4D)3016 500495 000OP/00004 — bestseller en rupture
Chaise (Bleu / Réglables 4D)1916 500313 500OP/00005 — stock faible
Total HT49808 500
TVA 19%153 615
Total TTC962 115

Karim n'a plus qu'à Confirmer la commande (un clic), envoyer la demande de prix au fournisseur, et le réappro suit son cours normal. Au prochain passage du scheduler, OP/00004 et OP/00005 verront que la commande est déjà émise (incoming_qty > 0) et ne déclencheront pas un second PO. Pas de double commande.

💡 Le scheduler factorise par fournisseur ET par entrepôt — si tu as 3 OPs sur 3 variantes du même fournisseur, tu obtiens 1 PO avec 3 lignes. Si tu en as sur 2 fournisseurs différents, 2 POs distincts. C'est géré par les procurement.group (un par couple OP+date) qui se regroupent au niveau du stock.rule. Tu n'as rien à coder ni à configurer.

6. Pièges et bonnes pratiques v19

⚠️ stock.valuation.layer SUPPRIMÉ en v19 — si tu lis d'anciens tutos ou si tu migres depuis v17/v18, sache que ce modèle a été remplacé par les champs value, remaining_qty, remaining_value directement sur stock.move, plus un nouveau modèle product.value. La valorisation de stock est entièrement refondue. Code custom à auditer avant migration.
⚠️ procurement.group SUPPRIMÉ aussi en v19 — l'API de scheduling change. La méthode pour forcer le scheduler depuis du code est self.env['stock.rule'].run_scheduler() (classmethod, plus de procurement.group à instancier). Les tâches de réappro existantes en custom v17/v18 sont à réécrire.
⚠️ Orderpoint sur template ≠ orderpoint sur variante — si tu crées par erreur un orderpoint avec product_tmpl_id sans préciser de variante, Odoo l'ignore silencieusement à l'exécution (pas de variante = pas de stock à surveiller). Vérifie toujours que product_id pointe sur un product.product spécifique.
⚠️ Champ qty_multiple SUPPRIMÉ — il a été remplacé par qty_to_order_computed et qty_to_order_manual. La colonne Multiple n'apparaît plus que sur certains layouts. Pour saisir des multiples (par exemple commander par lots de 5), passe par la quantité minimale fournisseur (product.supplierinfo.min_qty) sur l'onglet Achats du template.

Bonnes pratiques InfoSphere

  • Définis ta segmentation variantes AVANT de poser les seuils. Bestseller / Standard / Niche — 3 catégories de comportement qui dictent les min/max. Pas 6 valeurs uniques par catégorie de couleur.
  • Réserve la route MTO aux variantes peu commandées. Au-delà d'1 vente par semaine, le délai fournisseur devient pénalisant. MTS + orderpoint est presque toujours préférable.
  • Vérifie les délais fournisseur sur les variantes premium. Si ton bestseller est en rupture et que le délai est de 7 jours, ton orderpoint min doit couvrir 7 jours de vente — pas un chiffre arbitraire. Le champ days_to_order sur l'orderpoint sert à intégrer ce délai dans le calcul.
  • Garde les Gris anthracite dans le catalogue mais en MTO. Tu offres le choix au client tout en évitant le coût de stockage. Mieux vaut une vente avec délai qu'une non-vente.
  • Laisse le scheduler tourner la nuit. Forcer le run_scheduler manuellement plusieurs fois par jour multiplie les calculs sans bénéfice. Une fois par 24h suffit pour 99% des PME.

À retenir

📦 Stock indépendant par variante

Chaque product.product a ses propres stock.quant et son stock disponible. Le template ne contient qu'une somme calculée. 6 variantes = 6 stocks gérés séparément.

⚙️ Orderpoints différenciés par PTAV

Min/max indépendants par variante. Bestseller à 10/30, standard à 5/20, niche sans orderpoint. Une stratégie de stock par couple (coloris, accoudoirs).

🔀 Routes assignées à la variante

Champ route_ids sur product.product, pas seulement sur le template. MTO sur les premiums, MTS sur les classiques, sur le même template Chaise.

🤖 Scheduler factorise les PO

Un seul PO par fournisseur, plusieurs lignes pour plusieurs variantes. Pas de double commande au passage suivant (incoming_qty surveillé). Cron quotidien, déclenchable manuellement.

Saison 9 bouclée

Tu sais maintenant créer des variantes (Partie 1), les vendre 20 d'un coup en grille (Partie 2), et gérer leur stock de manière différenciée. La Saison 10 — Revenue Management commence avec les promotions multicanal déjà publiées, et continue avec les pricelists par segment et la fidélité.

💼 Approfondir — Prospection & Ventes

Autres articles du même domaine :

Les ventes

Acheter & Vendre

Le CRM

Acheter & Vendre

Articles complémentaires

Sur les mêmes thématiques : #intermediaire#cas-pratique

Recrutement RH

👥 Ressources humaines · Saison 4

Congés & Présence RH

👥 Ressources humaines · Saison 4

Site vitrine

🛍 Site web & eCommerce · Saison 5

Matrix configurator dans Odoo 19 CE — saisir N variantes en une grille
Saison 9 · Article 2/3 — Configurateur Produit