Stock Movements

    Endpoints pour consulter l'historique des mouvements de stock

    Stock Movements API

    Endpoints pour accéder à l'historique des entrées, sorties et ajustements de stock.

    Lister les mouvements de stock

    GET /v1/public-api/stock-movements

    Scope requis: read:stock-movements

    Paramètres de requête

    ParamètreTypeDescription
    pagenumberNuméro de page (défaut: 1)
    limitnumberÉléments par page (défaut: 20, max: 100)
    dateFromstringDate de début (ISO 8601)
    dateTostringDate de fin (ISO 8601)
    typestringType de mouvement : IN, OUT, ADJUSTMENT
    productIdstringFiltrer par produit
    warehouseIdstringFiltrer par entrepôt

    Exemple de requête

    curl -X GET "https://api.nerpsuite.com/v1/public-api/stock-movements?dateFrom=2024-01-01&dateTo=2024-01-31&type=OUT" \
      -H "X-API-Key: sk_live_xxx"

    Réponse

    {
      "data": [
        {
          "id": "mov_001",
          "batchId": "batch_abc",
          "batchNumber": "LOT-2024-0042",
          "productId": "prod_001",
          "productName": "iPhone 15 Pro",
          "sku": "IPHONE-15-PRO-128",
          "warehouseId": "wh_001",
          "warehouseName": "Entrepôt Central",
          "type": "OUT",
          "quantity": 2,
          "previousQty": 50,
          "newQty": 48,
          "sourceType": "CUSTOMER_ORDER",
          "sourceId": "ord_abc123",
          "notes": null,
          "createdAt": "2024-01-25T10:30:00Z"
        },
        {
          "id": "mov_002",
          "batchId": "batch_def",
          "batchNumber": "LOT-2024-0038",
          "productId": "prod_003",
          "productName": "Coque iPhone 15",
          "sku": "CASE-IPHONE-15-BLK",
          "warehouseId": "wh_001",
          "warehouseName": "Entrepôt Central",
          "type": "OUT",
          "quantity": 1,
          "previousQty": 120,
          "newQty": 119,
          "sourceType": "CUSTOMER_ORDER",
          "sourceId": "ord_abc123",
          "notes": null,
          "createdAt": "2024-01-25T10:30:00Z"
        }
      ],
      "total": 342,
      "page": 1,
      "limit": 20,
      "totalPages": 18
    }

    Obtenir un mouvement

    GET /v1/public-api/stock-movements/:id

    Scope requis: read:stock-movements

    Paramètres de chemin

    ParamètreTypeDescription
    idstringID du mouvement

    Exemple de requête

    curl -X GET "https://api.nerpsuite.com/v1/public-api/stock-movements/mov_001" \
      -H "X-API-Key: sk_live_xxx"

    Réponse

    Même format que dans la liste, mais pour un seul mouvement.

    Champs de réponse

    ChampTypeDescription
    idstringIdentifiant unique
    batchIdstringID du lot concerné
    batchNumberstringNuméro de lot
    productIdstringID du produit
    productNamestringNom du produit
    skustringSKU du produit
    warehouseIdstringID de l'entrepôt
    warehouseNamestringNom de l'entrepôt
    typestringType de mouvement
    quantitynumberQuantité déplacée
    previousQtynumberQuantité avant mouvement
    newQtynumberQuantité après mouvement
    sourceTypestringSource du mouvement
    sourceIdstringID de la source
    notesstringNotes additionnelles
    createdAtstringDate du mouvement (ISO 8601)

    Types de mouvement

    TypeDescription
    INEntrée en stock (réception fournisseur, retour)
    OUTSortie de stock (vente, expédition)
    ADJUSTMENTAjustement manuel (inventaire, correction)

    Sources de mouvement

    SourceDescription
    SUPPLIER_ORDERRéception d'une commande fournisseur
    CUSTOMER_ORDERVente à un client
    ADJUSTMENTAjustement manuel
    TRANSFERTransfert entre entrepôts
    DISPOSALMise au rebut (expiration, dommage)

    Cas d'usage

    Analyse de la rotation des stocks avec Power BI

    async function getStockRotation(productId, dateFrom, dateTo) {
      const response = await fetch(
        `/v1/public-api/stock-movements?productId=${productId}&dateFrom=${dateFrom}&dateTo=${dateTo}`,
        { headers: { 'X-API-Key': apiKey } }
      );
    
      const { data } = await response.json();
    
      const inQty = data.filter(m => m.type === 'IN').reduce((sum, m) => sum + m.quantity, 0);
      const outQty = data.filter(m => m.type === 'OUT').reduce((sum, m) => sum + m.quantity, 0);
    
      return { inQty, outQty, netChange: inQty - outQty };
    }

    Tracer les mouvements par entrepôt

    async function getMovementsByWarehouse(warehouseId) {
      let allMovements = [];
      let page = 1;
      let hasMore = true;
    
      while (hasMore) {
        const response = await fetch(
          `/v1/public-api/stock-movements?warehouseId=${warehouseId}&page=${page}&limit=100`,
          { headers: { 'X-API-Key': apiKey } }
        );
    
        const result = await response.json();
        allMovements = allMovements.concat(result.data);
        hasMore = page < result.totalPages;
        page++;
      }
    
      return allMovements;
    }