feat: update frontend for unified order model

Update all frontend templates and JavaScript to use new unified Order model:
- Orders tab: use status field, processing/cancelled values, items array
- Order detail: use snapshot fields, items array, tracking_provider
- JavaScript: update API params (status vs sync_status), orderStats fields
- Tracking modal: use tracking_provider instead of tracking_carrier
- Order items modal: use items array with item_state field

All status mappings:
- pending → pending (unconfirmed)
- processing → confirmed (at least one item available)
- cancelled → declined (all items unavailable)
- shipped → shipped (with tracking)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-19 21:38:02 +01:00
parent c49b80ce41
commit 2e6f8fdb8a
5 changed files with 126 additions and 110 deletions

View File

@@ -92,7 +92,7 @@ function adminMarketplaceLetzshop() {
ordersFilter: '',
ordersSearch: '',
ordersHasDeclinedItems: false,
orderStats: { pending: 0, confirmed: 0, rejected: 0, shipped: 0, has_declined_items: 0 },
orderStats: { pending: 0, processing: 0, shipped: 0, delivered: 0, cancelled: 0, total: 0, has_declined_items: 0 },
// Jobs
jobs: [],
@@ -103,7 +103,7 @@ function adminMarketplaceLetzshop() {
showTrackingModal: false,
showOrderModal: false,
selectedOrder: null,
trackingForm: { tracking_number: '', tracking_carrier: '' },
trackingForm: { tracking_number: '', tracking_provider: '' },
async init() {
marketplaceLetzshopLog.info('init() called');
@@ -399,7 +399,7 @@ function adminMarketplaceLetzshop() {
});
if (this.ordersFilter) {
params.append('sync_status', this.ordersFilter);
params.append('status', this.ordersFilter);
}
if (this.ordersHasDeclinedItems) {
@@ -437,13 +437,14 @@ function adminMarketplaceLetzshop() {
*/
updateOrderStats() {
// Reset stats
this.orderStats = { pending: 0, confirmed: 0, rejected: 0, shipped: 0, has_declined_items: 0 };
this.orderStats = { pending: 0, processing: 0, shipped: 0, delivered: 0, cancelled: 0, total: 0, has_declined_items: 0 };
// Count from orders list (only visible page - not accurate for totals)
for (const order of this.orders) {
if (this.orderStats.hasOwnProperty(order.sync_status)) {
this.orderStats[order.sync_status]++;
if (this.orderStats.hasOwnProperty(order.status)) {
this.orderStats[order.status]++;
}
this.orderStats.total++;
}
},
@@ -669,7 +670,7 @@ function adminMarketplaceLetzshop() {
this.selectedOrder = order;
this.trackingForm = {
tracking_number: order.tracking_number || '',
tracking_carrier: order.tracking_carrier || ''
tracking_provider: order.tracking_provider || ''
};
this.showTrackingModal = true;
},
@@ -707,17 +708,24 @@ function adminMarketplaceLetzshop() {
},
/**
* Confirm a single inventory unit
* Confirm a single order item
*/
async confirmInventoryUnit(order, unit, index) {
async confirmInventoryUnit(order, item, index) {
if (!this.selectedVendor) return;
// Use external_item_id (Letzshop inventory unit ID)
const itemId = item.external_item_id;
if (!itemId) {
this.error = 'Item has no external ID';
return;
}
try {
await apiClient.post(
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${unit.id}/confirm`
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${itemId}/confirm`
);
// Update local state
this.selectedOrder.inventory_units[index].state = 'confirmed_available';
this.selectedOrder.items[index].item_state = 'confirmed_available';
this.successMessage = 'Item confirmed';
// Reload orders to get updated status
await this.loadOrders();
@@ -728,17 +736,24 @@ function adminMarketplaceLetzshop() {
},
/**
* Decline a single inventory unit
* Decline a single order item
*/
async declineInventoryUnit(order, unit, index) {
async declineInventoryUnit(order, item, index) {
if (!this.selectedVendor) return;
// Use external_item_id (Letzshop inventory unit ID)
const itemId = item.external_item_id;
if (!itemId) {
this.error = 'Item has no external ID';
return;
}
try {
await apiClient.post(
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${unit.id}/decline`
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${itemId}/decline`
);
// Update local state
this.selectedOrder.inventory_units[index].state = 'confirmed_unavailable';
this.selectedOrder.items[index].item_state = 'confirmed_unavailable';
this.successMessage = 'Item declined';
// Reload orders to get updated status
await this.loadOrders();