medusa-stats 1.0.5

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.
Files changed (180) hide show
  1. package/.medusa/server/src/admin/composite.png +0 -0
  2. package/.medusa/server/src/admin/index.js +10512 -0
  3. package/.medusa/server/src/admin/index.mjs +10510 -0
  4. package/.medusa/server/src/admin/params.png +0 -0
  5. package/.medusa/server/src/admin/view.png +0 -0
  6. package/.medusa/server/src/admin/visualizations.png +0 -0
  7. package/.medusa/server/src/api/admin/statistics/alert-logs/[id]/route.d.ts +6 -0
  8. package/.medusa/server/src/api/admin/statistics/alert-logs/[id]/route.js +18 -0
  9. package/.medusa/server/src/api/admin/statistics/alert-logs/route.d.ts +6 -0
  10. package/.medusa/server/src/api/admin/statistics/alert-logs/route.js +33 -0
  11. package/.medusa/server/src/api/admin/statistics/alerts/[id]/logs/route.d.ts +6 -0
  12. package/.medusa/server/src/api/admin/statistics/alerts/[id]/logs/route.js +23 -0
  13. package/.medusa/server/src/api/admin/statistics/alerts/[id]/route.d.ts +17 -0
  14. package/.medusa/server/src/api/admin/statistics/alerts/[id]/route.js +64 -0
  15. package/.medusa/server/src/api/admin/statistics/alerts/[id]/toggle/route.d.ts +6 -0
  16. package/.medusa/server/src/api/admin/statistics/alerts/[id]/toggle/route.js +18 -0
  17. package/.medusa/server/src/api/admin/statistics/alerts/route.d.ts +12 -0
  18. package/.medusa/server/src/api/admin/statistics/alerts/route.js +94 -0
  19. package/.medusa/server/src/api/admin/statistics/charts/[id]/route.d.ts +17 -0
  20. package/.medusa/server/src/api/admin/statistics/charts/[id]/route.js +50 -0
  21. package/.medusa/server/src/api/admin/statistics/charts/[id]/statistics/route.d.ts +15 -0
  22. package/.medusa/server/src/api/admin/statistics/charts/[id]/statistics/route.js +40 -0
  23. package/.medusa/server/src/api/admin/statistics/charts/route.d.ts +4 -0
  24. package/.medusa/server/src/api/admin/statistics/charts/route.js +55 -0
  25. package/.medusa/server/src/api/admin/statistics/options/[id]/calculate/route.d.ts +7 -0
  26. package/.medusa/server/src/api/admin/statistics/options/[id]/calculate/route.js +23 -0
  27. package/.medusa/server/src/api/admin/statistics/options/[id]/clone/route.d.ts +7 -0
  28. package/.medusa/server/src/api/admin/statistics/options/[id]/clone/route.js +15 -0
  29. package/.medusa/server/src/api/admin/statistics/options/[id]/route.d.ts +17 -0
  30. package/.medusa/server/src/api/admin/statistics/options/[id]/route.js +69 -0
  31. package/.medusa/server/src/api/admin/statistics/options/route.d.ts +12 -0
  32. package/.medusa/server/src/api/admin/statistics/options/route.js +87 -0
  33. package/.medusa/server/src/api/admin/statistics/providers/[id]/route.d.ts +6 -0
  34. package/.medusa/server/src/api/admin/statistics/providers/[id]/route.js +18 -0
  35. package/.medusa/server/src/api/admin/statistics/providers/[id]/statistics/route.d.ts +6 -0
  36. package/.medusa/server/src/api/admin/statistics/providers/[id]/statistics/route.js +18 -0
  37. package/.medusa/server/src/api/admin/statistics/providers/route.d.ts +7 -0
  38. package/.medusa/server/src/api/admin/statistics/providers/route.js +57 -0
  39. package/.medusa/server/src/api/admin/statistics/utils/option-graph.d.ts +3 -0
  40. package/.medusa/server/src/api/admin/statistics/utils/option-graph.js +34 -0
  41. package/.medusa/server/src/api/admin/statistics/views/[id]/calculate/route.d.ts +7 -0
  42. package/.medusa/server/src/api/admin/statistics/views/[id]/calculate/route.js +21 -0
  43. package/.medusa/server/src/api/admin/statistics/views/[id]/clone/route.d.ts +7 -0
  44. package/.medusa/server/src/api/admin/statistics/views/[id]/clone/route.js +21 -0
  45. package/.medusa/server/src/api/admin/statistics/views/[id]/route.d.ts +17 -0
  46. package/.medusa/server/src/api/admin/statistics/views/[id]/route.js +71 -0
  47. package/.medusa/server/src/api/admin/statistics/views/route.d.ts +12 -0
  48. package/.medusa/server/src/api/admin/statistics/views/route.js +74 -0
  49. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  50. package/.medusa/server/src/api/middlewares.js +194 -0
  51. package/.medusa/server/src/api/validation/statistics/schemas.d.ts +1013 -0
  52. package/.medusa/server/src/api/validation/statistics/schemas.js +288 -0
  53. package/.medusa/server/src/index.d.ts +1 -0
  54. package/.medusa/server/src/index.js +18 -0
  55. package/.medusa/server/src/jobs/evaluate-statistics-alerts.d.ts +6 -0
  56. package/.medusa/server/src/jobs/evaluate-statistics-alerts.js +110 -0
  57. package/.medusa/server/src/links/statistics-alert-user.d.ts +2 -0
  58. package/.medusa/server/src/links/statistics-alert-user.js +16 -0
  59. package/.medusa/server/src/links/statistics-option-user.d.ts +2 -0
  60. package/.medusa/server/src/links/statistics-option-user.js +16 -0
  61. package/.medusa/server/src/loaders/statistics/index.d.ts +5 -0
  62. package/.medusa/server/src/loaders/statistics/index.js +47 -0
  63. package/.medusa/server/src/modules/statistics/index.d.ts +107 -0
  64. package/.medusa/server/src/modules/statistics/index.js +32 -0
  65. package/.medusa/server/src/modules/statistics/migrations/Migration20260223131741.d.ts +5 -0
  66. package/.medusa/server/src/modules/statistics/migrations/Migration20260223131741.js +57 -0
  67. package/.medusa/server/src/modules/statistics/models/alert-log.d.ts +74 -0
  68. package/.medusa/server/src/modules/statistics/models/alert-log.js +16 -0
  69. package/.medusa/server/src/modules/statistics/models/alert.d.ts +74 -0
  70. package/.medusa/server/src/modules/statistics/models/alert.js +24 -0
  71. package/.medusa/server/src/modules/statistics/models/chart.d.ts +81 -0
  72. package/.medusa/server/src/modules/statistics/models/chart.js +28 -0
  73. package/.medusa/server/src/modules/statistics/models/index.d.ts +7 -0
  74. package/.medusa/server/src/modules/statistics/models/index.js +24 -0
  75. package/.medusa/server/src/modules/statistics/models/option-input.d.ts +135 -0
  76. package/.medusa/server/src/modules/statistics/models/option-input.js +27 -0
  77. package/.medusa/server/src/modules/statistics/models/option.d.ts +78 -0
  78. package/.medusa/server/src/modules/statistics/models/option.js +41 -0
  79. package/.medusa/server/src/modules/statistics/models/provider.d.ts +75 -0
  80. package/.medusa/server/src/modules/statistics/models/provider.js +15 -0
  81. package/.medusa/server/src/modules/statistics/models/view.d.ts +79 -0
  82. package/.medusa/server/src/modules/statistics/models/view.js +30 -0
  83. package/.medusa/server/src/modules/statistics/providers/index.d.ts +1 -0
  84. package/.medusa/server/src/modules/statistics/providers/index.js +18 -0
  85. package/.medusa/server/src/modules/statistics/providers/provider.d.ts +254 -0
  86. package/.medusa/server/src/modules/statistics/providers/provider.js +307 -0
  87. package/.medusa/server/src/modules/statistics/service.d.ts +953 -0
  88. package/.medusa/server/src/modules/statistics/service.js +190 -0
  89. package/.medusa/server/src/modules/statistics/utils/dependency-option-map.d.ts +13 -0
  90. package/.medusa/server/src/modules/statistics/utils/dependency-option-map.js +67 -0
  91. package/.medusa/server/src/modules/statistics/utils/period-utils.d.ts +23 -0
  92. package/.medusa/server/src/modules/statistics/utils/period-utils.js +78 -0
  93. package/.medusa/server/src/modules/statistics/utils/time-series-utils.d.ts +6 -0
  94. package/.medusa/server/src/modules/statistics/utils/time-series-utils.js +8 -0
  95. package/.medusa/server/src/providers/common/index.d.ts +2 -0
  96. package/.medusa/server/src/providers/common/index.js +1232 -0
  97. package/.medusa/server/src/providers/composite/index.d.ts +2 -0
  98. package/.medusa/server/src/providers/composite/index.js +147 -0
  99. package/.medusa/server/src/workflows/statistics/calculate-single-statistic.d.ts +15 -0
  100. package/.medusa/server/src/workflows/statistics/calculate-single-statistic.js +28 -0
  101. package/.medusa/server/src/workflows/statistics/calculate-statistics.d.ts +20 -0
  102. package/.medusa/server/src/workflows/statistics/calculate-statistics.js +15 -0
  103. package/.medusa/server/src/workflows/statistics/calculate-view.d.ts +31 -0
  104. package/.medusa/server/src/workflows/statistics/calculate-view.js +30 -0
  105. package/.medusa/server/src/workflows/statistics/clone-view.d.ts +227 -0
  106. package/.medusa/server/src/workflows/statistics/clone-view.js +10 -0
  107. package/.medusa/server/src/workflows/statistics/create-alert.d.ts +139 -0
  108. package/.medusa/server/src/workflows/statistics/create-alert.js +12 -0
  109. package/.medusa/server/src/workflows/statistics/create-chart.d.ts +122 -0
  110. package/.medusa/server/src/workflows/statistics/create-chart.js +14 -0
  111. package/.medusa/server/src/workflows/statistics/create-view-with-options.d.ts +1342 -0
  112. package/.medusa/server/src/workflows/statistics/create-view-with-options.js +29 -0
  113. package/.medusa/server/src/workflows/statistics/delete-chart.d.ts +10 -0
  114. package/.medusa/server/src/workflows/statistics/delete-chart.js +14 -0
  115. package/.medusa/server/src/workflows/statistics/evaluate-alerts.d.ts +28 -0
  116. package/.medusa/server/src/workflows/statistics/evaluate-alerts.js +67 -0
  117. package/.medusa/server/src/workflows/statistics/get-available-statistics.d.ts +5 -0
  118. package/.medusa/server/src/workflows/statistics/get-available-statistics.js +10 -0
  119. package/.medusa/server/src/workflows/statistics/index.d.ts +14 -0
  120. package/.medusa/server/src/workflows/statistics/index.js +31 -0
  121. package/.medusa/server/src/workflows/statistics/manage-chart-statistics.d.ts +12 -0
  122. package/.medusa/server/src/workflows/statistics/manage-chart-statistics.js +14 -0
  123. package/.medusa/server/src/workflows/statistics/steps/calculate-statistics.d.ts +37 -0
  124. package/.medusa/server/src/workflows/statistics/steps/calculate-statistics.js +222 -0
  125. package/.medusa/server/src/workflows/statistics/steps/clone-view.d.ts +227 -0
  126. package/.medusa/server/src/workflows/statistics/steps/clone-view.js +39 -0
  127. package/.medusa/server/src/workflows/statistics/steps/create-alert-log-entries.d.ts +17 -0
  128. package/.medusa/server/src/workflows/statistics/steps/create-alert-log-entries.js +50 -0
  129. package/.medusa/server/src/workflows/statistics/steps/create-alert.d.ts +120 -0
  130. package/.medusa/server/src/workflows/statistics/steps/create-alert.js +21 -0
  131. package/.medusa/server/src/workflows/statistics/steps/create-chart.d.ts +118 -0
  132. package/.medusa/server/src/workflows/statistics/steps/create-chart.js +19 -0
  133. package/.medusa/server/src/workflows/statistics/steps/create-statistics-options.d.ts +117 -0
  134. package/.medusa/server/src/workflows/statistics/steps/create-statistics-options.js +16 -0
  135. package/.medusa/server/src/workflows/statistics/steps/create-statistics-view.d.ts +119 -0
  136. package/.medusa/server/src/workflows/statistics/steps/create-statistics-view.js +16 -0
  137. package/.medusa/server/src/workflows/statistics/steps/dedupe-alerts.d.ts +22 -0
  138. package/.medusa/server/src/workflows/statistics/steps/dedupe-alerts.js +64 -0
  139. package/.medusa/server/src/workflows/statistics/steps/delete-chart.d.ts +6 -0
  140. package/.medusa/server/src/workflows/statistics/steps/delete-chart.js +17 -0
  141. package/.medusa/server/src/workflows/statistics/steps/emit-alert-events.d.ts +17 -0
  142. package/.medusa/server/src/workflows/statistics/steps/emit-alert-events.js +41 -0
  143. package/.medusa/server/src/workflows/statistics/steps/evaluate-each-condition.d.ts +15 -0
  144. package/.medusa/server/src/workflows/statistics/steps/evaluate-each-condition.js +109 -0
  145. package/.medusa/server/src/workflows/statistics/steps/extract-alert-values.d.ts +12 -0
  146. package/.medusa/server/src/workflows/statistics/steps/extract-alert-values.js +86 -0
  147. package/.medusa/server/src/workflows/statistics/steps/fetch-active-alerts-for-option.d.ts +112 -0
  148. package/.medusa/server/src/workflows/statistics/steps/fetch-active-alerts-for-option.js +16 -0
  149. package/.medusa/server/src/workflows/statistics/steps/fetch-available-statistics.d.ts +4 -0
  150. package/.medusa/server/src/workflows/statistics/steps/fetch-available-statistics.js +39 -0
  151. package/.medusa/server/src/workflows/statistics/steps/fetch-option-with-relations.d.ts +112 -0
  152. package/.medusa/server/src/workflows/statistics/steps/fetch-option-with-relations.js +11 -0
  153. package/.medusa/server/src/workflows/statistics/steps/fetch-view-with-options.d.ts +112 -0
  154. package/.medusa/server/src/workflows/statistics/steps/fetch-view-with-options.js +20 -0
  155. package/.medusa/server/src/workflows/statistics/steps/manage-chart-statistics.d.ts +8 -0
  156. package/.medusa/server/src/workflows/statistics/steps/manage-chart-statistics.js +26 -0
  157. package/.medusa/server/src/workflows/statistics/steps/update-chart.d.ts +117 -0
  158. package/.medusa/server/src/workflows/statistics/steps/update-chart.js +32 -0
  159. package/.medusa/server/src/workflows/statistics/steps/update-view.d.ts +120 -0
  160. package/.medusa/server/src/workflows/statistics/steps/update-view.js +18 -0
  161. package/.medusa/server/src/workflows/statistics/steps/validate-alert-input.d.ts +1 -0
  162. package/.medusa/server/src/workflows/statistics/steps/validate-alert-input.js +34 -0
  163. package/.medusa/server/src/workflows/statistics/steps/validate-option-parameters.d.ts +21 -0
  164. package/.medusa/server/src/workflows/statistics/steps/validate-option-parameters.js +43 -0
  165. package/.medusa/server/src/workflows/statistics/steps/validate-view-input.d.ts +10 -0
  166. package/.medusa/server/src/workflows/statistics/steps/validate-view-input.js +15 -0
  167. package/.medusa/server/src/workflows/statistics/update-chart.d.ts +120 -0
  168. package/.medusa/server/src/workflows/statistics/update-chart.js +13 -0
  169. package/.medusa/server/src/workflows/statistics/update-view-configuration.d.ts +128 -0
  170. package/.medusa/server/src/workflows/statistics/update-view-configuration.js +18 -0
  171. package/.medusa/server/src/workflows/statistics/utils/cache-utils.d.ts +60 -0
  172. package/.medusa/server/src/workflows/statistics/utils/cache-utils.js +66 -0
  173. package/.medusa/server/src/workflows/statistics/utils/dependency-graph.d.ts +51 -0
  174. package/.medusa/server/src/workflows/statistics/utils/dependency-graph.js +131 -0
  175. package/.medusa/server/src/workflows/statistics/utils/parameter-utils.d.ts +54 -0
  176. package/.medusa/server/src/workflows/statistics/utils/parameter-utils.js +147 -0
  177. package/.medusa/server/src/workflows/statistics/validate-option-configuration.d.ts +9 -0
  178. package/.medusa/server/src/workflows/statistics/validate-option-configuration.js +35 -0
  179. package/README.md +310 -0
  180. package/package.json +87 -0
