Visible to customers
+{{ activeCount }}
+{{ hiddenCount }} hidden or archived
+ + + +Out of stock
+0" + > + {{ outOfStock.length }} +
+Customers cannot buy these
+ + + +Low stock
+0"> + {{ lowStock.length }} +
+Five or fewer available
+ + + +Paid, awaiting fulfilment
+{{ openOrders().length }}
+Ready to pick and pack
+ ++ Every tracked SKU has stock available. +
+ } @else { +| SKU | +Status | +Available | +
|---|---|---|
+ {{ row.sku }}
+ |
+
+ |
+ {{ row.on_hand - row.reserved }} | +
Nothing is waiting.
+ } @else { +| Order | +Placed | +
|---|---|
+ {{ order.id.slice(0, 8) }}
+ |
+ {{ order.created_at | date: 'short' }} | +
+ You are signed in as
+ {{ auth.user()?.email }}, which has the customer role only. Administration requires the
+ admin role, which an existing administrator grants in Keycloak.
+
| SKU | +Status | +On hand | +Reserved | +Available | +Actions | +
|---|---|---|---|---|---|
+ {{ row.sku }}
+ |
+
+ |
+ + + | +{{ row.reserved }} | +{{ available(row) }} | +
+
+
+ |
+
| Order | +Status | +Placed | +Total | +Actions | +
|---|---|---|---|---|
+ {{ order.id.slice(0, 8) }}
+ |
+
+ |
+ {{ order.created_at | date: 'medium' }} | ++ {{ order.total_amount | money: order.currency }} + | +
+
+
+ |
+
{{ d.order.id }}
+ Customer
+ @if (d.customer) { +{{ d.customer.first_name }} {{ d.customer.last_name }}
+{{ d.customer.email }}
+ @if (d.customer.phone) { +{{ d.customer.phone }}
+ } + } @else { +—
+ } +Ship to
+ @if (d.shipping_address; as a) { +{{ a.street }}
+{{ a.zip_code }} {{ a.city }}, {{ a.country }}
+ } @else { +No default address
+ } +Lines
+| SKU | +Qty | +Unit | +
|---|---|---|
+ {{ line.sku }}
+ |
+ {{ line.quantity }} | ++ {{ line.unit_price | money: d.order.currency }} + | +
Payment
+{{ d.payment?.status || '—' }}
+Shipment
+ @if (d.shipment; as s) { +{{ s.carrier }} — {{ s.status }}
+{{ s.tracking_number || 'No tracking number' }}
+ } @else { +Not shipped
+ } +| Product | +SKU | +Status | +Price | +Actions | +
|---|---|---|---|---|
|
+ {{ item.name }} +{{ item.brand || '—' }} + |
+
+ {{ item.sku }}
+ |
+
+ |
+ + {{ item.price?.amount | money: item.price?.currency || 'EUR' }} + | +
+
+
+ |
+
+ Rejected and completed are final. The API refuses any move out of them. +
+
+ {{ pendingLabel() }} return {{ returnId }}?
+
{{ user.displayName }}
+{{ user.email }}
+
+
{{ description }}
+ } +{{ title }}
+ @if (description) { +{{ description }}
+ } +{{ description }}
+ } +