docs: update Letzshop order import documentation
- Update implementation guide with unified order approach - Add mkdocs navigation entry - Add background task for order sync - Add debug script for historical imports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
163
scripts/debug_historical_import.py
Normal file
163
scripts/debug_historical_import.py
Normal file
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Debug script for historical import issues."""
|
||||
|
||||
import sys
|
||||
sys.path.insert(0, ".")
|
||||
|
||||
from app.core.database import SessionLocal
|
||||
from app.services.letzshop.credentials_service import LetzshopCredentialsService
|
||||
from models.database.letzshop import LetzshopHistoricalImportJob
|
||||
|
||||
|
||||
def get_valid_shipment_states(vendor_id: int = 1):
|
||||
"""Query the GraphQL schema to find valid ShipmentStateEnum values."""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
creds_service = LetzshopCredentialsService(db)
|
||||
|
||||
# Introspection query to get enum values
|
||||
introspection_query = """
|
||||
query {
|
||||
__type(name: "ShipmentStateEnum") {
|
||||
name
|
||||
enumValues {
|
||||
name
|
||||
description
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
with creds_service.create_client(vendor_id) as client:
|
||||
print("Querying ShipmentStateEnum values...")
|
||||
result = client._execute(introspection_query)
|
||||
|
||||
if result and "__type" in result:
|
||||
type_info = result["__type"]
|
||||
if type_info:
|
||||
print(f"\nEnum: {type_info['name']}")
|
||||
print("Valid values:")
|
||||
for value in type_info.get("enumValues", []):
|
||||
print(f" - {value['name']}: {value.get('description', 'No description')}")
|
||||
else:
|
||||
print("ShipmentStateEnum type not found")
|
||||
else:
|
||||
print(f"Unexpected result: {result}")
|
||||
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
def check_import_job_status():
|
||||
"""Check the status of historical import jobs."""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
jobs = db.query(LetzshopHistoricalImportJob).order_by(
|
||||
LetzshopHistoricalImportJob.id.desc()
|
||||
).limit(5).all()
|
||||
|
||||
print("\n=== Recent Historical Import Jobs ===")
|
||||
for job in jobs:
|
||||
print(f"\nJob {job.id}:")
|
||||
print(f" Status: {job.status}")
|
||||
print(f" Phase: {job.current_phase}")
|
||||
print(f" Page: {job.current_page}")
|
||||
print(f" Shipments fetched: {job.shipments_fetched}")
|
||||
print(f" Orders processed: {job.orders_processed}")
|
||||
print(f" Orders imported: {job.orders_imported}")
|
||||
print(f" Orders updated: {job.orders_updated}")
|
||||
print(f" Orders skipped: {job.orders_skipped}")
|
||||
print(f" Confirmed stats: {job.confirmed_stats}")
|
||||
print(f" Declined stats: {job.declined_stats}")
|
||||
print(f" Error: {job.error_message}")
|
||||
print(f" Started: {job.started_at}")
|
||||
print(f" Completed: {job.completed_at}")
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
def test_fetch_states(vendor_id: int = 1):
|
||||
"""Test fetching shipments with different states."""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
creds_service = LetzshopCredentialsService(db)
|
||||
|
||||
# States to test
|
||||
states_to_test = ["unconfirmed", "confirmed", "declined", "shipped", "rejected"]
|
||||
|
||||
with creds_service.create_client(vendor_id) as client:
|
||||
for state in states_to_test:
|
||||
print(f"\nTesting state: {state}")
|
||||
try:
|
||||
# Just try to fetch first page
|
||||
shipments = client.get_all_shipments_paginated(
|
||||
state=state,
|
||||
page_size=1,
|
||||
max_pages=1,
|
||||
)
|
||||
print(f" ✓ Success: {len(shipments)} shipments")
|
||||
except Exception as e:
|
||||
print(f" ✗ Error: {e}")
|
||||
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
def check_declined_items(vendor_id: int = 1):
|
||||
"""Check for orders with declined inventory units."""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
from models.database.letzshop import LetzshopOrder
|
||||
from collections import Counter
|
||||
|
||||
# Get all orders with inventory_units
|
||||
orders = db.query(LetzshopOrder).filter(
|
||||
LetzshopOrder.vendor_id == vendor_id,
|
||||
LetzshopOrder.inventory_units.isnot(None),
|
||||
).all()
|
||||
|
||||
# Count all states
|
||||
state_counts = Counter()
|
||||
total_units = 0
|
||||
|
||||
for order in orders:
|
||||
units = order.inventory_units or []
|
||||
for unit in units:
|
||||
state = unit.get("state", "unknown")
|
||||
state_counts[state] += 1
|
||||
total_units += 1
|
||||
|
||||
print(f"\n=== Inventory Unit States (all {len(orders)} orders) ===")
|
||||
print(f" Total units: {total_units}")
|
||||
print(f"\n State breakdown:")
|
||||
for state, count in sorted(state_counts.items(), key=lambda x: -x[1]):
|
||||
print(f" {state}: {count}")
|
||||
|
||||
# Show a sample order with its units
|
||||
if orders:
|
||||
sample = orders[0]
|
||||
print(f"\nSample order #{sample.id} (shipment {sample.letzshop_shipment_id}):")
|
||||
print(f" Shipment state: {sample.letzshop_state}")
|
||||
print(f" Sync status: {sample.sync_status}")
|
||||
if sample.inventory_units:
|
||||
for i, unit in enumerate(sample.inventory_units[:5]):
|
||||
print(f" Unit {i+1}: state={unit.get('state')}, id={unit.get('id')}")
|
||||
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("=== Letzshop Historical Import Debug ===\n")
|
||||
|
||||
print("1. Checking valid shipment states...")
|
||||
get_valid_shipment_states()
|
||||
|
||||
print("\n\n2. Testing different state values...")
|
||||
test_fetch_states()
|
||||
|
||||
print("\n\n3. Checking import job status...")
|
||||
check_import_job_status()
|
||||
|
||||
print("\n\n4. Checking declined items in inventory units...")
|
||||
check_declined_items()
|
||||
Reference in New Issue
Block a user