Périmètre

Back Office

  • Ajout de la suppression d'adresse dans le détail d'un account

La suppression d’une adresse directement depuis la page de détail d’un account est désormais possible, avec les contraintes suivantes :

  • Un account doit toujours posséder au moins une adresse de billing.
  • L’option de suppression n’est donc disponible que si l’account a plus d’une adresse.

  • Ajout de la possibilité de configurer les URLs front d'un environnement (hors multi-stores)

Il est désormais possible de configurer les URLs front d'un environnement mono store comme il était possible de le faire pour les environnements multi-stores.

La page Application Settings a été complétée pour configurer ces URLs en autonomie.


API

📘

NEW

Operations

  • Récupération des opérations visibles par un acheteur

Contexte :

Les customer users (acheteurs) peuvent désormais consulter la liste des opérations actives auxquelles leur compte a accès, directement depuis leur environnement connecté.

Cette évolution leur permet de découvrir les campagnes en cours et de démarrer leurs achats sur les opérations pertinentes selon leur store et leurs droits.

⚙️ Cette route est réservée aux clients de type ACCOUNT et protégée par le Feature Flag OPERATIONS.

Fonctionnement métier :

  • Visibilité
    • Seules les opérations au statut ACTIVE et actives temporellement sont visibles (now ∈ [startDate, endDate]).
    • Type PUBLIC → visible par tous les accounts rattachés au store effectif.
    • Type PRIVATE → visible uniquement si le customer user ou son account est explicitement associé à l’opération.

API correspondante :

🔍 Récupérer les opérations visibles pour l’acheteur

OPERATION-550 - GET /v1/shop/operations

{
  "operations": [
    {
      "id": "SUMMER_OPE_0825",
      "name": "Summer Operation · Fine Food",
      "type": "PRIVATE",
      "startDate": "2025-11-21T00:00:00Z",
      "endDate": "2025-11-28T23:59:59Z",
      "createdAt": "2025-08-04T12:34:56Z"
    }
  ]
}

  • Récupération unitaire d’une opération par l’acheteur

Contexte :

Les customer users (ACCOUNT) peuvent désormais consulter le détail d’une opération spécifique à laquelle ils ont accès, directement depuis leur environnement connecté.

Cette évolution permet d’afficher la page de détail d’une opération (nom, description, période, champs personnalisés, etc.) sans exposer l’ensemble du catalogue de produits associé.

⚙️ Cette route est réservée aux clients ACCOUNT et protégée par le Feature Flag OPERATIONS. 🔒 Elle ne renvoie que les métadonnées d’une opération (pas les lignes produits).

Fonctionnement métier :

  • Visibilité
    • Seules les opérations :
      • au statut ACTIVE,
      • et actives temporellement (now ∈ [startDate, endDate]) sont consultables.
    • Les opérations de type PUBLIC sont visibles par tous les accounts du store effectif.
    • Les opérations de type PRIVATE ne sont visibles que si le customer user ou son account y est explicitement associé.

API correspondante :

🔍 Récupération unitaire d’une opération

OPERATION-500 - GET /v1/shop/operations/{operationId}

{
  "id": "VIP_OPE_2025",
  "type": "PRIVATE",
  "status": "ACTIVE",
  "startDate": "2025-09-01T00:00:00Z",
  "endDate": "2025-09-30T23:59:59Z",
  "createdAt": "2025-07-20T09:00:00Z",
  "name": "VIP Autumn Sale",
  "description": "Exclusive offers for selected accounts.",
  "customFieldValues": [
    {
      "customField": {
        "externalId": "TAX_RATE",
        "externalSource": "MIRAKL",
        "name": {
          "en-GB": "Tax rate",
          "fr-FR": "Taux de taxe"
        },
        "role": "PRODUCT_TAX_RATE",
        "status": "ACTIVE"
      },
      "value": "5%"
    }
  ]
}

  • Récupération des lignes d’une opération par l’acheteur

Contexte :

Les customer users (acheteurs) peuvent désormais récupérer la liste des produits (variants) d’une opération à laquelle ils ont accès, avec leurs libellés localisés et contraintes de quantités (minQuantity, maxQuantity, recommendedQuantity).

Cette évolution permet d’afficher l’assortiment réel visible pour le compte connecté, en respectant le scoping catalogue et les règles de visibilité applicables au store effectif.

⚙️ Cette route est réservée aux clients de type ACCOUNT et protégée par le Feature Flag OPERATIONS.

Fonctionnement métier :

  • Visibilité de l’opération
    • Seules les opérations ACTIVE et actives temporellement (now ∈ [startDate, endDate]) sont consultables.
    • Type PUBLIC → visible pour tous les accounts du store effectif.
    • Type PRIVATE → visible uniquement si le customer user ou son account est explicitement associé.
  • Visibilité des variants
    • Les variants retournés sont ceux présents à la fois dans l’assortiment de l’opération et dans le catalogue visible pour l’account connecté.
    • Les variants non visibles sont ignorés silencieusement.
    • Si aucun variant n’est visible → 200 OK avec lines: [].

API correspondante :

🔍 Récupération des lignes produits d’une opération

OPERATION-551 - GET /v1/shop/operations/{operationId}/lines

{
  "lines": [
    {
      "variantId": "VAR-000123",
      "variantName": "Brie de Meaux AOP",
      "sku": "SKU-100045",
      "minQuantity": 0,
      "maxQuantity": null,
      "recommendedQuantity": 3
    },
    {
      "variantId": "VAR-000456",
      "variantName": "Comté 18 mois",
      "sku": "SKU-100078",
      "minQuantity": 2,
      "maxQuantity": 10,
      "recommendedQuantity": 5
    }
  ]
}

👍

UPDATE

Opérations

  • Créer une commande depuis une Opération (FULL ou PARTIAL)

Contexte :

Les acheteurs (ACCOUNT) peuvent désormais initialiser une commande directement depuis une Opération à laquelle ils ont accès.

Deux modes sont proposés :

  • FULL : ajout automatique de toutes les lignes éligibles et visibles de l’Opération, avec des quantités par défaut.
  • PARTIAL : création de la commande vide mais liée à l’Opération, puis ajout des lignes au cas par cas.

⚙️ Feature flag requis : OPERATIONS 🏬 Store effectif : dj-store s’il est fourni, sinon store par défaut du tenant (le user doit y être rattaché). 🔐 Visibilité Opération : uniquement les opérations ACTIVE, dans la fenêtre [startDate, endDate], et visibles pour l’acheteur :

  • PUBLIC → tous les accounts du store effectif,
  • PRIVATE → seulement si l’account (ou le user) est explicitement associé.

Fonctionnement métier :

  • Source unique par création
    • La commande peut être créée à partir d’une seule source (MVP : OPERATION uniquement).
    • Le couple sourceType + sourceId est optionnel, mais si sourceId est renseigné, sourceType est requis.
  • Modes d’initialisation des lignes
    • FULL (isFull = true, défaut quand une source est fournie)
      • Ajoute toutes les lignes de l’Opération éligibles & visibles pour l’acheteur (catalogue, offre/prix/variant actifs, fenêtre de dates, éligibilité tarifaire, stock…).
      • Quantité par défaut par ligne :
        1. recommendedQuantity > 0 → utilisée,
        2. sinon minQuantity > 0 → utilisée,
        3. sinon 1,
      • puis bornage par minQuantity / maxQuantity s’ils existent.
    • PARTIAL (isFull = false)
      • La commande est créée vide mais marquée comme issue de l’Opération.
      • Les lignes sont ajoutées ensuite via ORDER-150, avec application des contraintes de l’Opération uniquement pour les variants appartenant à l’Opération (date/visibilité + min/max).
      • Les variants hors Opération restent autorisés (règles standards uniquement).

