refactor: Convert to UV Python project with proper package structure

- Restructured project to use src/stocktool package layout
- Migrated to UV for dependency management
- Added pyproject.toml with all dependencies (sv-ttk, pillow, requests, pyyaml)
- Organized test files into tests/ directory
- Updated .gitignore for UV projects
- Comprehensive README with installation and usage instructions
- Removed old unused files (main.py, stock_tool_gui.py, duplicate copy)
- Added CLI entry point: stock-tool command

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-29 10:52:10 +07:00
parent abad7d3fa5
commit 9c742af585
24 changed files with 1563 additions and 192 deletions

View File

@@ -0,0 +1,106 @@
#!/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")