Se rendre au contenu

Maîtriser les Achats & Approvisionnements dans Odoo 19 — Partie 1/4 : Contrats-cadres et appels d'offre

Saison 8 · Article 1/4 — Achats & Approvisionnements
26 avril 2026 par
Maîtriser les Achats & Approvisionnements dans Odoo 19 — Partie 1/4 : Contrats-cadres et appels d'offre
B.Mustapha

Saison 8 · Article 1/2 — Maîtriser les Achats

Contrats-cadres & Appels d'offre dans Odoo 19

Passer d'une saisie manuelle des bons de commande à une politique d'achat structurée : négocier un contrat-cadre annuel, mettre plusieurs fournisseurs en concurrence, comparer les offres, confirmer le gagnant. Tout en natif Odoo 19 CE, avec une vraie nouveauté v19 à connaître.

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.

Arbre de décision : achat récurrent négociable → Contrat-cadre ; achat ponctuel avec mise en concurrence → RFQ + Alternatives ; aboutit à un bon de commande validé.

É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.

Paramètres Odoo 19 — section Achats avec l'option Gérer les options d'achat cochée.

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 :

Liste des conventions d'achat InfoSphere avec le bouton Nouveau pour créer un contrat-cadre.

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.

Formulaire Contrat-cadre avec TechFourniss DZ, dates 2026, lignes chaise et écran, état Confirmé.

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.

RFQ rattachée au contrat-cadre BO00005, lignes avec prix négocié figé.

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.

Fiche produit Chaise avec l'onglet Achat montrant TechFourniss à 16 500 DZD lié au contrat-cadre.

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 :

Onglet Alternatives d'une RFQ BureauPro, bouton Créer une alternative visible.

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 :

Vue comparative groupée par produit — prix, date de livraison, total par fournisseur.

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 :

Dialogue What about alternatives — 3 options : Annuler les alternatives / Les conserver / Confirmer.

  • 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 :

Les achats

Acheter & Vendre

Frais d'import & Landed costs

Maîtriser les Achats

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

Prise en main d'Odoo 19 : interface, vues et paramétrage
Comprendre l'interface Odoo, les 7 vues, le mode développeur et les paramètres fondamentaux — le guide complet pour bien démarrer.