Référence de l’API

Demandes d’achat

Ce que les personnes demandent à acheter avant qu’il existe une commande : validation, contrôle budgétaire, puis une commande.

En savoir plus sur cette ressource

Tout membre d’un espace de travail acheteur peut demander quelque chose, quel que soit son rôle achats : une demande n’engage aucune dépense, et sa validation est le contrôle. Une demande soumise passe par le circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), le plafond de dépenses du demandeur et, quand les budgets sont activés, le budget de son centre de coûts. Une fois validée, une personne habilitée à émettre des commandes la transforme en bon de commande avec ConvertPurchaseRequest. La commande garde la validation de la demande si elle reste dans ce qui a été validé, sur le même centre de coûts et le même compte comptable. Les demandes sont réservées à l’acheteur et ne sont jamais montrées aux fournisseurs.

Lister les demandes d’achat

Liste les demandes d’achat que vous pouvez voir, des plus récentes aux plus anciennes.

GET/v1/workspaces/{regionId}/purchase-requests

Paramètres

  • status"draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled"

    Seulement les demandes ayant ce statut.

  • mineboolean

    true : seulement les demandes de l’appelant.

  • awaitingMeboolean

    true : seulement les demandes qui attendent la validation de l’appelant, comme dans sa file de validations. status et mine sont alors ignorés.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Liste les demandes de l’appelant ; avec l’accès 'view' aux bons de commande, celles de tout le monde sauf les brouillons des autres ; et toute demande dont la chaîne de validation désigne l’appelant. Des plus récentes aux plus anciennes.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/purchase-requests
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
[
   {
      "id": "string",
      "title": "string",
      "description": "string",
      "requesterEmployeeKey": "string",
      "requesterName": "string",
      "costCenter": "string",
      "glCode": "string",
      "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
      "lineItems": [
         { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
      ],
      "amount": number,
      "currency": "string",
      "neededBy": "string",
      "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
      "notes": "string",
      "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "approvalVersion": number,
      "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
      "poId": "string",
      "rejectionReason": "string",
      "createdAt": "string",
      "updatedAt": "string",
      "submittedAt": "string",
      "decidedAt": "string",
      "canceledAt": "string",
      "canceledBy": "string"
   }
]

Créer une demande d’achat

Demande quelque chose : enregistre un brouillon ou le soumet à validation.

POST/v1/workspaces/{regionId}/purchase-requests

Corps

  • titlestringObligatoire

    Ce qui est nécessaire, en quelques mots. Jusqu’à 200 caractères.

  • descriptionstring

    Pourquoi c’est nécessaire : la raison métier. Jusqu’à 4 000 caractères. Obligatoire pour soumettre.

  • costCenterstring

    Le code ou le nom d’un centre de coûts, enregistré sous son code. Obligatoire pour soumettre quand l’espace de travail tient une liste de centres de coûts.

  • glCodestring

    Le compte comptable (catégorie de dépense), quand ce n’est pas celui du centre de coûts. Jusqu’à 40 caractères.

  • supplierobject

    Un fournisseur suggéré par le demandeur : { name, supplierConnectionId?, supplierRegionId? }. Un nom seul n’oriente rien ; un fournisseur approuvé de la liste de l’espace de travail est utilisé par les étapes de validation par fournisseur.

  • lineItemsArray<{ name, lineType?, qty, unit?, unitPrice }>Obligatoire

    Ce qui est nécessaire, de 1 à 50 lignes : name (jusqu’à 200 caractères), qty (supérieur à 0), unit (facultatif, p. ex. each, hour, month), unitPrice (une estimation, 0 ou plus, dans la devise de la demande) et lineType (facultatif : goods ou service, repris sur la ligne de la commande ; s’il est omis, une unité de temps en fait un service, toute autre un bien). Une ligne suffit pour une estimation.

  • currencystring

    ISO 4217. La devise de l’espace de travail si elle est omise.

  • neededBystring

    Quand c’est nécessaire, YYYY-MM-DD.

  • quoteImportIdstring

    Un devis importé via l’import de devis, à joindre.

  • notesstring

    Ce que les achats doivent savoir. Jusqu’à 2 000 caractères.

  • submitboolean

    true la soumet à validation aussitôt ; sinon, elle est enregistrée en brouillon.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Crée une demande d’achat en brouillon, avec l’appelant comme demandeur. Avec submit: true, elle est soumise aussitôt, comme le fait SubmitPurchaseRequest, et la réponse la montre en pending_approval, ou en approved quand l’autonomie ou une règle d’automatisation la couvre.

Tout membre de l’espace de travail acheteur, quel que soit son rôle achats.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - Un champ manque ou est invalide. Avec submit: true, aussi quand la demande n’a pas de description, pas de montant supérieur à 0, ou pas de centre de coûts dans un espace de travail qui tient une liste.
  • 409 Conflict - Code over_budget. Les budgets sont appliqués (mode blocage) et la demande ferait dépasser le budget de son centre de coûts, ou aucun taux de change ne permet de la contrôler. Le budgetCheck du corps donne les montants. Rien n’est enregistré.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests
Requête
POST /v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.buyer/purchase-requests
{
   "title": "Monitors for the design team",
   "description": "Two new designers start on November 3.",
   "costCenter": "CC-1000",
   "lineItems": [ { "name": "27-inch monitor", "lineType": "goods", "qty": 2, "unit": "each", "unitPrice": 320 } ],
   "neededBy": "2026-11-03",
   "submit": true
}
Réponse · 201 Created
{
   "id": "PR-3F9A1C2E",
   "title": "Monitors for the design team",
   "requesterName": "Priya Shah",
   "costCenter": "CC-1000",
   "amount": 640,
   "currency": "USD",
   "status": "pending_approval",
   "approvalVersion": 1,
   ...
}

Obtenir une demande d’achat

Obtient une demande d’achat.

GET/v1/workspaces/{regionId}/purchase-requests/{requestId}

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Renvoie une demande d’achat avec sa chaîne de validation, son contrôle budgétaire et, une fois commandée, le bon de commande qu’elle est devenue (poId). Visible par les mêmes personnes que dans ListPurchaseRequests.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/purchase-requests/{requestId}
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Modifier une demande d’achat

Modifie un brouillon, ou une demande en attente de validation.

PATCH/v1/workspaces/{regionId}/purchase-requests/{requestId}

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Corps

  • titlestring

    Ce qui est nécessaire, en quelques mots. Jusqu’à 200 caractères.

  • descriptionstring

    Pourquoi c’est nécessaire : la raison métier. Jusqu’à 4 000 caractères. Obligatoire pour soumettre.

  • costCenterstring

    Le code ou le nom d’un centre de coûts, enregistré sous son code. Obligatoire pour soumettre quand l’espace de travail tient une liste de centres de coûts.

  • glCodestring

    Le compte comptable (catégorie de dépense), quand ce n’est pas celui du centre de coûts. Jusqu’à 40 caractères.

  • supplierobject

    Un fournisseur suggéré par le demandeur : { name, supplierConnectionId?, supplierRegionId? }. Un nom seul n’oriente rien ; un fournisseur approuvé de la liste de l’espace de travail est utilisé par les étapes de validation par fournisseur.

  • lineItemsArray<{ name, lineType?, qty, unit?, unitPrice }>

    Ce qui est nécessaire, de 1 à 50 lignes : name (jusqu’à 200 caractères), qty (supérieur à 0), unit (facultatif, p. ex. each, hour, month), unitPrice (une estimation, 0 ou plus, dans la devise de la demande) et lineType (facultatif : goods ou service, repris sur la ligne de la commande ; s’il est omis, une unité de temps en fait un service, toute autre un bien). Une ligne suffit pour une estimation.

  • currencystring

    ISO 4217. La devise de l’espace de travail si elle est omise.

  • neededBystring

    Quand c’est nécessaire, YYYY-MM-DD.

  • quoteImportIdstring

    Un devis importé via l’import de devis, à joindre.

  • notesstring

    Ce que les achats doivent savoir. Jusqu’à 2 000 caractères.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Le demandeur modifie les champs envoyés ; le reste ne change pas. Envoyer lineItems remplace toutes les lignes. Une demande en attente de validation repasse par la validation depuis le début, car ses validations portaient sur son contenu précédent.

Le demandeur uniquement.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - Un champ est invalide, ou la demande est validée, commandée, rejetée ou annulée et ne peut pas être modifiée.
  • 403 Forbidden - L’appelant n’est pas le demandeur.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 409 Conflict - Code over_budget. Les budgets sont appliqués (mode blocage) et la demande ferait dépasser le budget de son centre de coûts, ou aucun taux de change ne permet de la contrôler. Le budgetCheck du corps donne les montants. Rien n’est enregistré.
  • 409 Conflict - La demande a changé pendant que cet appel l’écrivait. Relisez-la et réessayez.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
PATCH /v1/workspaces/{regionId}/purchase-requests/{requestId}
Requête
curl -X PATCH "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Soumettre une demande d’achat

Soumet un brouillon à validation.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/submit

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Construit la chaîne de validation de la demande et prévient son premier valideur. Les étapes de validation sont orientées selon le montant, le fournisseur, le demandeur, le centre de coûts et le compte comptable. Le statut devient pending_approval, ou directement approved quand l’autonomie ou une règle d’automatisation la couvre. Une demande dans une autre devise que celle de l’espace de travail est orientée au taux de change du jour ; sans taux, elle va toujours à une personne. Sans corps.

Le demandeur uniquement.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - La demande a déjà été soumise, ou elle n’a pas de description, pas de montant supérieur à 0, ou pas de centre de coûts dans un espace de travail qui tient une liste.
  • 403 Forbidden - L’appelant n’est pas le demandeur.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 409 Conflict - Code over_budget. Les budgets sont appliqués (mode blocage) et la demande ferait dépasser le budget de son centre de coûts, ou aucun taux de change ne permet de la contrôler. Le budgetCheck du corps donne les montants. Rien n’est enregistré.
  • 409 Conflict - La demande a changé pendant que cet appel l’écrivait. Relisez-la et réessayez.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/submit
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/submit" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Valider une demande d’achat

Valide l’étape de validation en cours d’une demande d’achat.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/approve

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Corps

  • expectedVersionnumber

    L’approvalVersion vue par l’appelant. Si la validation de la demande a changé depuis, l’appel est refusé avec 409 APPROVAL_VERSION_CHANGED au lieu de valider autre chose.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Valide l’étape qui désigne l’appelant. À l’étape finale, le budget est contrôlé de nouveau avant que la demande soit validée ; le demandeur est prévenu, ainsi que les personnes habilitées à émettre des commandes. Les mêmes règles que pour valider un bon de commande s’appliquent, y compris sur la possibilité pour un demandeur de valider sa propre demande.

Session connectée uniquement, avec l’accès 'edit' aux bons de commande. Tout autre appelant, y compris une clé d’API, reçoit 403 HUMAN_APPROVAL_REQUIRED avant toute lecture.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - La demande n’attend pas de validation.
  • 403 Forbidden - Code HUMAN_APPROVAL_REQUIRED. L’appelant est une clé API. Les étapes de validation désignent un employé précis, et une clé ne peut jamais en être un : une clé ne peut donc ni valider ni refuser une étape. Demandez à l’employé désigné par l’étape d’agir dans Pleaxy.
  • 403 Forbidden - Code APPROVER_NOT_ASSIGNED. Aucun valideur n’est affecté à l’étape en cours, donc personne ne peut agir dessus. Un administrateur doit d’abord en affecter un avec ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - L’appelant n’est pas l’employé désigné par l’étape en cours. Seul cet employé peut la valider ou la refuser : aucun rôle ni aucune permission ne remplace le fait d’être désigné.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 409 Conflict - Code APPROVAL_VERSION_CHANGED : expectedVersion ne correspond plus. Relisez la demande.
  • 409 Conflict - Code over_budget. Les budgets sont appliqués (mode blocage) et la demande ferait dépasser le budget de son centre de coûts, ou aucun taux de change ne permet de la contrôler. Le budgetCheck du corps donne les montants. Rien n’est enregistré.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/approve
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/approve" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "expectedVersion": number
}
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Rejeter une demande d’achat

