@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,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCancellationCorrelationId = createCancellationCorrelationId;
4
+ exports.getCancellationErrorMessage = getCancellationErrorMessage;
5
+ exports.classifyCancellationFailure = classifyCancellationFailure;
6
+ exports.isAlertableCancellationFailure = isAlertableCancellationFailure;
7
+ exports.logCancellationEvent = logCancellationEvent;
8
+ const crypto_1 = require("crypto");
9
+ function createCancellationCorrelationId(prefix) {
10
+ return `${prefix}-${(0, crypto_1.randomUUID)()}`;
11
+ }
12
+ function getCancellationErrorMessage(error) {
13
+ const direct = getNestedMessage(error);
14
+ if (direct) {
15
+ return direct;
16
+ }
17
+ return "Cancellation operational processing failed";
18
+ }
19
+ function classifyCancellationFailure(error) {
20
+ const message = getCancellationErrorMessage(error).toLowerCase();
21
+ if (message.includes("timed-out acquiring lock") ||
22
+ message.includes("timeout acquiring lock") ||
23
+ message.includes("timed out acquiring lock")) {
24
+ return "lock_timeout";
25
+ }
26
+ if (message.includes("already running") ||
27
+ message.includes("another job instance")) {
28
+ return "already_running";
29
+ }
30
+ if (message.includes("window") && message.includes("invalid")) {
31
+ return "invalid_metrics_window";
32
+ }
33
+ return "unexpected_error";
34
+ }
35
+ function isAlertableCancellationFailure(kind) {
36
+ return !["already_running", "lock_timeout"].includes(kind);
37
+ }
38
+ function getNestedMessage(value) {
39
+ if (!value) {
40
+ return null;
41
+ }
42
+ if (typeof value === "string") {
43
+ return value;
44
+ }
45
+ if (value instanceof Error) {
46
+ const causeMessage = getNestedMessage(value.cause);
47
+ return value.message || causeMessage || null;
48
+ }
49
+ if (typeof value === "object") {
50
+ const record = value;
51
+ const candidates = [
52
+ record.message,
53
+ record.error,
54
+ record.details,
55
+ record.cause,
56
+ record.response?.data,
57
+ record.response?.message,
58
+ record.data?.message,
59
+ record.body?.message,
60
+ ];
61
+ for (const candidate of candidates) {
62
+ const nested = getNestedMessage(candidate);
63
+ if (nested) {
64
+ return nested;
65
+ }
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ function logCancellationEvent(logger, level, payload) {
71
+ const line = JSON.stringify({
72
+ domain: "cancellation",
73
+ ...payload,
74
+ });
75
+ logger[level](line);
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NhbmNlbGxhdGlvbi91dGlscy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkNBLDBFQUVDO0FBRUQsa0VBUUM7QUFFRCxrRUF5QkM7QUFFRCx3RUFFQztBQTBDRCxvREFXQztBQTdJRCxtQ0FBbUM7QUE2Q25DLFNBQWdCLCtCQUErQixDQUFDLE1BQWM7SUFDNUQsT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFBLG1CQUFVLEdBQUUsRUFBRSxDQUFBO0FBQ3BDLENBQUM7QUFFRCxTQUFnQiwyQkFBMkIsQ0FBQyxLQUFjO0lBQ3hELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXRDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRCxPQUFPLDRDQUE0QyxDQUFBO0FBQ3JELENBQUM7QUFFRCxTQUFnQiwyQkFBMkIsQ0FDekMsS0FBYztJQUVkLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRWhFLElBQ0UsT0FBTyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztRQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO1FBQzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFDNUMsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUNFLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDbkMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUN4QyxDQUFDO1FBQ0QsT0FBTyxpQkFBaUIsQ0FBQTtJQUMxQixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxPQUFPLHdCQUF3QixDQUFBO0lBQ2pDLENBQUM7SUFFRCxPQUFPLGtCQUFrQixDQUFBO0FBQzNCLENBQUM7QUFFRCxTQUFnQiw4QkFBOEIsQ0FBQyxJQUE2QjtJQUMxRSxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDNUQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYztJQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzNCLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFFLEtBQXFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkYsT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUE7SUFDOUMsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsS0FBZ0MsQ0FBQTtRQUUvQyxNQUFNLFVBQVUsR0FBRztZQUNqQixNQUFNLENBQUMsT0FBTztZQUNkLE1BQU0sQ0FBQyxLQUFLO1lBQ1osTUFBTSxDQUFDLE9BQU87WUFDZCxNQUFNLENBQUMsS0FBSztZQUNYLE1BQU0sQ0FBQyxRQUFnRCxFQUFFLElBQUk7WUFDN0QsTUFBTSxDQUFDLFFBQWdELEVBQUUsT0FBTztZQUNoRSxNQUFNLENBQUMsSUFBNEMsRUFBRSxPQUFPO1lBQzVELE1BQU0sQ0FBQyxJQUE0QyxFQUFFLE9BQU87U0FDOUQsQ0FBQTtRQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sQ0FBQTtZQUNmLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxNQUFrQixFQUNsQixLQUFlLEVBQ2YsT0FBK0I7SUFFL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixNQUFNLEVBQUUsY0FBYztRQUN0QixHQUFHLE9BQU87S0FDWCxDQUFDLENBQUE7SUFFRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDckIsQ0FBQyJ9
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listCancellationOperationalMetrics = listCancellationOperationalMetrics;
4
+ exports.isCancellationReasonSpikeAlertable = isCancellationReasonSpikeAlertable;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const types_1 = require("../types");
7
+ async function listCancellationOperationalMetrics(container, input = {}) {
8
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
9
+ const windowHours = input.window_hours ?? 24;
10
+ if (!Number.isFinite(windowHours) || windowHours <= 0) {
11
+ throw new Error("Cancellation metrics window is invalid");
12
+ }
13
+ const now = input.now ?? new Date();
14
+ const currentWindowStart = new Date(now.getTime() - windowHours * 60 * 60 * 1000);
15
+ const previousWindowStart = new Date(currentWindowStart.getTime() - windowHours * 60 * 60 * 1000);
16
+ const [currentCasesResult, previousCanceledCasesResult, currentOfferEventsResult,] = await Promise.all([
17
+ query.graph({
18
+ entity: "cancellation_case",
19
+ fields: ["id", "reason_category", "final_outcome", "finalized_at", "created_at"],
20
+ filters: {
21
+ created_at: {
22
+ $gte: currentWindowStart.toISOString(),
23
+ $lte: now.toISOString(),
24
+ },
25
+ },
26
+ }),
27
+ query.graph({
28
+ entity: "cancellation_case",
29
+ fields: ["id", "reason_category", "final_outcome", "finalized_at", "created_at"],
30
+ filters: {
31
+ finalized_at: {
32
+ $gte: previousWindowStart.toISOString(),
33
+ $lt: currentWindowStart.toISOString(),
34
+ },
35
+ final_outcome: [types_1.CancellationFinalOutcome.CANCELED],
36
+ },
37
+ }),
38
+ query.graph({
39
+ entity: "retention_offer_event",
40
+ fields: ["id", "decision_status", "created_at"],
41
+ filters: {
42
+ created_at: {
43
+ $gte: currentWindowStart.toISOString(),
44
+ $lte: now.toISOString(),
45
+ },
46
+ },
47
+ }),
48
+ ]);
49
+ const currentCases = (currentCasesResult.data ?? []);
50
+ const previousCanceledCases = (previousCanceledCasesResult.data ?? []);
51
+ const currentOfferEvents = (currentOfferEventsResult.data ?? []);
52
+ const terminalCases = currentCases.filter((record) => record.final_outcome !== null);
53
+ const canceledCases = terminalCases.filter((record) => record.final_outcome === types_1.CancellationFinalOutcome.CANCELED);
54
+ const retainedCases = terminalCases.filter((record) => record.final_outcome === types_1.CancellationFinalOutcome.RETAINED);
55
+ const pausedCases = terminalCases.filter((record) => record.final_outcome === types_1.CancellationFinalOutcome.PAUSED);
56
+ const topReasonCategories = countReasonCategories(canceledCases)
57
+ .sort((left, right) => right.count - left.count)
58
+ .slice(0, 5);
59
+ const currentReasonMap = toReasonCountMap(canceledCases);
60
+ const previousReasonMap = toReasonCountMap(previousCanceledCases);
61
+ const spike = detectReasonCategorySpike(currentReasonMap, previousReasonMap);
62
+ const acceptedOrApplied = currentOfferEvents.filter((record) => [
63
+ types_1.RetentionOfferDecisionStatus.ACCEPTED,
64
+ types_1.RetentionOfferDecisionStatus.APPLIED,
65
+ ].includes(record.decision_status)).length;
66
+ return {
67
+ window_hours: windowHours,
68
+ case_count: currentCases.length,
69
+ terminal_case_count: terminalCases.length,
70
+ canceled_count: canceledCases.length,
71
+ retained_count: retainedCases.length + pausedCases.length,
72
+ pause_count: pausedCases.length,
73
+ churn_rate: terminalCases.length
74
+ ? Number((canceledCases.length / terminalCases.length).toFixed(4))
75
+ : 0,
76
+ offer_acceptance_rate: currentOfferEvents.length
77
+ ? Number((acceptedOrApplied / currentOfferEvents.length).toFixed(4))
78
+ : 0,
79
+ top_reason_categories: topReasonCategories,
80
+ spike_reason_category: spike.reason_category,
81
+ spike_current_count: spike.current_count,
82
+ spike_previous_count: spike.previous_count,
83
+ };
84
+ }
85
+ function isCancellationReasonSpikeAlertable(metrics, threshold = 5) {
86
+ if (!metrics.spike_reason_category) {
87
+ return false;
88
+ }
89
+ if (metrics.spike_current_count >= threshold && metrics.spike_previous_count === 0) {
90
+ return true;
91
+ }
92
+ return (metrics.spike_current_count >= threshold &&
93
+ metrics.spike_current_count >= metrics.spike_previous_count * 2);
94
+ }
95
+ function toReasonCountMap(records) {
96
+ const counts = new Map();
97
+ for (const record of records) {
98
+ const key = record.reason_category ?? "unclassified";
99
+ counts.set(key, (counts.get(key) ?? 0) + 1);
100
+ }
101
+ return counts;
102
+ }
103
+ function countReasonCategories(records) {
104
+ return [...toReasonCountMap(records).entries()].map(([reason_category, count]) => ({
105
+ reason_category,
106
+ count,
107
+ }));
108
+ }
109
+ function detectReasonCategorySpike(currentReasonMap, previousReasonMap) {
110
+ let selected = {
111
+ reason_category: null,
112
+ current_count: 0,
113
+ previous_count: 0,
114
+ growth: 0,
115
+ };
116
+ for (const [reasonCategory, currentCount] of currentReasonMap.entries()) {
117
+ const previousCount = previousReasonMap.get(reasonCategory) ?? 0;
118
+ const growth = previousCount === 0 ? currentCount : currentCount / previousCount;
119
+ if (currentCount > selected.current_count ||
120
+ (currentCount === selected.current_count && growth > selected.growth)) {
121
+ selected = {
122
+ reason_category: reasonCategory,
123
+ current_count: currentCount,
124
+ previous_count: previousCount,
125
+ growth,
126
+ };
127
+ }
128
+ }
129
+ return selected;
130
+ }
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uYWwtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NhbmNlbGxhdGlvbi91dGlscy9vcGVyYXRpb25hbC1tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOENBLGdGQXlHQztBQUVELGdGQWdCQztBQXhLRCxxREFBcUU7QUFDckUsb0NBR2lCO0FBeUNWLEtBQUssVUFBVSxrQ0FBa0MsQ0FDdEQsU0FBMEIsRUFDMUIsUUFBaUQsRUFBRTtJQUVuRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFBO0lBRTVDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUNuQyxNQUFNLGtCQUFrQixHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUNqRixNQUFNLG1CQUFtQixHQUFHLElBQUksSUFBSSxDQUNsQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQzVELENBQUE7SUFFRCxNQUFNLENBQ0osa0JBQWtCLEVBQ2xCLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDekIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDcEIsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNWLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDO1lBQ2hGLE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUU7b0JBQ1YsSUFBSSxFQUFFLGtCQUFrQixDQUFDLFdBQVcsRUFBRTtvQkFDdEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUU7aUJBQ3hCO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNWLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDO1lBQ2hGLE9BQU8sRUFBRTtnQkFDUCxZQUFZLEVBQUU7b0JBQ1osSUFBSSxFQUFFLG1CQUFtQixDQUFDLFdBQVcsRUFBRTtvQkFDdkMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLFdBQVcsRUFBRTtpQkFDdEM7Z0JBQ0QsYUFBYSxFQUFFLENBQUMsZ0NBQXdCLENBQUMsUUFBUSxDQUFDO2FBQ25EO1NBQ0YsQ0FBQztRQUNGLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDVixNQUFNLEVBQUUsdUJBQXVCO1lBQy9CLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQUM7WUFDL0MsT0FBTyxFQUFFO2dCQUNQLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsa0JBQWtCLENBQUMsV0FBVyxFQUFFO29CQUN0QyxJQUFJLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRTtpQkFDeEI7YUFDRjtTQUNGLENBQUM7S0FDSCxDQUFDLENBQUE7SUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxFQUFFLENBQW1DLENBQUE7SUFDdEYsTUFBTSxxQkFBcUIsR0FDekIsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFtQyxDQUFBO0lBQzVFLE1BQU0sa0JBQWtCLEdBQ3RCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBaUMsQ0FBQTtJQUV2RSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFBO0lBQ3BGLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3hDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLGdDQUF3QixDQUFDLFFBQVEsQ0FDdkUsQ0FBQTtJQUNELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3hDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLGdDQUF3QixDQUFDLFFBQVEsQ0FDdkUsQ0FBQTtJQUNELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3RDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLGdDQUF3QixDQUFDLE1BQU0sQ0FDckUsQ0FBQTtJQUVELE1BQU0sbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDO1NBQzdELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUMvQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRWQsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN4RCxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDakUsTUFBTSxLQUFLLEdBQUcseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUU1RSxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzdEO1FBQ0Usb0NBQTRCLENBQUMsUUFBUTtRQUNyQyxvQ0FBNEIsQ0FBQyxPQUFPO0tBQ3JDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxNQUFNLENBQUE7SUFFUixPQUFPO1FBQ0wsWUFBWSxFQUFFLFdBQVc7UUFDekIsVUFBVSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQy9CLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxNQUFNO1FBQ3pDLGNBQWMsRUFBRSxhQUFhLENBQUMsTUFBTTtRQUNwQyxjQUFjLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTTtRQUN6RCxXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDL0IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1lBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDTCxxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO1lBQzlDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFDTCxxQkFBcUIsRUFBRSxtQkFBbUI7UUFDMUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLGVBQWU7UUFDNUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLGFBQWE7UUFDeEMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLGNBQWM7S0FDM0MsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQixrQ0FBa0MsQ0FDaEQsT0FBdUMsRUFDdkMsU0FBUyxHQUFHLENBQUM7SUFFYixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxPQUFPLENBQ0wsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFNBQVM7UUFDeEMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQ2hFLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxPQUF1QztJQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQTtJQUV4QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLElBQUksY0FBYyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxPQUF1QztJQUNwRSxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLGVBQWU7UUFDZixLQUFLO0tBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTCxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsZ0JBQXFDLEVBQ3JDLGlCQUFzQztJQUV0QyxJQUFJLFFBQVEsR0FLUjtRQUNGLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sRUFBRSxDQUFDO0tBQ1YsQ0FBQTtJQUVELEtBQUssTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEUsTUFBTSxNQUFNLEdBQ1YsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFBO1FBRW5FLElBQ0UsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhO1lBQ3JDLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxhQUFhLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDckUsQ0FBQztZQUNELFFBQVEsR0FBRztnQkFDVCxlQUFlLEVBQUUsY0FBYztnQkFDL0IsYUFBYSxFQUFFLFlBQVk7Z0JBQzNCLGNBQWMsRUFBRSxhQUFhO2dCQUM3QixNQUFNO2FBQ1AsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQyJ9
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isActiveDunningCase = isActiveDunningCase;
4
+ exports.getEligibleRetentionOfferTypes = getEligibleRetentionOfferTypes;
5
+ const types_1 = require("../types");
6
+ const types_2 = require("../../subscription/types");
7
+ const types_3 = require("../../dunning/types");
8
+ const ACTIVE_DUNNING_CASE_STATUSES = new Set([
9
+ types_3.DunningCaseStatus.OPEN,
10
+ types_3.DunningCaseStatus.RETRY_SCHEDULED,
11
+ types_3.DunningCaseStatus.RETRYING,
12
+ types_3.DunningCaseStatus.AWAITING_MANUAL_RESOLUTION,
13
+ ]);
14
+ function isActiveDunningCase(status) {
15
+ return ACTIVE_DUNNING_CASE_STATUSES.has(status);
16
+ }
17
+ function getEligibleRetentionOfferTypes(input) {
18
+ if (input.subscription_status === types_2.SubscriptionStatus.PAUSED) {
19
+ return [];
20
+ }
21
+ if (input.subscription_status === types_2.SubscriptionStatus.PAST_DUE ||
22
+ input.has_active_dunning) {
23
+ return [types_1.RetentionOfferType.PAUSE_OFFER, types_1.RetentionOfferType.BONUS_OFFER];
24
+ }
25
+ return [
26
+ types_1.RetentionOfferType.PAUSE_OFFER,
27
+ types_1.RetentionOfferType.DISCOUNT_OFFER,
28
+ types_1.RetentionOfferType.BONUS_OFFER,
29
+ ];
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0ZW50aW9uLW9mZmVyLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NhbmNlbGxhdGlvbi91dGlscy9yZXRlbnRpb24tb2ZmZXItcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLGtEQUVDO0FBRUQsd0VBbUJDO0FBdkNELG9DQUE2QztBQUM3QyxvREFBNkQ7QUFDN0QsK0NBQXVEO0FBRXZELE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLENBQW9CO0lBQzlELHlCQUFpQixDQUFDLElBQUk7SUFDdEIseUJBQWlCLENBQUMsZUFBZTtJQUNqQyx5QkFBaUIsQ0FBQyxRQUFRO0lBQzFCLHlCQUFpQixDQUFDLDBCQUEwQjtDQUM3QyxDQUFDLENBQUE7QUFPRixTQUFnQixtQkFBbUIsQ0FBQyxNQUF5QjtJQUMzRCxPQUFPLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQzVDLEtBQWdDO0lBRWhDLElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLDBCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVELE9BQU8sRUFBMEIsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFDRSxLQUFLLENBQUMsbUJBQW1CLEtBQUssMEJBQWtCLENBQUMsUUFBUTtRQUN6RCxLQUFLLENBQUMsa0JBQWtCLEVBQ3hCLENBQUM7UUFDRCxPQUFPLENBQUMsMEJBQWtCLENBQUMsV0FBVyxFQUFFLDBCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCxPQUFPO1FBQ0wsMEJBQWtCLENBQUMsV0FBVztRQUM5QiwwQkFBa0IsQ0FBQyxjQUFjO1FBQ2pDLDBCQUFrQixDQUFDLFdBQVc7S0FDL0IsQ0FBQTtBQUNILENBQUMifQ==
@@ -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.DUNNING_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.DUNNING_MODULE = "dunning";
10
+ exports.default = (0, utils_1.Module)(exports.DUNNING_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kdW5uaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFrRDtBQUNsRCx3REFBNEM7QUFFL0IsUUFBQSxjQUFjLEdBQUcsU0FBUyxDQUFBO0FBRXZDLGtCQUFlLElBQUEsY0FBTSxFQUFDLHNCQUFjLEVBQUU7SUFDcEMsT0FBTyxFQUFFLGlCQUFvQjtDQUM5QixDQUFDLENBQUEifQ==
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260330190157 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260330190157 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "dunning_attempt" drop constraint if exists "dunning_attempt_dunning_case_id_attempt_no_unique";`);
8
+ this.addSql(`create table if not exists "dunning_case" ("id" text not null, "subscription_id" text not null, "renewal_cycle_id" text not null, "renewal_order_id" text null, "status" text check ("status" in ('open', 'retry_scheduled', 'retrying', 'awaiting_manual_resolution', 'recovered', 'unrecovered')) not null default 'open', "attempt_count" integer not null default 0, "max_attempts" integer not null, "retry_schedule" jsonb null, "next_retry_at" timestamptz null, "last_payment_error_code" text null, "last_payment_error_message" text null, "last_attempt_at" timestamptz null, "recovered_at" timestamptz null, "closed_at" timestamptz null, "recovery_reason" text null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "dunning_case_pkey" primary key ("id"));`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_deleted_at" ON "dunning_case" ("deleted_at") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_subscription_id" ON "dunning_case" ("subscription_id") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_renewal_cycle_id" ON "dunning_case" ("renewal_cycle_id") WHERE deleted_at IS NULL;`);
12
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_renewal_order_id" ON "dunning_case" ("renewal_order_id") WHERE deleted_at IS NULL;`);
13
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_status" ON "dunning_case" ("status") WHERE deleted_at IS NULL;`);
14
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_next_retry_at" ON "dunning_case" ("next_retry_at") WHERE deleted_at IS NULL;`);
15
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_last_attempt_at" ON "dunning_case" ("last_attempt_at") WHERE deleted_at IS NULL;`);
16
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_recovered_at" ON "dunning_case" ("recovered_at") WHERE deleted_at IS NULL;`);
17
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_closed_at" ON "dunning_case" ("closed_at") WHERE deleted_at IS NULL;`);
18
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_case_status_next_retry_at" ON "dunning_case" ("status", "next_retry_at") WHERE deleted_at IS NULL;`);
19
+ this.addSql(`create table if not exists "dunning_attempt" ("id" text not null, "dunning_case_id" text not null, "attempt_no" integer not null, "started_at" timestamptz not null, "finished_at" timestamptz null, "status" text check ("status" in ('processing', 'succeeded', 'failed')) not null default 'processing', "error_code" text null, "error_message" text null, "payment_reference" text null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "dunning_attempt_pkey" primary key ("id"));`);
20
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_dunning_case_id" ON "dunning_attempt" ("dunning_case_id") WHERE deleted_at IS NULL;`);
21
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_deleted_at" ON "dunning_attempt" ("deleted_at") WHERE deleted_at IS NULL;`);
22
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_attempt_no" ON "dunning_attempt" ("attempt_no") WHERE deleted_at IS NULL;`);
23
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_status" ON "dunning_attempt" ("status") WHERE deleted_at IS NULL;`);
24
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_started_at" ON "dunning_attempt" ("started_at") WHERE deleted_at IS NULL;`);
25
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_dunning_attempt_finished_at" ON "dunning_attempt" ("finished_at") WHERE deleted_at IS NULL;`);
26
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_dunning_attempt_dunning_case_id_attempt_no_unique" ON "dunning_attempt" ("dunning_case_id", "attempt_no") WHERE deleted_at IS NULL;`);
27
+ this.addSql(`alter table if exists "dunning_attempt" add constraint "dunning_attempt_dunning_case_id_foreign" foreign key ("dunning_case_id") references "dunning_case" ("id") on update cascade;`);
28
+ }
29
+ async down() {
30
+ this.addSql(`alter table if exists "dunning_attempt" drop constraint if exists "dunning_attempt_dunning_case_id_foreign";`);
31
+ this.addSql(`drop table if exists "dunning_case" cascade;`);
32
+ this.addSql(`drop table if exists "dunning_attempt" cascade;`);
33
+ }
34
+ }
35
+ exports.Migration20260330190157 = Migration20260330190157;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAzMzAxOTAxNTcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kdW5uaW5nL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjAzMzAxOTAxNTcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLHdIQUF3SCxDQUFDLENBQUM7UUFDdEksSUFBSSxDQUFDLE1BQU0sQ0FBQyxtMkJBQW0yQixDQUFDLENBQUM7UUFDajNCLElBQUksQ0FBQyxNQUFNLENBQUMscUhBQXFILENBQUMsQ0FBQztRQUNuSSxJQUFJLENBQUMsTUFBTSxDQUFDLCtIQUErSCxDQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpSUFBaUksQ0FBQyxDQUFDO1FBQy9JLElBQUksQ0FBQyxNQUFNLENBQUMsaUlBQWlJLENBQUMsQ0FBQztRQUMvSSxJQUFJLENBQUMsTUFBTSxDQUFDLDZHQUE2RyxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLE1BQU0sQ0FBQywySEFBMkgsQ0FBQyxDQUFDO1FBQ3pJLElBQUksQ0FBQyxNQUFNLENBQUMsK0hBQStILENBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsTUFBTSxDQUFDLHlIQUF5SCxDQUFDLENBQUM7UUFDdkksSUFBSSxDQUFDLE1BQU0sQ0FBQyxtSEFBbUgsQ0FBQyxDQUFDO1FBQ2pJLElBQUksQ0FBQyxNQUFNLENBQUMsNElBQTRJLENBQUMsQ0FBQztRQUUxSixJQUFJLENBQUMsTUFBTSxDQUFDLDhrQkFBOGtCLENBQUMsQ0FBQztRQUM1bEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxSUFBcUksQ0FBQyxDQUFDO1FBQ25KLElBQUksQ0FBQyxNQUFNLENBQUMsMkhBQTJILENBQUMsQ0FBQztRQUN6SSxJQUFJLENBQUMsTUFBTSxDQUFDLDJIQUEySCxDQUFDLENBQUM7UUFDekksSUFBSSxDQUFDLE1BQU0sQ0FBQyxtSEFBbUgsQ0FBQyxDQUFDO1FBQ2pJLElBQUksQ0FBQyxNQUFNLENBQUMsMkhBQTJILENBQUMsQ0FBQztRQUN6SSxJQUFJLENBQUMsTUFBTSxDQUFDLDZIQUE2SCxDQUFDLENBQUM7UUFDM0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyw0S0FBNEssQ0FBQyxDQUFDO1FBRTFMLElBQUksQ0FBQyxNQUFNLENBQUMsc0xBQXNMLENBQUMsQ0FBQztJQUN0TSxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw4R0FBOEcsQ0FBQyxDQUFDO1FBRTVILElBQUksQ0FBQyxNQUFNLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsTUFBTSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUVGO0FBcENELDBEQW9DQyJ9
@@ -0,0 +1,48 @@
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 dunning_case_1 = __importDefault(require("./dunning-case"));
8
+ const types_1 = require("../types");
9
+ const DunningAttempt = utils_1.model
10
+ .define("dunning_attempt", {
11
+ id: utils_1.model.id().primaryKey(),
12
+ dunning_case: utils_1.model.belongsTo(() => dunning_case_1.default, {
13
+ mappedBy: "attempts",
14
+ }),
15
+ attempt_no: utils_1.model.number(),
16
+ started_at: utils_1.model.dateTime(),
17
+ finished_at: utils_1.model.dateTime().nullable(),
18
+ status: utils_1.model
19
+ .enum(types_1.DunningAttemptStatus)
20
+ .default(types_1.DunningAttemptStatus.PROCESSING),
21
+ error_code: utils_1.model.text().nullable(),
22
+ error_message: utils_1.model.text().nullable(),
23
+ payment_reference: utils_1.model.text().nullable(),
24
+ metadata: utils_1.model.json().nullable(),
25
+ })
26
+ .indexes([
27
+ {
28
+ on: ["dunning_case_id"],
29
+ },
30
+ {
31
+ on: ["attempt_no"],
32
+ },
33
+ {
34
+ on: ["status"],
35
+ },
36
+ {
37
+ on: ["started_at"],
38
+ },
39
+ {
40
+ on: ["finished_at"],
41
+ },
42
+ {
43
+ on: ["dunning_case_id", "attempt_no"],
44
+ unique: true,
45
+ },
46
+ ]);
47
+ exports.default = DunningAttempt;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVubmluZy1hdHRlbXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZHVubmluZy9tb2RlbHMvZHVubmluZy1hdHRlbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQWlEO0FBQ2pELGtFQUF3QztBQUN4QyxvQ0FBK0M7QUFFL0MsTUFBTSxjQUFjLEdBQUcsYUFBSztLQUN6QixNQUFNLENBQUMsaUJBQWlCLEVBQUU7SUFDekIsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsWUFBWSxFQUFFLGFBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQVcsRUFBRTtRQUMvQyxRQUFRLEVBQUUsVUFBVTtLQUNyQixDQUFDO0lBQ0YsVUFBVSxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUU7SUFDMUIsVUFBVSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUU7SUFDNUIsV0FBVyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsTUFBTSxFQUFFLGFBQUs7U0FDVixJQUFJLENBQUMsNEJBQW9CLENBQUM7U0FDMUIsT0FBTyxDQUFDLDRCQUFvQixDQUFDLFVBQVUsQ0FBQztJQUMzQyxVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxhQUFhLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN0QyxpQkFBaUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzFDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2xDLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQ3hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUNmO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQztLQUNwQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxJQUFJO0tBQ2I7Q0FDRixDQUFDLENBQUE7QUFFSixrQkFBZSxjQUFjLENBQUEifQ==
@@ -0,0 +1,61 @@
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 dunning_attempt_1 = __importDefault(require("./dunning-attempt"));
8
+ const types_1 = require("../types");
9
+ const DunningCase = utils_1.model
10
+ .define("dunning_case", {
11
+ id: utils_1.model.id().primaryKey(),
12
+ subscription_id: utils_1.model.text(),
13
+ renewal_cycle_id: utils_1.model.text(),
14
+ renewal_order_id: utils_1.model.text().nullable(),
15
+ status: utils_1.model.enum(types_1.DunningCaseStatus).default(types_1.DunningCaseStatus.OPEN),
16
+ attempt_count: utils_1.model.number().default(0),
17
+ max_attempts: utils_1.model.number(),
18
+ retry_schedule: utils_1.model.json().nullable(),
19
+ next_retry_at: utils_1.model.dateTime().nullable(),
20
+ last_payment_error_code: utils_1.model.text().nullable(),
21
+ last_payment_error_message: utils_1.model.text().nullable(),
22
+ last_attempt_at: utils_1.model.dateTime().nullable(),
23
+ recovered_at: utils_1.model.dateTime().nullable(),
24
+ closed_at: utils_1.model.dateTime().nullable(),
25
+ recovery_reason: utils_1.model.text().nullable(),
26
+ attempts: utils_1.model.hasMany(() => dunning_attempt_1.default, {
27
+ mappedBy: "dunning_case",
28
+ }),
29
+ metadata: utils_1.model.json().nullable(),
30
+ })
31
+ .indexes([
32
+ {
33
+ on: ["subscription_id"],
34
+ },
35
+ {
36
+ on: ["renewal_cycle_id"],
37
+ },
38
+ {
39
+ on: ["renewal_order_id"],
40
+ },
41
+ {
42
+ on: ["status"],
43
+ },
44
+ {
45
+ on: ["next_retry_at"],
46
+ },
47
+ {
48
+ on: ["last_attempt_at"],
49
+ },
50
+ {
51
+ on: ["recovered_at"],
52
+ },
53
+ {
54
+ on: ["closed_at"],
55
+ },
56
+ {
57
+ on: ["status", "next_retry_at"],
58
+ },
59
+ ]);
60
+ exports.default = DunningCase;
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVubmluZy1jYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZHVubmluZy9tb2RlbHMvZHVubmluZy1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQWlEO0FBQ2pELHdFQUE4QztBQUM5QyxvQ0FBNEM7QUFFNUMsTUFBTSxXQUFXLEdBQUcsYUFBSztLQUN0QixNQUFNLENBQUMsY0FBYyxFQUFFO0lBQ3RCLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzdCLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDOUIsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN6QyxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx5QkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDckUsYUFBYSxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLFlBQVksRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQzVCLGNBQWMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLGFBQWEsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzFDLHVCQUF1QixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEQsMEJBQTBCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuRCxlQUFlLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QyxZQUFZLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN6QyxTQUFTLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN0QyxlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN4QyxRQUFRLEVBQUUsYUFBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBYyxFQUFFO1FBQzVDLFFBQVEsRUFBRSxjQUFjO0tBQ3pCLENBQUM7SUFDRixRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNsQyxDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1A7UUFDRSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztLQUN4QjtJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUM7S0FDekI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0tBQ3pCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUM7S0FDZjtJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQ3RCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztLQUN4QjtJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDO0tBQ3JCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDbEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUM7S0FDaEM7Q0FDRixDQUFDLENBQUE7QUFFSixrQkFBZSxXQUFXLENBQUEifQ==
@@ -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 dunning_attempt_1 = __importDefault(require("./models/dunning-attempt"));
8
+ const dunning_case_1 = __importDefault(require("./models/dunning-case"));
9
+ class DunningModuleService extends (0, utils_1.MedusaService)({
10
+ DunningCase: dunning_case_1.default,
11
+ DunningAttempt: dunning_attempt_1.default,
12
+ }) {
13
+ }
14
+ exports.default = DunningModuleService;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2R1bm5pbmcvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUF5RDtBQUN6RCwrRUFBcUQ7QUFDckQseUVBQStDO0FBRS9DLE1BQU0sb0JBQXFCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQy9DLFdBQVcsRUFBWCxzQkFBVztJQUNYLGNBQWMsRUFBZCx5QkFBYztDQUNmLENBQUM7Q0FBRztBQUVMLGtCQUFlLG9CQUFvQixDQUFBIn0=
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DunningAttemptStatus = exports.DunningCaseStatus = void 0;
4
+ var DunningCaseStatus;
5
+ (function (DunningCaseStatus) {
6
+ DunningCaseStatus["OPEN"] = "open";
7
+ DunningCaseStatus["RETRY_SCHEDULED"] = "retry_scheduled";
8
+ DunningCaseStatus["RETRYING"] = "retrying";
9
+ DunningCaseStatus["AWAITING_MANUAL_RESOLUTION"] = "awaiting_manual_resolution";
10
+ DunningCaseStatus["RECOVERED"] = "recovered";
11
+ DunningCaseStatus["UNRECOVERED"] = "unrecovered";
12
+ })(DunningCaseStatus || (exports.DunningCaseStatus = DunningCaseStatus = {}));
13
+ var DunningAttemptStatus;
14
+ (function (DunningAttemptStatus) {
15
+ DunningAttemptStatus["PROCESSING"] = "processing";
16
+ DunningAttemptStatus["SUCCEEDED"] = "succeeded";
17
+ DunningAttemptStatus["FAILED"] = "failed";
18
+ })(DunningAttemptStatus || (exports.DunningAttemptStatus = DunningAttemptStatus = {}));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kdW5uaW5nL3R5cGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQVksaUJBT1g7QUFQRCxXQUFZLGlCQUFpQjtJQUMzQixrQ0FBYSxDQUFBO0lBQ2Isd0RBQW1DLENBQUE7SUFDbkMsMENBQXFCLENBQUE7SUFDckIsOEVBQXlELENBQUE7SUFDekQsNENBQXVCLENBQUE7SUFDdkIsZ0RBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVBXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBTzVCO0FBRUQsSUFBWSxvQkFJWDtBQUpELFdBQVksb0JBQW9CO0lBQzlCLGlEQUF5QixDQUFBO0lBQ3pCLCtDQUF1QixDQUFBO0lBQ3ZCLHlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxvQkFBb0Isb0NBQXBCLG9CQUFvQixRQUkvQiJ9