@reorderjs/reorder 1.0.1

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 (231) hide show
  1. package/.medusa/server/scripts/reset-reorder-plugin-data.js +175 -0
  2. package/.medusa/server/src/admin/index.js +17889 -0
  3. package/.medusa/server/src/admin/index.mjs +17871 -0
  4. package/.medusa/server/src/admin/types/activity-log.js +10 -0
  5. package/.medusa/server/src/admin/types/analytics.js +17 -0
  6. package/.medusa/server/src/admin/types/cancellation.js +27 -0
  7. package/.medusa/server/src/admin/types/dunning.js +19 -0
  8. package/.medusa/server/src/admin/types/plan-offer.js +25 -0
  9. package/.medusa/server/src/admin/types/renewal.js +23 -0
  10. package/.medusa/server/src/admin/types/subscription.js +22 -0
  11. package/.medusa/server/src/api/admin/cancellations/[id]/apply-offer/route.js +30 -0
  12. package/.medusa/server/src/api/admin/cancellations/[id]/finalize/route.js +31 -0
  13. package/.medusa/server/src/api/admin/cancellations/[id]/reason/route.js +31 -0
  14. package/.medusa/server/src/api/admin/cancellations/[id]/route.js +20 -0
  15. package/.medusa/server/src/api/admin/cancellations/middlewares.js +55 -0
  16. package/.medusa/server/src/api/admin/cancellations/route.js +20 -0
  17. package/.medusa/server/src/api/admin/cancellations/utils.js +116 -0
  18. package/.medusa/server/src/api/admin/cancellations/validators.js +130 -0
  19. package/.medusa/server/src/api/admin/dunning/[id]/mark-recovered/route.js +27 -0
  20. package/.medusa/server/src/api/admin/dunning/[id]/mark-unrecovered/route.js +27 -0
  21. package/.medusa/server/src/api/admin/dunning/[id]/retry-now/route.js +28 -0
  22. package/.medusa/server/src/api/admin/dunning/[id]/retry-schedule/route.js +29 -0
  23. package/.medusa/server/src/api/admin/dunning/[id]/route.js +20 -0
  24. package/.medusa/server/src/api/admin/dunning/middlewares.js +60 -0
  25. package/.medusa/server/src/api/admin/dunning/route.js +20 -0
  26. package/.medusa/server/src/api/admin/dunning/utils.js +70 -0
  27. package/.medusa/server/src/api/admin/dunning/validators.js +81 -0
  28. package/.medusa/server/src/api/admin/orders/[id]/subscription-summary/route.js +10 -0
  29. package/.medusa/server/src/api/admin/orders/utils.js +8 -0
  30. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  31. package/.medusa/server/src/api/admin/renewals/[id]/approve-changes/route.js +27 -0
  32. package/.medusa/server/src/api/admin/renewals/[id]/force/route.js +30 -0
  33. package/.medusa/server/src/api/admin/renewals/[id]/reject-changes/route.js +27 -0
  34. package/.medusa/server/src/api/admin/renewals/[id]/route.js +10 -0
  35. package/.medusa/server/src/api/admin/renewals/middlewares.js +61 -0
  36. package/.medusa/server/src/api/admin/renewals/route.js +10 -0
  37. package/.medusa/server/src/api/admin/renewals/utils.js +60 -0
  38. package/.medusa/server/src/api/admin/renewals/validators.js +62 -0
  39. package/.medusa/server/src/api/admin/subscription-analytics/export/route.js +20 -0
  40. package/.medusa/server/src/api/admin/subscription-analytics/kpis/route.js +20 -0
  41. package/.medusa/server/src/api/admin/subscription-analytics/middlewares.js +45 -0
  42. package/.medusa/server/src/api/admin/subscription-analytics/rebuild/route.js +75 -0
  43. package/.medusa/server/src/api/admin/subscription-analytics/trends/route.js +20 -0
  44. package/.medusa/server/src/api/admin/subscription-analytics/utils.js +81 -0
  45. package/.medusa/server/src/api/admin/subscription-analytics/validators.js +76 -0
  46. package/.medusa/server/src/api/admin/subscription-logs/[id]/route.js +20 -0
  47. package/.medusa/server/src/api/admin/subscription-logs/middlewares.js +66 -0
  48. package/.medusa/server/src/api/admin/subscription-logs/route.js +20 -0
  49. package/.medusa/server/src/api/admin/subscription-logs/utils.js +84 -0
  50. package/.medusa/server/src/api/admin/subscription-logs/validators.js +32 -0
  51. package/.medusa/server/src/api/admin/subscription-offers/[id]/route.js +22 -0
  52. package/.medusa/server/src/api/admin/subscription-offers/[id]/toggle/route.js +17 -0
  53. package/.medusa/server/src/api/admin/subscription-offers/middlewares.js +58 -0
  54. package/.medusa/server/src/api/admin/subscription-offers/route.js +20 -0
  55. package/.medusa/server/src/api/admin/subscription-offers/utils.js +41 -0
  56. package/.medusa/server/src/api/admin/subscription-offers/validators.js +112 -0
  57. package/.medusa/server/src/api/admin/subscription-settings/middlewares.js +15 -0
  58. package/.medusa/server/src/api/admin/subscription-settings/route.js +33 -0
  59. package/.medusa/server/src/api/admin/subscription-settings/utils.js +109 -0
  60. package/.medusa/server/src/api/admin/subscription-settings/validators.js +74 -0
  61. package/.medusa/server/src/api/admin/subscriptions/[id]/cancel/route.js +18 -0
  62. package/.medusa/server/src/api/admin/subscriptions/[id]/logs/route.js +20 -0
  63. package/.medusa/server/src/api/admin/subscriptions/[id]/pause/route.js +18 -0
  64. package/.medusa/server/src/api/admin/subscriptions/[id]/resume/route.js +18 -0
  65. package/.medusa/server/src/api/admin/subscriptions/[id]/route.js +10 -0
  66. package/.medusa/server/src/api/admin/subscriptions/[id]/schedule-plan-change/route.js +26 -0
  67. package/.medusa/server/src/api/admin/subscriptions/[id]/update-shipping-address/route.js +27 -0
  68. package/.medusa/server/src/api/admin/subscriptions/middlewares.js +79 -0
  69. package/.medusa/server/src/api/admin/subscriptions/route.js +10 -0
  70. package/.medusa/server/src/api/admin/subscriptions/utils.js +42 -0
  71. package/.medusa/server/src/api/admin/subscriptions/validators.js +76 -0
  72. package/.medusa/server/src/api/middlewares.js +32 -0
  73. package/.medusa/server/src/api/store/carts/[id]/subscribe/route.js +18 -0
  74. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/cancellation/route.js +37 -0
  75. package/.medusa/server/src/api/store/customers/me/subscriptions/route.js +10 -0
  76. package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +104 -0
  77. package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +13 -0
  78. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  79. package/.medusa/server/src/jobs/process-analytics-daily-snapshots.js +149 -0
  80. package/.medusa/server/src/jobs/process-cancellation-operational-metrics.js +102 -0
  81. package/.medusa/server/src/jobs/process-dunning-retries.js +249 -0
  82. package/.medusa/server/src/jobs/process-renewal-cycles.js +180 -0
  83. package/.medusa/server/src/links/cancellation-subscription.js +13 -0
  84. package/.medusa/server/src/links/renewal-order.js +12 -0
  85. package/.medusa/server/src/links/renewal-subscription.js +13 -0
  86. package/.medusa/server/src/links/subscription-cart.js +12 -0
  87. package/.medusa/server/src/links/subscription-customer.js +13 -0
  88. package/.medusa/server/src/links/subscription-order.js +13 -0
  89. package/.medusa/server/src/links/subscription-product.js +13 -0
  90. package/.medusa/server/src/links/subscription-variant.js +13 -0
  91. package/.medusa/server/src/modules/activity-log/index.js +13 -0
  92. package/.medusa/server/src/modules/activity-log/migrations/Migration20260401204521.js +24 -0
  93. package/.medusa/server/src/modules/activity-log/migrations/Migration20260405112500.js +16 -0
  94. package/.medusa/server/src/modules/activity-log/models/subscription-log.js +52 -0
  95. package/.medusa/server/src/modules/activity-log/service.js +13 -0
  96. package/.medusa/server/src/modules/activity-log/types/index.js +33 -0
  97. package/.medusa/server/src/modules/activity-log/utils/admin-query.js +261 -0
  98. package/.medusa/server/src/modules/activity-log/utils/normalize-log-event.js +169 -0
  99. package/.medusa/server/src/modules/analytics/constants.js +8 -0
  100. package/.medusa/server/src/modules/analytics/index.js +13 -0
  101. package/.medusa/server/src/modules/analytics/migrations/Migration20260402183116.js +27 -0
  102. package/.medusa/server/src/modules/analytics/models/subscription-metrics-daily.js +65 -0
  103. package/.medusa/server/src/modules/analytics/service.js +13 -0
  104. package/.medusa/server/src/modules/analytics/utils/admin-query.js +632 -0
  105. package/.medusa/server/src/modules/analytics/utils/data-quality.js +101 -0
  106. package/.medusa/server/src/modules/analytics/utils/observability.js +127 -0
  107. package/.medusa/server/src/modules/cancellation/index.js +13 -0
  108. package/.medusa/server/src/modules/cancellation/migrations/Migration20260401143914.js +34 -0
  109. package/.medusa/server/src/modules/cancellation/migrations/Migration20260405112000.js +14 -0
  110. package/.medusa/server/src/modules/cancellation/models/cancellation-case.js +52 -0
  111. package/.medusa/server/src/modules/cancellation/models/retention-offer-event.js +47 -0
  112. package/.medusa/server/src/modules/cancellation/service.js +15 -0
  113. package/.medusa/server/src/modules/cancellation/types/index.js +43 -0
  114. package/.medusa/server/src/modules/cancellation/utils/admin-query.js +530 -0
  115. package/.medusa/server/src/modules/cancellation/utils/audit.js +21 -0
  116. package/.medusa/server/src/modules/cancellation/utils/errors.js +31 -0
  117. package/.medusa/server/src/modules/cancellation/utils/observability.js +77 -0
  118. package/.medusa/server/src/modules/cancellation/utils/operational-metrics.js +131 -0
  119. package/.medusa/server/src/modules/cancellation/utils/retention-offer-policy.js +31 -0
  120. package/.medusa/server/src/modules/dunning/index.js +13 -0
  121. package/.medusa/server/src/modules/dunning/migrations/Migration20260330190157.js +36 -0
  122. package/.medusa/server/src/modules/dunning/models/dunning-attempt.js +48 -0
  123. package/.medusa/server/src/modules/dunning/models/dunning-case.js +61 -0
  124. package/.medusa/server/src/modules/dunning/service.js +15 -0
  125. package/.medusa/server/src/modules/dunning/types/index.js +19 -0
  126. package/.medusa/server/src/modules/dunning/utils/admin-query.js +548 -0
  127. package/.medusa/server/src/modules/dunning/utils/errors.js +40 -0
  128. package/.medusa/server/src/modules/dunning/utils/observability.js +109 -0
  129. package/.medusa/server/src/modules/dunning/utils/retry-schedule.js +47 -0
  130. package/.medusa/server/src/modules/dunning/utils/scheduler-query.js +42 -0
  131. package/.medusa/server/src/modules/plan-offer/index.js +13 -0
  132. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329104245.js +22 -0
  133. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329153000.js +25 -0
  134. package/.medusa/server/src/modules/plan-offer/models/plan-offer.js +35 -0
  135. package/.medusa/server/src/modules/plan-offer/service.js +13 -0
  136. package/.medusa/server/src/modules/plan-offer/types/index.js +26 -0
  137. package/.medusa/server/src/modules/plan-offer/utils/admin-query.js +429 -0
  138. package/.medusa/server/src/modules/plan-offer/utils/effective-config.js +84 -0
  139. package/.medusa/server/src/modules/plan-offer/utils/errors.js +55 -0
  140. package/.medusa/server/src/modules/renewal/index.js +13 -0
  141. package/.medusa/server/src/modules/renewal/migrations/Migration20260329185930.js +34 -0
  142. package/.medusa/server/src/modules/renewal/models/renewal-attempt.js +49 -0
  143. package/.medusa/server/src/modules/renewal/models/renewal-cycle.js +56 -0
  144. package/.medusa/server/src/modules/renewal/service.js +15 -0
  145. package/.medusa/server/src/modules/renewal/types/index.js +23 -0
  146. package/.medusa/server/src/modules/renewal/utils/admin-query.js +450 -0
  147. package/.medusa/server/src/modules/renewal/utils/errors.js +39 -0
  148. package/.medusa/server/src/modules/renewal/utils/observability.js +89 -0
  149. package/.medusa/server/src/modules/renewal/utils/scheduler-query.js +48 -0
  150. package/.medusa/server/src/modules/renewal/utils/upcoming-cycle.js +54 -0
  151. package/.medusa/server/src/modules/settings/index.js +13 -0
  152. package/.medusa/server/src/modules/settings/migrations/Migration20260403121004.js +17 -0
  153. package/.medusa/server/src/modules/settings/migrations/Migration20260403132519.js +17 -0
  154. package/.medusa/server/src/modules/settings/models/subscription-settings.js +32 -0
  155. package/.medusa/server/src/modules/settings/service.js +82 -0
  156. package/.medusa/server/src/modules/settings/types.js +15 -0
  157. package/.medusa/server/src/modules/settings/utils/audit.js +43 -0
  158. package/.medusa/server/src/modules/settings/utils/normalize-settings.js +99 -0
  159. package/.medusa/server/src/modules/subscription/index.js +13 -0
  160. package/.medusa/server/src/modules/subscription/migrations/Migration20260327143452.js +24 -0
  161. package/.medusa/server/src/modules/subscription/migrations/Migration20260329194835.js +16 -0
  162. package/.medusa/server/src/modules/subscription/models/subscription.js +64 -0
  163. package/.medusa/server/src/modules/subscription/service.js +13 -0
  164. package/.medusa/server/src/modules/subscription/types/index.js +17 -0
  165. package/.medusa/server/src/modules/subscription/utils/admin-query.js +465 -0
  166. package/.medusa/server/src/modules/subscription/utils/errors.js +28 -0
  167. package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +178 -0
  168. package/.medusa/server/src/workflows/apply-retention-offer.js +52 -0
  169. package/.medusa/server/src/workflows/approve-renewal-changes.js +61 -0
  170. package/.medusa/server/src/workflows/cancel-subscription.js +64 -0
  171. package/.medusa/server/src/workflows/create-or-upsert-plan-offer.js +11 -0
  172. package/.medusa/server/src/workflows/ensure-next-renewal-cycle.js +11 -0
  173. package/.medusa/server/src/workflows/finalize-cancellation.js +88 -0
  174. package/.medusa/server/src/workflows/force-renewal-cycle.js +11 -0
  175. package/.medusa/server/src/workflows/index.js +79 -0
  176. package/.medusa/server/src/workflows/mark-dunning-recovered.js +11 -0
  177. package/.medusa/server/src/workflows/mark-dunning-unrecovered.js +11 -0
  178. package/.medusa/server/src/workflows/pause-subscription.js +61 -0
  179. package/.medusa/server/src/workflows/process-renewal-cycle.js +43 -0
  180. package/.medusa/server/src/workflows/rebuild-analytics-daily-snapshots.js +13 -0
  181. package/.medusa/server/src/workflows/reject-renewal-changes.js +61 -0
  182. package/.medusa/server/src/workflows/resume-subscription.js +76 -0
  183. package/.medusa/server/src/workflows/run-dunning-retry.js +23 -0
  184. package/.medusa/server/src/workflows/schedule-subscription-plan-change.js +57 -0
  185. package/.medusa/server/src/workflows/start-cancellation-case.js +58 -0
  186. package/.medusa/server/src/workflows/start-dunning.js +11 -0
  187. package/.medusa/server/src/workflows/steps/apply-retention-offer.js +200 -0
  188. package/.medusa/server/src/workflows/steps/approve-renewal-changes.js +48 -0
  189. package/.medusa/server/src/workflows/steps/cancel-subscription.js +48 -0
  190. package/.medusa/server/src/workflows/steps/create-initial-renewal-cycle.js +6 -0
  191. package/.medusa/server/src/workflows/steps/create-subscription-log-event.js +61 -0
  192. package/.medusa/server/src/workflows/steps/create-subscription-record.js +56 -0
  193. package/.medusa/server/src/workflows/steps/ensure-next-renewal-cycle.js +151 -0
  194. package/.medusa/server/src/workflows/steps/finalize-cancellation.js +161 -0
  195. package/.medusa/server/src/workflows/steps/force-renewal-cycle.js +120 -0
  196. package/.medusa/server/src/workflows/steps/link-subscription-commerce-entities.js +44 -0
  197. package/.medusa/server/src/workflows/steps/mark-dunning-recovered.js +72 -0
  198. package/.medusa/server/src/workflows/steps/mark-dunning-unrecovered.js +53 -0
  199. package/.medusa/server/src/workflows/steps/normalize-analytics-rebuild-range.js +59 -0
  200. package/.medusa/server/src/workflows/steps/pause-subscription.js +50 -0
  201. package/.medusa/server/src/workflows/steps/process-renewal-cycle.js +641 -0
  202. package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +519 -0
  203. package/.medusa/server/src/workflows/steps/reject-renewal-changes.js +48 -0
  204. package/.medusa/server/src/workflows/steps/resume-subscription.js +45 -0
  205. package/.medusa/server/src/workflows/steps/run-dunning-retry.js +592 -0
  206. package/.medusa/server/src/workflows/steps/schedule-subscription-plan-change.js +81 -0
  207. package/.medusa/server/src/workflows/steps/shared-cancellation-log.js +3 -0
  208. package/.medusa/server/src/workflows/steps/shared-plan-offer.js +280 -0
  209. package/.medusa/server/src/workflows/steps/shared-renewal-approval.js +34 -0
  210. package/.medusa/server/src/workflows/steps/start-cancellation-case.js +147 -0
  211. package/.medusa/server/src/workflows/steps/start-dunning.js +237 -0
  212. package/.medusa/server/src/workflows/steps/toggle-plan-offer.js +33 -0
  213. package/.medusa/server/src/workflows/steps/update-cancellation-reason.js +95 -0
  214. package/.medusa/server/src/workflows/steps/update-dunning-retry-schedule.js +91 -0
  215. package/.medusa/server/src/workflows/steps/update-plan-offer.js +51 -0
  216. package/.medusa/server/src/workflows/steps/update-subscription-settings.js +91 -0
  217. package/.medusa/server/src/workflows/steps/update-subscription-shipping-address.js +54 -0
  218. package/.medusa/server/src/workflows/steps/upsert-plan-offer.js +48 -0
  219. package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +280 -0
  220. package/.medusa/server/src/workflows/toggle-plan-offer.js +11 -0
  221. package/.medusa/server/src/workflows/update-cancellation-reason.js +53 -0
  222. package/.medusa/server/src/workflows/update-dunning-retry-schedule.js +11 -0
  223. package/.medusa/server/src/workflows/update-plan-offer.js +11 -0
  224. package/.medusa/server/src/workflows/update-subscription-settings.js +11 -0
  225. package/.medusa/server/src/workflows/update-subscription-shipping-address.js +99 -0
  226. package/.medusa/server/src/workflows/utils/analytics-incremental.js +24 -0
  227. package/.medusa/server/src/workflows/utils/date-output.js +13 -0
  228. package/.medusa/server/src/workflows/utils/subscription-settings.js +13 -0
  229. package/LICENSE +21 -0
  230. package/README.md +200 -0
  231. package/package.json +73 -0
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateAnalyticsQualityForRange = evaluateAnalyticsQualityForRange;
4
+ const MRR_CHANGE_THRESHOLD_PERCENT = 50;
5
+ const CHURN_RATE_ABSOLUTE_THRESHOLD = 25;
6
+ const CHURN_RATE_DELTA_THRESHOLD = 15;
7
+ function round(value) {
8
+ return Number(value.toFixed(2));
9
+ }
10
+ function computeChurnRate(churnedSubscriptionsCount, activeSubscriptionsCount) {
11
+ if (activeSubscriptionsCount <= 0) {
12
+ return 0;
13
+ }
14
+ return (churnedSubscriptionsCount / activeSubscriptionsCount) * 100;
15
+ }
16
+ function evaluateAnalyticsQualityForRange(snapshots) {
17
+ const findings = [];
18
+ const ordered = [...snapshots].sort((left, right) => left.metric_date.localeCompare(right.metric_date));
19
+ ordered.forEach((snapshot, index) => {
20
+ if (snapshot.processed_subscriptions > 0 && snapshot.snapshot_rows === 0) {
21
+ findings.push({
22
+ code: "analytics.snapshot.empty_day",
23
+ severity: "error",
24
+ metric: "snapshot",
25
+ date: snapshot.metric_date,
26
+ message: "Analytics rebuild produced no snapshot rows for a day with processed subscriptions",
27
+ metadata: {
28
+ processed_subscriptions: snapshot.processed_subscriptions,
29
+ snapshot_rows: snapshot.snapshot_rows,
30
+ },
31
+ });
32
+ }
33
+ if (snapshot.processed_subscriptions > 0 &&
34
+ snapshot.snapshot_rows !== snapshot.processed_subscriptions) {
35
+ findings.push({
36
+ code: "analytics.snapshot.incomplete_day",
37
+ severity: "error",
38
+ metric: "snapshot",
39
+ date: snapshot.metric_date,
40
+ message: "Analytics rebuild produced a snapshot row count that does not match processed subscriptions",
41
+ metadata: {
42
+ processed_subscriptions: snapshot.processed_subscriptions,
43
+ snapshot_rows: snapshot.snapshot_rows,
44
+ },
45
+ });
46
+ }
47
+ const previousSnapshot = index > 0 ? ordered[index - 1] : null;
48
+ if (!previousSnapshot) {
49
+ return;
50
+ }
51
+ if (snapshot.mrr_amount !== null &&
52
+ previousSnapshot.mrr_amount !== null &&
53
+ previousSnapshot.mrr_amount > 0) {
54
+ const deltaPercent = ((snapshot.mrr_amount - previousSnapshot.mrr_amount) /
55
+ previousSnapshot.mrr_amount) *
56
+ 100;
57
+ if (Math.abs(deltaPercent) >= MRR_CHANGE_THRESHOLD_PERCENT) {
58
+ findings.push({
59
+ code: "analytics.mrr.spike",
60
+ severity: "warn",
61
+ metric: "mrr",
62
+ date: snapshot.metric_date,
63
+ message: "Daily MRR changed more than the configured anomaly threshold compared with the previous day",
64
+ metadata: {
65
+ current_mrr: round(snapshot.mrr_amount),
66
+ previous_mrr: round(previousSnapshot.mrr_amount),
67
+ delta_percentage: round(deltaPercent),
68
+ threshold_percentage: MRR_CHANGE_THRESHOLD_PERCENT,
69
+ },
70
+ });
71
+ }
72
+ }
73
+ const currentChurnRate = computeChurnRate(snapshot.churned_subscriptions_count, snapshot.active_subscriptions_count);
74
+ const previousChurnRate = computeChurnRate(previousSnapshot.churned_subscriptions_count, previousSnapshot.active_subscriptions_count);
75
+ if (currentChurnRate >= CHURN_RATE_ABSOLUTE_THRESHOLD ||
76
+ Math.abs(currentChurnRate - previousChurnRate) >=
77
+ CHURN_RATE_DELTA_THRESHOLD) {
78
+ findings.push({
79
+ code: "analytics.churn_rate.spike",
80
+ severity: "warn",
81
+ metric: "churn_rate",
82
+ date: snapshot.metric_date,
83
+ message: "Daily churn rate exceeded the configured threshold or changed sharply compared with the previous day",
84
+ metadata: {
85
+ current_churn_rate: round(currentChurnRate),
86
+ previous_churn_rate: round(previousChurnRate),
87
+ delta_percentage: round(currentChurnRate - previousChurnRate),
88
+ absolute_threshold: CHURN_RATE_ABSOLUTE_THRESHOLD,
89
+ delta_threshold: CHURN_RATE_DELTA_THRESHOLD,
90
+ },
91
+ });
92
+ }
93
+ });
94
+ return {
95
+ findings,
96
+ finding_count: findings.length,
97
+ has_errors: findings.some((finding) => finding.severity === "error"),
98
+ has_warnings: findings.some((finding) => finding.severity === "warn"),
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1xdWFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYW5hbHl0aWNzL3V0aWxzL2RhdGEtcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJDQSw0RUFrSEM7QUFySUQsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUE7QUFDdkMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUE7QUFDeEMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUE7QUFFckMsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUMxQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLHlCQUFpQyxFQUNqQyx3QkFBZ0M7SUFFaEMsSUFBSSx3QkFBd0IsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCxPQUFPLENBQUMseUJBQXlCLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxHQUFHLENBQUE7QUFDckUsQ0FBQztBQUVELFNBQWdCLGdDQUFnQyxDQUM5QyxTQUFpQztJQUVqQyxNQUFNLFFBQVEsR0FBOEIsRUFBRSxDQUFBO0lBQzlDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUNsRCxDQUFBO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNsQyxJQUFJLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxRQUFR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
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAnalyticsCorrelationId = createAnalyticsCorrelationId;
4
+ exports.getAnalyticsErrorMessage = getAnalyticsErrorMessage;
5
+ exports.classifyAnalyticsFailure = classifyAnalyticsFailure;
6
+ exports.isAlertableAnalyticsFailure = isAlertableAnalyticsFailure;
7
+ exports.isSlowAnalyticsRebuild = isSlowAnalyticsRebuild;
8
+ exports.isSlowAnalyticsJob = isSlowAnalyticsJob;
9
+ exports.isSlowAnalyticsRead = isSlowAnalyticsRead;
10
+ exports.getAnalyticsRebuildLogLevel = getAnalyticsRebuildLogLevel;
11
+ exports.getAnalyticsJobLogLevel = getAnalyticsJobLogLevel;
12
+ exports.getAnalyticsReadLogLevel = getAnalyticsReadLogLevel;
13
+ exports.buildAnalyticsReadEventName = buildAnalyticsReadEventName;
14
+ exports.logAnalyticsEvent = logAnalyticsEvent;
15
+ const crypto_1 = require("crypto");
16
+ const SLOW_ANALYTICS_REBUILD_THRESHOLD_MS = 5_000;
17
+ const SLOW_ANALYTICS_JOB_THRESHOLD_MS = 5_000;
18
+ const SLOW_ANALYTICS_READ_THRESHOLD_MS = 1_000;
19
+ function getNestedMessage(value) {
20
+ if (!value) {
21
+ return null;
22
+ }
23
+ if (typeof value === "string") {
24
+ return value;
25
+ }
26
+ if (value instanceof Error) {
27
+ const causeMessage = getNestedMessage(value.cause);
28
+ return value.message || causeMessage || null;
29
+ }
30
+ if (typeof value === "object") {
31
+ const record = value;
32
+ const candidates = [
33
+ record.message,
34
+ record.error,
35
+ record.details,
36
+ record.cause,
37
+ record.response?.data,
38
+ record.response?.message,
39
+ record.data?.message,
40
+ record.body?.message,
41
+ ];
42
+ for (const candidate of candidates) {
43
+ const nested = getNestedMessage(candidate);
44
+ if (nested) {
45
+ return nested;
46
+ }
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ function createAnalyticsCorrelationId(prefix) {
52
+ return `${prefix}-${(0, crypto_1.randomUUID)()}`;
53
+ }
54
+ function getAnalyticsErrorMessage(error) {
55
+ const direct = getNestedMessage(error);
56
+ if (direct) {
57
+ return direct;
58
+ }
59
+ return "Analytics processing failed";
60
+ }
61
+ function classifyAnalyticsFailure(error) {
62
+ const message = getAnalyticsErrorMessage(error).toLowerCase();
63
+ if (message.includes("timed-out acquiring lock") ||
64
+ message.includes("timeout acquiring lock") ||
65
+ message.includes("timed out acquiring lock")) {
66
+ return "lock_timeout";
67
+ }
68
+ if (message.includes("already running") ||
69
+ message.includes("already rebuilding") ||
70
+ message.includes("another job instance")) {
71
+ return "already_running";
72
+ }
73
+ return "unexpected_error";
74
+ }
75
+ function isAlertableAnalyticsFailure(kind) {
76
+ return !["already_running", "lock_timeout"].includes(kind);
77
+ }
78
+ function isSlowAnalyticsRebuild(durationMs) {
79
+ return durationMs > SLOW_ANALYTICS_REBUILD_THRESHOLD_MS;
80
+ }
81
+ function isSlowAnalyticsJob(durationMs) {
82
+ return durationMs > SLOW_ANALYTICS_JOB_THRESHOLD_MS;
83
+ }
84
+ function isSlowAnalyticsRead(durationMs) {
85
+ return durationMs > SLOW_ANALYTICS_READ_THRESHOLD_MS;
86
+ }
87
+ function getAnalyticsRebuildLogLevel(input) {
88
+ if (input.failed_days_count > 0 || input.quality_error_count > 0) {
89
+ return "error";
90
+ }
91
+ if (input.blocked_days_count > 0 ||
92
+ input.quality_warning_count > 0 ||
93
+ isSlowAnalyticsRebuild(input.duration_ms)) {
94
+ return "warn";
95
+ }
96
+ return "info";
97
+ }
98
+ function getAnalyticsJobLogLevel(input) {
99
+ if (input.failed_days_count > 0) {
100
+ return "error";
101
+ }
102
+ if (input.blocked_days_count > 0 ||
103
+ isSlowAnalyticsJob(input.duration_ms)) {
104
+ return "warn";
105
+ }
106
+ return "info";
107
+ }
108
+ function getAnalyticsReadLogLevel(input) {
109
+ if (input.failed) {
110
+ return "error";
111
+ }
112
+ if (isSlowAnalyticsRead(input.duration_ms)) {
113
+ return "warn";
114
+ }
115
+ return "info";
116
+ }
117
+ function buildAnalyticsReadEventName(kind) {
118
+ return `analytics.read.${kind}`;
119
+ }
120
+ function logAnalyticsEvent(logger, level, payload) {
121
+ const line = JSON.stringify({
122
+ domain: "analytics",
123
+ ...payload,
124
+ });
125
+ logger[level](line);
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FuYWx5dGljcy91dGlscy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUZBLG9FQUVDO0FBRUQsNERBUUM7QUFFRCw0REFvQkM7QUFFRCxrRUFFQztBQUVELHdEQUVDO0FBRUQsZ0RBRUM7QUFFRCxrREFFQztBQUVELGtFQW9CQztBQUVELDBEQWlCQztBQUVELDREQWFDO0FBRUQsa0VBRUM7QUFFRCw4Q0FXQztBQXBORCxtQ0FBbUM7QUFXbkMsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSwrQkFBK0IsR0FBRyxLQUFLLENBQUE7QUFDN0MsTUFBTSxnQ0FBZ0MsR0FBRyxLQUFLLENBQUE7QUFFOUMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUUsS0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuRixPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQTtJQUM5QyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFnQyxDQUFBO1FBRS9DLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLE1BQU0sQ0FBQyxPQUFPO1lBQ2QsTUFBTSxDQUFDLEtBQUs7WUFDWixNQUFNLENBQUMsT0FBTztZQUNkLE1BQU0sQ0FBQyxLQUFLO1lBQ1gs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
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CANCELLATION_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.CANCELLATION_MODULE = "cancellation";
10
+ exports.default = (0, utils_1.Module)(exports.CANCELLATION_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUFpRDtBQUVwQyxRQUFBLG1CQUFtQixHQUFHLGNBQWMsQ0FBQTtBQUVqRCxrQkFBZSxJQUFBLGNBQU0sRUFBQywyQkFBbUIsRUFBRTtJQUN6QyxPQUFPLEVBQUUsaUJBQXlCO0NBQ25DLENBQUMsQ0FBQSJ9
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260401143914 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260401143914 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "cancellation_case" ("id" text not null, "subscription_id" text not null, "status" text check ("status" in ('requested', 'evaluating_retention', 'retention_offered', 'retained', 'paused', 'canceled')) not null default 'requested', "reason" text null, "reason_category" text check ("reason_category" in ('price', 'product_fit', 'delivery', 'billing', 'temporary_pause', 'switched_competitor', 'other')) null, "notes" text null, "recommended_action" text check ("recommended_action" in ('pause_offer', 'discount_offer', 'bonus_offer', 'direct_cancel')) null, "final_outcome" text check ("final_outcome" in ('retained', 'paused', 'canceled')) null, "finalized_at" timestamptz null, "finalized_by" text null, "cancellation_effective_at" timestamptz null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "cancellation_case_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_deleted_at" ON "cancellation_case" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_subscription_id" ON "cancellation_case" ("subscription_id") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_status" ON "cancellation_case" ("status") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_final_outcome" ON "cancellation_case" ("final_outcome") WHERE deleted_at IS NULL;`);
12
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_reason_category" ON "cancellation_case" ("reason_category") WHERE deleted_at IS NULL;`);
13
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_created_at" ON "cancellation_case" ("created_at") WHERE deleted_at IS NULL;`);
14
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_subscription_id_status" ON "cancellation_case" ("subscription_id", "status") WHERE deleted_at IS NULL;`);
15
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_status_created_at" ON "cancellation_case" ("status", "created_at") WHERE deleted_at IS NULL;`);
16
+ this.addSql(`create table if not exists "retention_offer_event" ("id" text not null, "cancellation_case_id" text not null, "offer_type" text check ("offer_type" in ('pause_offer', 'discount_offer', 'bonus_offer')) not null, "offer_payload" jsonb null, "decision_status" text check ("decision_status" in ('proposed', 'accepted', 'rejected', 'applied', 'expired')) not null default 'proposed', "decision_reason" text null, "decided_at" timestamptz null, "decided_by" text null, "applied_at" timestamptz null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "retention_offer_event_pkey" primary key ("id"));`);
17
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_cancellation_case_id" ON "retention_offer_event" ("cancellation_case_id") WHERE deleted_at IS NULL;`);
18
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_deleted_at" ON "retention_offer_event" ("deleted_at") WHERE deleted_at IS NULL;`);
19
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_offer_type" ON "retention_offer_event" ("offer_type") WHERE deleted_at IS NULL;`);
20
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_decision_status" ON "retention_offer_event" ("decision_status") WHERE deleted_at IS NULL;`);
21
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_created_at" ON "retention_offer_event" ("created_at") WHERE deleted_at IS NULL;`);
22
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_cancellation_case_id_created_at" ON "retention_offer_event" ("cancellation_case_id", "created_at") WHERE deleted_at IS NULL;`);
23
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_offer_type_decision_status" ON "retention_offer_event" ("offer_type", "decision_status") WHERE deleted_at IS NULL;`);
24
+ this.addSql(`alter table if exists "retention_offer_event" drop constraint if exists "retention_offer_event_cancellation_case_id_foreign";`);
25
+ this.addSql(`alter table if exists "retention_offer_event" add constraint "retention_offer_event_cancellation_case_id_foreign" foreign key ("cancellation_case_id") references "cancellation_case" ("id") on update cascade;`);
26
+ }
27
+ async down() {
28
+ this.addSql(`alter table if exists "retention_offer_event" drop constraint if exists "retention_offer_event_cancellation_case_id_foreign";`);
29
+ this.addSql(`drop table if exists "cancellation_case" cascade;`);
30
+ this.addSql(`drop table if exists "retention_offer_event" cascade;`);
31
+ }
32
+ }
33
+ exports.Migration20260401143914 = Migration20260401143914;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDExNDM5MTQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDQwMTE0MzkxNC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsNDlCQUE0OUIsQ0FBQyxDQUFDO1FBQzErQixJQUFJLENBQUMsTUFBTSxDQUFDLCtIQUErSCxDQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsdUhBQXVILENBQUMsQ0FBQztRQUNySSxJQUFJLENBQUMsTUFBTSxDQUFDLHFJQUFxSSxDQUFDLENBQUM7UUFDbkosSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsK0hBQStILENBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsTUFBTSxDQUFDLDBKQUEwSixDQUFDLENBQUM7UUFDeEssSUFBSSxDQUFDLE1BQU0sQ0FBQyxnSkFBZ0osQ0FBQyxDQUFDO1FBRTlKLElBQUksQ0FBQyxNQUFNLENBQUMsb3NCQUFvc0IsQ0FBQyxDQUFDO1FBQ2x0QixJQUFJLENBQUMsTUFBTSxDQUFDLDJKQUEySixDQUFDLENBQUM7UUFDekssSUFBSSxDQUFDLE1BQU0sQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO1FBQ3JKLElBQUksQ0FBQyxNQUFNLENBQUMsdUlBQXVJLENBQUMsQ0FBQztRQUNySixJQUFJLENBQUMsTUFBTSxDQUFDLGlKQUFpSixDQUFDLENBQUM7UUFDL0osSUFBSSxDQUFDLE1BQU0sQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO1FBQ3JKLElBQUksQ0FBQyxNQUFNLENBQUMsb0xBQW9MLENBQUMsQ0FBQztRQUNsTSxJQUFJLENBQUMsTUFBTSxDQUFDLDBLQUEwSyxDQUFDLENBQUM7UUFFeEwsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSEFBK0gsQ0FBQyxDQUFDO1FBQzdJLElBQUksQ0FBQyxNQUFNLENBQUMsaU5BQWlOLENBQUMsQ0FBQztJQUNqTyxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSEFBK0gsQ0FBQyxDQUFDO1FBRTdJLElBQUksQ0FBQyxNQUFNLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUVGO0FBbENELDBEQWtDQyJ9
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260405112000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260405112000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "cancellation_case" drop column if exists "recommended_action";`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "cancellation_case" add column if not exists "recommended_action" text check ("recommended_action" in ('pause_offer', 'discount_offer', 'bonus_offer', 'direct_cancel')) null;`);
11
+ }
12
+ }
13
+ exports.Migration20260405112000 = Migration20260405112000;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDUxMTIwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDQwNTExMjAwMC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUMzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQ1QsdUZBQXVGLENBQ3hGLENBQUM7SUFDSixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FDVCxzTUFBc00sQ0FDdk0sQ0FBQztJQUNKLENBQUM7Q0FDRjtBQVpELDBEQVlDIn0=
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const retention_offer_event_1 = __importDefault(require("./retention-offer-event"));
8
+ const types_1 = require("../types");
9
+ const CancellationCase = utils_1.model
10
+ .define("cancellation_case", {
11
+ id: utils_1.model.id().primaryKey(),
12
+ subscription_id: utils_1.model.text(),
13
+ status: utils_1.model
14
+ .enum(types_1.CancellationCaseStatus)
15
+ .default(types_1.CancellationCaseStatus.REQUESTED),
16
+ reason: utils_1.model.text().nullable(),
17
+ reason_category: utils_1.model.enum(types_1.CancellationReasonCategory).nullable(),
18
+ notes: utils_1.model.text().nullable(),
19
+ final_outcome: utils_1.model.enum(types_1.CancellationFinalOutcome).nullable(),
20
+ finalized_at: utils_1.model.dateTime().nullable(),
21
+ finalized_by: utils_1.model.text().nullable(),
22
+ cancellation_effective_at: utils_1.model.dateTime().nullable(),
23
+ offer_events: utils_1.model.hasMany(() => retention_offer_event_1.default, {
24
+ mappedBy: "cancellation_case",
25
+ }),
26
+ metadata: utils_1.model.json().nullable(),
27
+ })
28
+ .indexes([
29
+ {
30
+ on: ["subscription_id"],
31
+ },
32
+ {
33
+ on: ["status"],
34
+ },
35
+ {
36
+ on: ["final_outcome"],
37
+ },
38
+ {
39
+ on: ["reason_category"],
40
+ },
41
+ {
42
+ on: ["created_at"],
43
+ },
44
+ {
45
+ on: ["subscription_id", "status"],
46
+ },
47
+ {
48
+ on: ["status", "created_at"],
49
+ },
50
+ ]);
51
+ exports.default = CancellationCase;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsbGF0aW9uLWNhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbW9kZWxzL2NhbmNlbGxhdGlvbi1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQWlEO0FBQ2pELG9GQUF5RDtBQUN6RCxvQ0FJaUI7QUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxhQUFLO0tBQzNCLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtJQUMzQixFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM3QixNQUFNLEVBQUUsYUFBSztTQUNWLElBQUksQ0FBQyw4QkFBc0IsQ0FBQztTQUM1QixPQUFPLENBQUMsOEJBQXNCLENBQUMsU0FBUyxDQUFDO0lBQzVDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQy9CLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLGtDQUEwQixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ2xFLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLGdDQUF3QixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlELFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLFlBQVksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3JDLHlCQUF5QixFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEQsWUFBWSxFQUFFLGFBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsK0JBQW1CLEVBQUU7UUFDckQsUUFBUSxFQUFFLG1CQUFtQjtLQUM5QixDQUFDO0lBQ0YsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDbEMsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQO1FBQ0UsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUM7S0FDeEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUNmO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUM7S0FDdEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQ3hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQztLQUNsQztJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztLQUM3QjtDQUNGLENBQUMsQ0FBQTtBQUVKLGtCQUFlLGdCQUFnQixDQUFBIn0=
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const cancellation_case_1 = __importDefault(require("./cancellation-case"));
8
+ const types_1 = require("../types");
9
+ const RetentionOfferEvent = utils_1.model
10
+ .define("retention_offer_event", {
11
+ id: utils_1.model.id().primaryKey(),
12
+ cancellation_case: utils_1.model.belongsTo(() => cancellation_case_1.default, {
13
+ mappedBy: "offer_events",
14
+ }),
15
+ offer_type: utils_1.model.enum(types_1.RetentionOfferType),
16
+ offer_payload: utils_1.model.json().nullable(),
17
+ decision_status: utils_1.model
18
+ .enum(types_1.RetentionOfferDecisionStatus)
19
+ .default(types_1.RetentionOfferDecisionStatus.PROPOSED),
20
+ decision_reason: utils_1.model.text().nullable(),
21
+ decided_at: utils_1.model.dateTime().nullable(),
22
+ decided_by: utils_1.model.text().nullable(),
23
+ applied_at: utils_1.model.dateTime().nullable(),
24
+ metadata: utils_1.model.json().nullable(),
25
+ })
26
+ .indexes([
27
+ {
28
+ on: ["cancellation_case_id"],
29
+ },
30
+ {
31
+ on: ["offer_type"],
32
+ },
33
+ {
34
+ on: ["decision_status"],
35
+ },
36
+ {
37
+ on: ["created_at"],
38
+ },
39
+ {
40
+ on: ["cancellation_case_id", "created_at"],
41
+ },
42
+ {
43
+ on: ["offer_type", "decision_status"],
44
+ },
45
+ ]);
46
+ exports.default = RetentionOfferEvent;
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0ZW50aW9uLW9mZmVyLWV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY2FuY2VsbGF0aW9uL21vZGVscy9yZXRlbnRpb24tb2ZmZXItZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBaUQ7QUFDakQsNEVBQWtEO0FBQ2xELG9DQUdpQjtBQUVqQixNQUFNLG1CQUFtQixHQUFHLGFBQUs7S0FDOUIsTUFBTSxDQUFDLHVCQUF1QixFQUFFO0lBQy9CLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQWdCLEVBQUU7UUFDekQsUUFBUSxFQUFFLGNBQWM7S0FDekIsQ0FBQztJQUNGLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLDBCQUFrQixDQUFDO0lBQzFDLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3RDLGVBQWUsRUFBRSxhQUFLO1NBQ25CLElBQUksQ0FBQyxvQ0FBNEIsQ0FBQztTQUNsQyxPQUFPLENBQUMsb0NBQTRCLENBQUMsUUFBUSxDQUFDO0lBQ2pELGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3hDLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ25DLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2xDLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUDtRQUNFLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDO0tBQzdCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQ3hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixFQUFFLFlBQVksQ0FBQztLQUMzQztJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO0tBQ3RDO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsbUJBQW1CLENBQUEifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const cancellation_case_1 = __importDefault(require("./models/cancellation-case"));
8
+ const retention_offer_event_1 = __importDefault(require("./models/retention-offer-event"));
9
+ class CancellationModuleService extends (0, utils_1.MedusaService)({
10
+ CancellationCase: cancellation_case_1.default,
11
+ RetentionOfferEvent: retention_offer_event_1.default,
12
+ }) {
13
+ }
14
+ exports.default = CancellationModuleService;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NhbmNlbGxhdGlvbi9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQXlEO0FBQ3pELG1GQUF5RDtBQUN6RCwyRkFBZ0U7QUFFaEUsTUFBTSx5QkFBMEIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDcEQsZ0JBQWdCLEVBQWhCLDJCQUFnQjtJQUNoQixtQkFBbUIsRUFBbkIsK0JBQW1CO0NBQ3BCLENBQUM7Q0FBRztBQUVMLGtCQUFlLHlCQUF5QixDQUFBIn0=
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RetentionOfferDecisionStatus = exports.RetentionOfferType = exports.CancellationFinalOutcome = exports.CancellationReasonCategory = exports.CancellationCaseStatus = void 0;
4
+ var CancellationCaseStatus;
5
+ (function (CancellationCaseStatus) {
6
+ CancellationCaseStatus["REQUESTED"] = "requested";
7
+ CancellationCaseStatus["EVALUATING_RETENTION"] = "evaluating_retention";
8
+ CancellationCaseStatus["RETENTION_OFFERED"] = "retention_offered";
9
+ CancellationCaseStatus["RETAINED"] = "retained";
10
+ CancellationCaseStatus["PAUSED"] = "paused";
11
+ CancellationCaseStatus["CANCELED"] = "canceled";
12
+ })(CancellationCaseStatus || (exports.CancellationCaseStatus = CancellationCaseStatus = {}));
13
+ var CancellationReasonCategory;
14
+ (function (CancellationReasonCategory) {
15
+ CancellationReasonCategory["PRICE"] = "price";
16
+ CancellationReasonCategory["PRODUCT_FIT"] = "product_fit";
17
+ CancellationReasonCategory["DELIVERY"] = "delivery";
18
+ CancellationReasonCategory["BILLING"] = "billing";
19
+ CancellationReasonCategory["TEMPORARY_PAUSE"] = "temporary_pause";
20
+ CancellationReasonCategory["SWITCHED_COMPETITOR"] = "switched_competitor";
21
+ CancellationReasonCategory["OTHER"] = "other";
22
+ })(CancellationReasonCategory || (exports.CancellationReasonCategory = CancellationReasonCategory = {}));
23
+ var CancellationFinalOutcome;
24
+ (function (CancellationFinalOutcome) {
25
+ CancellationFinalOutcome["RETAINED"] = "retained";
26
+ CancellationFinalOutcome["PAUSED"] = "paused";
27
+ CancellationFinalOutcome["CANCELED"] = "canceled";
28
+ })(CancellationFinalOutcome || (exports.CancellationFinalOutcome = CancellationFinalOutcome = {}));
29
+ var RetentionOfferType;
30
+ (function (RetentionOfferType) {
31
+ RetentionOfferType["PAUSE_OFFER"] = "pause_offer";
32
+ RetentionOfferType["DISCOUNT_OFFER"] = "discount_offer";
33
+ RetentionOfferType["BONUS_OFFER"] = "bonus_offer";
34
+ })(RetentionOfferType || (exports.RetentionOfferType = RetentionOfferType = {}));
35
+ var RetentionOfferDecisionStatus;
36
+ (function (RetentionOfferDecisionStatus) {
37
+ RetentionOfferDecisionStatus["PROPOSED"] = "proposed";
38
+ RetentionOfferDecisionStatus["ACCEPTED"] = "accepted";
39
+ RetentionOfferDecisionStatus["REJECTED"] = "rejected";
40
+ RetentionOfferDecisionStatus["APPLIED"] = "applied";
41
+ RetentionOfferDecisionStatus["EXPIRED"] = "expired";
42
+ })(RetentionOfferDecisionStatus || (exports.RetentionOfferDecisionStatus = RetentionOfferDecisionStatus = {}));
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxzQkFPWDtBQVBELFdBQVksc0JBQXNCO0lBQ2hDLGlEQUF1QixDQUFBO0lBQ3ZCLHVFQUE2QyxDQUFBO0lBQzdDLGlFQUF1QyxDQUFBO0lBQ3ZDLCtDQUFxQixDQUFBO0lBQ3JCLDJDQUFpQixDQUFBO0lBQ2pCLCtDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFQVyxzQkFBc0Isc0NBQXRCLHNCQUFzQixRQU9qQztBQUVELElBQVksMEJBUVg7QUFSRCxXQUFZLDBCQUEwQjtJQUNwQyw2Q0FBZSxDQUFBO0lBQ2YseURBQTJCLENBQUE7SUFDM0IsbURBQXFCLENBQUE7SUFDckIsaURBQW1CLENBQUE7SUFDbkIsaUVBQW1DLENBQUE7SUFDbkMseUVBQTJDLENBQUE7SUFDM0MsNkNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUlcsMEJBQTBCLDBDQUExQiwwQkFBMEIsUUFRckM7QUFFRCxJQUFZLHdCQUlYO0FBSkQsV0FBWSx3QkFBd0I7SUFDbEMsaURBQXFCLENBQUE7SUFDckIsNkNBQWlCLENBQUE7SUFDakIsaURBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLHdCQUF3Qix3Q0FBeEIsd0JBQXdCLFFBSW5DO0FBRUQsSUFBWSxrQkFJWDtBQUpELFdBQVksa0JBQWtCO0lBQzVCLGlEQUEyQixDQUFBO0lBQzNCLHVEQUFpQyxDQUFBO0lBQ2pDLGlEQUEyQixDQUFBO0FBQzdCLENBQUMsRUFKVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQUk3QjtBQUVELElBQVksNEJBTVg7QUFORCxXQUFZLDRCQUE0QjtJQUN0QyxxREFBcUIsQ0FBQTtJQUNyQixxREFBcUIsQ0FBQTtJQUNyQixxREFBcUIsQ0FBQTtJQUNyQixtREFBbUIsQ0FBQTtJQUNuQixtREFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTlcsNEJBQTRCLDRDQUE1Qiw0QkFBNEIsUUFNdkMifQ==