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:
@@ -165,16 +165,16 @@ class TestProductModel:
|
||||
|
||||
def test_product_reset_to_source(self, db, test_vendor, test_marketplace_product):
|
||||
"""Test reset_to_source methods."""
|
||||
# Set up marketplace product values
|
||||
test_marketplace_product.price_numeric = 100.00
|
||||
# Set up marketplace product values (use cents internally)
|
||||
test_marketplace_product.price_cents = 10000 # €100.00
|
||||
test_marketplace_product.brand = "SourceBrand"
|
||||
db.commit()
|
||||
|
||||
# Create product with overrides
|
||||
# Create product with overrides (price property converts euros to cents)
|
||||
product = Product(
|
||||
vendor_id=test_vendor.id,
|
||||
marketplace_product_id=test_marketplace_product.id,
|
||||
price=89.99,
|
||||
price_cents=8999, # €89.99
|
||||
brand="OverrideBrand",
|
||||
)
|
||||
db.add(product)
|
||||
@@ -184,13 +184,14 @@ class TestProductModel:
|
||||
assert product.effective_price == 89.99
|
||||
assert product.effective_brand == "OverrideBrand"
|
||||
|
||||
# Reset price to source
|
||||
product.reset_field_to_source("price")
|
||||
# Reset price_cents to source (OVERRIDABLE_FIELDS now uses _cents names)
|
||||
product.reset_field_to_source("price_cents")
|
||||
db.commit()
|
||||
db.refresh(product)
|
||||
|
||||
assert product.price is None
|
||||
assert product.effective_price == 100.00 # Now inherits
|
||||
assert product.price_cents is None
|
||||
assert product.price is None # Property returns None when cents is None
|
||||
assert product.effective_price == 100.00 # Now inherits from marketplace
|
||||
|
||||
# Reset all fields
|
||||
product.reset_all_to_source()
|
||||
|
||||
Reference in New Issue
Block a user