API correspondante :

✅ Créer une commande (support de la source OPERATION)

ORDER-108 - POST /v2/shop/commercial-orders

Champs ajoutés / utilisés :

  • sourceType ∈ OPERATION | QUOTE | ORDER | CART (MVP : OPERATION uniquement)
  • sourceId (externalId de l’Opération)
  • isFull (bool, défaut true si une source est fournie)

Exemples de requêtes :

{
  "sourceType": "OPERATION",
  "sourceId": "OPE-UK-SUMMER-2025",
  "isFull": true,
  "customFieldIdType": "EXTERNAL_ID",
  "customFields": [
    {"customFieldId": "DELIVERY_NOTE", "customFieldValue": "Leave at reception"},
    {"customFieldId": "INTERNAL_TAG", "customFieldValue": "VIP"}
  ]
}
{
  "sourceType": "OPERATION",
  "sourceId": "OPE-UK-SUMMER-2025",
  "isFull": false
}
{
  "id": "ord_0001FZ4Y8CTZ9",
  "reference": "FO-2025-000123"
}

✏️ Ajouter / modifier des lignes après création (PARTIAL)

ORDER-150 - PUT /v2/shop/commercial-orders/{commercialOrderId}/lines

Comportement spécifique “commande issue d’Opération” (PARTIAL) :

  • Pour un variant de l’Opération → application conjointe des règles standard + contraintes Opération (date/visibilité, min/max).
  • Pour un variant hors Opérationrègles standard uniquement.

Exemples de requêtes :

{
  "customFieldIdType": "EXTERNAL_ID",
  "lineIdType": "EXTERNAL_ID",
  "lineType": "OFFER_PRICE",
  "updateOrderCommercialLines": [
    {
      "id": "offp_ext_123",
      "quantity": 6,
      "updateAction": "ADD_QUANTITY",
      "metadata": { "unit": "2" }
    }
  ]
}
{
  "lineIdType": "EXTERNAL_ID",
  "lineType": "PRODUCT_VARIANT",
  "updateOrderCommercialLines": [
    { "id": "VAR-000777", "quantity": 12, "updateAction": "REPLACE_QUANTITY" }
  ]
}

Buying Policies

  • Tris sur la liste des blocages de comptes (Credit Hold)

Contexte :

Les opérateurs peuvent désormais trier la liste des blocages de comptes (credit holds) pour analyser plus rapidement les situations (nouveaux blocages, fin proche, derniers modifiés, etc.).

Cette amélioration s’applique à la route existante de listing et vient compléter les filtres introduits précédemment.

Fonctionnement métier :

  • Tri par date de création décroissante par défaut → les blocages les plus récents apparaissent en premier.
  • Possibilité de combiner plusieurs tris pour affiner l’ordre d’affichage (ex. trier par date de fin puis, à égalité, par compte).
  • Cas particuliers gérés pour éviter les surprises d’affichage (ex. dates de fin non renseignées envoyées en dernier).

API correspondante :

🔍 Lister les blocages (triable)

ADM-OPERATION-550 - GET /v1/buying-policies/credit-control/holds

Nouveau paramètre de tri

  • sort (répétable) — format field:direction
    • Champs autorisés : createdAt, updatedAt, startDate, endDate, accountId
    • Directions : asc | desc
    • Multi-tris : répéter le paramètre, ex. ?sort=endDate:asc&sort=accountId:asc
    • Tri par défaut : createdAt:desc
    • Comportements spécifiques :
      • Pour endDate, les valeurs null sont toujours renvoyées en dernier, quel que soit le sens.
      • Règle Djust : tout tri invalide ou mal formé est ignoré silencieusement ; la requête réussit avec les tris valides restants.
      • En cas d’égalité, le tri par défaut (createdAt:desc) est ajouté en tie-breaker.

Exemples d'appels :

Derniers modifiés d’abord : 
	?sort=updatedAt:desc
Blocages qui finissent bientôt : 	
	?sort=endDate:asc
Puis par compte à égalité : 
	?sort=endDate:asc&sort=accountId:asc

Périmètre

API

📘

NEW

Operations

  • Modification d’une Opération (métadonnées)

Contexte :

Les opérateurs et les customer users habilités peuvent désormais modifier les métadonnées d’une opération existante, tant qu’elle est en statut DRAFT.

Cette évolution permet de corriger ou d’ajuster les informations planifiées avant la publication d’une opération — par exemple mettre à jour le nom, la description, les dates ou les champs personnalisés.

⚙️ La fonctionnalité est protégée par le Feature Flag global OPERATIONS. 🔒 Elle ne permet pas de modifier les produits, variants ou comptes associés à l’opération.

Fonctionnement métier :

  • Opérateur (dj-client: OPERATOR) : peut modifier toute opération en DRAFT, sans contrainte de store.
  • Customer User (dj-client: ACCOUNT) :
    • doit avoir le droit OPERATIONS_UPDATE = true,
    • doit être owner de l’opération (ownerId = customerUserId),
    • doit être rattaché au store effectif (dj-store si fourni, sinon store par défaut du tenant).
  • Les trois conditions sont cumulatives.
  • Les opérations en statut ACTIVE ou INACTIVE ne peuvent pas être modifiées.
  • Si une endDate est fournie, elle doit être postérieure ou égale à startDate.

API correspondante :

✏️ Mise à jour d’une opération existante

ADM-OPERATION-200 - PUT /operations/{operationId}

{
  "names": {
    "en-GB": "Black Friday - Updated",
    "fr-FR": "Black Friday - Mis à jour"
  },
  "descriptions": {
    "en-GB": "New details added for this campaign",
    "fr-FR": "Nouveaux détails ajoutés pour cette campagne"
  },
  "startDate": "2025-11-22T00:00:00Z",
  "endDate": "2025-11-29T23:59:59Z",
  "customFieldValues": [
    {
      "customFieldId": "cf_1234",
      "customFieldValue": "10%"
    }
  ]
}

  • Suppression d’une Opération

Contexte :

Les opérateurs et les customer users habilités peuvent désormais supprimer une opération, y compris ses métadonnées (nom, type, code), lorsque celle-ci n’est plus utilisée.

Cette action permet de nettoyer les opérations obsolètes ou erronées, tout en garantissant la sécurité des données grâce à des contrôles stricts d’usage et d’accès.

La suppression :

  • est définitive et irréversible,
  • est protégée par le Feature Flag OPERATIONS,
  • n’est autorisée que si l’opération n’est liée à aucun panier ni commande.

Fonctionnement métier :

  • Opérateur (dj-client: OPERATOR)
    • Peut supprimer toute opération, quel que soit son statut (DRAFT, ACTIVE, INACTIVE).
    • Pas de contrainte liée au store.
    • Suppression bloquée si l’opération est liée à un panier ou une commande.
  • Customer User (dj-client: ACCOUNT)
    • Doit cumuler les trois conditions suivantes :
      • Droit OPERATIONS_DELETE = true,
      • Être owner de l’opération (ownerId = customerUserId),
      • Être rattaché au store effectif (dj-store si fourni, sinon store par défaut du tenant).
    • Si l’une des conditions n’est pas remplie → accès refusé (403).
  • Effets en cascade :
    • Si la suppression est autorisée, les associations aux produits et aux comptes sont également supprimées automatiquement.

