feat: integer cents money handling, order page fixes, and vendor filter persistence
Money Handling Architecture: - Store all monetary values as integer cents (€105.91 = 10591) - Add app/utils/money.py with Money class and conversion helpers - Add static/shared/js/money.js for frontend formatting - Update all database models to use _cents columns (Product, Order, etc.) - Update CSV processor to convert prices to cents on import - Add Alembic migration for Float to Integer conversion - Create .architecture-rules/money.yaml with 7 validation rules - Add docs/architecture/money-handling.md documentation Order Details Page Fixes: - Fix customer name showing 'undefined undefined' - use flat field names - Fix vendor info empty - add vendor_name/vendor_code to OrderDetailResponse - Fix shipping address using wrong nested object structure - Enrich order detail API response with vendor info Vendor Filter Persistence Fixes: - Fix orders.js: restoreSavedVendor now sets selectedVendor and filters - Fix orders.js: init() only loads orders if no saved vendor to restore - Fix marketplace-letzshop.js: restoreSavedVendor calls selectVendor() - Fix marketplace-letzshop.js: clearVendorSelection clears TomSelect dropdown - Align vendor selector placeholder text between pages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
47
tests/fixtures/customer_fixtures.py
vendored
47
tests/fixtures/customer_fixtures.py
vendored
@@ -53,19 +53,60 @@ def test_customer_address(db, test_vendor, test_customer):
|
||||
|
||||
@pytest.fixture
|
||||
def test_order(db, test_vendor, test_customer, test_customer_address):
|
||||
"""Create a test order."""
|
||||
"""Create a test order with customer/address snapshots."""
|
||||
from datetime import datetime, timezone
|
||||
|
||||
order = Order(
|
||||
vendor_id=test_vendor.id,
|
||||
customer_id=test_customer.id,
|
||||
order_number="TEST-ORD-001",
|
||||
status="pending",
|
||||
channel="direct",
|
||||
subtotal=99.99,
|
||||
total_amount=99.99,
|
||||
currency="EUR",
|
||||
shipping_address_id=test_customer_address.id,
|
||||
billing_address_id=test_customer_address.id,
|
||||
order_date=datetime.now(timezone.utc),
|
||||
# Customer snapshot
|
||||
customer_first_name=test_customer.first_name,
|
||||
customer_last_name=test_customer.last_name,
|
||||
customer_email=test_customer.email,
|
||||
customer_phone=None,
|
||||
# Shipping address snapshot
|
||||
ship_first_name=test_customer_address.first_name,
|
||||
ship_last_name=test_customer_address.last_name,
|
||||
ship_address_line_1=test_customer_address.address_line_1,
|
||||
ship_city=test_customer_address.city,
|
||||
ship_postal_code=test_customer_address.postal_code,
|
||||
ship_country_iso="LU",
|
||||
# Billing address snapshot
|
||||
bill_first_name=test_customer_address.first_name,
|
||||
bill_last_name=test_customer_address.last_name,
|
||||
bill_address_line_1=test_customer_address.address_line_1,
|
||||
bill_city=test_customer_address.city,
|
||||
bill_postal_code=test_customer_address.postal_code,
|
||||
bill_country_iso="LU",
|
||||
)
|
||||
db.add(order)
|
||||
db.commit()
|
||||
db.refresh(order)
|
||||
return order
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_order_item(db, test_order, test_product):
|
||||
"""Create a test order item."""
|
||||
from models.database.order import OrderItem
|
||||
|
||||
order_item = OrderItem(
|
||||
order_id=test_order.id,
|
||||
product_id=test_product.id,
|
||||
product_name="Test Product",
|
||||
product_sku="TEST-SKU-001",
|
||||
quantity=1,
|
||||
unit_price=49.99,
|
||||
total_price=49.99,
|
||||
)
|
||||
db.add(order_item)
|
||||
db.commit()
|
||||
db.refresh(order_item)
|
||||
return order_item
|
||||
|
||||
Reference in New Issue
Block a user