Ce que tu vas apprendre
Activer le module
Conventions d'achat + option « Gérer les options d'achat ».
Contrat-cadre
Négocier prix et volumes sur l'année, générer les RFQ au fil de l'eau.
Appel d'offre v19
Les Alternatives ont remplacé le type « tenders ». Attention au piège !
Choisir la meilleure offre
Comparer, sélectionner, confirmer — gérer les alternatives restantes.
Pourquoi InfoSphere structure ses achats
Depuis l'ouverture du point de vente, le déploiement des campagnes marketing et la structuration du circuit d'achat de base, l'équipe d'InfoSphere grandit. Trois nouveaux collaborateurs arrivent le trimestre prochain, et la direction technique veut refaire la salle serveurs. Karim, fondateur et responsable des achats, se retrouve avec deux problèmes très différents :
- Équiper récursivement les postes — chaises ergonomiques, écrans 27 pouces, fournitures. Karim sait déjà qu'il en faudra 15-20 unités d'ici la fin de l'année. Il veut fixer un prix négocié sur volume avec son fournisseur historique et ne plus repasser par une négociation à chaque commande.
- Investir sur du ponctuel lourd — un serveur rack 2U et des switches 48-port. Budget conséquent (~1 million DZD), une seule commande. Karim veut mettre en concurrence 3 fournisseurs et garder la traçabilité des offres pour justifier le choix à sa comptable Inès.
Ces deux besoins appellent deux outils distincts dans Odoo 19. Et c'est précisément là que la version 19 change les règles par rapport aux versions antérieures.
Quel outil pour quel besoin ?
Arbre de décision achats récurrents vs achats ponctuels concurrentiels.
Étape 1
Activer Conventions d'achat et Options d'achat
Le module qui gère les contrats-cadres s'appelle Conventions d'achat
(techniquement purchase_requisition). Il est installé à la demande —
pas dans le socle des Achats. Pour l'activer :
Achats → Configuration → Paramètres → Gestion des Commandes, puis coche deux options :
- Conventions d'achat — active le menu dédié aux contrats-cadres et aux modèles d'achat.
- Gérer les options d'achat — active le mécanisme des Alternatives sur les RFQ. C'est cette option qui te permet de faire des appels d'offre en v19 — on y revient juste en-dessous.
Sauvegarde. Odoo recharge et tu vois apparaître un nouveau sous-menu Commandes → Conventions d'achat et un onglet Alternatives dans toute fiche RFQ.
⚠️ Changement majeur v19 — les « Tenders » ont disparu
Jusqu'en Odoo 16, le champ purchase.requisition.requisition_type
proposait trois valeurs : blanket_order, tenders,
purchase_template. On lançait un appel d'offre en créant une
« convention de type Tender ».
Depuis la v17, et confirmé en v19, la valeur tenders
a été retirée. Les appels d'offre passent désormais par un mécanisme
complètement séparé : les Alternatives
(purchase.order.group + alternative_po_ids). Tu crées
une RFQ normale, tu la duplique en plusieurs « alternatives » concurrentes,
tu compares, et tu confirmes la gagnante.
Pourquoi ce changement ? La séparation est plus propre conceptuellement : un contrat-cadre engage un partenariat long-terme avec UN fournisseur ; un appel d'offre est une consultation ponctuelle entre N fournisseurs. Les mettre dans le même modèle créait de la confusion.
Étape 2
Négocier un contrat-cadre avec TechFourniss DZ
Karim a négocié avec TechFourniss DZ, son fournisseur historique : 20 chaises ergonomiques à 16 500 DZD l'unité (au lieu de 18 500 tarif liste) et 15 écrans IPS 27 pouces à 28 000 DZD (au lieu de 32 000). Engagement sur l'année 2026.
Menu Achats → Commandes → Conventions d'achat → Nouveau :
Sur le formulaire, remplis :
- Type d'accord :
Contrat-cadre(valeur par défaut). - Fournisseur : TechFourniss DZ. Odoo te propose automatiquement la devise DZD si c'est celle configurée sur la fiche fournisseur.
- Date de début / Date de fin : 01/01/2026 au 31/12/2026. Une contrainte Python bloquera la confirmation si tu inverses.
- Responsable des achats : Karim (pré-rempli).
- Description : contexte, volumétrie prévue, conditions de paiement (30j fin de mois dans notre cas).
Dans l'onglet Produits à acheter, ajoute les lignes : chaise ergonomique (qty 20, prix 16 500), écran 27" (qty 15, prix 28 000). Le prix est obligatoire et strictement positif — un prix 0 est refusé par l'ORM à la confirmation.
Clique sur Confirmer. L'état passe à Confirmé et —
point important — Odoo crée automatiquement une entrée dans la liste
des fournisseurs (product.supplierinfo) pour chaque ligne,
avec le prix négocié. Cela signifie que dès cet instant, le MRP ou le reordering
automatique utiliseront ce prix par défaut.
Étape 3
Consommer le contrat-cadre au fil de l'eau
Trois semaines plus tard, Karim a besoin de 5 chaises et 3 écrans pour les deux premiers arrivants. Il ne recrée pas un devis from scratch : il tire sa commande du contrat-cadre.
Sur la fiche du contrat-cadre, clique sur Nouvelle commande (bouton intelligent en haut). Odoo crée une RFQ (Request For Quotation) pré-remplie avec :
- Le fournisseur TechFourniss DZ.
- La devise, la fiscalité, les conditions de paiement issues de la fiche partenaire.
- Les lignes produits du contrat, avec quantité à 0 (à toi de saisir combien tu commandes cette fois) et le prix négocié figé.
Saisis 5 chaises et 3 écrans, sauvegarde. Tu obtiens ta RFQ rattachée au contrat, visible dans le champ Convention d'achat.
Confirme la RFQ en bon de commande. Retour sur le contrat-cadre : le champ Commandé de chaque ligne se met à jour — 5 chaises sur 20 commandées, 3 écrans sur 15. Karim visualise en un coup d'œil la consommation de son enveloppe annuelle.
💡 Astuce
La comparaison Commandé vs Quantité est une excellente métrique pour négocier la reconduction du contrat l'année suivante. Si tu as consommé 18/20 chaises, le fournisseur sait que le partenariat vaut le coup de prolonger ; s'il reste 15 chaises non commandées en octobre, tu as un argument pour demander un rabais supplémentaire.
Étape 4
Le prix négocié suit le produit partout
Ouvre la fiche produit Chaise ergonomique InfoChair Pro, onglet Achat. Tu vois une ligne fournisseur TechFourniss DZ avec le prix 16 500 DZD, flaguée comme issue de la convention d'achat active.
Cette entrée est synchronisée automatiquement avec le contrat. Si demain tu modifies
le prix sur une ligne de la convention (typique après une renégociation mi-année),
le supplier.info est mis à jour dans la foulée — tu n'as rien à faire
manuellement. Et si tu clôtures le contrat (bouton Clôturer),
les supplier.info liés sont supprimés pour éviter que le prix expiré ne fuite sur
de futures commandes.
📖 Définition — RFQ (Request For Quotation) : c'est un bon de commande à l'état brouillon. Tant qu'il n'est pas confirmé, aucun mouvement de stock ni écriture comptable n'est généré. La RFQ est l'unité de travail de base dans Odoo Achats — c'est elle qui porte l'appel d'offre, le contrat-cadre déclenché, ou l'achat spontané.
Étape 5
Organiser un appel d'offre via les Alternatives
Pour le serveur rack et les switches, Karim veut mettre trois fournisseurs en concurrence : BureauPro (spécialiste mobilier qui propose aussi du réseau), ImportEquip (importateur matériel serveur), et TechFourniss DZ (qui diversifie).
En v19, l'appel d'offre se construit en partant d'une RFQ normale que tu dupliques en plusieurs alternatives.
5.1 — Créer la RFQ pivot
Menu Achats → Nouveau. Fournisseur : BureauPro. Ajoute les deux lignes produits : Serveur rack 2U InfoRack-R2 (qty 2, prix 335 000 DZD) et Switch 48 ports Gigabit (qty 4, prix 65 000 DZD). Sauvegarde mais ne confirme pas — la RFQ reste à l'état brouillon.
5.2 — Dupliquer en alternatives
Onglet Alternatives (apparu grâce à l'option activée en Étape 1). Bouton Créer une alternative :
Un wizard te demande :
- Le nouveau fournisseur pour l'alternative (ex : ImportEquip).
- Si tu veux copier les lignes produits de la RFQ initiale (coche par défaut).
- Une note optionnelle.
Valide. Odoo crée une seconde RFQ pour le même groupe d'achat avec les mêmes produits, que tu ajustes ensuite avec les prix de ImportEquip (318 000 DZD pour le serveur, 59 500 DZD pour le switch).
Répète pour TechFourniss DZ (345 000 + 62 000). Tu as maintenant 3 RFQ
liées entre elles via un purchase.order.group interne.
5.3 — Comparer les offres
Sur n'importe laquelle des 3 RFQ, onglet Alternatives, bouton Comparer les lignes de produits :
Odoo affiche une vue liste groupée par produit. Pour chaque produit,
tu vois les 3 lignes concurrentes triées par montant total : Odoo met
visuellement en évidence la meilleure offre par produit via la méthode
get_tender_best_lines. Karim constate qu'ImportEquip gagne sur les
deux produits, mais BureauPro offre un délai de livraison plus court.
🎯 À retenir
La vue comparative permet un split order : rien n'oblige à tout commander chez le même fournisseur. Tu peux très bien prendre le serveur chez ImportEquip et les switches chez BureauPro si les délais l'imposent. Les actions Effacer les quantités sur les lignes perdantes sont prévues pour ça.
Étape 6
Confirmer le gagnant et gérer les perdants
Karim choisit ImportEquip pour tout (meilleur prix, délai acceptable). Il ouvre la RFQ ImportEquip et clique sur Confirmer la commande.
Odoo détecte qu'il existe 2 autres RFQ alternatives encore à l'état brouillon et ouvre un wizard de décision :
- Annuler les alternatives — les 2 RFQ perdantes passent à l'état Annulé. Propre, traçable.
- Conserver les alternatives — elles restent en brouillon. Utile si tu attends encore une contre-offre.
- Continuer sans action — confirme juste la RFQ gagnante, les autres restent telles quelles (équivalent à Conserver).
Karim choisit Annuler les alternatives. Le bon de commande ImportEquip est confirmé ; les deux autres basculent en Annulé avec un message dans le chatter : « Cancelled by the agreement associated to this quotation ». Inès retrouvera toute la traçabilité de la mise en concurrence à l'audit, et elle enchaînera naturellement avec le contrôle de la facture via le cycle facturation et paiements.
Pièges à éviter
⚠️ Dates inversées sur un contrat-cadre
Contrainte _check_dates : si tu saisis une
date de fin antérieure à la date de début, Odoo lève une
ValidationError au moment de sauvegarder. Aucun moyen de contourner,
c'est vérifié au niveau ORM.
⚠️ Prix à zéro interdit sur contrat-cadre confirmé
Ajouter ou modifier une ligne à prix 0 sur un contrat
déjà confirmé lève un UserError. Si tu dois corriger
un prix, repasse d'abord le contrat en brouillon via
Remettre en brouillon.
⚠️ Changer le Type d'accord après confirmation
Impossible. Le write() du modèle bloque tout
changement de Type d'accord ou d'entreprise sur un contrat qui n'est
pas en brouillon. À l'inverse, en brouillon, le changement déclenche un
renumérotage automatique via une nouvelle séquence.
⚠️ Clôturer un contrat = perdre le prix négocié
Le bouton Clôturer (état Fermé)
supprime les supplier.info attachés au contrat. Les prochaines
commandes chez ce fournisseur repartiront du prix liste ou d'un autre fournisseur
trouvé. Prévois la reconduction avant la date de fin, pas après.
⚠️ Appels d'offre sans l'option activée
Si l'onglet Alternatives n'apparaît pas sur tes RFQ,
c'est que tu n'as pas coché Gérer les options d'achat dans
les Paramètres. L'utilisateur doit aussi avoir le groupe
Purchase Alternatives.
Bonnes pratiques
- 1 contrat-cadre = 1 fournisseur. Pour multi-fournisseurs sur un même produit, tu utilises les Alternatives, pas les conventions.
- Description riche : remplis l'HTML description avec conditions de paiement, pénalités, clause de révision. C'est affiché dans la RFQ générée et devient une preuve contractuelle.
- Active l'onglet Alternatives pour le responsable achats uniquement. Groupe dédié — évite que chaque acheteur opérationnel fasse des appels d'offre sauvages.
- Traçabilité perdue = audit perdu. En appel d'offre, préfère Annuler les alternatives plutôt que de les laisser en brouillon : l'état Annulé garde l'historique du processus de décision.
La facture ImportEquip arrive… et surprise !
Le serveur est livré. Inès reçoit la facture du transitaire : fret, douane, assurance — presque 12% du montant du bon de commande. Ces coûts n'apparaissent nulle part dans la valorisation du stock, et pourtant ils font partie du coût réel du matériel.
Dans la Partie 2, on verra comment Odoo 19 répartit
ces frais d'importation sur les produits reçus via le module
stock_landed_costs. On parlera aussi de la ventilation par quantité,
poids, volume ou montant, et de l'impact comptable FIFO/AVCO.
À paraître — Partie 2 : Frais d'importation & Landed Costs
À retenir
🤝 Contrat-cadre
Pour les achats récurrents à volumes négociés. Menu Conventions d'achat, type Contrat-cadre, dates + lignes + prix. Génère les RFQ au fil de l'eau, auto-met à jour le prix fournisseur sur les produits.
⚔️ Appel d'offre
Pour la mise en concurrence ponctuelle. En v19 : pas de type « tenders » ! Tu crées une RFQ classique, tu la duplique via Créer une alternative, tu compares et tu confirmes la gagnante.
⚠️ Activer les options
Module Conventions d'achat installé à la demande. Paramètre Gérer les options d'achat à cocher pour faire apparaître l'onglet Alternatives.
🔒 Traçabilité
À la confirmation d'une RFQ, le wizard te propose d'annuler/conserver les alternatives. Annuler garde l'historique de la décision, c'est ton filet pour les audits.
🛒 Approfondir — Achats & Fournisseurs
Autres articles du même domaine :
Acheter & Vendre
Maîtriser les Achats
Valorisation de stock (Standard, FIFO, AVCO)
Maîtriser les Achats
Suite de la Saison 8 — Maîtriser les Achats
Articles complémentaires
Sur les mêmes thématiques : #intermediaire#cas-pratique
👥 Ressources humaines · Saison 4
👥 Ressources humaines · Saison 4
🛍 Site web & eCommerce · Saison 5