Rejette une demande d’achat avec un motif.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/reject

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Corps

  • reasonstringObligatoire

    Pourquoi la demande est rejetée ; le demandeur le voit. Jusqu’à 1 000 caractères.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Rejette la demande à l’étape qui désigne l’appelant. Le statut devient rejected et le demandeur est prévenu avec le motif. Définitif : le demandeur fait une nouvelle demande.

Avec l’accès 'edit' aux bons de commande. Seul l’employé désigné par l’étape en cours ; une clé d’API reçoit 403 HUMAN_APPROVAL_REQUIRED.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - Pas de motif, ou la demande n’attend pas de validation.
  • 403 Forbidden - Code HUMAN_APPROVAL_REQUIRED. L’appelant est une clé API. Les étapes de validation désignent un employé précis, et une clé ne peut jamais en être un : une clé ne peut donc ni valider ni refuser une étape. Demandez à l’employé désigné par l’étape d’agir dans Pleaxy.
  • 403 Forbidden - Code APPROVER_NOT_ASSIGNED. Aucun valideur n’est affecté à l’étape en cours, donc personne ne peut agir dessus. Un administrateur doit d’abord en affecter un avec ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - L’appelant n’est pas l’employé désigné par l’étape en cours. Seul cet employé peut la valider ou la refuser : aucun rôle ni aucune permission ne remplace le fait d’être désigné.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/reject
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/reject" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "reason": "string"
}
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Annuler une demande d’achat