API correspondante :

🗑️ Suppression d’une opération

ADM-OPERATION-300 - DELETE /operations/{operationId}


  • Activation / Désactivation d’une Opération

Contexte :

Les opérateurs et les customer users habilités peuvent désormais activer ou désactiver une opération afin de la rendre visible ou non pour les acheteurs concernés.

Cette fonctionnalité offre plus de flexibilité dans la gestion du cycle de vie d’une campagne commerciale, tout en garantissant la cohérence avec les droits d’accès et le Feature Flag OPERATIONS.

  • Une opération ACTIVE devient immédiatement visible pour les comptes associés.
  • Une opération INACTIVE reste enregistrée, mais n’est plus affichée ni accessible côté acheteur.
  • Il est impossible de repasser en DRAFT une fois l’opération publiée.
  • Le changement de statut est indépendant des dates (startDate / endDate).
  • L’action est soumise au Feature Flag global OPERATIONS.

Fonctionnement métier :

  • Opérateur (dj-client: OPERATOR) :
    • Peut toujours activer ou désactiver une opération, sans restriction de store.
  • Customer User (dj-client: ACCOUNT) :
    • Doit disposer du droit OPERATIONS_UPDATE_STATUS = true,
    • Être owner de l’opération (ownerId = customerUserId),
    • Être rattaché au store effectif (dj-store si fourni, sinon store par défaut du tenant).
    • Les trois conditions sont cumulatives et obligatoires.
  • Transitions autorisées :
    • DRAFT → ACTIVE
    • DRAFT → INACTIVE
    • ACTIVE → INACTIVE
    • INACTIVE → ACTIVE

❌Aucune opération ne peut redevenir DRAFT après publication. 🔄 Ces transitions sont indépendantes des dates de début et de fin de l’opération.


API correspondante :

✏️ Mise à jour du statut d’une opération

ADM-OPERATION-201 - PATCH /operations/{operationId}

{ 
  "status": "ACTIVE"
}

  • Suppression de variants d’une Opération

Contexte :

Les opérateurs et les customer users habilités peuvent désormais supprimer un ou plusieurs variants d’une opération, afin de maintenir un assortiment à jour ou corriger des erreurs avant publication.

Cette évolution permet de gérer plus facilement le contenu d’une opération en préparation, sans avoir à recréer l’ensemble de la configuration.

⚙️ L’action est protégée par le Feature Flag OPERATIONS et limitée aux opérations au statut DRAFT. 🔒 La suppression est possible uniquement pour :

  • les opérateurs (accès complet, sans contrainte de store),
  • les customer users qui cumulent les trois conditions suivantes :
    • être owner de l’opération (ownerId = customerUserId),
    • disposer du droit OPERATIONS_UPDATE,
    • être rattachés au store effectif (dj-store si fourni, sinon store par défaut du tenant).

Fonctionnement métier :

  • Les variants sont identifiés par leurs identifiants externes (variantIds).
  • Les IDs non valides ou non liés à l’opération sont ignorés ; si aucun variant n’est valide, la suppression échoue.
  • La suppression ne prend effet que sur les opérations en DRAFT ; une opération active ou inactive ne peut pas être modifiée.
  • Cette action n’affecte pas les locales, car elle agit uniquement sur des identifiants techniques.

API correspondante :

🗑️ Suppression d’un ou plusieurs variants d’une opération

ADM-OPERATION-350 - DELETE /operations/{operationId}/lines

[
  "VAR-001",
  "VAR-002",
  "VAR-XYZ"
]

Périmètre

Data Hub

Ajout de l’option de compression GZIP pour les exports API

Les opérateurs back-office peuvent désormais sélectionner le mode de compression GZIP lors de la configuration d’un job d’export par API.

Dans certains cas, comme l’export de commandes contenant plusieurs centaines de lignes, la taille des données peut devenir conséquente. En activant le mode de compression GZIP, les données sont compressées avant d’être transmises via l’API, ce qui permet de réduire significativement la taille des appels API.

API

📘

NEW

Operations

  • Suppression d’accounts d’une Opération (PRIVATE)

Contexte :

Les opérateurs et customer users habilités peuvent désormais retirer un ou plusieurs comptes associés à une opération de type PRIVATE.

Cette évolution permet de révoquer l’accès à une opération ciblée, par exemple lorsqu’un compte ne doit plus bénéficier d’une campagne.

  • La suppression n’est possible que pour les opérations :
    • de type PRIVATE,
    • au statut DRAFT.
  • L’action est protégée par le Feature Flag OPERATIONS.
    • Opérateur : peut supprimer des comptes de toute opération PRIVATE en DRAFT, sans contrainte de store.
    • Customer User : doit cumuler trois conditions pour supprimer des comptes :
      • droit OPERATIONS_UPDATE = true,
      • être owner de l’opération (ownerId = customerUserId),
      • être rattaché au store effectif (dj-store si fourni, sinon store par défaut du tenant).

Fonctionnement métier :

  • Les IDs fournis doivent correspondre à des accounts déjà liés à l’opération.
  • Les accounts inconnus ou non liés sont ignorés ; si aucun des accounts fournis n’est valide, une erreur est renvoyée.
  • Une opération de type PUBLIC n’accepte jamais de suppression d’accounts (cas rejeté).

API correspondante :

🗑️ Suppression d’accounts d’une opération PRIVATE

ADM-OPERATION-351 - DELETE /operations/{operationId}/accounts

[
  "acc_123",
  "acc_456"
]

Buying Policies

  • Validation forcée d’un blocage de commande

Contexte :

Les opérateurs de la plateforme peuvent désormais forcer manuellement la validation d’une commande bloquée par une ou plusieurs buying policies (encours, quotas).

Cette évolution permet de reprendre le traitement d’une commande bloquée lorsque les conditions initiales ne peuvent être satisfaites automatiquement, tout en conservant une traçabilité complète des actions opérateur.

Fonctionnement métier :

  • Seules les commandes au statut BLOCKED_BY_POLICY peuvent être forcées. (Ceci exclut pour le moment les buying policies de validation manuelle historiques).
  • Une commande bloquée par plusieurs policies n’est débloquée que si plus aucune ne s’applique.
  • Le statut évolue de BLOCKED_BY_POLICY → WAITING_SUPPLIER_APPROVAL une fois la validation forcée acceptée.
  • Chaque action de forçage est enregistrée avec la date, l’auteur et la policy concernée.
  • Le processus reste auditables via un endpoint d’historique dédié.

Exemple : une commande bloquée par la policy de quota peut être validée manuellement si l’opérateur décide d’autoriser exceptionnellement son envoi au fournisseur.

API correspondante :

✅ Forcer la validation d’une ou plusieurs commandes bloquées

ADM-ORDER-150 - POST /v1/logistic-orders/unblock

{
  "orderIds": ["ORD-12345", "ORD-67890"]
}

🔍 Consulter l’historique des validations forcées

ADM-ORDER-550 - GET /v1/logistic-orders/{logisticOrderId}/unblock-history

{
  "actions": [
    {
      "forcedAt": "2025-06-19T15:32:00Z",
      "forcedBy": {
        "userId": "USR-456",
        "fullName": "Alice Martin"
      },
      "buyingPolicy": "CREDIT_CONTROL"
    },
    {
      "forcedAt": "2025-06-20T09:10:00Z",
      "forcedBy": {
        "userId": "USR-789",
        "fullName": "Marc Dubois"
      },
      "buyingPolicy": "QUOTA"
    }
  ]
}

