Comment corriger STANDARD_PRICE_NOT_DEFINED dans les déploiements Salesforce

Un enregistrement a besoin d'une entrée Standard Price Book pour le produit, mais aucune n'a encore été créée.

Se produit lors de : DML à l'exécution sur des objets de tarification, dans les migrations CPQ et les scripts de configuration produit

Ce que cela signifie

STANDARD_PRICE_NOT_DEFINED signifie qu'une opération, généralement l'ajout d'un produit à un price book personnalisé, ou sa référence sur une Quote ou une Opportunity Line, exige que le produit possède déjà une entrée Standard Price Book, et qu'il n'en existe aucune. Salesforce traite l'entrée Standard Price Book comme la base à partir de laquelle chaque entrée de price book personnalisée est construite.

Cette exigence d'ordre est une règle de la plateforme Salesforce, pas une règle spécifique à CPQ, elle s'applique donc que les produits soient créés via l'UI standard, Data Loader, ou les propres outils de provisioning d'un package CPQ.

Diagnostic

Causes courantes

Entrée de price book personnalisée créée avant l'entrée standard
Un script de migration insère un PricebookEntry personnalisé pour un produit sans d'abord créer son entrée Standard Price Book.
L'ordre de migration saute entièrement l'étape du pricebook standard
Un processus de chargement de données a été conçu autour des price books personnalisés et n'a jamais inclus d'étape pour les entrées standard.
Un nouveau produit a été ajouté directement à un price book personnalisé
Un produit créé via une automatisation ou un script a été relié directement à un price book personnalisé, en contournant le standard.

La solution

  1. Insérez d'abord l'entrée Standard Price Book
    Créez toujours l'entrée Standard Price Book d'un produit avant de l'ajouter à un price book personnalisé.
    Id standardPbId = Test.getStandardPricebookId();
    insert new PricebookEntry(
        Pricebook2Id = standardPbId,
        Product2Id = productId,
        UnitPrice = 100,
        IsActive = true
    );
  2. Séquencez les migrations de tarification dans le bon ordre
    Ordonnez la migration afin que les entrées standard soient créées dans une étape distincte, antérieure aux entrées de price book personnalisées.
  3. Auditez les produits sans entrées standard
    Après une migration, interrogez les produits ayant des entrées de price book personnalisées mais aucune entrée Standard Price Book et complétez-les.
En pratique

Comment Serpent évite cela

Serpent séquence les objets dépendants des données de la même manière qu'il séquence les dépendances de métadonnées, si bien qu'une migration CPQ insère les entrées Standard Price Book avant toute entrée de price book personnalisée qui en dépend. Voir la bibliothèque des erreurs de déploiement Salesforce.

Métadonnées et données dans un seul flux de déploiement dans Serpent

Prévention

Faites de la création de l'entrée Standard Price Book la première étape de chaque script de création de produit
Intégrez l'insertion de l'entrée standard dans le même script ou trigger qui crée un nouvel enregistrement Product2, afin qu'elle ne puisse jamais être omise.
Intégrez Test.getStandardPricebookId() dans chaque factory de test liée aux produits
Standardisez dès le premier jour la configuration des données de test des objets de tarification sur Test.getStandardPricebookId(), car les tests Apex ne peuvent pas interroger directement le vrai Standard Price Book Id de l'org.
Effectuez un audit périodique des produits sans tarification standard
Planifiez un contrôle récurrent de tout enregistrement Product2 actif sans entrée Standard Price Book active, afin que les écarts apparaissent avant que la prochaine migration ne les rencontre.
Questions fréquentes

STANDARD_PRICE_NOT_DEFINED, les réponses

Tous les price books personnalisés ont-ils besoin qu'une entrée standard existe ?
Oui. Salesforce exige que le produit possède une entrée Standard Price Book active avant de pouvoir être ajouté à tout autre price book.
L'entrée Standard Price Book peut-elle avoir un prix différent de l'entrée personnalisée ?
Oui. L'entrée Standard Price Book doit simplement exister et être active ; le prix qu'elle porte peut différer librement de toute entrée de price book personnalisée pour le même produit.
Comment les tests Apex obtiennent-ils l'Id du Standard Price Book, puisqu'il n'est normalement pas interrogeable ?
Utilisez Test.getStandardPricebookId() dans le contexte de test ; interroger directement Pricebook2 avec IsStandard = true est bloqué en dehors de cette méthode spécifique au test.

Commencez gratuitement. Sans carte bancaire, sans installation, sans engagement.

Configuration en moins de 15 minutes. Aucune embauche DevOps nécessaire.

Curieux de livrer plus vite avant de vous lancer ? Parlons-en

Sans engagement.