Retire une demande d’achat tant qu’elle n’est pas commandée.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Retire un brouillon, une demande en attente de validation ou une demande validée pas encore commandée. Le statut devient canceled. Sans corps.

Le demandeur, ou un administrateur de l’espace de travail.

Champs de la réponse

  • statusstring

    draft jusqu’à la soumission ; pending_approval pendant la chaîne de validation ; approved, puis ordered une fois devenue un bon de commande (poId) ; ou rejected (rejectionReason) ou canceled.

  • amountnumber

    Le total des lignes (qty × unitPrice), en currency.

  • approvalobject

    La chaîne de validation, absente tant que c’est un brouillon. Construite à partir du circuit de validation des demandes d’achat de l’espace de travail (par défaut celui des bons de commande), du plafond de dépenses du demandeur et du contrôle budgétaire.

  • approvalVersionnumber

    Augmente à chaque changement de la validation. Envoyez-la comme expectedVersion pour valider.

  • budgetCheckobject

    Le contrôle budgétaire du centre de coûts quand les budgets sont activés : le dernier, à la soumission ou à la validation finale. Les montants sont dans la devise du budget.

Erreurs

  • 400 Bad Request - La demande est déjà commandée, rejetée ou annulée.
  • 403 Forbidden - L’appelant n’est ni le demandeur ni un administrateur.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 409 Conflict - La demande a changé pendant que cet appel l’écrivait. Relisez-la et réessayez.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Convertir une demande d’achat