Périmètre

BackOffice Djust

Configuration de nouveaux rôles pour la configuration des Buying Policies

Deux nouveaux rôles ont été ajoutés pour gérer les configuration de Buying Policies de quotas et d'encours :

  • Rôle de gestion de quota minimum pour un fournisseur associé à un CF de type number
  • Rôle de gestion des limites de crédit et d'encours pour un compte client associé à des CF de type number.

API

📘

NEW

Operations

  • Création d'une Opération

Contexte :

Les utilisateurs peuvent désormais créer une nouvelle opération (campagne commerciale ou organisationnelle) directement via l’API.

Cette action permet d’initialiser une opération en statut DRAFT, sans produits ni comptes associés, en amont de toute configuration (variants, accounts, prix…).

  • La visibilité (PRIVATE ou PUBLIC) est définie à la création et n’est pas modifiable par la suite.
  • Le créateur de l’opération (ownerId) est automatiquement enregistré et sera le seul à pouvoir la modifier côté compte client (hors opérateur).
  • La création est protégée par le feature flag OPERATIONS.
  • L’internationalisation est supportée via les locales autorisées du store (IETF BCP 47). La locale par défaut du store (ou du tenant si le store n’en définit pas) doit obligatoirement être présente.

Fonctionnement métier :

  • Opérateur (dj-client: OPERATOR) : peut toujours créer une opération, quel que soit le store.
  • Customer User (dj-client: ACCOUNT) :
    • doit disposer du droit OPERATIONS_CREATE = true,
    • ne peut créer que sur un store auquel il est rattaché (ou le store par défaut du tenant).
  • À la création, le statut de l’opération est toujours DRAFT.

API correspondante :

➕ Créer une opération

ADM-OPERATION-100 - POST /operations

{
  "externalId": "SUMMER_OPE_0825",
  "type": "PRIVATE",
  "names": {
    "en-GB": "Summer Operation",
    "fr-FR": "Opération Été"
  },
  "descriptions": {
    "en-GB": "Summer Operation · Fine Food",
    "fr-FR": "Opération Été · Produits raffinés"
  },
  "startDate": "2025-11-21T00:00:00Z",
  "endDate": "2025-11-28T23:59:59Z"
}
{
  "id": "ope_1234"
}

  • Ajout et modification des variants d’une Opération

Contexte :

Il est désormais possible, pour les opérateurs et les customer users habilités, d’ajouter des variants à une opération et/ou de modifier les quantités associées (minQuantity, maxQuantity, recommendedQuantity).

Cette évolution permet d’ajuster les contraintes d’achat avant la publication d’une opération.

Fonctionnement métier :

  • Ajout : un variant ne peut être associé qu’une seule fois à une opération.
  • Mise à jour : possible en masse, chaque ligne correspondant à un variantId externe.
  • Validation des quantités :
    • minQuantity ≥ 0 (facultatif, permet de rendre l’achat obligatoire si > 0),
    • maxQuantity ≥ minQuantity (si défini),
    • recommendedQuantity ∈ [minQuantity, maxQuantity] si maxQuantity est défini, sinon ≥ minQuantity.

API correspondante :

✏️ Modification des variants d’une opération

ADM-OPERATION-250 - PUT /operations/{operationId}/lines

[
  {
    "variantId": "VAR-001",
    "minQuantity": 2,
    "maxQuantity": 12,
    "recommendedQuantity": 6
  },
  {
    "variantId": "VAR-002",
    "minQuantity": 0,
    "recommendedQuantity": 0
  }
]

  • Ajout d’accounts à une Opération (PRIVATE)

Contexte :

Il est désormais possible d’ajouter des comptes à une opération de type PRIVATE, afin de restreindre sa visibilité uniquement aux accounts explicitement autorisés.

  • Cette action est réservée aux opérations en statut DRAFT et de type PRIVATE.

API correspondante :

➕ Ajout d’accounts à une opération

ADM-OPERATION-251 - PUT /operations/{operationId}/accounts

[
  "ACC-001",
  "ACC-002",
  "ACC-XYZ"
]

  • Récupération des accounts d’une Opération (PRIVATE)

Contexte :

Les opérateurs et les customer users habilités peuvent désormais consulter la liste des comptes associés à une opération PRIVATE.

Cette évolution permet de contrôler qui a accès à une opération restreinte, afin de sécuriser la diffusion des campagnes commerciales ou organisationnelles.

Fonctionnement métier :

  • Les résultats peuvent être filtrés par accountIds (externalIds uniquement) et/ou accountName (recherche partielle, insensible à la casse).
  • Le tri par défaut est effectué sur accountName dans le sens ASC.
  • Autres tris possibles : accountName, accountId.

API correspondante :

🔍 Récupérer les accounts liés à une opération

ADM-OPERATION-552 - GET /operations/{operationId}/accounts

{
  "accounts": [
    {
      "accountId": "ACC-001",
      "accountName": "Store #1 Rennes"
    },
    {
      "accountId": "ACC-002",
      "accountName": "Store #2 Nantes"
    }
  ]
}

  • Récupération des variants d’une Opération

Contexte :

Les opérateurs et les customer users habilités peuvent désormais consulter la liste des variants associés à une opération, avec leurs quantités configurées (minQuantity, maxQuantity, recommendedQuantity).

  • Cette route permet de contrôler le contenu d’une opération et de préparer sa modification ou son utilisation.

Fonctionnement métier :

  • Filtres disponibles :
    • variantIds (externalIds uniquement, valeurs inconnues ignorées)
    • variantName (recherche exacte ou partielle, insensible à la casse, dans la locale effective)
    • minQuantity, maxQuantity, recommendedQuantity (recherche exacte)
  • Paramètre locale : permet de définir la langue de recherche et de tri pour variantName (fallback sur la locale par défaut du store si inconnue).
  • Tri :
    • Par défaut sur variantId:asc.
    • Champs supportés : variantId, variantName, minQuantity, maxQuantity, recommendedQuantity.

API correspondante :

🔍 Récupération des variants d’une opération

ADM-OPERATION-551 - GET /operations/{operationId}/lines

{
  "lines": [
    {
      "variantId": "VAR-001",
      "variantName": "Black shirt",
      "minQuantity": 2,
      "maxQuantity": 10,
      "recommendedQuantity": 4
    },
    {
      "variantId": "VAR-002",
      "variantName": "White shirt",
      "minQuantity": 0,
      "maxQuantity": 5,
      "recommendedQuantity": 1
    }
  ]
}

  • Récupération des Opérations existantes (liste)

Contexte :

Les équipes Opérations et Sales peuvent désormais consulter la liste des Opérations (campagnes) via une route d’administration unique.

L’accès est contrôlé (owner, droits, store) et filtrable (statut, nom, dates, type…), afin de retrouver rapidement une opération, vérifier son statut et l’ouvrir pour suivi/édition.

