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:
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)
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)
Zapisanie na UI OMS/ERP nr zamówienia z WMS
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
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