Dodanie zamówienia sprzedaży

Jak dodać zamówienie przez API

Poniższy skrypt dodaje zamówienie sprzedaży z losowymi produktami. W prawdziwej integracji najpierw będziemy musieli zmapować np produkty z OMS z produktami z WMS używając endpointa /api/external/v2/stock/product/getproducts. Skrypt jest dość prosty, pobiera produkty i w kolejnym kroku dodaje do zamówienia. Gdy zamówienie zostanie dodane, WMS zwraca ID zamówienia (do zapisania np w OMS/ERP)

Przy dodawaniu zamówień dobrą praktyką jest:

  1. Upewnienie się, że zamówień nie dodajemy parokrotnie (przez API można dodać to samo zamówienie bez żadnego limitu i w przypadku systemów produkcyjnych będą realizowane)

  2. Sprawdzanie i zapisywanie w OMS/ERP aktualnego statusu zamówienia (można wywołać webhooka z WMS do OMS - nie ma potrzeby odpytywanie API o statusy)

  3. Zapisanie na UI OMS/ERP nr zamówienia z WMS

  4. Uzupełnienie dostępnych informacji w zamówieniu takich jak:

a) salesourcetype (źródło zamówienie) b) saleType (typ zamówienia, Detal/Hurt etc) (https://docs.easystorage.io/pl/panel-web/konfiguracja/typy-zamowien-sprzedazy)

c) klient invoiceCustomer/shippingCustomer

Endpoint na dodawanie klientów jest w tym momencie niedostępny

import requests
import uuid
import json
import random
from datetime import datetime, timezone

# 🔧 KONFIGURACJA
BASE_URL = "https://tenanatklient.easystorage.io"
USERNAME = "apiuser@e"
PASSWORD = "haslo"
WAREHOUSE_ID = "3a4a1dfe-7703-4865-374e-08da2dc1ff9f"
NUM_PRODUCTS = 50  # 🔁 TUTAJ ustaw ile produktów chcesz dodać do zamówienia

# 🔑 POBIERANIE TOKENA
def get_access_token():
    url = f"{BASE_URL}/api/external/v2/account/gettoken"
    payload = {
        'username': USERNAME,
        'password': PASSWORD,
    }
    response = requests.post(url, json=payload)
    response.raise_for_status()
    return response.json()['data']['user']['accessToken']

# 📦 POBIERANIE PRODUKTÓW
def get_products(token, num_products):
    url = f"{BASE_URL}/api/external/v2/stock/product/getproducts"
    headers = {
        'Authorization': f'Bearer {token}'
    }

    page = 1
    products = []

    while len(products) < num_products:
        payload = {
            "paging": {
                "page": page,
                "rowsPerPage": 100
            },
            "filter": {
                "ids": None,
                "codes": None,
                "createdOrUpdatedAfter": None,
                "owner": {
                    "id": None
                }
            }
        }

        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        page_data = response.json()['data']['products']
        if not page_data:
            break
        products.extend(page_data)
        page += 1

    return products[:num_products]

# 🧾 BUDOWANIE ZAMÓWIENIA
def build_order(products):

    now_utc = datetime.now(timezone.utc)
    formatted = now_utc.isoformat(timespec='milliseconds').replace('+00:00', 'Z')

    return {
        "orderNumber": f"ORDER-{uuid.uuid4()}",
        "referenceNumber": f"zam/{str(uuid.uuid4())[:8]}",
        "saleDate": formatted,
        "warehouse": {
            "id": WAREHOUSE_ID
        },
        "products": [
            {
                "product": {
                    "id": p["id"]
                },
                "quantity": random.randint(1, 10)
            } for p in products
        ]
    }

# 🚚 WYSYŁKA ZAMÓWIENIA
def send_order(token, order_data):
    url = f"{BASE_URL}/api/external/v2/sale/addsale"
    headers = {
        'Authorization': f'Bearer {token}'
    }
    response = requests.post(url, headers=headers, json=order_data)

    if response.status_code != 200:
        print("❌ Błąd podczas dodawania zamówienia:")
        print(f"Status: {response.status_code}")
        print("Treść odpowiedzi:", response.text)
        print("📤 Wysłany payload:")
        print(json.dumps(order_data, indent=2))
        return

    data = response.json().get("data")
    sale_id = data.get("sale", {}).get("id") if data else None

    if sale_id:
        print(f"✅ Zamówienie utworzone! ID: {sale_id}")
    else:
        print("⚠️ Zamówienie wysłane, ale nie znaleziono saleId w odpowiedzi:")
        print(response.json())

# ▶️ START
if __name__ == "__main__":
    print("🔑 Pobieram token...")
    token = get_access_token()

    print("📦 Pobieram listę produktów...")
    products = get_products(token, NUM_PRODUCTS)

    print(f"✅ Znaleziono {len(products)} produktów.")

    print("🧾 Buduję zamówienie...")
    order_data = build_order(products)

    print("📤 Wysyłam zamówienie...")
    send_order(token, order_data)

Last updated