Fonctionnement métier :

  • Visibilité opérateur (dj-client: OPERATOR)
    • Voit toutes les opérations.
    • Si dj-store est fourni → résultats restreints à ce store.
    • Si dj-store est absent → résultats restreints au store par défaut du tenant.
  • Visibilité customer user (dj-client: ACCOUNT)
    • Ne voit que ses propres opérations (ownerId = customerUserId) et uniquement si le droit OPERATIONS_READ = true.
    • Doit être rattaché au store demandé :
      • Si dj-store est fourni → le caller doit être attaché à ce store.
      • Si dj-store est absent → fallback sur le store par défaut du tenant ; le caller doit y être attaché.
    • Locales
      • Le paramètre locale (optionnel) détermine la langue des champs localisés (name).
      • La locale doit faire partie des locales autorisées du store de l’opération ; sinon, fallback sur la locale par défaut du store.

API correspondante :

🔍 Lister les opérations

ADM-OPERATION-550 - GET /operations

{
  "operations": [
    {
      "id": "ope_001",
      "externalId": "SUMMER_OPE_0825",
      "name": "Summer Operation · Fine Food",
      "type": "PRIVATE",
      "status": "ACTIVE",
      "startDate": "2025-11-21T00:00:00Z",
      "endDate": "2025-11-28T23:59:59Z",
      "createdAt": "2025-08-04T12:34:56Z",
      "updatedAt": "2025-08-05T10:00:00Z",
      "ownerId": "usr_987",
      "ownerFirstName": "Alice",
      "ownerLastName": "Durand"
    }
  ]
}


Périmètre

BackOffice Djust

Possibilité de suppression d'un utilisateur opérateur :

Il est désormais possible de supprimer un utilisateur opérateur directement depuis le BackOffice Djust.

  • Depuis la page de détail d’un opérateur
  • Depuis le listing des opérateurs

API

📘

NEW

Buying Policies

  • Validation des commandes et blocages par quota

Contexte :

Une nouvelle buying policy de quotas permet désormais de bloquer les commandes tant que la quantité minimum attendue par fournisseur (univers) et par compte client n’est pas atteinte.

Cette règle complète la validation des commandes déjà existante (encours, validation manuelle). Elle vise à optimiser la préparation logistique en regroupant des volumes suffisants avant expédition.

  • Chaque commande est vérifiée individuellement par rapport au quota défini.
  • Il n’y a pas de cumul entre plusieurs commandes pour atteindre le quota : chaque commande doit respecter le seuil minimum seule.
  • Le blocage est appliqué au niveau de la commande : si le quota n’est pas atteint, le statut passe en BLOCKED_BY_POLICY.
  • Une commande bloquée peut être validée manuellement par un opérateur ou revalidée automatiquement à la prochaine exécution du job de validation (si les conditions sont remplies).

Fonctionnement :

  1. Ordre de validation des commandes :
    1. Policy d’encours
    2. Policy de quotas
    3. Validation manuelle (policy historique)
  2. Règles appliquées :
  • Si un quota spécifique existe pour le couple Account × Supplier, c’est cette valeur qui s’applique.
  • Sinon, on utilise la valeur par défaut définie au niveau du Supplier (via un Custom Field + rôle).
  • Si rien n’est configuré, c’est la valeur globale de la buying policy qui est utilisée.
  • Si aucune configuration n’est trouvée, la commande est bloquée par défaut.
  1. Cas de validation :
  • Quantité de la commande < quota → commande bloquée (BLOCKED_BY_POLICY).
  • Quantité de la commande quota → workflow continue vers les autres policies, puis passage en WAITING_SUPPLIER_APPROVAL.

  • Quotas minimums spécifiques par Account x Supplier

Contexte :

Les opérateurs peuvent désormais définir des quotas minimums spécifiques pour chaque couple Customer Account × Supplier.

Ces règles surchargent la valeur globale de la policy de quotas ainsi que la valeur éventuellement définie au niveau Supplier.

Objectif : refléter les accords commerciaux au plus fin, débloquer/bloquer des commandes de façon ciblée et piloter les comportements d’achat par fournisseur.

Fonctionnement métier :

  • Priorité des valeurs : Account × Supplier > Supplier > valeur globale de la policy.
  • Une commande est bloquée si les quantités commandées sont < minQuotaValue défini pour le couple concerné.
  • En l’absence de configuration Account × Supplier, le système retombe sur le quota Supplier, puis sur la valeur globale.
  • La suppression d’une règle spécifique prend effet immédiatement (retombée sur Supplier/global).

APIs correspondantes :

Quatre APIs ont été ajoutées pour gérer ces quotas spécifiques.

➕ Créer des règles Account × Supplier (bulk)

ADM-BUYING-POLICY-152 - POST /v1/buying-policies/quotas/rules

[
  { "customerAccountId": "acc-123", "supplierId": "sup-456", "minQuotaValue": 1500 }
]

🔎 Lister / filtrer les règles spécifiques

ADM-BUYING-POLICY-553 - GET /v1/buying-policies/quotas/rules

Query params (tous external ids) :

  • customerAccountIds (array)
  • supplierIds (array)

✏️ Mettre à jour une règle spécifique

ADM-BUYING-POLICY-206 - PUT /v1/buying-policies/quotas/rules/{ruleId}

{ "minQuotaValue": 1200 }

🗑️ Supprimer une règle spécifique

ADM-BUYING-POLICY-302 - DELETE /v1/buying-policies/quotas/rules/{ruleId}


  • Groupes de co-validation de quotas (Account × Supplier)

Contexte :

Il est désormais possible de lier plusieurs règles de quotas (couples Customer Account × Supplier) dans un groupe de co-validation.

Objectif : valider ou bloquer les commandes ensemble — si au moins un fournisseur du groupe ne respecte pas son quota, toutes les commandes du groupe sont bloquées.

Le contrôle s’exécute au moment de la validation des commandes lorsque celles-ci sont vérifiées par les Buying Policies.

Fonctionnement métier :

  • Périmètre d’un groupe : un même account et ≥ 2 suppliers distincts.
  • Aucune addition de seuil : chaque supplier conserve son quota propre (priorité : Account×Supplier > Supplier > global). Le groupe impose la validation conjointe.
  • Co-validation stricte : si une commande d’un supplier du groupe n’atteint pas son quota, toutes les commandes du groupe passent en BLOCKED_BY_POLICY.
  • Absence de pair : si au cut-off il n’existe pas encore de commande pour un des suppliers du groupe, les autres commandes du groupe sont bloquées. Dès qu’une commande éligible apparaît pour le supplier manquant (et respecte les critères), la revalidation déverrouille l’ensemble.

APIs correspondantes :

Quatre APIs ont été ajoutées pour gérer ces quotas spécifiques.

➕ Créer un groupe de co-validation

ADM-BUYING-POLICY-153 - POST /v1/buying-policies/quotas/groups

{
  "quotaRuleIds": ["qr-001", "qr-002"]
}

🔎 Lister les groupes

ADM-BUYING-POLICY-554 - GET /v1/buying-policies/quotas/groups

[
  {
    "id": "qgroup-001",
    "quotaRuleIds": ["qr-001","qr-002"],
    "createdAt": "2025-08-02T10:00:00Z",
    "updatedAt": "2025-08-02T10:00:00Z"
  }
]

✏️ Mettre à jour un groupe

ADM-BUYING-POLICY-207 - PUT /v1/buying-policies/quotas/groups/{groupId}

{ "quotaRuleIds": ["qr-001","qr-005","qr-006"] }

🗑️ Supprimer un groupe

ADM-BUYING-POLICY-303 - DELETE /v1/buying-policies/quotas/groups/{groupId}


  • Récupération des raisons de blocage des commandes

Contexte :

