medusa-analytics 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -40,18 +40,13 @@ function OrdersOverTimeTooltip({
|
|
|
40
40
|
}
|
|
41
41
|
const STATUS_COLORS = {
|
|
42
42
|
pending: "#F59E0B",
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
shipped: "#06B6D4",
|
|
46
|
-
delivered: "#10B981",
|
|
47
|
-
cancelled: "#EF4444"
|
|
43
|
+
cancelled: "#EF4444",
|
|
44
|
+
delivered: "#10B981"
|
|
48
45
|
};
|
|
49
46
|
const ORDER_CHART_STATUSES = [
|
|
50
47
|
{ key: "pending", label: "Pending", color: STATUS_COLORS.pending },
|
|
51
|
-
{ key: "
|
|
52
|
-
{ key: "
|
|
53
|
-
{ key: "fulfilled", label: "Fulfilled", color: "#10B981" },
|
|
54
|
-
{ key: "cancelled", label: "Cancelled", color: STATUS_COLORS.cancelled }
|
|
48
|
+
{ key: "cancelled", label: "Cancelled", color: STATUS_COLORS.cancelled },
|
|
49
|
+
{ key: "delivered", label: "Delivered", color: STATUS_COLORS.delivered }
|
|
55
50
|
];
|
|
56
51
|
function formatCurrency(value) {
|
|
57
52
|
return new Intl.NumberFormat("en-IN", {
|
|
@@ -133,9 +128,8 @@ function OrdersDashboard() {
|
|
|
133
128
|
if (error || !data) {
|
|
134
129
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-danger", children: error ?? "Failed to load analytics" }) });
|
|
135
130
|
}
|
|
136
|
-
const fulfilledCount = (data.statusCounts.shipped ?? 0) + (data.statusCounts.delivered ?? 0);
|
|
137
131
|
const pieData = ORDER_CHART_STATUSES.map(({ key, label, color }) => {
|
|
138
|
-
const value = key === "
|
|
132
|
+
const value = key === "delivered" ? data.statusCounts.delivered ?? data.deliveredOrders ?? 0 : key === "cancelled" ? data.statusCounts.cancelled ?? data.cancelledOrders ?? 0 : data.statusCounts.pending ?? data.pendingOrders ?? 0;
|
|
139
133
|
return { name: label, value, color };
|
|
140
134
|
}).filter((d) => d.value > 0);
|
|
141
135
|
const returnsExchangesData = [
|
|
@@ -205,10 +199,10 @@ function OrdersDashboard() {
|
|
|
205
199
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: data.returnOrders.toLocaleString() })
|
|
206
200
|
] })
|
|
207
201
|
] }),
|
|
208
|
-
/* @__PURE__ */ jsxRuntime.
|
|
209
|
-
/* @__PURE__ */ jsxRuntime.
|
|
210
|
-
|
|
211
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-[
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row flex-wrap gap-6 items-stretch", children: [
|
|
203
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 flex flex-col", style: { minWidth: "280px" }, children: [
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "mb-3", children: "Orders by status" }),
|
|
205
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-h-[280px] flex items-center justify-center", children: pieData.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: 280, children: /* @__PURE__ */ jsxRuntime.jsxs(recharts.PieChart, { margin: { top: 8, right: 8, bottom: 8, left: 8 }, children: [
|
|
212
206
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
213
207
|
recharts.Pie,
|
|
214
208
|
{
|
|
@@ -226,31 +220,31 @@ function OrdersDashboard() {
|
|
|
226
220
|
),
|
|
227
221
|
/* @__PURE__ */ jsxRuntime.jsx(recharts.Tooltip, { formatter: (value) => [value ?? 0, "Orders"] }),
|
|
228
222
|
/* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { verticalAlign: "bottom", height: 36 })
|
|
229
|
-
] }) }) })
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
] })
|
|
223
|
+
] }) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-sm", children: "No orders in this period" }) })
|
|
224
|
+
] }),
|
|
225
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 flex flex-col", style: { minWidth: "280px" }, children: [
|
|
226
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "mb-3", children: "Returns & exchanges" }),
|
|
227
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-h-[280px] flex items-center justify-center", children: returnsExchangesData.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: 280, children: /* @__PURE__ */ jsxRuntime.jsxs(recharts.PieChart, { margin: { top: 8, right: 8, bottom: 8, left: 8 }, children: [
|
|
228
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
229
|
+
recharts.Pie,
|
|
230
|
+
{
|
|
231
|
+
data: returnsExchangesData,
|
|
232
|
+
cx: "50%",
|
|
233
|
+
cy: "50%",
|
|
234
|
+
innerRadius: 52,
|
|
235
|
+
outerRadius: 78,
|
|
236
|
+
paddingAngle: 2,
|
|
237
|
+
dataKey: "value",
|
|
238
|
+
nameKey: "name",
|
|
239
|
+
isAnimationActive: true,
|
|
240
|
+
children: returnsExchangesData.map((entry, index) => /* @__PURE__ */ jsxRuntime.jsx(recharts.Cell, { fill: entry.color }, `cell-re-${index}`))
|
|
241
|
+
}
|
|
242
|
+
),
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.Tooltip, { formatter: (value) => [value ?? 0, "Count"] }),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { verticalAlign: "bottom", height: 36 })
|
|
245
|
+
] }) }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-muted text-sm", children: "No returns or exchanges in this period" }) })
|
|
252
246
|
] })
|
|
253
|
-
] }),
|
|
247
|
+
] }) }),
|
|
254
248
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "p-6", children: [
|
|
255
249
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4 mb-4", children: [
|
|
256
250
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", children: "Orders over time" }),
|
|
@@ -591,19 +585,17 @@ const ANALYTICS_MODULES = [
|
|
|
591
585
|
const AnalyticsPage = () => {
|
|
592
586
|
const [activeModule, setActiveModule] = react.useState("orders");
|
|
593
587
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full bg-ui-bg-base", children: /* @__PURE__ */ jsxRuntime.jsx("main", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "divide-y p-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "py-6 px-6", children: [
|
|
594
|
-
/* @__PURE__ */ jsxRuntime.
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
)) })
|
|
606
|
-
] }),
|
|
588
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", className: "mb-4", children: "Analytics" }),
|
|
589
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 mb-6", children: ANALYTICS_MODULES.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
590
|
+
ui.Button,
|
|
591
|
+
{
|
|
592
|
+
variant: activeModule === m.id ? "secondary" : "transparent",
|
|
593
|
+
size: "small",
|
|
594
|
+
onClick: () => setActiveModule(m.id),
|
|
595
|
+
children: m.label
|
|
596
|
+
},
|
|
597
|
+
m.id
|
|
598
|
+
)) }),
|
|
607
599
|
activeModule === "orders" && /* @__PURE__ */ jsxRuntime.jsx(OrdersDashboard, {}),
|
|
608
600
|
activeModule === "customers" && /* @__PURE__ */ jsxRuntime.jsx(CustomersDashboard, {})
|
|
609
601
|
] }) }) }) });
|
|
@@ -39,18 +39,13 @@ function OrdersOverTimeTooltip({
|
|
|
39
39
|
}
|
|
40
40
|
const STATUS_COLORS = {
|
|
41
41
|
pending: "#F59E0B",
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
shipped: "#06B6D4",
|
|
45
|
-
delivered: "#10B981",
|
|
46
|
-
cancelled: "#EF4444"
|
|
42
|
+
cancelled: "#EF4444",
|
|
43
|
+
delivered: "#10B981"
|
|
47
44
|
};
|
|
48
45
|
const ORDER_CHART_STATUSES = [
|
|
49
46
|
{ key: "pending", label: "Pending", color: STATUS_COLORS.pending },
|
|
50
|
-
{ key: "
|
|
51
|
-
{ key: "
|
|
52
|
-
{ key: "fulfilled", label: "Fulfilled", color: "#10B981" },
|
|
53
|
-
{ key: "cancelled", label: "Cancelled", color: STATUS_COLORS.cancelled }
|
|
47
|
+
{ key: "cancelled", label: "Cancelled", color: STATUS_COLORS.cancelled },
|
|
48
|
+
{ key: "delivered", label: "Delivered", color: STATUS_COLORS.delivered }
|
|
54
49
|
];
|
|
55
50
|
function formatCurrency(value) {
|
|
56
51
|
return new Intl.NumberFormat("en-IN", {
|
|
@@ -132,9 +127,8 @@ function OrdersDashboard() {
|
|
|
132
127
|
if (error || !data) {
|
|
133
128
|
return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-danger", children: error ?? "Failed to load analytics" }) });
|
|
134
129
|
}
|
|
135
|
-
const fulfilledCount = (data.statusCounts.shipped ?? 0) + (data.statusCounts.delivered ?? 0);
|
|
136
130
|
const pieData = ORDER_CHART_STATUSES.map(({ key, label, color }) => {
|
|
137
|
-
const value = key === "
|
|
131
|
+
const value = key === "delivered" ? data.statusCounts.delivered ?? data.deliveredOrders ?? 0 : key === "cancelled" ? data.statusCounts.cancelled ?? data.cancelledOrders ?? 0 : data.statusCounts.pending ?? data.pendingOrders ?? 0;
|
|
138
132
|
return { name: label, value, color };
|
|
139
133
|
}).filter((d) => d.value > 0);
|
|
140
134
|
const returnsExchangesData = [
|
|
@@ -204,10 +198,10 @@ function OrdersDashboard() {
|
|
|
204
198
|
/* @__PURE__ */ jsx(Heading, { level: "h2", children: data.returnOrders.toLocaleString() })
|
|
205
199
|
] })
|
|
206
200
|
] }),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
/* @__PURE__ */
|
|
209
|
-
|
|
210
|
-
/* @__PURE__ */ jsx("div", { className: "min-h-[
|
|
201
|
+
/* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row flex-wrap gap-6 items-stretch", children: [
|
|
202
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 flex flex-col", style: { minWidth: "280px" }, children: [
|
|
203
|
+
/* @__PURE__ */ jsx(Heading, { level: "h3", className: "mb-3", children: "Orders by status" }),
|
|
204
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 min-h-[280px] flex items-center justify-center", children: pieData.length > 0 ? /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: 280, children: /* @__PURE__ */ jsxs(PieChart, { margin: { top: 8, right: 8, bottom: 8, left: 8 }, children: [
|
|
211
205
|
/* @__PURE__ */ jsx(
|
|
212
206
|
Pie,
|
|
213
207
|
{
|
|
@@ -225,31 +219,31 @@ function OrdersDashboard() {
|
|
|
225
219
|
),
|
|
226
220
|
/* @__PURE__ */ jsx(Tooltip, { formatter: (value) => [value ?? 0, "Orders"] }),
|
|
227
221
|
/* @__PURE__ */ jsx(Legend, { verticalAlign: "bottom", height: 36 })
|
|
228
|
-
] }) }) })
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
] })
|
|
222
|
+
] }) }) : /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-sm", children: "No orders in this period" }) })
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 flex flex-col", style: { minWidth: "280px" }, children: [
|
|
225
|
+
/* @__PURE__ */ jsx(Heading, { level: "h3", className: "mb-3", children: "Returns & exchanges" }),
|
|
226
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 min-h-[280px] flex items-center justify-center", children: returnsExchangesData.length > 0 ? /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: 280, children: /* @__PURE__ */ jsxs(PieChart, { margin: { top: 8, right: 8, bottom: 8, left: 8 }, children: [
|
|
227
|
+
/* @__PURE__ */ jsx(
|
|
228
|
+
Pie,
|
|
229
|
+
{
|
|
230
|
+
data: returnsExchangesData,
|
|
231
|
+
cx: "50%",
|
|
232
|
+
cy: "50%",
|
|
233
|
+
innerRadius: 52,
|
|
234
|
+
outerRadius: 78,
|
|
235
|
+
paddingAngle: 2,
|
|
236
|
+
dataKey: "value",
|
|
237
|
+
nameKey: "name",
|
|
238
|
+
isAnimationActive: true,
|
|
239
|
+
children: returnsExchangesData.map((entry, index) => /* @__PURE__ */ jsx(Cell, { fill: entry.color }, `cell-re-${index}`))
|
|
240
|
+
}
|
|
241
|
+
),
|
|
242
|
+
/* @__PURE__ */ jsx(Tooltip, { formatter: (value) => [value ?? 0, "Count"] }),
|
|
243
|
+
/* @__PURE__ */ jsx(Legend, { verticalAlign: "bottom", height: 36 })
|
|
244
|
+
] }) }) : /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-muted text-sm", children: "No returns or exchanges in this period" }) })
|
|
251
245
|
] })
|
|
252
|
-
] }),
|
|
246
|
+
] }) }),
|
|
253
247
|
/* @__PURE__ */ jsxs(Container, { className: "p-6", children: [
|
|
254
248
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4 mb-4", children: [
|
|
255
249
|
/* @__PURE__ */ jsx(Heading, { level: "h3", children: "Orders over time" }),
|
|
@@ -590,19 +584,17 @@ const ANALYTICS_MODULES = [
|
|
|
590
584
|
const AnalyticsPage = () => {
|
|
591
585
|
const [activeModule, setActiveModule] = useState("orders");
|
|
592
586
|
return /* @__PURE__ */ jsx("div", { className: "flex h-full bg-ui-bg-base", children: /* @__PURE__ */ jsx("main", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx(Container, { className: "divide-y p-0", children: /* @__PURE__ */ jsxs("div", { className: "py-6 px-6", children: [
|
|
593
|
-
/* @__PURE__ */
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
)) })
|
|
605
|
-
] }),
|
|
587
|
+
/* @__PURE__ */ jsx(Heading, { level: "h1", className: "mb-4", children: "Analytics" }),
|
|
588
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 mb-6", children: ANALYTICS_MODULES.map((m) => /* @__PURE__ */ jsx(
|
|
589
|
+
Button,
|
|
590
|
+
{
|
|
591
|
+
variant: activeModule === m.id ? "secondary" : "transparent",
|
|
592
|
+
size: "small",
|
|
593
|
+
onClick: () => setActiveModule(m.id),
|
|
594
|
+
children: m.label
|
|
595
|
+
},
|
|
596
|
+
m.id
|
|
597
|
+
)) }),
|
|
606
598
|
activeModule === "orders" && /* @__PURE__ */ jsx(OrdersDashboard, {}),
|
|
607
599
|
activeModule === "customers" && /* @__PURE__ */ jsx(CustomersDashboard, {})
|
|
608
600
|
] }) }) }) });
|
|
@@ -2,28 +2,21 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
/**
|
|
6
|
-
const STATUS_BUCKETS = [
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
"processing",
|
|
10
|
-
"shipped",
|
|
11
|
-
"delivered",
|
|
12
|
-
"cancelled",
|
|
13
|
-
];
|
|
14
|
-
function normalizeStatus(status) {
|
|
15
|
-
if (!status || typeof status !== "string")
|
|
5
|
+
/** Only three status buckets: pending, cancelled, delivered */
|
|
6
|
+
const STATUS_BUCKETS = ["pending", "cancelled", "delivered"];
|
|
7
|
+
function toSimpleStatus(status) {
|
|
8
|
+
if (status === undefined || status === null || typeof status !== "string")
|
|
16
9
|
return "pending";
|
|
17
|
-
const s = status.toLowerCase();
|
|
10
|
+
const s = String(status).trim().toLowerCase();
|
|
18
11
|
if (s === "canceled" || s === "cancelled")
|
|
19
12
|
return "cancelled";
|
|
20
|
-
if
|
|
21
|
-
|
|
13
|
+
// Medusa "completed" = delivered; also support "fulfilled" / "delivered" if used by custom flows
|
|
14
|
+
if (s === "completed" || s === "fulfilled" || s === "delivered")
|
|
15
|
+
return "delivered";
|
|
22
16
|
return "pending";
|
|
23
17
|
}
|
|
24
18
|
function isPendingStatus(status) {
|
|
25
|
-
|
|
26
|
-
return normalized !== "delivered" && normalized !== "cancelled";
|
|
19
|
+
return toSimpleStatus(status) === "pending";
|
|
27
20
|
}
|
|
28
21
|
const MIN_DAYS = 1;
|
|
29
22
|
const MAX_DAYS = 365;
|
|
@@ -105,14 +98,15 @@ async function GET(req, res) {
|
|
|
105
98
|
if (!inRange)
|
|
106
99
|
continue;
|
|
107
100
|
const status = o.status;
|
|
108
|
-
const
|
|
109
|
-
statusCounts[
|
|
101
|
+
const simple = toSimpleStatus(status);
|
|
102
|
+
statusCounts[simple] = (statusCounts[simple] ?? 0) + 1;
|
|
110
103
|
totalOrders += 1;
|
|
111
104
|
if (typeof o.id === "string" && o.id) {
|
|
112
105
|
orderIdsInRange.add(o.id);
|
|
113
106
|
}
|
|
107
|
+
const fulfillments = o.fulfillments ?? [];
|
|
114
108
|
// Total revenue and AOV: only include non-cancelled orders
|
|
115
|
-
if (
|
|
109
|
+
if (simple !== "cancelled") {
|
|
116
110
|
const total = typeof o.total === "number" ? o.total : 0;
|
|
117
111
|
totalRevenue += total;
|
|
118
112
|
nonCancelledCount += 1;
|
|
@@ -121,7 +115,6 @@ async function GET(req, res) {
|
|
|
121
115
|
ordersTodayCount += 1;
|
|
122
116
|
if (isPendingStatus(status))
|
|
123
117
|
pendingOrders += 1;
|
|
124
|
-
const fulfillments = o.fulfillments ?? [];
|
|
125
118
|
for (const f of fulfillments) {
|
|
126
119
|
const shippedAt = toValidDate(f.shipped_at);
|
|
127
120
|
if (shippedAt && createdAt) {
|
|
@@ -138,6 +131,13 @@ async function GET(req, res) {
|
|
|
138
131
|
}
|
|
139
132
|
const cancelledOrders = Math.floor(statusCounts.cancelled ?? 0);
|
|
140
133
|
const deliveredOrders = Math.floor(statusCounts.delivered ?? 0);
|
|
134
|
+
const pendingOrdersCount = Math.floor(statusCounts.pending ?? 0);
|
|
135
|
+
// Ensure statusCounts matches KPI values so chart and cards stay in sync
|
|
136
|
+
const finalStatusCounts = {
|
|
137
|
+
pending: pendingOrdersCount,
|
|
138
|
+
cancelled: cancelledOrders,
|
|
139
|
+
delivered: deliveredOrders,
|
|
140
|
+
};
|
|
141
141
|
let exchangeOrders = 0;
|
|
142
142
|
let returnOrders = 0;
|
|
143
143
|
if (orderIdsInRange.size > 0) {
|
|
@@ -181,7 +181,7 @@ async function GET(req, res) {
|
|
|
181
181
|
exchangeOrders: Math.floor(exchangeOrders),
|
|
182
182
|
returnOrders: Math.floor(returnOrders),
|
|
183
183
|
avgFulfillmentTimeHours,
|
|
184
|
-
statusCounts,
|
|
184
|
+
statusCounts: finalStatusCounts,
|
|
185
185
|
};
|
|
186
186
|
res.json(body);
|
|
187
187
|
}
|
|
@@ -193,4 +193,4 @@ async function GET(req, res) {
|
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FuYWx5dGljcy9vcmRlcnMtc3VtbWFyeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdEQSxrQkFxTUM7QUF2UEQscURBSWtDO0FBSWxDLCtEQUErRDtBQUMvRCxNQUFNLGNBQWMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFVLENBQUE7QUFFckUsU0FBUyxjQUFjLENBQUMsTUFBMEI7SUFDaEQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQzNGLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM3QyxJQUFJLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQTtJQUM3RCxpR0FBaUc7SUFDakcsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQTtJQUNuRixPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsTUFBMEI7SUFDakQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFBO0FBQzdDLENBQUM7QUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUE7QUFDbEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFBO0FBRXBCLFNBQVMsU0FBUyxDQUFDLENBQU87SUFDeEIsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FB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
|