Cost column shows Odoo standard_price (editable). Margin % is calculated
from cost and sale price. Editing margin auto-calculates the sale price
using: price = cost / (1 - margin/100). All cells are inline-editable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Click any price cell (WC Standard, WC Sale, Odoo Price) to edit inline.
Enter or click away saves and syncs to the source. Escape cancels.
Validation: sale price cannot exceed standard price.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Split woo_price into woo_regular_price and woo_sale_price
- Sync to WC: if standard=0 sets regular_price, otherwise sets sale_price
- Validation: standard price cannot be less than sale price
- Both prices shown in mapping UI with sale price highlighted in green
- Refresh Prices pulls both values from WC API
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Product names in the mapped table are now links that open the WC product
page in a new tab. Added woo_permalink field, stored during fetch,
returned by search endpoint.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pagination with page nav for mapped, unmatched Odoo, and unmatched WC tabs
- Per-product arrow buttons to push price in either direction
- Bulk price sync buttons: All Prices Odoo→WC and All Prices WC→Odoo
- Server-side offset/limit with total count in search endpoints
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use a formatPrice() method on the component instead of calling Number()
directly in the OWL template. Fixes TypeError: ctx.Number is not a function.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
toFixed() was failing on null values. Now uses explicit null/undefined
checks so $0.00 prices display correctly instead of showing dashes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Existing mapped products had no WC price since they were fetched before
the woo_price field existed. action_refresh_prices fetches current prices
from WC API for all mapped products.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added woo_price field to woo.product.map model, populated during fetch.
Search endpoint now returns both odoo_price and woo_price for side-by-side
comparison in the mapped products table.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Odoo 19 does NOT use .o_dark class or data-bs-theme attribute. It sets
color-scheme via SCSS and stores preference in color_scheme cookie.
Added theme_detect.js that reads the cookie and sets data-woo-theme="dark"
on <html> for reliable CSS targeting. Fixed CSS dark mode selectors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- WooDashboard OWL client action registered as fusion_woocommerce.woo_dashboard
- Cards: pending orders (clickable), last sync (relative time), errors 24h (clickable),
products mapped % with progress bar
- Quick actions: Sync Now, View Conflicts, Open Mapping, View Orders
- Instances table showing name, connection state, last sync datetime
- Auto-refreshes every 60 s while mounted
- All data fetched via standalone rpc() per Odoo 19 rules
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>