Les opérateurs peuvent désormais identifier les raisons pour lesquelles une ou plusieurs commandes sont bloquées par les buying policies.

L’objectif est de faciliter le diagnostic et d’accélérer les actions correctives ou validations manuelles, sans surcharger les réponses de l’API Orders.

Fonctionnement métier :

  • Le nouvel endpoint dédié permet de lister les policies responsables d’un blocage pour chaque commande logistique.
  • Une commande peut être bloquée par plusieurs policies ; pour la version actuelle, seule la raison courante est remontée.

API correspondante :

🔍 Récupération des raisons de blocage

ADM-BUYING-POLICY-552 - GET /v1/buying-policies/blocking-reasons

{
  "blockingReasons": [
    {
      "logisticOrderId": "ORD-001",
      "blockingPolicies": [
        {
          "type": "MANUAL_VALIDATION",
          "id": "BP-MANUAL-001"
        }
      ]
    },
    {
      "logisticOrderId": "ORD-002",
      "blockingPolicies": []
    }
  ]
}

Opérations

  • Consultation du détail d'une Opération

Contexte :

Les Opérations (campagnes commerciales, actions marketing ou opérationnelles) peuvent désormais être consultées individuellement via un nouvel endpoint.

Cette évolution permet :

  • aux opérateurs de la plateforme de consulter n’importe quelle opération existante sans restriction,
  • aux customer users habilités d’accéder uniquement aux opérations qu’ils possèdent (ownerId = customerUserId), à condition d’avoir le droit OPERATIONS_READ actif et d’être rattachés au store concerné.

⚠️ Le feature flag OPERATIONS doit être activé pour que la route soit disponible.

Fonctionnement métier :

  • Opérateur : visibilité complète, quel que soit le store ou l’owner.
  • Customer User :
    • doit être owner de l’opération,
    • doit disposer du droit OPERATIONS_READ = true,
    • doit être rattaché au store concerné (ou au store par défaut du tenant si aucun n’est précisé).

API correspondante :

🔍 Récupération du détail d’une opération

ADM-OPERATION-500 - GET /operations/{operationId}

{
  "id": "ope_001",
  "externalId": "SUMMER_OPE_0825",
  "names": {
    "en-GB": "Summer Operation · Fine Food",
    "fr-FR": "Opération Été · Produits raffinés"
  },
  "descriptions": {
    "en-GB": "Seasonal operation focused on gourmet product sales",
    "fr-FR": "Opération saisonnière axée sur les produits gastronomiques"
  },
  "status": "ACTIVE",
  "type": "PRIVATE",
  "startDate": "2025-11-21T00:00:00Z",
  "endDate": "2025-11-28T23:59:59Z",
  "createdAt": "2025-08-04T12:34:56Z",
  "updatedAt": "2025-08-05T10:00:00Z",
  "ownerId": "usr_987",
  "ownerFirstName": "Alice",
  "ownerLastName": "Durand",
  "customFieldValues": []
}
👍

UPDATE

Orders

  • Visualisation des commandes bloquées

Contexte :

Les opérateurs peuvent désormais filtrer et visualiser les commandes bloquées par une ou plusieurs buying policies.

L’objectif est de faciliter le suivi des commandes en anomalie, de comprendre rapidement la nature du blocage (encours, quota, validation manuelle) et d’orienter leur traitement.

Trois cas sont couverts :

  • Récupérer toutes les commandes bloquées par au moins une buying policy
  • Récupérer les commandes bloquées uniquement par un type de buying policy
  • Récupérer les commandes bloquées par la validation manuelle d’un autre utilisateur (buying policies historiques)

Fonctionnement métier :

  • Une commande est considérée comme bloquée si elle est au statut BLOCKED_BY_POLICY ou WAITING_CUSTOMER_APPROVAL.
  • Les filtres permettent de :
    • Lister uniquement les commandes bloquées (blockedByBuyingPolicy = true)
    • Restreindre la recherche à certains types de policies (blockingPolicyTypes) :
      • CREDIT_CONTROL
      • QUOTA
      • MANUAL_VALIDATION
  • Les valeurs du filtre blockingPolicyTypes fonctionnent en OU : une commande est incluse si elle correspond à au moins une des policies listées.
  • ⚠️ Le filtre blockingPolicyTypes n’est appliqué que si blockedByBuyingPolicy = true. Sinon, il est ignoré.

API correspondante :

ADM-ORDER-551 - POST /v1/logistic-orders

Exemples :

{
  "blockedByBuyingPolicy": true
}
{
  "blockedByBuyingPolicy": true,
  "blockingPolicyTypes": ["CREDIT_CONTROL"]
}
{
  "blockedByBuyingPolicy": true,
  "blockingPolicyTypes": ["MANUAL_VALIDATION"]
}

Périmètre

BackOffice Djust

Améliorations graphiques et optimisations de design :

Dans la continuité de la refonte globale du Back Office de Djust, un redesign des pages suivantes a été apporté afin de simplifier l'expérience utilisateur.

  • Page detail des Custom fields (Champs personnalisées) : Settings -> Custom fields (offer, customer user, etc.)

Il est désormais possible d'ordonner les valeurs des custom fields grâce au drag and drop.

  • Avant :

  • Après :


Data Hub

Définition d'une adresse de livraison et/ou facturation à l'import

Il est désormais possible de définir si une adresse doit être utilisée pour la livraison (shipping) et/ou la facturation (billing) lors de l’import des comptes clients depuis le data hub.

📘

Si aucune valeur n’est renseignée à l’import, l’adresse sera considérée comme valable pour la livraison et la facturation.

⚠️

Un compte doit avoir au moins une adresse de facturation.

API

📘

NEW

Buying Policies

  • Définition d'une limite de quota minimum par défaut à la plateforme

Contexte :

Les opérateurs peuvent désormais définir un quota de commande minimum global.

Ce quota est utilisé automatiquement pour tous les couples Customer Account × Supplier qui ne disposent pas d’une configuration spécifique.

Il garantit une homogénéité dans le contrôle des commandes et permet de bloquer celles qui ne respectent pas le volume minimum attendu.

Fonctionnement :

  • Si un quota spécifique est défini au niveau du Supplier ou du couple Customer Account × Supplier, celui-ci prévaut.
  • Si aucun quota spécifique n’est défini, la valeur par défaut s’applique.
  • Une valeur de 0 signifie qu’aucune restriction n’est appliquée par défaut.
  • Lors de la création d’un nouvel environnement, la valeur par défaut est initialisée à 0.

APIs correspondantes :

🔍 Consultation du quota par défaut

ADM-BUYING-POLICY-501 - GET /v1/buying-policies/quotas

  • Retourne le statut de la policy (ACTIVE ou INACTIVE), la valeur du quota par défaut et la date de dernière mise à jour.
  • Accessible uniquement avec le header dj-client: OPERATOR.
{
  "status": "ACTIVE",
  "minQuotaValue": 1000,
  "updatedAt": "2025-07-03T09:00:00Z"
}

✏️ Mise à jour du quota par défaut

ADM-BUYING-POLICY-205 - PATCH /v1/buying-policies/quotas/min-value

  • Permet de modifier la valeur globale appliquée.
{
  "minQuotaValue": 1500
}

  • Activation / désactivation globale de la policy de quotas

Contexte :

Les opérateurs peuvent désormais activer ou désactiver globalement la buying policy de quotas.

Cette règle permet de contrôler si les commandes doivent être bloquées en fonction d’un quota minimum configuré (spécifique ou par défaut).

