EMCO Compliant is maintained manually in BC, so the pricing column now
fetches it from the new /api/bc-empco endpoint (items API, field
empCOCompliant) on every app load instead of reading the Dropbox matrix.
One fetch per page load, cached across tab switches; sorting uses the
live map.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The proxy was calling getAccessToken() but discarding the result, then
downloading via the public sharing link which is CDN-cached. Updated
data in Dropbox could take minutes/hours to propagate through the CDN,
causing all fields in the Matrix view to show stale values.
Now attempts download via /2/sharing/get_shared_link_file with Bearer
auth (no CDN cache), falling back to the sharing link if credentials
are not configured.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- Add bc-proxy and bc-export serverless API handlers
- Add businessCentral service with updateCpnpNoInBC and downloadBusinessCentralItemsExcel
- Sync cpnpNo to BC on save (CosmeticItemsView and handleSaveAll)
- Parallelize handleSaveAll with Promise.all
- Fix array index key, a11y click/keyboard handlers, autoFocus
- Grant Change History and Pending Validation access to jingying.shi@craze-group.com
Co-Authored-By: claude-flow <ruv@ruv.net>
Products that have entries in products_history were edited at some point.
If their status was accidentally reset to 'excel', the sync would overwrite
their data. Now also check products_history to build the protected set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migrated 126 manual edits to 'edited' status.
- Updated App.tsx to merge rows with 'edited' or 'synced' status.
- Protected manual edits from being overwritten by automated Dropbox syncs.
Both Vercel serverless functions now enforce CORS, returning 403 for
requests from any origin other than craze-data-check.vercel.app.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>