@lodashventure/medusa-sales-analytics 1.1.4 → 1.1.6
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.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { MedusaRequest, MedusaResponse, MedusaNextFunction } from "@medusajs/framework/http";
|
|
1
|
+
import type { MedusaRequest, MedusaResponse, MedusaNextFunction } from "@medusajs/framework/http";
|
|
2
2
|
export declare function addSalesStatistics(req: MedusaRequest, res: MedusaResponse, next: MedusaNextFunction): Promise<void>;
|
|
@@ -2,102 +2,167 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addSalesStatistics = addSalesStatistics;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const COMPLETED_ORDER_STATUSES = new Set([
|
|
6
|
+
"completed",
|
|
7
|
+
"partially_returned",
|
|
8
|
+
"partially_shipped",
|
|
9
|
+
"shipped",
|
|
10
|
+
"fulfilled",
|
|
11
|
+
"partially_fulfilled",
|
|
12
|
+
]);
|
|
5
13
|
async function addSalesStatistics(req, res, next) {
|
|
6
14
|
const originalJson = res.json.bind(res);
|
|
7
15
|
res.json = async function (data) {
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
try {
|
|
17
|
+
const payload = normalizeProductPayload(data);
|
|
18
|
+
if (!payload || payload.products.length === 0) {
|
|
19
|
+
return originalJson(data);
|
|
20
|
+
}
|
|
21
|
+
let salesByVariant = new Map();
|
|
10
22
|
try {
|
|
11
23
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
entity: "order_line_item",
|
|
15
|
-
fields: [
|
|
16
|
-
"id",
|
|
17
|
-
"variant_id",
|
|
18
|
-
"quantity",
|
|
19
|
-
"unit_price",
|
|
20
|
-
"subtotal",
|
|
21
|
-
"order_id"
|
|
22
|
-
]
|
|
23
|
-
});
|
|
24
|
-
// Get orders separately
|
|
25
|
-
const orderIds = [...new Set(orderItems.map(item => item.order_id).filter(Boolean))];
|
|
26
|
-
let orders = [];
|
|
27
|
-
if (orderIds.length > 0) {
|
|
28
|
-
const orderResult = await query.graph({
|
|
29
|
-
entity: "order",
|
|
30
|
-
fields: ["id", "status", "created_at"],
|
|
31
|
-
filters: {
|
|
32
|
-
id: orderIds
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
orders = orderResult.data;
|
|
36
|
-
}
|
|
37
|
-
// Create order map
|
|
38
|
-
const orderMap = new Map(orders.map(o => [o.id, o]));
|
|
39
|
-
// Filter for completed orders
|
|
40
|
-
const filteredOrderItems = orderItems.filter(item => {
|
|
41
|
-
const order = orderMap.get(item.order_id);
|
|
42
|
-
return order && [
|
|
43
|
-
"completed",
|
|
44
|
-
"partially_returned",
|
|
45
|
-
"partially_shipped",
|
|
46
|
-
"shipped",
|
|
47
|
-
"fulfilled",
|
|
48
|
-
"partially_fulfilled"
|
|
49
|
-
].includes(order.status);
|
|
50
|
-
});
|
|
51
|
-
// Add sales statistics to each product
|
|
52
|
-
data.products = data.products.map((product) => {
|
|
53
|
-
const variantIds = product.variants?.map((v) => v.id) || [];
|
|
54
|
-
const productSales = filteredOrderItems.filter(item => item.variant_id && variantIds.includes(item.variant_id));
|
|
55
|
-
const totalQuantitySold = productSales.reduce((sum, item) => sum + (item.quantity || 0), 0);
|
|
56
|
-
const totalRevenue = productSales.reduce((sum, item) => sum + (item.subtotal || 0), 0);
|
|
57
|
-
// Add sales data to each variant if they exist
|
|
58
|
-
if (product.variants && Array.isArray(product.variants)) {
|
|
59
|
-
product.variants = product.variants.map((variant) => {
|
|
60
|
-
const variantSales = productSales.filter(item => item.variant_id === variant.id);
|
|
61
|
-
const variantQuantitySold = variantSales.reduce((sum, item) => sum + (item.quantity || 0), 0);
|
|
62
|
-
const variantRevenue = variantSales.reduce((sum, item) => sum + (item.subtotal || 0), 0);
|
|
63
|
-
// Add sales stats to variant
|
|
64
|
-
return {
|
|
65
|
-
...variant,
|
|
66
|
-
sales_statistics: {
|
|
67
|
-
quantity_sold: variantQuantitySold,
|
|
68
|
-
revenue: variantRevenue,
|
|
69
|
-
number_of_orders: new Set(variantSales.map(item => item.order_id).filter(Boolean)).size
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
// Add product-level sales statistics
|
|
75
|
-
return {
|
|
76
|
-
...product,
|
|
77
|
-
sales_statistics: {
|
|
78
|
-
total_quantity_sold: totalQuantitySold,
|
|
79
|
-
total_revenue: totalRevenue,
|
|
80
|
-
number_of_orders: new Set(productSales.map(item => item.order_id).filter(Boolean)).size,
|
|
81
|
-
average_order_value: totalQuantitySold > 0 ? totalRevenue / totalQuantitySold : 0,
|
|
82
|
-
is_bestseller: totalQuantitySold > 0,
|
|
83
|
-
stock_status: product.variants?.some((v) => {
|
|
84
|
-
// Check inventory from different possible structures
|
|
85
|
-
const inventory = v.inventory_items?.[0]?.inventory ||
|
|
86
|
-
v.inventory_items?.[0] ||
|
|
87
|
-
v.inventory?.items?.[0];
|
|
88
|
-
return inventory?.available_quantity > 0 || inventory?.stocked_quantity > 0;
|
|
89
|
-
}) ? 'in_stock' : 'out_of_stock'
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
});
|
|
24
|
+
const orderItems = await fetchCompletedOrderItems(query);
|
|
25
|
+
salesByVariant = groupSalesByVariant(orderItems);
|
|
93
26
|
}
|
|
94
27
|
catch (error) {
|
|
95
|
-
|
|
96
|
-
|
|
28
|
+
console.error("Error fetching sales statistics:", error);
|
|
29
|
+
// Continue with empty sales data so middleware still adds the field
|
|
97
30
|
}
|
|
31
|
+
const enrichedProducts = payload.products.map((product) => attachSalesStatistics(product, salesByVariant));
|
|
32
|
+
payload.apply(enrichedProducts);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error("Error adding sales statistics:", error);
|
|
98
36
|
}
|
|
99
37
|
return originalJson(data);
|
|
100
38
|
};
|
|
101
39
|
next();
|
|
102
40
|
}
|
|
103
|
-
|
|
41
|
+
function normalizeProductPayload(data) {
|
|
42
|
+
if (Array.isArray(data?.products)) {
|
|
43
|
+
return {
|
|
44
|
+
products: data.products,
|
|
45
|
+
apply: (products) => {
|
|
46
|
+
data.products = products;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (data?.product && !Array.isArray(data.product)) {
|
|
51
|
+
return {
|
|
52
|
+
products: [data.product],
|
|
53
|
+
apply: (products) => {
|
|
54
|
+
data.product = products[0] ?? data.product;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
async function fetchCompletedOrderItems(query) {
|
|
61
|
+
const result = (await query.graph({
|
|
62
|
+
entity: "order_line_item",
|
|
63
|
+
fields: [
|
|
64
|
+
"id",
|
|
65
|
+
"variant_id",
|
|
66
|
+
"quantity",
|
|
67
|
+
"unit_price",
|
|
68
|
+
"subtotal",
|
|
69
|
+
"order_id",
|
|
70
|
+
"order.id",
|
|
71
|
+
"order.status",
|
|
72
|
+
],
|
|
73
|
+
}));
|
|
74
|
+
const items = result?.data ?? [];
|
|
75
|
+
return items.filter((item) => {
|
|
76
|
+
const status = typeof item?.order?.status === "string"
|
|
77
|
+
? item.order.status.toLowerCase()
|
|
78
|
+
: "";
|
|
79
|
+
return COMPLETED_ORDER_STATUSES.has(status);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function groupSalesByVariant(orderItems) {
|
|
83
|
+
return orderItems.reduce((acc, item) => {
|
|
84
|
+
if (!item?.variant_id) {
|
|
85
|
+
return acc;
|
|
86
|
+
}
|
|
87
|
+
const sales = acc.get(item.variant_id) ?? [];
|
|
88
|
+
sales.push(item);
|
|
89
|
+
acc.set(item.variant_id, sales);
|
|
90
|
+
return acc;
|
|
91
|
+
}, new Map());
|
|
92
|
+
}
|
|
93
|
+
function attachSalesStatistics(product, salesByVariant) {
|
|
94
|
+
if (!product) {
|
|
95
|
+
return product;
|
|
96
|
+
}
|
|
97
|
+
const hasVariantArray = Array.isArray(product.variants);
|
|
98
|
+
const variantsArray = hasVariantArray ? product.variants : [];
|
|
99
|
+
const variantIds = variantsArray
|
|
100
|
+
.map((variant) => variant?.id)
|
|
101
|
+
.filter(Boolean);
|
|
102
|
+
const productSales = variantIds.flatMap((variantId) => salesByVariant.get(variantId) ?? []);
|
|
103
|
+
const totalQuantitySold = sumQuantities(productSales);
|
|
104
|
+
const totalRevenue = sumRevenue(productSales);
|
|
105
|
+
const numberOfOrders = countUniqueOrders(productSales);
|
|
106
|
+
const enrichedVariants = hasVariantArray
|
|
107
|
+
? variantsArray.map((variant) => {
|
|
108
|
+
const variantSales = salesByVariant.get(variant.id) ?? [];
|
|
109
|
+
return {
|
|
110
|
+
...variant,
|
|
111
|
+
sales_statistics: {
|
|
112
|
+
quantity_sold: sumQuantities(variantSales),
|
|
113
|
+
revenue: sumRevenue(variantSales),
|
|
114
|
+
number_of_orders: countUniqueOrders(variantSales),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
})
|
|
118
|
+
: product.variants;
|
|
119
|
+
return {
|
|
120
|
+
...product,
|
|
121
|
+
...(enrichedVariants ? { variants: enrichedVariants } : {}),
|
|
122
|
+
sales_statistics: {
|
|
123
|
+
total_quantity_sold: totalQuantitySold,
|
|
124
|
+
total_revenue: totalRevenue,
|
|
125
|
+
number_of_orders: numberOfOrders,
|
|
126
|
+
average_order_value: totalQuantitySold > 0 ? totalRevenue / totalQuantitySold : 0,
|
|
127
|
+
is_bestseller: totalQuantitySold > 0,
|
|
128
|
+
stock_status: resolveStockStatus(enrichedVariants ?? product.variants),
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function sumQuantities(orderItems) {
|
|
133
|
+
return orderItems.reduce((sum, item) => sum + (typeof item.quantity === "number" ? item.quantity : 0), 0);
|
|
134
|
+
}
|
|
135
|
+
function sumRevenue(orderItems) {
|
|
136
|
+
return orderItems.reduce((sum, item) => sum + (typeof item.subtotal === "number" ? item.subtotal : 0), 0);
|
|
137
|
+
}
|
|
138
|
+
function countUniqueOrders(orderItems) {
|
|
139
|
+
return new Set(orderItems.map((item) => item.order_id).filter(Boolean)).size;
|
|
140
|
+
}
|
|
141
|
+
function resolveStockStatus(variants) {
|
|
142
|
+
if (!Array.isArray(variants) || variants.length === 0) {
|
|
143
|
+
return "out_of_stock";
|
|
144
|
+
}
|
|
145
|
+
return variants.some((variant) => variantHasInventory(variant))
|
|
146
|
+
? "in_stock"
|
|
147
|
+
: "out_of_stock";
|
|
148
|
+
}
|
|
149
|
+
function variantHasInventory(variant) {
|
|
150
|
+
if (!variant) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const inventoryCandidate = variant.inventory_items?.[0]?.inventory ??
|
|
154
|
+
variant.inventory_items?.[0] ??
|
|
155
|
+
variant.inventory?.items?.[0];
|
|
156
|
+
if (!inventoryCandidate) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
const inventory = inventoryCandidate.inventory ?? inventoryCandidate;
|
|
160
|
+
if (typeof inventory?.available_quantity === "number") {
|
|
161
|
+
return inventory.available_quantity > 0;
|
|
162
|
+
}
|
|
163
|
+
if (typeof inventory?.stocked_quantity === "number") {
|
|
164
|
+
return inventory.stocked_quantity > 0;
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXNhbGVzLXN0YXRpc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzL2FkZC1zYWxlcy1zdGF0aXN0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0NBLGdEQXFDQztBQWhFRCxxREFBc0U7QUFrQnRFLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdkMsV0FBVztJQUNYLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsU0FBUztJQUNULFdBQVc7SUFDWCxxQkFBcUI7Q0FDdEIsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxHQUFrQixFQUNsQixHQUFtQixFQUNuQixJQUF3QjtJQUV4QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QyxHQUFXLENBQUMsSUFBSSxHQUFHLEtBQUssV0FBVyxJQUFTO1FBQzNDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFFRCxJQUFJLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztZQUU3RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sVUFBVSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pELGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-sales-analytics",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"description": "Sales analytics and statistics plugin for Medusa v2",
|
|
5
5
|
"author": "Lodashventure",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,21 +29,21 @@
|
|
|
29
29
|
"prepublishOnly": "medusa plugin:build"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@medusajs/framework": "2.11.
|
|
32
|
+
"@medusajs/framework": "2.11.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"@medusajs/framework": "2.11.2",
|
|
36
36
|
"@medusajs/medusa": "2.11.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@medusajs/admin-sdk": "2.11.
|
|
40
|
-
"@medusajs/admin-shared": "2.11.
|
|
41
|
-
"@medusajs/cli": "2.11.
|
|
42
|
-
"@medusajs/medusa": "2.11.
|
|
43
|
-
"@medusajs/types": "2.11.
|
|
44
|
-
"@types/node": "^
|
|
39
|
+
"@medusajs/admin-sdk": "2.11.3",
|
|
40
|
+
"@medusajs/admin-shared": "2.11.3",
|
|
41
|
+
"@medusajs/cli": "2.11.3",
|
|
42
|
+
"@medusajs/medusa": "2.11.3",
|
|
43
|
+
"@medusajs/types": "2.11.3",
|
|
44
|
+
"@types/node": "^24.10.0",
|
|
45
45
|
"ts-node": "^10.9.2",
|
|
46
|
-
"typescript": "^5.
|
|
47
|
-
"vite": "^
|
|
46
|
+
"typescript": "^5.9.3",
|
|
47
|
+
"vite": "^7.2.2"
|
|
48
48
|
}
|
|
49
49
|
}
|