Elle est particulièrement utile en phase de migration ou de test, ou encore pour ajuster rapidement le niveau de contrôle sans modifier la configuration des comptes ou des suppliers.

  • Quand la policy est ACTIVE : toutes les commandes sont validées selon les règles de quota (valeurs définies au niveau du Supplier ou valeur par défaut si absente).
  • Quand la policy est INACTIVE : aucune vérification ni blocage n’est appliqué.
  • Par défaut, lors de la création d’un environnement, la policy est initialisée à INACTIVE.

APIs correspondantes :

🔍 Consultation de la configuration globale

ADM-BUYING-POLICY-501 - GET /v1/buying-policies/quotas

  • La route est commune entre la gestion des statuts et des quotas par défaut.
  • Retourne l’état actuel de la policy (ACTIVE ou INACTIVE), la valeur du quota minimum par défaut (minQuotaValue) et la date de dernière mise à jour.

✏️ Mise à jour de l’état de la policy

ADM-BUYING-POLICY-204 - PATCH /v1/buying-policies/quotas

  • La route est commune entre la gestion des statuts et des quotas par défaut.
  • Permet d’activer ou désactiver la policy via l’attribut status (ACTIVE ou INACTIVE).

Périmètre

BackOffice Djust

Améliorations graphiques et optimisations de design :

Dans la continuité de la refonte globale du Back Office de Djust, un redesign des pages suivantes a été apporté afin de simplifier l'expérience utilisateur.

  • Page de gestion des tags produits : Settings -> Product Tags.
  • Page de creation/mise à jour des restrictions de catalogues : Product -> Catalog Views.

Affichage du statut Online/Offline en page liste offres

L'état d’une offer est désormais affiché (à la manière des produits) au niveau de la colonne de statut.

Celui-ci n'est affiché que si le feature flag SEARCH_V2 est actif


API

📘

NEW

Opérations