@@ -0,0 +1,1232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const zod_1 = require("zod");
5
+ const medusa_stats_1 = require("medusa-stats");
6
+ const framework_1 = require("@medusajs/framework");
7
+ class CommonStatisticsProvider extends medusa_stats_1.AbstractStatisticsProvider {
8
+ async getAvailableStatistics() {
9
+ return [
10
+ new medusa_stats_1.StatBuilder("cart_progress_breakdown", "Cart Progress Breakdown")
11
+ .description("Break down carts by their progress stage")
12
+ .field({
13
+ name: "include_completed",
14
+ label: "Include Completed",
15
+ description: "Include completed carts in the breakdown",
16
+ schema: zod_1.z.boolean().default(false),
17
+ fieldType: "boolean"
18
+ }, false)
19
+ .chart("pie")
20
+ .dimension("category")
21
+ .build(),
22
+ new medusa_stats_1.StatBuilder("average_cart_value", "Average Cart Value")
23
+ .description("Average value of carts over time")
24
+ .field({
25
+ name: "currency_code",
26
+ label: "Currency",
27
+ description: "Filter by currency code",
28
+ schema: zod_1.z.string().optional(),
29
+ fieldType: "text",
30
+ placeholder: "USD"
31
+ })
32
+ .field({
33
+ name: "status",
34
+ label: "Cart Status",
35
+ description: "Filter by cart status",
36
+ schema: zod_1.z.enum(["all", "completed", "active", "abandoned"]).default("all"),
37
+ fieldType: "select",
38
+ options: [
39
+ { value: "all", label: "All Carts" },
40
+ { value: "completed", label: "Completed" },
41
+ { value: "active", label: "Active" },
42
+ { value: "abandoned", label: "Abandoned" }
43
+ ]
44
+ }, "all")
45
+ .chart("line")
46
+ .dimension("time")
47
+ .build(),
48
+ new medusa_stats_1.StatBuilder("abandoned_cart_value", "Abandoned Cart Value")
49
+ .description("Average value of abandoned carts")
50
+ .field({
51
+ name: "currency_code",
52
+ label: "Currency",
53
+ description: "Filter by currency code",
54
+ schema: zod_1.z.string().optional(),
55
+ fieldType: "text",
56
+ placeholder: "USD"
57
+ })
58
+ .field({
59
+ name: "abandoned_after_hours",
60
+ label: "Abandoned After Hours",
61
+ description: "Consider cart abandoned after this many hours",
62
+ schema: zod_1.z.number().min(1).max(168).default(24),
63
+ fieldType: "number"
64
+ }, 24)
65
+ .chart("line")
66
+ .dimension("time")
67
+ .build(),
68
+ new medusa_stats_1.StatBuilder("total_cart_value", "Total Cart Value")
69
+ .description("Total value of all carts over time")
70
+ .field({
71
+ name: "currency_code",
72
+ label: "Currency",
73
+ description: "Filter by currency code",
74
+ schema: zod_1.z.string().optional(),
75
+ fieldType: "text",
76
+ placeholder: "USD"
77
+ })
78
+ .chart("line")
79
+ .dimension("time")
80
+ .build(),
81
+ new medusa_stats_1.StatBuilder("order_refund_ratio", "Order Refund Ratio")
82
+ .description("Ratio of refunds to total sales (%)")
83
+ .field({
84
+ name: "currency_code",
85
+ label: "Currency",
86
+ description: "Filter by currency code",
87
+ schema: zod_1.z.string().optional(),
88
+ fieldType: "text",
89
+ placeholder: "USD"
90
+ })
91
+ .chart("line")
92
+ .dimension("time")
93
+ .build(),
94
+ new medusa_stats_1.StatBuilder("order_promotion_ratio", "Order Promotion Ratio")
95
+ .description("Ratio of discounts to total sales (%)")
96
+ .chart("line")
97
+ .dimension("time")
98
+ .build(),
99
+ new medusa_stats_1.StatBuilder("total_promotions_value", "Total Promotions Value")
100
+ .description("Total value of discounts applied to orders")
101
+ .field({
102
+ name: "currency_code",
103
+ label: "Currency",
104
+ description: "Filter by currency code",
105
+ schema: zod_1.z.string().optional(),
106
+ fieldType: "text",
107
+ placeholder: "USD"
108
+ })
109
+ .chart("line")
110
+ .dimension("time")
111
+ .build(),
112
+ new medusa_stats_1.StatBuilder("orders_by_status", "Orders by Status")
113
+ .description("Count of orders grouped by status")
114
+ .field({
115
+ name: "statuses",
116
+ label: "Statuses",
117
+ description: "Order statuses to include",
118
+ schema: zod_1.z.array(zod_1.z.string()).default(["pending", "completed", "canceled", "requires_action"]),
119
+ fieldType: "multiselect",
120
+ options: [
121
+ { value: "pending", label: "Pending" },
122
+ { value: "completed", label: "Completed" },
123
+ { value: "canceled", label: "Canceled" },
124
+ { value: "requires_action", label: "Requires Action" }
125
+ ]
126
+ }, ["pending", "completed", "canceled", "requires_action"])
127
+ .chart("bar")
128
+ .dimension("category")
129
+ .build(),
130
+ new medusa_stats_1.StatBuilder("average_units_per_order", "Average Units per Order")
131
+ .description("Average number of items per order")
132
+ .chart("line")
133
+ .dimension("time")
134
+ .build(),
135
+ new medusa_stats_1.StatBuilder("orders_by_time", "Orders by Time")
136
+ .description("Number of orders over time")
137
+ .field({
138
+ name: "status",
139
+ label: "Order Status",
140
+ description: "Filter by order status",
141
+ schema: zod_1.z.enum(["all", "completed", "pending", "canceled"]).default("completed"),
142
+ fieldType: "select",
143
+ options: [
144
+ { value: "all", label: "All Orders" },
145
+ { value: "completed", label: "Completed" },
146
+ { value: "pending", label: "Pending" },
147
+ { value: "canceled", label: "Canceled" }
148
+ ]
149
+ }, "completed")
150
+ .chart("line")
151
+ .dimension("time")
152
+ .build(),
153
+ new medusa_stats_1.StatBuilder("orders_chart", "Orders Chart")
154
+ .description("Comprehensive orders visualization")
155
+ .field({
156
+ name: "metric",
157
+ label: "Metric",
158
+ description: "What to measure",
159
+ schema: zod_1.z.enum(["count", "total_value", "average_value"]).default("count"),
160
+ fieldType: "select",
161
+ options: [
162
+ { value: "count", label: "Order Count" },
163
+ { value: "total_value", label: "Total Value" },
164
+ { value: "average_value", label: "Average Value" }
165
+ ]
166
+ }, "count")
167
+ .chart("line")
168
+ .dimension("time")
169
+ .build(),
170
+ new medusa_stats_1.StatBuilder("regions_popularity", "Regions Popularity")
171
+ .description("Most popular regions by order count")
172
+ .field({
173
+ name: "limit",
174
+ label: "Limit",
175
+ description: "Number of regions to show",
176
+ schema: zod_1.z.number().min(1).max(50).default(10),
177
+ fieldType: "number"
178
+ }, 10)
179
+ .chart("bar")
180
+ .dimension("category")
181
+ .build(),
182
+ new medusa_stats_1.StatBuilder("sales_channel_popularity", "Sales Channel Popularity")
183
+ .description("Order count by sales channel")
184
+ .chart("pie")
185
+ .dimension("category")
186
+ .build(),
187
+ new medusa_stats_1.StatBuilder("orders_frequency_distribution", "Orders Frequency Distribution")
188
+ .description("Distribution of time between repeat orders")
189
+ .field({
190
+ name: "bucket_size",
191
+ label: "Bucket Size (days)",
192
+ description: "Size of time buckets in days",
193
+ schema: zod_1.z.number().min(1).max(365).default(7),
194
+ fieldType: "number"
195
+ }, 7)
196
+ .chart("bar")
197
+ .dimension("category")
198
+ .build(),
199
+ new medusa_stats_1.StatBuilder("payment_provider_popularity", "Payment Provider Popularity")
200
+ .description("Most popular payment providers")
201
+ .chart("bar")
202
+ .dimension("category")
203
+ .build(),
204
+ new medusa_stats_1.StatBuilder("average_sales", "Average Sales")
205
+ .description("Average sales value over time")
206
+ .field({
207
+ name: "currency_code",
208
+ label: "Currency",
209
+ description: "Filter by currency code",
210
+ schema: zod_1.z.string().optional(),
211
+ fieldType: "text",
212
+ placeholder: "USD"
213
+ })
214
+ .chart("line")
215
+ .dimension("time")
216
+ .build(),
217
+ new medusa_stats_1.StatBuilder("sales_per_channel", "Sales per Channel")
218
+ .description("Total sales by sales channel")
219
+ .field({
220
+ name: "currency_code",
221
+ label: "Currency",
222
+ description: "Filter by currency code",
223
+ schema: zod_1.z.string().optional(),
224
+ fieldType: "text",
225
+ placeholder: "USD"
226
+ })
227
+ .chart("bar")
228
+ .dimension("category")
229
+ .build(),
230
+ new medusa_stats_1.StatBuilder("net_sales", "Net Sales")
231
+ .description("Net sales after discounts and refunds")
232
+ .field({
233
+ name: "currency_code",
234
+ label: "Currency",
235
+ description: "Filter by currency code",
236
+ schema: zod_1.z.string().optional(),
237
+ fieldType: "text",
238
+ placeholder: "USD"
239
+ })
240
+ .field({
241
+ name: "include_tax",
242
+ label: "Include Tax",
243
+ description: "Include tax in net sales calculation",
244
+ schema: zod_1.z.boolean().default(true),
245
+ fieldType: "boolean"
246
+ }, true)
247
+ .chart("line")
248
+ .dimension("time")
249
+ .build(),
250
+ new medusa_stats_1.StatBuilder("sales_by_time", "Sales by Time")
251
+ .description("Total sales over time")
252
+ .field({
253
+ name: "currency_code",
254
+ label: "Currency",
255
+ description: "Filter by currency code",
256
+ schema: zod_1.z.string().optional(),
257
+ fieldType: "text",
258
+ placeholder: "USD"
259
+ })
260
+ .chart("line")
261
+ .dimension("time")
262
+ .build(),
263
+ new medusa_stats_1.StatBuilder("sales_by_currency", "Sales by Currency")
264
+ .description("Total sales grouped by currency")
265
+ .chart("pie")
266
+ .dimension("category")
267
+ .build(),
268
+ new medusa_stats_1.StatBuilder("sales_chart", "Sales Chart")
269
+ .description("Comprehensive sales visualization")
270
+ .field({
271
+ name: "currency_code",
272
+ label: "Currency",
273
+ description: "Filter by currency code",
274
+ schema: zod_1.z.string().optional(),
275
+ fieldType: "text",
276
+ placeholder: "USD"
277
+ })
278
+ .field({
279
+ name: "include_refunds",
280
+ label: "Include Refunds",
281
+ description: "Whether to subtract refunds from sales",
282
+ schema: zod_1.z.boolean().default(false),
283
+ fieldType: "boolean"
284
+ }, false)
285
+ .chart("line")
286
+ .dimension("time")
287
+ .build(),
288
+ new medusa_stats_1.StatBuilder("refunds_total", "Refunds Total")
289
+ .description("Total refunds over time")
290
+ .field({
291
+ name: "currency_code",
292
+ label: "Currency",
293
+ description: "Filter by currency code",
294
+ schema: zod_1.z.string().optional(),
295
+ fieldType: "text",
296
+ placeholder: "USD"
297
+ })
298
+ .chart("line")
299
+ .dimension("time")
300
+ .build(),
301
+ new medusa_stats_1.StatBuilder("average_sales_per_customer", "Average Sales per Customer")
302
+ .description("Average sales value per customer")
303
+ .field({
304
+ name: "currency_code",
305
+ label: "Currency",
306
+ description: "Filter by currency code",
307
+ schema: zod_1.z.string().optional(),
308
+ fieldType: "text",
309
+ placeholder: "USD"
310
+ })
311
+ .field({
312
+ name: "customer_segment",
313
+ label: "Customer Segment",
314
+ description: "Filter by customer segment",
315
+ schema: zod_1.z.enum(["all", "new", "returning"]).default("all"),
316
+ fieldType: "select",
317
+ options: [
318
+ { value: "all", label: "All Customers" },
319
+ { value: "new", label: "New Customers" },
320
+ { value: "returning", label: "Returning Customers" }
321
+ ]
322
+ }, "all")
323
+ .chart("line")
324
+ .dimension("time")
325
+ .build(),
326
+ new medusa_stats_1.StatBuilder("customer_lifetime_value", "Customer Lifetime Value")
327
+ .description("Average lifetime value per customer")
328
+ .field({
329
+ name: "currency_code",
330
+ label: "Currency",
331
+ description: "Filter by currency code",
332
+ schema: zod_1.z.string().optional(),
333
+ fieldType: "text",
334
+ placeholder: "USD"
335
+ })
336
+ .chart("line")
337
+ .dimension("time")
338
+ .build(),
339
+ new medusa_stats_1.StatBuilder("new_customers_by_time", "New Customers by Time")
340
+ .description("Number of new customers over time")
341
+ .chart("line")
342
+ .dimension("time")
343
+ .build(),
344
+ new medusa_stats_1.StatBuilder("repeat_customer_rate", "Repeat Customer Rate")
345
+ .description("Percentage of customers who made multiple orders")
346
+ .field({
347
+ name: "minimum_orders",
348
+ label: "Minimum Orders",
349
+ description: "Minimum orders to be considered repeat customer",
350
+ schema: zod_1.z.number().min(2).max(10).default(2),
351
+ fieldType: "number"
352
+ }, 2)
353
+ .chart("line")
354
+ .dimension("time")
355
+ .build(),
356
+ new medusa_stats_1.StatBuilder("customers_chart", "Customers Chart")
357
+ .description("Comprehensive customer visualization")
358
+ .field({
359
+ name: "metric",
360
+ label: "Metric",
361
+ description: "What to measure",
362
+ schema: zod_1.z.enum(["total", "new", "active", "repeat"]).default("total"),
363
+ fieldType: "select",
364
+ options: [
365
+ { value: "total", label: "Total Customers" },
366
+ { value: "new", label: "New Customers" },
367
+ { value: "active", label: "Active Customers" },
368
+ { value: "repeat", label: "Repeat Customers" }
369
+ ]
370
+ }, "total")
371
+ .chart("line")
372
+ .dimension("time")
373
+ .build(),
374
+ new medusa_stats_1.StatBuilder("cumulative_customers", "Cumulative Customers")
375
+ .description("Cumulative customer count over time")
376
+ .chart("line")
377
+ .dimension("time")
378
+ .build(),
379
+ new medusa_stats_1.StatBuilder("customer_retention_rate", "Customer Retention Rate")
380
+ .description("Percentage of customers retained over time")
381
+ .field({
382
+ name: "cohort_period",
383
+ label: "Cohort Period",
384
+ description: "Period for cohort analysis",
385
+ schema: zod_1.z.enum(["day", "week", "month", "quarter"]).default("month"),
386
+ fieldType: "select",
387
+ options: [
388
+ { value: "day", label: "Daily" },
389
+ { value: "week", label: "Weekly" },
390
+ { value: "month", label: "Monthly" },
391
+ { value: "quarter", label: "Quarterly" }
392
+ ]
393
+ }, "month")
394
+ .chart("line")
395
+ .dimension("time")
396
+ .build(),
397
+ new medusa_stats_1.StatBuilder("top_variants", "Top Variants")
398
+ .description("Top selling product variants")
399
+ .field({
400
+ name: "limit",
401
+ label: "Limit",
402
+ description: "Number of variants to show",
403
+ schema: zod_1.z.number().min(1).max(100).default(20),
404
+ fieldType: "number"
405
+ }, 20)
406
+ .field({
407
+ name: "metric",
408
+ label: "Metric",
409
+ description: "Sort by quantity or revenue",
410
+ schema: zod_1.z.enum(["quantity", "revenue"]).default("quantity"),
411
+ fieldType: "select",
412
+ options: [
413
+ { value: "quantity", label: "Quantity Sold" },
414
+ { value: "revenue", label: "Revenue Generated" }
415
+ ]
416
+ }, "quantity")
417
+ .chart("bar")
418
+ .dimension("category")
419
+ .build(),
420
+ new medusa_stats_1.StatBuilder("top_returned_variants", "Top Returned Variants")
421
+ .description("Most frequently returned product variants")
422
+ .field({
423
+ name: "limit",
424
+ label: "Limit",
425
+ description: "Number of variants to show",
426
+ schema: zod_1.z.number().min(1).max(100).default(20),
427
+ fieldType: "number"
428
+ }, 20)
429
+ .chart("bar")
430
+ .dimension("category")
431
+ .build(),
432
+ new medusa_stats_1.StatBuilder("products_sold_count", "Products Sold Count")
433
+ .description("Count of products/units sold over time")
434
+ .field({
435
+ name: "count_type",
436
+ label: "Count Type",
437
+ description: "Count unique products or total units",
438
+ schema: zod_1.z.enum(["total_units", "unique_products"]).default("total_units"),
439
+ fieldType: "select",
440
+ options: [
441
+ { value: "total_units", label: "Total Units" },
442
+ { value: "unique_products", label: "Unique Products" }
443
+ ]
444
+ }, "total_units")
445
+ .chart("line")
446
+ .dimension("time")
447
+ .build(),
448
+ new medusa_stats_1.StatBuilder("out_of_stock_variants", "Out of Stock Variants")
449
+ .description("Number of out of stock variants")
450
+ .field({
451
+ name: "location_id",
452
+ label: "Location ID",
453
+ description: "Filter by stock location",
454
+ schema: zod_1.z.string().optional(),
455
+ fieldType: "text"
456
+ })
457
+ .field({
458
+ name: "threshold",
459
+ label: "Stock Threshold",
460
+ description: "Consider out of stock below this level",
461
+ schema: zod_1.z.number().min(0).default(0),
462
+ fieldType: "number"
463
+ }, 0)
464
+ .chart("number")
465
+ .dimension("time")
466
+ .build()
467
+ ];
468
+ }
469
+ async calculateStatistic(input) {
470
+ const { id, parameters, periodStart, periodEnd, interval } = input;
471
+ framework_1.logger.info(`Calculating statistic ${id} from ${periodStart} to ${periodEnd} with interval ${interval}`);
472
+ switch (id) {
473
+ case "cart_progress_breakdown": {
474
+ const includeCompleted = parameters.include_completed ?? false;
475
+ const filters = {
476
+ created_at: { $gte: periodStart, $lte: periodEnd }
477
+ };
478
+ if (!includeCompleted) {
479
+ filters.completed_at = null;
480
+ }
481
+ const { data: carts } = await this.query.graph({
482
+ entity: "cart",
483
+ fields: ["id", "completed_at", "email", "customer_id", "payment_collection.*"],
484
+ filters
485
+ });
486
+ const breakdown = {
487
+ "Empty": 0,
488
+ "With Items": 0,
489
+ "Customer Info": 0,
490
+ "Payment": 0,
491
+ "Completed": 0
492
+ };
493
+ for (const cart of carts) {
494
+ if (cart.completed_at) {
495
+ breakdown["Completed"]++;
496
+ }
497
+ else if (cart.payment_collection) {
498
+ breakdown["Payment"]++;
499
+ }
500
+ else if (cart.email || cart.customer_id) {
501
+ breakdown["Customer Info"]++;
502
+ }
503
+ else {
504
+ breakdown["With Items"]++;
505
+ }
506
+ }
507
+ return {
508
+ value: Object.entries(breakdown).map(([name, value]) => ({ x: name, value })),
509
+ metadata: { total: carts.length }
510
+ };
511
+ }
512
+ case "average_cart_value": {
513
+ const currencyCode = parameters.currency_code;
514
+ const status = parameters.status ?? "all";
515
+ const filters = {
516
+ created_at: { $gte: periodStart, $lte: periodEnd }
517
+ };
518
+ if (currencyCode) {
519
+ filters.currency_code = currencyCode;
520
+ }
521
+ if (status === "completed") {
522
+ filters.completed_at = { $ne: null };
523
+ }
524
+ else if (status === "active") {
525
+ filters.completed_at = null;
526
+ }
527
+ else if (status === "abandoned") {
528
+ const cutoff = new Date(Date.now() - 24 * 60 * 60 * 1000);
529
+ filters.completed_at = null;
530
+ filters.updated_at = { $lt: cutoff };
531
+ }
532
+ const { data: carts } = await this.query.graph({
533
+ entity: "cart",
534
+ fields: ["id", "created_at", "total"],
535
+ filters
536
+ });
537
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(carts, periodStart, periodEnd, interval, (0, medusa_stats_1.average)('total'));
538
+ return { value: timeSeries };
539
+ }
540
+ case "abandoned_cart_value": {
541
+ const currencyCode = parameters.currency_code;
542
+ const abandonedAfterHours = parameters.abandoned_after_hours ?? 24;
543
+ const cutoff = new Date(Date.now() - abandonedAfterHours * 60 * 60 * 1000);
544
+ const filters = {
545
+ created_at: { $gte: periodStart, $lte: periodEnd },
546
+ completed_at: null,
547
+ updated_at: { $lt: cutoff }
548
+ };
549
+ if (currencyCode) {
550
+ filters.currency_code = currencyCode;
551
+ }
552
+ const { data: carts } = await this.query.graph({
553
+ entity: "cart",
554
+ fields: ["id", "created_at", "total"],
555
+ filters
556
+ });
557
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(carts, periodStart, periodEnd, interval, (0, medusa_stats_1.average)('total'));
558
+ return {
559
+ value: timeSeries,
560
+ metadata: { abandonedCount: carts.length }
561
+ };
562
+ }
563
+ case "total_cart_value": {
564
+ const currencyCode = parameters.currency_code;
565
+ const filters = {
566
+ created_at: { $gte: periodStart, $lte: periodEnd }
567
+ };
568
+ if (currencyCode) {
569
+ filters.currency_code = currencyCode;
570
+ }
571
+ const { data: carts } = await this.query.graph({
572
+ entity: "cart",
573
+ fields: ["id", "created_at", "total"],
574
+ filters
575
+ });
576
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(carts, periodStart, periodEnd, interval, (0, medusa_stats_1.sum)('total'));
577
+ return {
578
+ value: timeSeries,
579
+ metadata: { totalCarts: carts.length }
580
+ };
581
+ }
582
+ case "order_refund_ratio": {
583
+ const currencyCode = parameters.currency_code;
584
+ const filters = {
585
+ created_at: { $gte: periodStart, $lte: periodEnd }
586
+ };
587
+ if (currencyCode) {
588
+ filters.currency_code = currencyCode;
589
+ }
590
+ const { data: orders } = await this.query.graph({
591
+ entity: "order",
592
+ fields: ["id", "created_at", "total", "refunded_total"],
593
+ filters
594
+ });
595
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
596
+ const totalSales = items.reduce((sum, order) => sum + (order.total || 0), 0);
597
+ const totalRefunds = items.reduce((sum, order) => sum + (order.refunded_total || 0), 0);
598
+ return totalSales > 0 ? (totalRefunds / totalSales) * 100 : 0;
599
+ });
600
+ return { value: timeSeries };
601
+ }
602
+ case "order_promotion_ratio": {
603
+ const { data: orders } = await this.query.graph({
604
+ entity: "order",
605
+ fields: ["id", "created_at", "total", "discount_total"],
606
+ filters: {
607
+ created_at: { $gte: periodStart, $lte: periodEnd }
608
+ }
609
+ });
610
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
611
+ const totalSales = items.reduce((sum, order) => sum + (order.total || 0), 0);
612
+ const totalDiscounts = items.reduce((sum, order) => sum + (order.discount_total || 0), 0);
613
+ return totalSales > 0 ? (totalDiscounts / totalSales) * 100 : 0;
614
+ });
615
+ return { value: timeSeries };
616
+ }
617
+ case "total_promotions_value": {
618
+ const currencyCode = parameters.currency_code;
619
+ const filters = {
620
+ created_at: { $gte: periodStart, $lte: periodEnd }
621
+ };
622
+ if (currencyCode) {
623
+ filters.currency_code = currencyCode;
624
+ }
625
+ const { data: orders } = await this.query.graph({
626
+ entity: "order",
627
+ fields: ["id", "created_at", "discount_total"],
628
+ filters
629
+ });
630
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.sum)('discount_total'));
631
+ return { value: timeSeries };
632
+ }
633
+ case "orders_by_status": {
634
+ const statuses = parameters.statuses ?? ["pending", "completed", "canceled", "requires_action"];
635
+ const { data: orders } = await this.query.graph({
636
+ entity: "order",
637
+ fields: ["id", "status"],
638
+ filters: {
639
+ created_at: { $gte: periodStart, $lte: periodEnd },
640
+ status: { $in: statuses }
641
+ }
642
+ });
643
+ const statusCounts = {};
644
+ for (const status of statuses) {
645
+ statusCounts[status] = 0;
646
+ }
647
+ for (const order of orders) {
648
+ if (order.status && statusCounts[order.status] !== undefined) {
649
+ statusCounts[order.status]++;
650
+ }
651
+ }
652
+ return {
653
+ value: Object.entries(statusCounts).map(([name, value]) => ({ x: name, value }))
654
+ };
655
+ }
656
+ case "average_units_per_order": {
657
+ const { data: orders } = await this.query.graph({
658
+ entity: "order",
659
+ fields: ["id", "created_at", "items.detail.quantity"],
660
+ filters: {
661
+ created_at: { $gte: periodStart, $lte: periodEnd }
662
+ }
663
+ });
664
+ console.dir(orders, { depth: null });
665
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
666
+ const totalOrders = items.length;
667
+ if (totalOrders === 0)
668
+ return 0;
669
+ const totalUnits = items.reduce((sum, order) => {
670
+ const orderUnits = (order.items || []).reduce((s, item) => s + (item.detail?.quantity || 0), 0);
671
+ return sum + orderUnits;
672
+ }, 0);
673
+ return totalUnits / totalOrders;
674
+ });
675
+ return { value: timeSeries };
676
+ }
677
+ case "orders_by_time": {
678
+ const status = parameters.status ?? "completed";
679
+ const filters = {
680
+ created_at: { $gte: periodStart, $lte: periodEnd }
681
+ };
682
+ if (status !== "all") {
683
+ filters.status = status;
684
+ }
685
+ const { data: orders } = await this.query.graph({
686
+ entity: "order",
687
+ fields: ["id", "created_at"],
688
+ filters
689
+ });
690
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.count)());
691
+ return { value: timeSeries };
692
+ }
693
+ case "orders_chart": {
694
+ const metric = parameters.metric ?? "count";
695
+ const { data: orders } = await this.query.graph({
696
+ entity: "order",
697
+ fields: ["id", "created_at", "total"],
698
+ filters: {
699
+ created_at: { $gte: periodStart, $lte: periodEnd }
700
+ }
701
+ });
702
+ let timeSeries;
703
+ if (metric === "count") {
704
+ timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.count)());
705
+ }
706
+ else if (metric === "total_value") {
707
+ timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.sum)('total'));
708
+ }
709
+ else {
710
+ timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.average)('total'));
711
+ }
712
+ return { value: timeSeries };
713
+ }
714
+ case "regions_popularity": {
715
+ const limit = parameters.limit ?? 10;
716
+ const { data: orders } = await this.query.graph({
717
+ entity: "order",
718
+ fields: ["id", "region_id"],
719
+ filters: {
720
+ created_at: { $gte: periodStart, $lte: periodEnd }
721
+ }
722
+ });
723
+ const regionCounts = {};
724
+ for (const order of orders) {
725
+ const regionId = order.region_id || "Unknown";
726
+ regionCounts[regionId] = (regionCounts[regionId] || 0) + 1;
727
+ }
728
+ const sorted = Object.entries(regionCounts)
729
+ .sort(([, a], [, b]) => b - a)
730
+ .slice(0, limit);
731
+ return {
732
+ value: sorted.map(([name, value]) => ({ x: name, value }))
733
+ };
734
+ }
735
+ case "sales_channel_popularity": {
736
+ const { data: orders } = await this.query.graph({
737
+ entity: "order",
738
+ fields: ["id", "sales_channel_id"],
739
+ filters: {
740
+ created_at: { $gte: periodStart, $lte: periodEnd }
741
+ }
742
+ });
743
+ const channelCounts = {};
744
+ for (const order of orders) {
745
+ const channelId = order.sales_channel_id || "Unknown";
746
+ channelCounts[channelId] = (channelCounts[channelId] || 0) + 1;
747
+ }
748
+ return {
749
+ value: Object.entries(channelCounts).map(([name, value]) => ({ x: name, value }))
750
+ };
751
+ }
752
+ case "orders_frequency_distribution": {
753
+ const bucketSize = parameters.bucket_size ?? 7;
754
+ const { data: orders } = await this.query.graph({
755
+ entity: "order",
756
+ fields: ["id", "customer_id", "created_at"],
757
+ filters: {
758
+ created_at: { $gte: periodStart, $lte: periodEnd },
759
+ customer_id: { $ne: null }
760
+ }
761
+ });
762
+ const customerOrders = {};
763
+ for (const order of orders) {
764
+ if (!customerOrders[order.customer_id]) {
765
+ customerOrders[order.customer_id] = [];
766
+ }
767
+ customerOrders[order.customer_id].push(new Date(order.created_at));
768
+ }
769
+ const timeDiffs = [];
770
+ for (const dates of Object.values(customerOrders)) {
771
+ if (dates.length < 2)
772
+ continue;
773
+ dates.sort((a, b) => a.getTime() - b.getTime());
774
+ for (let i = 1; i < dates.length; i++) {
775
+ const diffDays = (dates[i].getTime() - dates[i - 1].getTime()) / (1000 * 60 * 60 * 24);
776
+ timeDiffs.push(diffDays);
777
+ }
778
+ }
779
+ const buckets = {};
780
+ for (const diff of timeDiffs) {
781
+ const bucket = Math.floor(diff / bucketSize) * bucketSize;
782
+ const bucketLabel = `${bucket}-${bucket + bucketSize} days`;
783
+ buckets[bucketLabel] = (buckets[bucketLabel] || 0) + 1;
784
+ }
785
+ return {
786
+ value: Object.entries(buckets).map(([name, value]) => ({ x: name, value }))
787
+ };
788
+ }
789
+ case "payment_provider_popularity": {
790
+ const { data: payments } = await this.query.graph({
791
+ entity: "payment_collection",
792
+ fields: ["id", "payment_sessions.provider_id", "created_at"],
793
+ filters: {
794
+ created_at: { $gte: periodStart, $lte: periodEnd }
795
+ }
796
+ });
797
+ console.dir(payments, { depth: null });
798
+ const providerCounts = {};
799
+ for (const payment of payments) {
800
+ const provider = payment.payment_sessions?.[0]?.provider_id;
801
+ if (!provider)
802
+ continue;
803
+ providerCounts[provider] = (providerCounts[provider] || 0) + 1;
804
+ }
805
+ return {
806
+ value: Object.entries(providerCounts).map(([name, value]) => ({ x: name, value }))
807
+ };
808
+ }
809
+ case "average_sales": {
810
+ const currencyCode = parameters.currency_code;
811
+ const filters = {
812
+ created_at: { $gte: periodStart, $lte: periodEnd }
813
+ };
814
+ if (currencyCode) {
815
+ filters.currency_code = currencyCode;
816
+ }
817
+ const { data: orders } = await this.query.graph({
818
+ entity: "order",
819
+ fields: ["id", "created_at", "total"],
820
+ filters
821
+ });
822
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.average)('total'));
823
+ return { value: timeSeries };
824
+ }
825
+ case "sales_per_channel": {
826
+ const currencyCode = parameters.currency_code;
827
+ const filters = {
828
+ created_at: { $gte: periodStart, $lte: periodEnd }
829
+ };
830
+ if (currencyCode) {
831
+ filters.currency_code = currencyCode;
832
+ }
833
+ const { data: orders } = await this.query.graph({
834
+ entity: "order",
835
+ fields: ["id", "sales_channel_id", "total"],
836
+ filters
837
+ });
838
+ const channelSales = {};
839
+ for (const order of orders) {
840
+ const channel = order.sales_channel_id || "Unknown";
841
+ channelSales[channel] = (channelSales[channel] || 0) + (order.total || 0);
842
+ }
843
+ return {
844
+ value: Object.entries(channelSales).map(([name, value]) => ({ x: name, value }))
845
+ };
846
+ }
847
+ case "net_sales": {
848
+ const currencyCode = parameters.currency_code;
849
+ const includeTax = parameters.include_tax ?? true;
850
+ const filters = {
851
+ created_at: { $gte: periodStart, $lte: periodEnd }
852
+ };
853
+ if (currencyCode) {
854
+ filters.currency_code = currencyCode;
855
+ }
856
+ const { data: orders } = await this.query.graph({
857
+ entity: "order",
858
+ fields: ["id", "created_at", "total", "tax_total", "discount_total", "refunded_total"],
859
+ filters
860
+ });
861
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
862
+ return items.reduce((sum, order) => {
863
+ let net = order.total || 0;
864
+ if (!includeTax) {
865
+ net -= (order.tax_total || 0);
866
+ }
867
+ net -= (order.discount_total || 0);
868
+ net -= (order.refunded_total || 0);
869
+ return sum + Math.max(0, net);
870
+ }, 0);
871
+ });
872
+ return { value: timeSeries };
873
+ }
874
+ case "sales_by_time": {
875
+ const currencyCode = parameters.currency_code;
876
+ const filters = {
877
+ created_at: { $gte: periodStart, $lte: periodEnd }
878
+ };
879
+ if (currencyCode) {
880
+ filters.currency_code = currencyCode;
881
+ }
882
+ const { data: orders } = await this.query.graph({
883
+ entity: "order",
884
+ fields: ["id", "created_at", "total"],
885
+ filters
886
+ });
887
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.sum)('total'));
888
+ return { value: timeSeries };
889
+ }
890
+ case "sales_by_currency": {
891
+ const { data: orders } = await this.query.graph({
892
+ entity: "order",
893
+ fields: ["id", "currency_code", "total"],
894
+ filters: {
895
+ created_at: { $gte: periodStart, $lte: periodEnd }
896
+ }
897
+ });
898
+ const currencySales = {};
899
+ for (const order of orders) {
900
+ const currency = order.currency_code || "Unknown";
901
+ currencySales[currency] = (currencySales[currency] || 0) + (order.total || 0);
902
+ }
903
+ return {
904
+ value: Object.entries(currencySales).map(([name, value]) => ({ x: name, value }))
905
+ };
906
+ }
907
+ case "sales_chart": {
908
+ const currencyCode = parameters.currency_code;
909
+ const includeRefunds = parameters.include_refunds ?? false;
910
+ const filters = {
911
+ created_at: { $gte: periodStart, $lte: periodEnd }
912
+ };
913
+ if (currencyCode) {
914
+ filters.currency_code = currencyCode;
915
+ }
916
+ const { data: orders } = await this.query.graph({
917
+ entity: "order",
918
+ fields: ["id", "created_at", "total", "refunded_total"],
919
+ filters
920
+ });
921
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
922
+ return items.reduce((sum, order) => {
923
+ const total = order.total || 0;
924
+ return sum + (includeRefunds ? total - (order.refunded_total || 0) : total);
925
+ }, 0);
926
+ });
927
+ return { value: timeSeries };
928
+ }
929
+ case "refunds_total": {
930
+ const currencyCode = parameters.currency_code;
931
+ const filters = {
932
+ created_at: { $gte: periodStart, $lte: periodEnd }
933
+ };
934
+ if (currencyCode) {
935
+ filters.currency_code = currencyCode;
936
+ }
937
+ const { data: orders } = await this.query.graph({
938
+ entity: "order",
939
+ fields: ["id", "created_at", "refunded_total"],
940
+ filters
941
+ });
942
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (0, medusa_stats_1.sum)('refunded_total'));
943
+ return { value: timeSeries };
944
+ }
945
+ case "average_sales_per_customer": {
946
+ const currencyCode = parameters.currency_code;
947
+ const segment = parameters.customer_segment ?? "all";
948
+ const filters = {
949
+ created_at: { $gte: periodStart, $lte: periodEnd },
950
+ customer_id: { $ne: null }
951
+ };
952
+ if (currencyCode) {
953
+ filters.currency_code = currencyCode;
954
+ }
955
+ const { data: orders } = await this.query.graph({
956
+ entity: "order",
957
+ fields: ["id", "customer_id", "created_at", "total"],
958
+ filters
959
+ });
960
+ let filteredOrders = orders;
961
+ if (segment === "new" || segment === "returning") {
962
+ const customerFirstOrder = {};
963
+ for (const order of orders) {
964
+ const existing = customerFirstOrder[order.customer_id];
965
+ const orderDate = new Date(order.created_at);
966
+ if (!existing || orderDate < existing) {
967
+ customerFirstOrder[order.customer_id] = orderDate;
968
+ }
969
+ }
970
+ filteredOrders = orders.filter((order) => {
971
+ const isFirst = customerFirstOrder[order.customer_id]?.getTime() === new Date(order.created_at).getTime();
972
+ return segment === "new" ? isFirst : !isFirst;
973
+ });
974
+ }
975
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(filteredOrders, periodStart, periodEnd, interval, (items) => {
976
+ const uniqueCustomers = new Set(items.map(o => o.customer_id)).size;
977
+ const totalSales = items.reduce((sum, order) => sum + (order.total || 0), 0);
978
+ return uniqueCustomers > 0 ? totalSales / uniqueCustomers : 0;
979
+ });
980
+ return { value: timeSeries };
981
+ }
982
+ case "customer_lifetime_value": {
983
+ const currencyCode = parameters.currency_code;
984
+ const filters = {
985
+ customer_id: { $ne: null }
986
+ };
987
+ if (currencyCode) {
988
+ filters.currency_code = currencyCode;
989
+ }
990
+ const { data: allOrders } = await this.query.graph({
991
+ entity: "order",
992
+ fields: ["id", "customer_id", "created_at", "total"],
993
+ filters
994
+ });
995
+ const customerLTV = {};
996
+ for (const order of allOrders) {
997
+ customerLTV[order.customer_id] = (customerLTV[order.customer_id] || 0) + (order.total || 0);
998
+ }
999
+ const periodOrders = allOrders.filter((o) => {
1000
+ const date = new Date(o.created_at);
1001
+ return date >= new Date(periodStart) && date <= new Date(periodEnd);
1002
+ });
1003
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(periodOrders, periodStart, periodEnd, interval, (items) => {
1004
+ const customers = new Set(items.map(o => o.customer_id));
1005
+ const totalLTV = Array.from(customers).reduce((sum, customerId) => sum + (customerLTV[customerId] || 0), 0);
1006
+ return customers.size > 0 ? totalLTV / customers.size : 0;
1007
+ });
1008
+ return { value: timeSeries };
1009
+ }
1010
+ case "new_customers_by_time": {
1011
+ const { data: customers } = await this.query.graph({
1012
+ entity: "customer",
1013
+ fields: ["id", "created_at"],
1014
+ filters: {
1015
+ created_at: { $gte: periodStart, $lte: periodEnd }
1016
+ }
1017
+ });
1018
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(customers, periodStart, periodEnd, interval, (0, medusa_stats_1.count)());
1019
+ return { value: timeSeries };
1020
+ }
1021
+ case "repeat_customer_rate": {
1022
+ const minimumOrders = parameters.minimum_orders ?? 2;
1023
+ const { data: orders } = await this.query.graph({
1024
+ entity: "order",
1025
+ fields: ["id", "customer_id", "created_at"],
1026
+ filters: {
1027
+ created_at: { $gte: periodStart, $lte: periodEnd },
1028
+ customer_id: { $ne: null }
1029
+ }
1030
+ });
1031
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
1032
+ const customerOrderCounts = {};
1033
+ for (const order of items) {
1034
+ customerOrderCounts[order.customer_id] = (customerOrderCounts[order.customer_id] || 0) + 1;
1035
+ }
1036
+ const uniqueCustomers = Object.keys(customerOrderCounts).length;
1037
+ const repeatCustomers = Object.values(customerOrderCounts).filter(count => count >= minimumOrders).length;
1038
+ return uniqueCustomers > 0 ? (repeatCustomers / uniqueCustomers) * 100 : 0;
1039
+ });
1040
+ return { value: timeSeries };
1041
+ }
1042
+ case "customers_chart": {
1043
+ const metric = parameters.metric ?? "total";
1044
+ if (metric === "total" || metric === "new") {
1045
+ const { data: customers } = await this.query.graph({
1046
+ entity: "customer",
1047
+ fields: ["id", "created_at"],
1048
+ filters: {
1049
+ created_at: { $gte: periodStart, $lte: periodEnd }
1050
+ }
1051
+ });
1052
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(customers, periodStart, periodEnd, interval, (0, medusa_stats_1.count)());
1053
+ return { value: timeSeries };
1054
+ }
1055
+ else {
1056
+ const { data: orders } = await this.query.graph({
1057
+ entity: "order",
1058
+ fields: ["id", "customer_id", "created_at"],
1059
+ filters: {
1060
+ created_at: { $gte: periodStart, $lte: periodEnd },
1061
+ customer_id: { $ne: null }
1062
+ }
1063
+ });
1064
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
1065
+ if (metric === "active") {
1066
+ return new Set(items.map(o => o.customer_id)).size;
1067
+ }
1068
+ else {
1069
+ const customerOrderCounts = {};
1070
+ for (const order of items) {
1071
+ customerOrderCounts[order.customer_id] = (customerOrderCounts[order.customer_id] || 0) + 1;
1072
+ }
1073
+ return Object.values(customerOrderCounts).filter(count => count >= 2).length;
1074
+ }
1075
+ });
1076
+ return { value: timeSeries };
1077
+ }
1078
+ }
1079
+ case "cumulative_customers": {
1080
+ const { data: customers } = await this.query.graph({
1081
+ entity: "customer",
1082
+ fields: ["id", "created_at"],
1083
+ filters: {
1084
+ created_at: { $lte: periodEnd }
1085
+ }
1086
+ });
1087
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(customers, periodStart, periodEnd, interval, (0, medusa_stats_1.count)());
1088
+ let cumulative = 0;
1089
+ const cumulativeData = timeSeries.map((point) => {
1090
+ cumulative += point.y;
1091
+ return { x: point.x, y: cumulative };
1092
+ });
1093
+ return { value: cumulativeData };
1094
+ }
1095
+ case "customer_retention_rate": {
1096
+ const cohortPeriod = parameters.cohort_period ?? "month";
1097
+ const { data: orders } = await this.query.graph({
1098
+ entity: "order",
1099
+ fields: ["id", "customer_id", "created_at"],
1100
+ filters: {
1101
+ created_at: { $gte: periodStart, $lte: periodEnd },
1102
+ customer_id: { $ne: null }
1103
+ }
1104
+ });
1105
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(orders, periodStart, periodEnd, interval, (items) => {
1106
+ return new Set(items.map(o => o.customer_id)).size;
1107
+ });
1108
+ const retentionData = timeSeries.map((point, index) => {
1109
+ if (index === 0)
1110
+ return { x: point.x, value: 100 };
1111
+ const previous = timeSeries[index - 1].value;
1112
+ const retained = previous > 0 ? (point.value / previous) * 100 : 0;
1113
+ return { x: point.x, value: Math.min(100, retained) };
1114
+ });
1115
+ return { value: retentionData };
1116
+ }
1117
+ case "top_variants": {
1118
+ const limit = parameters.limit ?? 20;
1119
+ const metric = parameters.metric ?? "quantity";
1120
+ const { data: lineItems } = await this.query.graph({
1121
+ entity: "order_line_item",
1122
+ fields: ["id", "variant_id", "title", "quantity", "subtotal"],
1123
+ filters: {
1124
+ created_at: { $gte: periodStart, $lte: periodEnd }
1125
+ }
1126
+ });
1127
+ const variantMetrics = {};
1128
+ for (const item of lineItems) {
1129
+ const variantId = item.variant_id || "unknown";
1130
+ if (!variantMetrics[variantId]) {
1131
+ variantMetrics[variantId] = { title: item.title || variantId, quantity: 0, revenue: 0 };
1132
+ }
1133
+ variantMetrics[variantId].quantity += item.quantity || 0;
1134
+ variantMetrics[variantId].revenue += item.subtotal || 0;
1135
+ }
1136
+ const sorted = Object.entries(variantMetrics)
1137
+ .sort(([, a], [, b]) => {
1138
+ return metric === "quantity" ? b.quantity - a.quantity : b.revenue - a.revenue;
1139
+ })
1140
+ .slice(0, limit);
1141
+ return {
1142
+ value: sorted.map(([id, data]) => ({
1143
+ x: data.title,
1144
+ value: metric === "quantity" ? data.quantity : data.revenue
1145
+ }))
1146
+ };
1147
+ }
1148
+ case "top_returned_variants": {
1149
+ const limit = parameters.limit ?? 20;
1150
+ const { data: returns } = await this.query.graph({
1151
+ entity: "return",
1152
+ fields: ["id", "items.item_id", "created_at"],
1153
+ filters: {
1154
+ created_at: { $gte: periodStart, $lte: periodEnd }
1155
+ }
1156
+ });
1157
+ const returnedItemIds = new Set(returns.flatMap((ret) => (ret.items || []).map((item) => item.item_id)));
1158
+ if (returnedItemIds.size === 0) {
1159
+ return { value: [] };
1160
+ }
1161
+ const { data: lineItems } = await this.query.graph({
1162
+ entity: "order_line_item",
1163
+ fields: ["id", "variant_id", "title", "quantity"],
1164
+ filters: {
1165
+ id: { $in: Array.from(returnedItemIds) }
1166
+ }
1167
+ });
1168
+ const variantReturns = {};
1169
+ for (const item of lineItems) {
1170
+ const variantId = item.variant_id || "unknown";
1171
+ if (!variantReturns[variantId]) {
1172
+ variantReturns[variantId] = { title: item.title || variantId, count: 0 };
1173
+ }
1174
+ variantReturns[variantId].count += item.quantity || 0;
1175
+ }
1176
+ const sorted = Object.entries(variantReturns)
1177
+ .sort(([, a], [, b]) => b.count - a.count)
1178
+ .slice(0, limit);
1179
+ return {
1180
+ value: sorted.map(([id, data]) => ({
1181
+ x: data.title,
1182
+ value: data.count
1183
+ }))
1184
+ };
1185
+ }
1186
+ case "products_sold_count": {
1187
+ const countType = parameters.count_type ?? "total_units";
1188
+ const { data: lineItems } = await this.query.graph({
1189
+ entity: "order_line_item",
1190
+ fields: ["id", "product_id", "variant_id", "quantity", "created_at"],
1191
+ filters: {
1192
+ created_at: { $gte: periodStart, $lte: periodEnd }
1193
+ }
1194
+ });
1195
+ const timeSeries = (0, medusa_stats_1.createTimeSeries)(lineItems, periodStart, periodEnd, interval, (items) => {
1196
+ if (countType === "unique_products") {
1197
+ return new Set(items.map(item => item.product_id)).size;
1198
+ }
1199
+ else {
1200
+ return items.reduce((sum, item) => sum + (item.quantity || 0), 0);
1201
+ }
1202
+ });
1203
+ return { value: timeSeries };
1204
+ }
1205
+ case "out_of_stock_variants": {
1206
+ const locationId = parameters.location_id;
1207
+ const threshold = parameters.threshold ?? 0;
1208
+ const filters = {
1209
+ stocked_quantity: { $lte: threshold }
1210
+ };
1211
+ if (locationId) {
1212
+ filters.location_id = locationId;
1213
+ }
1214
+ const { data: inventoryLevels } = await this.query.graph({
1215
+ entity: "inventory_level",
1216
+ fields: ["id", "inventory_item_id", "stocked_quantity"],
1217
+ filters
1218
+ });
1219
+ return {
1220
+ value: [{ x: new Date().toISOString(), y: inventoryLevels.length }],
1221
+ metadata: { count: inventoryLevels.length }
1222
+ };
1223
+ }
1224
+ default:
1225
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Statistic calculation not implemented: ${id}`);
1226
+ }
1227
+ }
1228
+ }
1229
+ CommonStatisticsProvider.identifier = "common-statistics";
1230
+ CommonStatisticsProvider.displayName = "Common Statistics Provider";
1231
+ exports.default = (0, utils_1.ModuleProvider)("statistics", { services: [CommonStatisticsProvider] });
1232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2NvbW1vbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUF3RTtBQUN4RSw2QkFBd0I7QUFDeEIsK0NBVXNCO0FBQ3RCLG1EQUFvRDtBQUVwRCxNQUFNLHdCQUF5QixTQUFRLHlDQUEwQjtJQUk3RCxLQUFLLENBQUMsc0JBQXNCO1FBQ3hCLE9BQU87WUFFSCxJQUFJLDBCQUFXLENBQUMseUJBQXlCLEVBQUUseUJBQXlCLENBQUM7aUJBQ2hFLFdBQVcsQ0FBQywwQ0FBMEMsQ0FBQztpQkFDdkQsS0FBSyxDQUFDO2dCQUNILElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLEtBQUssRUFBRSxtQkFBbUI7Z0JBQzFCLFdBQVcsRUFBRSwwQ0FBMEM7Z0JBQ3ZELE1BQU0sRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbEMsU0FBUyxFQUFFLFNBQVM7YUFDdkIsRUFBRSxLQUFLLENBQUM7aUJBQ1IsS0FBSyxDQUFDLEtBQUssQ0FBQztpQkFDWixTQUFTLENBQUMsVUFBVSxDQUFDO2lCQUNyQixLQUFLLEVBQUU7WUFFWixJQUFJLDBCQUFXLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7aUJBQ3RELFdBQVcsQ0FBQyxrQ0FBa0MsQ0FBQztpQkFDL0MsS0FBSyxDQUFDO2dCQUNILElBQUksRUFBRSxlQUFlO2dCQUNyQixLQUFLLEVBQUUsVUFBVTtnQkFDakIsV0FBVyxFQUFFLHlCQUF5QjtnQkFDdEMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzdCLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixXQUFXLEVBQUUsS0FBSzthQUNyQixDQUFDO2lCQUNELEtBQUssQ0FBQztnQkFDSCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxLQUFLLEVBQUUs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