Gå til innhold
ShopentlyLearn

Opprett · Lagerjustering — Lagerbeholdning

Utfør «Opprett · Lagerjustering» i «Lagerbeholdning» med dataene som er beskrevet nedenfor.

POST/api/v1/inventory/stock-adjustments

Autentisering
Bearer
Tilgjengelig fra
STANDARD
Nødvendige tilganger
inventory.stock:update

Kodeeksempler

Eksempel på forespørsel

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))

Eksempel på svar 201

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

Prinsipper

  • Lagerposter skiller mellom fysisk on_hand-mengde, ordrereservasjoner, manuelle reservasjoner og mengden tilgjengelig for salg.
  • Bruk returnert lageridentifikator og versjon; produkt- og variantbeholdning er separate mål.
  • En sellable_limit på -1 betyr ubegrenset, mens 0 betyr at ingenting er tilgjengelig for salg.
  • Ubegrenset tilgjengelighet vises som null i available.
  • Ikke behandle null som 0.
  • Lagerjusteringer, salgsgrenser og manuelle reservasjoner bruker separate operasjoner og tilganger.

Parametere

Forespørselshoder

Idempotency-KeyStrengObligatorisk

Unik identifikator for én logisk skriveoperasjon.

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

Forespørselsinnhold

application/json · Obligatorisk

StockAdjustmentCreate
expected_versionHeltallObligatorisk

Versjon lest før skriveoperasjonen; et avvik avviser oppdateringen.

minimum: 0maximum: 9223372036854775807
Eksempel: 0
locationsArray <LocationQuantity > Obligatorisk

Lagerplasseringer.

minItems: 1maxItems: 100
Eksempel: [{"location_id":"example","on_hand":1}]
reasonStrengObligatorisk

Registrert begrunnelse for endringen.

minLength: 1maxLength: 500
Eksempel: "Example"
target_idStrengObligatorisk

Identifikator for produktet eller varianten operasjonen påvirker.

Begrensninger
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
Eksempel: "example"
target_typeStrengObligatorisk

Om operasjonen gjelder et produkt eller en variant.

Begrensninger
enum
["product", "variant"]
Eksempel: "product"
warehouse_idStrengObligatorisk

Lageridentifikator.

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

Svar

Svar 200

dataMutationData Obligatorisk

Innholdet i et vellykket svar.

Felter · data
deletedBoolsk verdiObligatorisk

Om slettingen ble utført.

idStrengObligatorisk

Ressursidentifikator; behold den slik den returneres.

versionHeltall nullObligatorisk

Ressursversjon brukt til samtidighetskontroll.

metaContextPageMeta ContextMeta PageMeta RequestMeta Obligatorisk

Svarmetadata.

Felter · meta

ContextPageMeta

localeStrengObligatorisk

Språk valgt for denne forespørselen.

market_codeStrengObligatorisk

Markedskode returnert av kontekstendepunktet.

market_idStrengObligatorisk

Markedsidentifikator returnert av kontekstendepunktet.

paginationPagination Obligatorisk

Metadata for markørbasert sideinndeling.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

ContextMeta

localeStrengObligatorisk

Språk valgt for denne forespørselen.

market_codeStrengObligatorisk

Markedskode returnert av kontekstendepunktet.

market_idStrengObligatorisk

Markedsidentifikator returnert av kontekstendepunktet.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obligatorisk

Metadata for markørbasert sideinndeling.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

RequestMeta

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

Svar 201

dataMutationData Obligatorisk

Innholdet i et vellykket svar.

Felter · data
deletedBoolsk verdiObligatorisk

Om slettingen ble utført.

idStrengObligatorisk

Ressursidentifikator; behold den slik den returneres.

versionHeltall nullObligatorisk

Ressursversjon brukt til samtidighetskontroll.

metaContextPageMeta ContextMeta PageMeta RequestMeta Obligatorisk

Svarmetadata.

Felter · meta

ContextPageMeta

localeStrengObligatorisk

Språk valgt for denne forespørselen.

market_codeStrengObligatorisk

Markedskode returnert av kontekstendepunktet.

market_idStrengObligatorisk

Markedsidentifikator returnert av kontekstendepunktet.

paginationPagination Obligatorisk

Metadata for markørbasert sideinndeling.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

ContextMeta

localeStrengObligatorisk

Språk valgt for denne forespørselen.

market_codeStrengObligatorisk

Markedskode returnert av kontekstendepunktet.

market_idStrengObligatorisk

Markedsidentifikator returnert av kontekstendepunktet.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obligatorisk

Metadata for markørbasert sideinndeling.

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100

RequestMeta

request_idStrengObligatorisk

Saksidentifikator; i svarmetadata identifiserer den HTTP-forespørselen.

minLength: 1maxLength: 100
Eksempel på svar

HTTP-status

200
Vellykket svar Skjema
201
Ressurs opprettet Skjema
400
Ugyldig forespørsel
401
Autentisering kreves
403
Tilgang nektet
404
Ressursen ble ikke funnet
409
Versjonskonflikt
422
Validering mislyktes
429
Forespørselsgrensen er overskredet
Andre HTTP-statuser (7)
405
Metoden er ikke tillatt
413
Forespørselen er for stor
415
Formatet støttes ikke
500
Serverfeil
502
Feil i API-gateway
503
Tjenesten er utilgjengelig
504
Tidsavbrudd

Feilkatalog: ErrorResponse

Headere

201

LocationStrengValgfritt

Relativ URL til ressursen som ble opprettet.

401

WWW-AuthenticateStrengValgfritt

Autentiseringsmetode serveren krever.

405

AllowStrengValgfritt

HTTP-metoder denne ressursen støtter.

429, 503

Retry-AfterHeltallValgfritt

Minste ventetid før neste forsøk, i sekunder.

minimum: 0