Une nouvelle entité "Opérations" en cours de développement devrait voir le jour courant septembre. Voici les premiers éléments qui sont livrés dans cette version (d'autres suivront sur les releases futures).

  • Pilotage de la feature Opérations via Feature Flag

Un nouveau Feature Flag OPERATIONS permet désormais d’activer ou de désactiver dynamiquement l’ensemble de la feature Opérations (endpoints, jobs et pricing override associés).

Quand OPERATIONS = false :

  • Tous les endpoints /admin/operations/** et /shop/operations/** deviennent inaccessibles.
  • Toutes les règles de pricing spécifiques liées aux opérations sont ignorées.
    • Le fallback de prix est alors appliqué selon la hiérarchie standard :
      Account → Customer Tags → Public

Par défaut, la feature est désactivée, l'activation se fait via les équipes CSM et Support.


👍

UPDATE

Orders

  • Ajouter de champs supplémentaires dans l’export order par API

Les champs suivants ont été ajoutés dans l'export order API du Data Hub :

  • productAttributeValues
  • confirmedPrice
  • itemPerPack
  • type (offerPriceType)
  • typeValue (offerPriceTypeValue)
  • priceWithTaxes
  • itemPriceWithoutTaxes
  • productTaxAmount
  • shippingPriceWithTaxes
  • shippingPriceWithoutTaxes
  • shippingTaxAmount
  • taxLegalNotice
  • totalPriceWithTaxes
  • totalPriceWithoutTaxes
  • totalProductTaxAmount
  • totalTaxAmount
  • quantity
  • externalId (adresse shipping)
  • externalId (variant)
  • sku (variant)
  • externalId (customer user)
  • id, externalId (order logistic)
  • id (order line)
  • orderCommercialId
  • OrderCommercialReference

Périmètre

BackOffice Djust

Améliorations graphiques et optimisations de design :

Dans la continuité de la refonte globale du Back Office de Djust, un redesign des pages suivantes a été apporté afin de simplifier l'expérience utilisateur.

  • Page de creation d'un produit / variant : Product -> Create.
  • Page de creation/mise à jour des clients d'interfaces pour le DataHub : Data Hub -> Client -> Create/Update.

API

📘

NEW

Buying Policies

  • Récupération des raisons de blocage des commandes

Un nouvel endpoint d’administration permet aux opérateurs de récupérer la liste des buying policies ayant bloqué une ou plusieurs commandes logistiques.

L’objectif est de faciliter le diagnostic et la résolution des blocages, sans surcharger les réponses standard de l’API Orders.

🔍 Récupération des raisons de blocage

ADM-BUYING-POLICY-552 - GET /v1/buying-policies/blocking-reasons

Renvoie, pour chaque commande logistique fournie, la liste des buying policies qui ont empêché sa validation (ex. CREDIT_CONTROL, QUOTA, MANUAL_VALIDATION).

Query parameters :

  • logisticOrderIds (requis) : liste des IDs des commandes logistiques concernées
  • idType (optionnel, défaut REFERENCE) : type d’identifiant (DJUST_ID, EXTERNAL_ID, REFERENCE)
ℹ️

Règles :

  • Si un ID est invalide, il est ignoré
  • Si aucune policy ne bloque une commande, le tableau blockingPolicies est vide
  • Maximum 20 policies retournées par commande
{
  "blockingReasons": [
    {
      "logisticOrderId": "ORD-001",
      "blockingPolicies": [
        {
          "type": "MANUAL_VALIDATION",
          "id": "BP-MANUAL-001"
        }
      ]
    }
  ]
}

👍

UPDATE

Orders x Buying Policies

  • Filtrage des commandes par type de buying policy

La route d’administration POST /v1/logistic-orders permet désormais de filtrer les commandes bloquées par un ou plusieurs types spécifiques de buying policies.

Cette évolution complète le filtre blockedByBuyingPolicy en permettant de cibler uniquement certaines policies.

🔍 Filtrer par type de buying policy

Nouveau paramètre facultatif : blockingPolicyTypes (array)

  • Permet de lister un ou plusieurs types de buying policies pour restreindre la recherche.
  • Les valeurs fonctionnent en OU : si au moins une policy correspond, la commande est incluse dans le résultat.
{
  "blockedByBuyingPolicy": true,
  "blockingPolicyTypes": ["CREDIT_CONTROL", "MANUAL_VALIDATION"]
}

Valeurs possibles :

  • CREDIT_CONTROL
  • QUOTA
  • MANUAL_VALIDATION
ℹ️

Règles importantes :

  • Le filtre blockingPolicyTypes n’est pris en compte que si blockedByBuyingPolicy = true.
  • Si blockedByBuyingPolicy est false ou absent, blockingPolicyTypes est ignoré.
  • Le statut de commande doit être BLOCKED_BY_POLICY pour que le filtre soit appliqué.

Comme énoncé ci-dessus, un nouveau statut a été ajouté dans le workflow de commande : BLOCKED_BY_POLICY. Il est présent sur les routes suivantes :

GET /v1/logistic-orders
POST /v1/logistic-orders
POST /v1/logistic-orders/export
GET /v1/logistic-orders/{orderLogisticId}
GET /v1/logistic-orders/{orderLogisticId}/approvals
GET /v1/logistic-orders/{orderLogisticId}/history
GET /v1/supplier-quotes/{supplierQuoteId}/orders

ORDER-560 - GET /v1/shop/commercial-orders
ORDER-100 - POST /v1/shop/commercial-orders
ORDER-500 - GET /v1/shop/commercial-orders/{commercialOrderId}
ACCOUNT-550 - GET /v1/shop/customer-accounts/orders
ACCOUNT-555 - GET /v1/shop/customer-accounts/organisations/{organisationId}/orders
N/A - GET /v1/shop/logistic-orders
ORDER-550 - POST /v1/shop/logistic-orders
ORDER-501 - GET /v1/shop/logistic-orders/{orderLogisticId}
ORDER-205 - PATCH /v1/shop/logistic-orders/{orderLogisticId}
ORDER-200 - PUT /v1/shop/logistic-orders/{orderLogisticId}/approve
ORDER-556 - GET /v1/shop/logistic-orders/{orderLogisticId}/approvers
ORDER-201 - PUT /v1/shop/logistic-orders/{orderLogisticId}/cancel
ORDER-203 - PUT /v1/shop/logistic-orders/{orderLogisticId}/confirm-reception
ORDER-204 - PUT /v1/shop/logistic-orders/{orderLogisticId}/disapprove
ORDER-107 - POST /v2/shop/supplier-quotes/{supplierQuoteId}/initialize-orders

Offers

  • Remontée de l'information online/offline sur les offres

Afin de savoir si une offre est live ou non, l'information online est remontée sur l'ensemble des APIs d'administration d'offres suivantes :

GET /v1/offer-inventories
PATCH /v1/offer-inventories
POST /v1/offer-inventories
GET /v1/offer-inventories/{offerInventoryId}
PUT /v1/offer-inventories/{offerInventoryId}
PATCH /v1/offer-inventories/{offerInventoryId}/offer-prices
POST /v1/offer-inventories/{offerInventoryId}/offer-prices
PUT /v1/offer-inventories/{offerInventoryId}/offer-prices

Orders

  • Ajout de la date de dernière synchronisation du panier (lastSyncAt)

Un nouveau champ lastSyncAt a été ajouté à la Commercial Order.

Il indique la date et l’heure de la dernière synchronisation réussie du panier (nouvelle API qui sera déployée dans la prochaine version).

Le format est ISO 8601 (ex. "2025-07-22T14:30:00Z").

La modification est visible dans la réponse de l'appel à :

ORDER-107 - POST /v2/shop/supplier-quotes/{supplierQuoteId}/initialize-orders
ORDER-560 - GET /v1/shop/commercial-orders
ORDER-100 - POST /v1/shop/commercial-orders
ORDER-500 - GET /v1/shop/commercial-orders/{commercialOrderId}

  • Ajout d’un champmetadata

Un nouveau champ metadata est désormais disponible dans la route API :

ORDER-561 - PUT /v2/shop/commercial-orders/{commercialOrderId}/lines

Ce champ permet d’associer, à chaque ligne, sous la forme de paires clé/valeur libres, des données contextuelles (ex. : localisation, informations logistiques, unité de vente etc.) qui seront transmises à l’API externe dans le cadre du Real-Time Pricing qui sera déployé prochainement.

Périmètre

BackOffice Djust

BO – Transcodings sur les pages des jobs d’import

Il est désormais possible de configurer des transcodings sur les jobs d’import afin de convertir automatiquement des valeurs sources en valeurs cibles lors de l’import de données.

  • Pour chaque champ mappé, vous pouvez définir des règles de conversion (ex. : “John” → “Jean”).
  • Ces conversions sont appliquées automatiquement au moment de l’import.
  • Les transcodings peuvent être activés ou désactivés individuellement.

📩 Fonctionnalité disponible uniquement sur demande. Contactez l’équipe support pour l’activer sur votre environnement.



API

📘

NEW

Buying Policies

  • Nouvelle Buying Policy de définition d'un quota minimum d'achat

Trois nouveaux endpoints permettent désormais aux opérateurs de consulter et mettre à jour l'état global de la buying policy de quotas ainsi que le quota minimum par défaut appliqué par cette buying policy. Ce quota permet de contrôler la quantité minimale par commande pour un fournisseur donné.

Ce quota global est utilisé pour tous les couples Customer Account × Supplier ne disposant pas d’une configuration individuelle.

🔍 1. Consultation de la configuration de la buying policy de quotas

ADM-BUYING-POLICY-501 - GET /v1/buying-policies/quotas

Permet de récupérer la configuration globale de la policy de quotas, incluant :

  • Son statut d’activation (ACTIVE ou INACTIVE)
  • La valeur actuelle du quota minimum par défaut (minQuotaValue)
  • La date de dernière mise à jour
{
  "status": "ACTIVE",
  "minQuotaValue": 1000,
  "updatedAt": "2025-07-03T09:00:00Z"
}
ℹ️

Si aucun quota spécifique n’est défini pour un fournisseur ou un couple Customer Account × Supplier, la valeur globale par défaut est appliquée.
⚠️ Par défaut, cette valeur est 0 lors de l’initialisation d’un environnement.

✏️ 2. Mise à jour du quota minimum par défaut

ADM-BUYING-POLICY-205 - PATCH /v1/buying-policies/quotas/min-value

Permet de modifier la valeur globale appliquée lorsque qu’aucun quota spécifique n’est configuré pour un fournisseur ou un couple Customer Account × Supplier.

{
  "minQuotaValue": 1500
}
ℹ️

La valeur doit être supérieure ou égale à 0
Un 0 signifie qu’aucune restriction de quota n’est appliquée par défaut

✏️ 3. Activation / désactivation de la policy

ADM-BUYING-POLICY-204 - PATCH /v1/buying-policies/quotas

Permet d’activer ou de désactiver globalement la policy de quotas.

{
  "status": "INACTIVE"
}

Valeurs acceptées pour le status :

  • ACTIVE → contrôle des quotas appliqué à toutes les commandes
  • INACTIVE → quotas ignorés, aucune commande bloquée

👍

UPDATE

Incidents

  • Filtrage par motif d’incident :

    Afin de pouvoir réduire le nombre d’incidents à traiter en front et de faciliter la recherche, un filtre par motif d’incident est ajouté.

    Il fonctionne de la même manière que le filtre customerAccountIds, il s'agit d'une liste d'id de reasons passées en query param sur la route ORDER-559 - GET /v1/shop/incidents

    Le param reasonCodes ajouté prendra en entrée une liste d’ID de reasons et fonctionne via un OU logique entre chaque valeur.

Périmètre

API

👍

UPDATE

Djust PAY

  • Modification des attributs de paiement

    • A la création et la validation d'une commande dans un contexte, il est désormais obligatoire de renseigner les deux champs suivants:

      • paymentOption
      • paymentProvider

      ⚠️

      Attention

      L'objet paymentInfo n'est pas obligatoire, seuls les attributs enfants paymentOption et paymentProvider le sont lorsque celui-ci est utilisé.

      Les routes concernées sont :

      ORDER-100 - POST /v1/shop/commercial-orders
      ORDER-212 - PUT /v1/shop/commercial-orders/{orderCommercialId}/created

Incidents

  • Filtrage par valeur de Custom Fields d’incident :

    Afin de pouvoir réduire le nombre d’incidents à traiter en front et de faciliter la recherche, un filtre par custom field value d’incident est ajouté.

    Le but dans ce cas est de pouvoir rechercher dans les valeurs de CF à l’incident (order line ou order).

    Ainsi on ajoutera le param customFields qui prendra en entrée une liste d’ID de CF croisés avec les valeurs à rechercher.

    Le format attendu est le suivant :

    customFields=CF_ID1|CF_Value1,CF_ID2|CF_Value2…