Ga naar de inhoud
ShopentlyLearn

Aanmaken · Voorraadcorrectie — Voorraad

Voer ‘Aanmaken · Voorraadcorrectie’ uit in ‘Voorraad’ met de hieronder beschreven gegevens.

POST/api/v1/inventory/stock-adjustments

Authenticatie
Bearer
Beschikbaar vanaf
STANDARD
Vereiste rechten
inventory.stock:update

Codevoorbeelden

Voorbeeldverzoek

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request POST \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --header 'Idempotency-Key: example-create_adjustment_api_v1_inventory_stock_adjustments_post' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "expected_version": 0,
  "locations": [
    {
      "location_id": "example",
      "on_hand": 1
    }
  ],
  "reason": "Example",
  "target_id": "example",
  "target_type": "product",
  "warehouse_id": "example"
}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/inventory/stock-adjustments

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = ['Idempotency-Key: example-create_adjustment_api_v1_inventory_stock_adjustments_post', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/inventory/stock-adjustments');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{
  "expected_version": 0,
  "locations": [
    {
      "location_id": "example",
      "on_hand": 1
    }
  ],
  "reason": "Example",
  "target_id": "example",
  "target_type": "product",
  "warehouse_id": "example"
}');
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {'Idempotency-Key': 'example-create_adjustment_api_v1_inventory_stock_adjustments_post'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "expected_version": 0,\n  "locations": [\n    {\n      "location_id": "example",\n      "on_hand": 1\n    }\n  ],\n  "reason": "Example",\n  "target_id": "example",\n  "target_type": "product",\n  "warehouse_id": "example"\n}'
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'POST', base_url + '/api/v1/inventory/stock-adjustments', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

Voorbeeldantwoord 201

JSON
{
  "data": {
    "deleted": false,
    "id": "stock_v1_WyJleGFtcGxlIiwicHJvZHVjdCIsImV4YW1wbGUiXQ",
    "version": 1
  },
  "meta": {
    "request_id": "example"
  }
}

Werking

  • Voorraadregistraties onderscheiden fysieke on_hand-hoeveelheid, bestelreserveringen, handmatige reserveringen en de voor verkoop beschikbare hoeveelheid.
  • Gebruik de teruggegeven voorraadidentificatie en versie; productvoorraad en variantvoorraad zijn afzonderlijke doelen.
  • Een sellable_limit van -1 betekent onbeperkt; 0 betekent dat er niets beschikbaar is voor verkoop.
  • Onbeperkte beschikbaarheid wordt in available als null weergegeven.
  • Behandel null niet als nul.
  • Voorraadcorrecties, verkooplimieten en handmatige reserveringen hebben afzonderlijke bewerkingen en rechten.

Parameters

Verzoekheaders

Idempotency-KeyTekenreeksVerplicht

Unieke identificatie voor één logische schrijfbewerking.

minLength: 1maxLength: 128
Beperkingen
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Voorbeeld: "example-create_adjustment_api_v1_inventory_stock_adjustments_post"

Verzoekinhoud

application/json · Verplicht

StockAdjustmentCreate
expected_versionGeheel getalVerplicht

Versie die vóór de schrijfbewerking is gelezen; bij afwijking wordt de wijziging geweigerd.

minimum: 0maximum: 9223372036854775807
Voorbeeld: 0
locationsArray <LocationQuantity > Verplicht

Magazijnlocaties.

minItems: 1maxItems: 100
Voorbeeld: [{"location_id":"example","on_hand":1}]
reasonTekenreeksVerplicht

Vastgelegde reden voor de wijziging.

minLength: 1maxLength: 500
Voorbeeld: "Example"
target_idTekenreeksVerplicht

Identificatie van het product of de variant waarop de bewerking betrekking heeft.

Beperkingen
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
Voorbeeld: "example"
target_typeTekenreeksVerplicht

Of de bewerking betrekking heeft op een product of een variant.

Beperkingen
enum
["product", "variant"]
Voorbeeld: "product"
warehouse_idTekenreeksVerplicht