Commande une demande validée : crée son bon de commande.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/convert

Paramètres

  • requestIdstringObligatoire

    La demande d’achat, p. ex. PR-3F9A1C2E.

Corps

  • any CreatePurchaseOrder fieldobject

    Tous les champs sont facultatifs et reprennent par défaut ceux de la demande. supplier est nécessaire quand la demande n’en désigne aucun. Envoyer lineItems remplace les lignes de la demande.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Crée un bon de commande à partir d’une demande validée, comme le fait CreatePurchaseOrder : les lignes de la demande (une ligne personnalisée en quantité chacune), le fournisseur, le centre de coûts, le compte comptable, le devis et les notes, que le corps peut chacun remplacer. La commande désigne la demande (requestId) et la demande passe à ordered, en une seule étape : une demande devient au plus une commande. Quand la commande porte sur le même centre de coûts et le même compte comptable et que son montant, dans la devise de l’espace de travail, ne dépasse pas ce qui a été validé, elle garde la validation de la demande ; sinon, elle passe par le circuit de validation des bons de commande. Le demandeur est prévenu.

Avec l’accès 'create' aux bons de commande.

Erreurs

  • 400 Bad Request - La demande n’est pas validée, ou ni la demande ni le corps ne désignent de fournisseur. Tout refus de CreatePurchaseOrder s’applique aussi.
  • 409 Conflict - La demande a déjà été commandée.
  • 404 Not Found - Aucune demande d’achat avec cet id que l’appelant peut voir. Qui ne peut pas voir une demande n’apprend pas si elle existe.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/convert
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/convert" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 201 Created
{
   "request": {
      "id": "string",
      "title": "string",
      "description": "string",
      "requesterEmployeeKey": "string",
      "requesterName": "string",
      "costCenter": "string",
      "glCode": "string",
      "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
      "lineItems": [
         { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
      ],
      "amount": number,
      "currency": "string",
      "neededBy": "string",
      "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
      "notes": "string",
      "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "approvalVersion": number,
      "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
      "poId": "string",
      "rejectionReason": "string",
      "createdAt": "string",
      "updatedAt": "string",
      "submittedAt": "string",
      "decidedAt": "string",
      "canceledAt": "string",
      "canceledBy": "string"
   },
   "purchaseOrder": {
      "id": "string",
      "buyerOrgId": "string",
      "supplierOrgId": "string",
      "supplier": "string",
      "amount": number,
      "currency": "string",
      "status": "draft" | "pending_approval" | "rejected" | "awaiting_fulfillment" | "invoiced" | "paid" | "canceled" | "closed" | "expired",
      "invoiceId": "string",
      "provider": "aws" | "gcp" | "azure" | "oci",
      "payerAccounts": [
         { "id": "string", "label": "string", "detail": "string" }
      ],
      "billToParty": {
         "source": "company_profile" | "custom",
         "companyName": "string",
         "address": { "line1": "string", "line2": "string", "city": "string", "region": "string", "postalCode": "string", "country": "string" },
         "addressText": "string",
         "taxId": "string"
      },
      "costCenter": "string",
      "costCenterChanges": [ { "from": "string", "to": "string", "reason": "string", "by": "string", "byName": "string", "at": "string" } ],
      "budgetOwner": "string",
      "buyerName": "string",
      "supplierSite": "string",
      "notes": "string",
      "requestId": "string",
      "lineItems": [
         {
         "lineNo": number,
         "scopeType": "sku" | "service" | "account" | "custom",
         "scopeId": "string" | null,
         "name": "string",
         "ruleType": "quantity" | "amount",
         "unit": "string",
         "unitPrice": number,
         "qty": number,
         "nteAmount": number,
         "lineType": "goods" | "service",
         "currency": "string",
         "paymentTerms": "string",
         "validFrom": "string",
         "validUntil": "string",
         "consumed": number,
         "customerLineNo": "string",
         "supplierSku": "string",
         "priceSource": "contract" | "list" | "manual"
       }
      ],
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "supplierEmail": { "to": "string", "at": "string" },
      "priorInvoiced": { "amount": number, "currency": "string", "basis": "invoiced" | "remaining", "sourceSystem": "sap_ariba" | "coupa" | "oracle", "importId": "string", "fileName": "string", "importedAt": "string", "importedBy": "string" },
      "createdAt": "string"
   }
}
Nous contacter