Price conflicts and sync errors were setting woo.product.map state to
'conflict'/'error', making products disappear from the mapped list.
Conflicts are now tracked only in woo.conflict model. Map state stays
'mapped' as long as the product link exists.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The health check cron runs inside Docker which can't always reach
external URLs. It was setting state to 'error' breaking fetch/sync.
Now it only logs warnings — state changes only via explicit Test
Connection button.
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>
Product mapping UI called these methods but they didn't exist on
woo.instance. action_fetch_products fetches WC products via API,
auto-matches by SKU, handles variations. action_sync runs all
enabled sync types manually.
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>
Converted all attrs= expressions to inline invisible/readonly attributes
in wizard XML views (woo_product_fetch_views.xml, woo_setup_wizard_views.xml).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Override account.move action_post to auto-push invoice PDF to WC on posting
- Add _cron_health_check to ping all instances and flag unreachable ones
- Add health check cron record (every 10 minutes) to data/cron.xml
- Add IP-based rate limiting (100 req/min) to webhook controller
- Fill in API endpoints: order/documents, order/status, order/messages
with real data from woo.order, stock.picking, and mail.message
- Implement return/create API endpoint with product mapping and line creation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace _sync_orders placeholder with full WC order import pipeline
- Add _sync_order_from_wc, _find_or_create_customer, _prepare_sale_order_vals,
_prepare_order_line_vals, _prepare_shipping_line_vals helpers
- Add push methods on woo.order: action_push_shipping, action_push_completed,
action_push_invoice_pdf, action_push_delivery_pdf, _push_messages_to_wc
- Override stock.picking button_validate to auto-create shipment records and
push tracking/delivery PDFs to WooCommerce
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>
Add company_id to woo.shipment, woo.sync.log, woo.return.line. Add
order_id to woo.conflict for order-type conflicts. Add _odoo_messages
to WP meta table. Fix section numbering. Document lib/ import path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete design spec for bidirectional Odoo 19 <-> WooCommerce sync system
covering product mapping, order lifecycle, inventory sync, customer portal,
and all supporting data models. Addresses all review findings including
variant support, tax/pricelist mapping models, return/RMA workflow,
multi-shipment tracking, and Odoo 19 technical requirements.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add fusion_claims.adp.export.record model with filestore-backed Binary field
for tracking exported ADP claims files organized by Year > Month > Posting Period
- Add tree/form/search views with default group-by hierarchy, latest first
- Add "Export Files" menuitem under ADP menu section
- Add bulk ZIP download server action for multi-select export
- Replace Documents app storage with new model in export wizard
- Remove Documents-related methods (_save_to_documents, folder creation)
- Add migration button in Settings to move existing Documents files
- Fix Export ADP button visibility: only show on ADP portion invoices
- Remove redundant Sync All button from invoice form
- Add ACL entries for billing users (read/create) and managers (full CRUD)
- Bump version to 19.0.7.3.0
Made-with: Cursor
is_rental_order is a computed field, not passed in vals during create.
Use in_rental_app context flag in create() and add onchange handler
so sale type sets to 'Rentals' immediately when toggled in the form.
Made-with: Cursor
Rental orders no longer show the "Authorizer Required?" question or
the Authorizer field. The sale type is automatically set to 'Rentals'
when creating or confirming a rental order. Validation logic also
skips authorizer checks for rental sale type.
Made-with: Cursor
Odoo 19 replaced category_id with privilege_id on res.groups.
Keep only privilege_id=False to clear it from the dropdown.
Co-authored-by: Cursor <cursoragent@cursor.com>