Magazijnidentificatie.

Beperkingen
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
Voorbeeld: "example"

Antwoorden

Antwoord 200

dataMutationData Verplicht

Gegevens van een geslaagd antwoord.

Velden · data
deletedBooleaanse waardeVerplicht

Of de verwijdering is uitgevoerd.

idTekenreeksVerplicht

Resource-identificatie; bewaar deze zoals teruggegeven.

versionGeheel getal nullVerplicht

Resourceversie voor controle op gelijktijdige wijzigingen.

metaContextPageMeta ContextMeta PageMeta RequestMeta Verplicht

Metadata van het antwoord.

Velden · meta

ContextPageMeta

localeTekenreeksVerplicht

Taal die voor dit verzoek is geselecteerd.

market_codeTekenreeksVerplicht

Marktcode die het contextendpoint teruggeeft.

market_idTekenreeksVerplicht

Marktidentificatie die het contextendpoint teruggeeft.

paginationPagination Verplicht

Metadata voor cursorpaginering.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

ContextMeta

localeTekenreeksVerplicht

Taal die voor dit verzoek is geselecteerd.

market_codeTekenreeksVerplicht

Marktcode die het contextendpoint teruggeeft.

market_idTekenreeksVerplicht

Marktidentificatie die het contextendpoint teruggeeft.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

PageMeta

paginationPagination Verplicht

Metadata voor cursorpaginering.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

RequestMeta

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

Antwoord 201

dataMutationData Verplicht

Gegevens van een geslaagd antwoord.

Velden · data
deletedBooleaanse waardeVerplicht

Of de verwijdering is uitgevoerd.

idTekenreeksVerplicht

Resource-identificatie; bewaar deze zoals teruggegeven.

versionGeheel getal nullVerplicht

Resourceversie voor controle op gelijktijdige wijzigingen.

metaContextPageMeta ContextMeta PageMeta RequestMeta Verplicht

Metadata van het antwoord.

Velden · meta

ContextPageMeta

localeTekenreeksVerplicht

Taal die voor dit verzoek is geselecteerd.

market_codeTekenreeksVerplicht

Marktcode die het contextendpoint teruggeeft.

market_idTekenreeksVerplicht

Marktidentificatie die het contextendpoint teruggeeft.

paginationPagination Verplicht

Metadata voor cursorpaginering.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

ContextMeta

localeTekenreeksVerplicht

Taal die voor dit verzoek is geselecteerd.

market_codeTekenreeksVerplicht

Marktcode die het contextendpoint teruggeeft.

market_idTekenreeksVerplicht

Marktidentificatie die het contextendpoint teruggeeft.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

PageMeta

paginationPagination Verplicht

Metadata voor cursorpaginering.

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100

RequestMeta

request_idTekenreeksVerplicht

Aanvraagidentificatie; in antwoordmetadata identificeert dit het HTTP-verzoek.

minLength: 1maxLength: 100
Voorbeeldantwoord

HTTP-status

200
Geslaagd antwoord Schema
201
Resource aangemaakt Schema
400
Ongeldig verzoek
401
Authenticatie vereist
403
Toegang geweigerd
404
Resource niet gevonden
409
Versieconflict
422
Validatie mislukt
429
Verzoeklimiet overschreden
Overige HTTP-statussen (7)
405
Methode niet toegestaan
413
Verzoek te groot
415
Niet-ondersteund formaat
500
Serverfout
502
API-gatewayfout
503
Service niet beschikbaar
504
Gatewaytime-out

Foutencatalogus: ErrorResponse

Headers

201

LocationTekenreeksOptioneel

Relatieve URL van de aangemaakte resource.

401

WWW-AuthenticateTekenreeksOptioneel

Authenticatieschema dat de server vereist.

405

AllowTekenreeksOptioneel

HTTP-methoden die deze resource ondersteunt.

429, 503

Retry-AfterGeheel getalOptioneel

Minimale wachttijd voordat u het opnieuw probeert, in seconden.

minimum: 0