A comprehensive barcode scanning application for InvenTree inventory management. Features: - Multi-mode operation (Add/Update/Check/Locate stock) - Smart duplicate prevention when adding stock - Barcode scanning with automatic part code cleaning - Real-time server connection monitoring - Part information display with images - Debug mode for troubleshooting Fixes applied: - Fixed encoding issues with non-ASCII characters in barcodes - Fixed API response handling for list and dict formats - Implemented duplicate prevention using PATCH to update existing stock - Added comprehensive error handling and logging Includes test suite for verification of all fixes.
107 lines
4.1 KiB
Python
107 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script to demonstrate the updated _add_stock logic.
|
|
This shows how duplicates are prevented by updating existing stock items.
|
|
"""
|
|
|
|
def simulate_add_stock(part_id, location_id, quantity, existing_stock_items):
|
|
"""
|
|
Simulate the add stock workflow.
|
|
|
|
Args:
|
|
part_id: Part ID
|
|
location_id: Location ID
|
|
quantity: Quantity to add
|
|
existing_stock_items: List of existing stock items (for simulation)
|
|
|
|
Returns:
|
|
Tuple of (action, stock_id, old_stock, new_stock)
|
|
"""
|
|
# Find existing stock item for this part at this location
|
|
existing = None
|
|
for item in existing_stock_items:
|
|
if item['part'] == part_id and item['location'] == location_id:
|
|
existing = item
|
|
break
|
|
|
|
if existing:
|
|
# Stock item exists - add to it
|
|
stock_id = existing['pk']
|
|
old_stock = existing['quantity']
|
|
new_stock = old_stock + quantity
|
|
|
|
# Update the existing item (simulate)
|
|
existing['quantity'] = new_stock
|
|
|
|
return ('updated', stock_id, old_stock, new_stock)
|
|
else:
|
|
# No existing stock - create new item
|
|
new_item = {
|
|
'pk': len(existing_stock_items) + 100, # Simulate new ID
|
|
'part': part_id,
|
|
'location': location_id,
|
|
'quantity': quantity
|
|
}
|
|
existing_stock_items.append(new_item)
|
|
|
|
return ('created', new_item['pk'], 0, quantity)
|
|
|
|
|
|
print("Testing Add Stock Duplicate Prevention\n")
|
|
print("=" * 60)
|
|
|
|
# Simulate existing stock items
|
|
stock_items = []
|
|
|
|
print("\nScenario 1: Adding stock when NO existing item exists")
|
|
print("-" * 60)
|
|
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=150, existing_stock_items=stock_items)
|
|
print(f"Action: {action}")
|
|
print(f"Stock ID: {sid}")
|
|
print(f"Stock change: {old} -> {new} (+{new - old})")
|
|
print(f"Total stock items: {len(stock_items)}")
|
|
print(f"Expected: Created new stock item PASS" if action == 'created' else "FAIL")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("\nScenario 2: Adding MORE stock to EXISTING item (should UPDATE, not duplicate)")
|
|
print("-" * 60)
|
|
print(f"Current stock items before scan: {len(stock_items)}")
|
|
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=100, existing_stock_items=stock_items)
|
|
print(f"Action: {action}")
|
|
print(f"Stock ID: {sid}")
|
|
print(f"Stock change: {old} -> {new} (+{new - old})")
|
|
print(f"Total stock items: {len(stock_items)}")
|
|
print(f"Expected: Updated existing item, NO duplicate PASS" if action == 'updated' and len(stock_items) == 1 else "FAIL")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("\nScenario 3: Adding stock AGAIN (should continue to UPDATE)")
|
|
print("-" * 60)
|
|
print(f"Current stock items before scan: {len(stock_items)}")
|
|
action, sid, old, new = simulate_add_stock(part_id=456, location_id=476, quantity=50, existing_stock_items=stock_items)
|
|
print(f"Action: {action}")
|
|
print(f"Stock ID: {sid}")
|
|
print(f"Stock change: {old} -> {new} (+{new - old})")
|
|
print(f"Total stock items: {len(stock_items)}")
|
|
print(f"Expected: Updated existing item, still NO duplicate PASS" if action == 'updated' and len(stock_items) == 1 else "FAIL")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("\nScenario 4: Adding same part to DIFFERENT location (should create new)")
|
|
print("-" * 60)
|
|
print(f"Current stock items before scan: {len(stock_items)}")
|
|
action, sid, old, new = simulate_add_stock(part_id=456, location_id=999, quantity=75, existing_stock_items=stock_items)
|
|
print(f"Action: {action}")
|
|
print(f"Stock ID: {sid}")
|
|
print(f"Stock change: {old} -> {new} (+{new - old})")
|
|
print(f"Total stock items: {len(stock_items)}")
|
|
print(f"Expected: Created new item for different location PASS" if action == 'created' and len(stock_items) == 2 else "FAIL")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("\nFinal Summary:")
|
|
print("-" * 60)
|
|
for i, item in enumerate(stock_items, 1):
|
|
print(f"Stock Item {i}: ID={item['pk']}, Part={item['part']}, Location={item['location']}, Qty={item['quantity']}")
|
|
|
|
print("\nSUCCESS All scenarios demonstrate proper duplicate prevention!")
|
|
print(" - Same part + same location = UPDATE existing")
|
|
print(" - Same part + different location = CREATE new")
|