@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,519 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rebuildAnalyticsDailySnapshotsStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const analytics_1 = require("../../modules/analytics");
7
+ const constants_1 = require("../../modules/analytics/constants");
8
+ const data_quality_1 = require("../../modules/analytics/utils/data-quality");
9
+ const observability_1 = require("../../modules/analytics/utils/observability");
10
+ const types_1 = require("../../modules/cancellation/types");
11
+ const types_2 = require("../../modules/activity-log/types");
12
+ const types_3 = require("../../modules/subscription/types");
13
+ function getQuery(container) {
14
+ return container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
15
+ }
16
+ function getLocking(container) {
17
+ return container.resolve(utils_1.Modules.LOCKING);
18
+ }
19
+ function toUtcDateKey(date) {
20
+ return date.toISOString().slice(0, 10);
21
+ }
22
+ function buildAnalyticsRangeLockKey(input) {
23
+ return `analytics:snapshots:range:${input.date_from.slice(0, 10)}:${input.date_to.slice(0, 10)}`;
24
+ }
25
+ function buildAnalyticsDayLockKey(dayStart) {
26
+ return `analytics:snapshots:${toUtcDateKey(dayStart)}`;
27
+ }
28
+ function toUtcDayStart(dayIso) {
29
+ return new Date(dayIso);
30
+ }
31
+ function toUtcDayEnd(dayStart) {
32
+ return new Date(Date.UTC(dayStart.getUTCFullYear(), dayStart.getUTCMonth(), dayStart.getUTCDate(), 23, 59, 59, 999));
33
+ }
34
+ function normalizeMonthlyRecurringValue(amount, interval, value) {
35
+ if (!Number.isFinite(amount) || !Number.isFinite(value) || value <= 0) {
36
+ return null;
37
+ }
38
+ if (interval === types_3.SubscriptionFrequencyInterval.WEEK) {
39
+ return Number(((amount * 52) / (12 * value)).toFixed(2));
40
+ }
41
+ if (interval === types_3.SubscriptionFrequencyInterval.MONTH) {
42
+ return Number((amount / value).toFixed(2));
43
+ }
44
+ return Number((amount / (12 * value)).toFixed(2));
45
+ }
46
+ function isDunningOpenAtDayEnd(dunningCase, dayEnd) {
47
+ const createdAt = new Date(dunningCase.created_at);
48
+ const recoveredAt = dunningCase.recovered_at
49
+ ? new Date(dunningCase.recovered_at)
50
+ : null;
51
+ const closedAt = dunningCase.closed_at ? new Date(dunningCase.closed_at) : null;
52
+ return (createdAt <= dayEnd &&
53
+ (!recoveredAt || recoveredAt > dayEnd) &&
54
+ (!closedAt || closedAt > dayEnd));
55
+ }
56
+ function resolveSubscriptionStatusForDay(subscription, latestLifecycleEvent, hasOpenDunningAtDayEnd, dayEnd) {
57
+ if (subscription.cancel_effective_at &&
58
+ new Date(subscription.cancel_effective_at) <= dayEnd) {
59
+ return types_3.SubscriptionStatus.CANCELLED;
60
+ }
61
+ if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_PAUSED) {
62
+ return types_3.SubscriptionStatus.PAUSED;
63
+ }
64
+ if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_CANCELED &&
65
+ subscription.cancel_effective_at &&
66
+ new Date(subscription.cancel_effective_at) > dayEnd) {
67
+ return latestLifecycleEvent.previous_state?.status ?? types_3.SubscriptionStatus.ACTIVE;
68
+ }
69
+ if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_RESUMED) {
70
+ return types_3.SubscriptionStatus.ACTIVE;
71
+ }
72
+ if (hasOpenDunningAtDayEnd) {
73
+ return types_3.SubscriptionStatus.PAST_DUE;
74
+ }
75
+ if (subscription.status === types_3.SubscriptionStatus.PAUSED &&
76
+ subscription.paused_at &&
77
+ new Date(subscription.paused_at) <= dayEnd) {
78
+ return types_3.SubscriptionStatus.PAUSED;
79
+ }
80
+ if (subscription.status === types_3.SubscriptionStatus.PAST_DUE) {
81
+ return types_3.SubscriptionStatus.PAST_DUE;
82
+ }
83
+ return types_3.SubscriptionStatus.ACTIVE;
84
+ }
85
+ async function listSubscriptionsForDay(container, dayEnd, batchSize, offset) {
86
+ const query = getQuery(container);
87
+ const result = await query.graph({
88
+ entity: "subscription",
89
+ fields: [
90
+ "id",
91
+ "customer_id",
92
+ "product_id",
93
+ "variant_id",
94
+ "status",
95
+ "frequency_interval",
96
+ "frequency_value",
97
+ "started_at",
98
+ "paused_at",
99
+ "cancel_effective_at",
100
+ ],
101
+ filters: {
102
+ started_at: {
103
+ $lte: dayEnd.toISOString(),
104
+ },
105
+ },
106
+ pagination: {
107
+ take: batchSize,
108
+ skip: offset,
109
+ order: {
110
+ id: "ASC",
111
+ },
112
+ },
113
+ });
114
+ return {
115
+ subscriptions: (result.data ?? []),
116
+ count: result.metadata?.count ?? 0,
117
+ limit: result.metadata?.take ?? batchSize,
118
+ offset: result.metadata?.skip ?? offset,
119
+ };
120
+ }
121
+ async function listLifecycleEvents(container, subscriptionIds, dayEnd) {
122
+ if (!subscriptionIds.length) {
123
+ return [];
124
+ }
125
+ const query = getQuery(container);
126
+ const result = await query.graph({
127
+ entity: "subscription_log",
128
+ fields: [
129
+ "subscription_id",
130
+ "event_type",
131
+ "created_at",
132
+ "previous_state",
133
+ ],
134
+ filters: {
135
+ subscription_id: subscriptionIds,
136
+ event_type: [
137
+ types_2.ActivityLogEventType.SUBSCRIPTION_PAUSED,
138
+ types_2.ActivityLogEventType.SUBSCRIPTION_RESUMED,
139
+ types_2.ActivityLogEventType.SUBSCRIPTION_CANCELED,
140
+ ],
141
+ created_at: {
142
+ $lte: dayEnd.toISOString(),
143
+ },
144
+ },
145
+ });
146
+ return (result.data ?? []);
147
+ }
148
+ async function listDunningCases(container, subscriptionIds, dayEnd) {
149
+ if (!subscriptionIds.length) {
150
+ return [];
151
+ }
152
+ const query = getQuery(container);
153
+ const result = await query.graph({
154
+ entity: "dunning_case",
155
+ fields: ["subscription_id", "created_at", "recovered_at", "closed_at"],
156
+ filters: {
157
+ subscription_id: subscriptionIds,
158
+ created_at: {
159
+ $lte: dayEnd.toISOString(),
160
+ },
161
+ },
162
+ });
163
+ return (result.data ?? []);
164
+ }
165
+ async function listChurnEvents(container, subscriptionIds, dayStart, dayEnd) {
166
+ if (!subscriptionIds.length) {
167
+ return [];
168
+ }
169
+ const query = getQuery(container);
170
+ const result = await query.graph({
171
+ entity: "cancellation_case",
172
+ fields: ["subscription_id", "reason_category", "final_outcome", "finalized_at"],
173
+ filters: {
174
+ subscription_id: subscriptionIds,
175
+ final_outcome: [types_1.CancellationFinalOutcome.CANCELED],
176
+ finalized_at: {
177
+ $gte: dayStart.toISOString(),
178
+ $lte: dayEnd.toISOString(),
179
+ },
180
+ },
181
+ });
182
+ return (result.data ?? []);
183
+ }
184
+ async function listSuccessfulRenewalCycles(container, subscriptionIds, dayEnd) {
185
+ if (!subscriptionIds.length) {
186
+ return [];
187
+ }
188
+ const query = getQuery(container);
189
+ const result = await query.graph({
190
+ entity: "renewal_cycle",
191
+ fields: ["subscription_id", "generated_order_id", "scheduled_for"],
192
+ filters: {
193
+ subscription_id: subscriptionIds,
194
+ status: ["succeeded"],
195
+ scheduled_for: {
196
+ $lte: dayEnd.toISOString(),
197
+ },
198
+ },
199
+ });
200
+ return (result.data ?? []).filter((cycle) => cycle.generated_order_id);
201
+ }
202
+ async function listOrders(container, orderIds) {
203
+ if (!orderIds.length) {
204
+ return [];
205
+ }
206
+ const query = getQuery(container);
207
+ const result = await query.graph({
208
+ entity: "order",
209
+ fields: ["id", "total", "currency_code"],
210
+ filters: {
211
+ id: orderIds,
212
+ },
213
+ });
214
+ return (result.data ?? []);
215
+ }
216
+ async function rebuildSingleDay(container, analyticsModule, input, dayIso) {
217
+ const dayStart = toUtcDayStart(dayIso);
218
+ const dayEnd = toUtcDayEnd(dayStart);
219
+ const batchSize = 100;
220
+ let offset = 0;
221
+ let processedSubscriptions = 0;
222
+ const rows = [];
223
+ while (true) {
224
+ const page = await listSubscriptionsForDay(container, dayEnd, batchSize, offset);
225
+ const subscriptions = page.subscriptions;
226
+ if (!subscriptions.length) {
227
+ break;
228
+ }
229
+ const subscriptionIds = subscriptions.map((subscription) => subscription.id);
230
+ const [lifecycleEvents, dunningCases, churnEvents, renewalCycles] = await Promise.all([
231
+ listLifecycleEvents(container, subscriptionIds, dayEnd),
232
+ listDunningCases(container, subscriptionIds, dayEnd),
233
+ listChurnEvents(container, subscriptionIds, dayStart, dayEnd),
234
+ listSuccessfulRenewalCycles(container, subscriptionIds, dayEnd),
235
+ ]);
236
+ const latestLifecycleEventBySubscription = new Map();
237
+ const openDunningBySubscription = new Map();
238
+ const churnBySubscription = new Map();
239
+ const latestRenewalBySubscription = new Map();
240
+ for (const event of lifecycleEvents) {
241
+ const existing = latestLifecycleEventBySubscription.get(event.subscription_id);
242
+ if (!existing ||
243
+ new Date(existing.created_at).getTime() < new Date(event.created_at).getTime()) {
244
+ latestLifecycleEventBySubscription.set(event.subscription_id, event);
245
+ }
246
+ }
247
+ for (const dunningCase of dunningCases) {
248
+ if (isDunningOpenAtDayEnd(dunningCase, dayEnd)) {
249
+ openDunningBySubscription.set(dunningCase.subscription_id, true);
250
+ }
251
+ }
252
+ for (const churnEvent of churnEvents) {
253
+ churnBySubscription.set(churnEvent.subscription_id, churnEvent);
254
+ }
255
+ for (const renewalCycle of renewalCycles) {
256
+ const existing = latestRenewalBySubscription.get(renewalCycle.subscription_id);
257
+ if (!existing ||
258
+ new Date(existing.scheduled_for).getTime() <
259
+ new Date(renewalCycle.scheduled_for).getTime()) {
260
+ latestRenewalBySubscription.set(renewalCycle.subscription_id, renewalCycle);
261
+ }
262
+ }
263
+ const orderIds = [...latestRenewalBySubscription.values()]
264
+ .map((cycle) => cycle.generated_order_id)
265
+ .filter((id) => Boolean(id));
266
+ const orders = await listOrders(container, orderIds);
267
+ const ordersById = new Map(orders.map((order) => [order.id, order]));
268
+ for (const subscription of subscriptions) {
269
+ const lifecycleEvent = latestLifecycleEventBySubscription.get(subscription.id) ?? null;
270
+ const derivedStatus = resolveSubscriptionStatusForDay(subscription, lifecycleEvent, openDunningBySubscription.get(subscription.id) ?? false, dayEnd);
271
+ const isActive = derivedStatus === types_3.SubscriptionStatus.ACTIVE;
272
+ const churnEvent = churnBySubscription.get(subscription.id) ?? null;
273
+ const latestRenewal = latestRenewalBySubscription.get(subscription.id) ?? null;
274
+ const latestOrder = latestRenewal?.generated_order_id
275
+ ? ordersById.get(latestRenewal.generated_order_id) ?? null
276
+ : null;
277
+ const orderTotal = latestOrder ? Number(latestOrder.total ?? 0) : null;
278
+ const mrrAmount = isActive && latestOrder && Number.isFinite(orderTotal)
279
+ ? normalizeMonthlyRecurringValue(orderTotal, subscription.frequency_interval, subscription.frequency_value)
280
+ : null;
281
+ rows.push({
282
+ metric_date: dayStart,
283
+ subscription_id: subscription.id,
284
+ customer_id: subscription.customer_id,
285
+ product_id: subscription.product_id,
286
+ variant_id: subscription.variant_id,
287
+ status: derivedStatus,
288
+ frequency_interval: subscription.frequency_interval,
289
+ frequency_value: subscription.frequency_value,
290
+ currency_code: latestOrder?.currency_code ?? null,
291
+ is_active: isActive,
292
+ active_subscriptions_count: isActive ? 1 : 0,
293
+ mrr_amount: mrrAmount,
294
+ churned_subscriptions_count: churnEvent ? 1 : 0,
295
+ churn_reason_category: churnEvent?.reason_category ?? null,
296
+ source_snapshot: {
297
+ lifecycle_event_type: lifecycleEvent?.event_type ?? null,
298
+ dunning_open_at_day_end: openDunningBySubscription.get(subscription.id) ?? false,
299
+ renewal_order_id: latestRenewal?.generated_order_id ?? null,
300
+ revenue_source: latestOrder ? "latest_successful_renewal_order" : "unavailable",
301
+ churn_source: churnEvent ? "cancellation_case" : null,
302
+ },
303
+ metadata: {
304
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
305
+ trigger_type: input.trigger_type,
306
+ correlation_id: input.correlation_id,
307
+ reason: input.reason,
308
+ },
309
+ });
310
+ }
311
+ processedSubscriptions += subscriptions.length;
312
+ offset += page.limit;
313
+ if (offset >= page.count) {
314
+ break;
315
+ }
316
+ }
317
+ const previousRows = (await analyticsModule.listSubscriptionMetricsDailies({
318
+ metric_date: dayStart,
319
+ }));
320
+ let deletedExistingRows = false;
321
+ try {
322
+ if (previousRows.length) {
323
+ await analyticsModule.deleteSubscriptionMetricsDailies(previousRows.map((row) => row.id));
324
+ deletedExistingRows = true;
325
+ }
326
+ if (rows.length) {
327
+ await analyticsModule.createSubscriptionMetricsDailies(rows);
328
+ }
329
+ return {
330
+ processed_subscriptions: processedSubscriptions,
331
+ upserted_rows: rows.length,
332
+ skipped_rows: 0,
333
+ failed: false,
334
+ quality_snapshot: {
335
+ metric_date: dayStart.toISOString(),
336
+ processed_subscriptions: processedSubscriptions,
337
+ snapshot_rows: rows.length,
338
+ active_subscriptions_count: rows.reduce((sum, row) => sum + row.active_subscriptions_count, 0),
339
+ churned_subscriptions_count: rows.reduce((sum, row) => sum + row.churned_subscriptions_count, 0),
340
+ mrr_amount: rows.length > 0
341
+ ? Number(rows.reduce((sum, row) => sum + Number(row.mrr_amount ?? 0), 0).toFixed(2))
342
+ : null,
343
+ },
344
+ };
345
+ }
346
+ catch (error) {
347
+ if (deletedExistingRows && previousRows.length) {
348
+ try {
349
+ await analyticsModule.createSubscriptionMetricsDailies(previousRows);
350
+ }
351
+ catch {
352
+ // Ignore restore failure here; the calling workflow will surface the original failure.
353
+ }
354
+ }
355
+ throw error;
356
+ }
357
+ }
358
+ exports.rebuildAnalyticsDailySnapshotsStep = (0, workflows_sdk_1.createStep)("rebuild-analytics-daily-snapshots", async function (input, { container }) {
359
+ const logger = container.resolve("logger");
360
+ const analyticsModule = container.resolve(analytics_1.ANALYTICS_MODULE);
361
+ const locking = getLocking(container);
362
+ const startedAt = Date.now();
363
+ let processedSubscriptions = 0;
364
+ let upsertedRows = 0;
365
+ const blockedDays = [];
366
+ const failedDays = [];
367
+ const qualitySnapshots = [];
368
+ (0, observability_1.logAnalyticsEvent)(logger, "info", {
369
+ event: "analytics.rebuild",
370
+ outcome: "started",
371
+ correlation_id: input.correlation_id,
372
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
373
+ trigger_type: input.trigger_type,
374
+ reason: input.reason,
375
+ date_from: input.date_from,
376
+ date_to: input.date_to,
377
+ processed_days: 0,
378
+ processed_subscriptions: 0,
379
+ upserted_rows: 0,
380
+ failure_count: 0,
381
+ blocked_count: 0,
382
+ message: "Analytics rebuild started",
383
+ });
384
+ try {
385
+ await locking.execute(buildAnalyticsRangeLockKey(input), async () => {
386
+ for (const dayIso of input.normalized_days) {
387
+ const dayStart = toUtcDayStart(dayIso);
388
+ try {
389
+ const summary = await locking.execute(buildAnalyticsDayLockKey(dayStart), async () => rebuildSingleDay(container, analyticsModule, input, dayIso), {
390
+ timeout: 1,
391
+ });
392
+ processedSubscriptions += summary.processed_subscriptions;
393
+ upsertedRows += summary.upserted_rows;
394
+ qualitySnapshots.push(summary.quality_snapshot);
395
+ }
396
+ catch (error) {
397
+ const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
398
+ if (failureKind === "lock_timeout") {
399
+ blockedDays.push(dayIso);
400
+ }
401
+ else {
402
+ failedDays.push(dayIso);
403
+ }
404
+ }
405
+ }
406
+ }, {
407
+ timeout: 1,
408
+ });
409
+ }
410
+ catch (error) {
411
+ const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
412
+ if (failureKind === "lock_timeout") {
413
+ blockedDays.push(...input.normalized_days);
414
+ }
415
+ else {
416
+ failedDays.push(...input.normalized_days);
417
+ }
418
+ }
419
+ const processedDays = input.normalized_days.length - failedDays.length - blockedDays.length;
420
+ const quality = (0, data_quality_1.evaluateAnalyticsQualityForRange)(qualitySnapshots);
421
+ const qualityErrorCount = quality.findings.filter((entry) => entry.severity === "error").length;
422
+ const qualityWarningCount = quality.findings.filter((entry) => entry.severity === "warn").length;
423
+ if (quality.findings.length) {
424
+ for (const finding of quality.findings) {
425
+ (0, observability_1.logAnalyticsEvent)(logger, finding.severity === "error" ? "error" : "warn", {
426
+ event: "analytics.quality",
427
+ outcome: "completed",
428
+ correlation_id: input.correlation_id,
429
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
430
+ trigger_type: input.trigger_type,
431
+ reason: input.reason,
432
+ date_from: input.date_from,
433
+ date_to: input.date_to,
434
+ quality_issue_count: quality.finding_count,
435
+ quality_error_count: qualityErrorCount,
436
+ quality_warning_count: qualityWarningCount,
437
+ message: finding.message,
438
+ metadata: {
439
+ ...finding,
440
+ },
441
+ });
442
+ }
443
+ }
444
+ else {
445
+ (0, observability_1.logAnalyticsEvent)(logger, "info", {
446
+ event: "analytics.quality",
447
+ outcome: "completed",
448
+ correlation_id: input.correlation_id,
449
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
450
+ trigger_type: input.trigger_type,
451
+ reason: input.reason,
452
+ date_from: input.date_from,
453
+ date_to: input.date_to,
454
+ quality_issue_count: 0,
455
+ quality_error_count: 0,
456
+ quality_warning_count: 0,
457
+ message: "Analytics quality checks completed without findings",
458
+ });
459
+ }
460
+ const durationMs = Date.now() - startedAt;
461
+ const alertable = failedDays.length > 0 ||
462
+ blockedDays.length > 0 ||
463
+ qualityErrorCount > 0 ||
464
+ (0, observability_1.isSlowAnalyticsRebuild)(durationMs);
465
+ (0, observability_1.logAnalyticsEvent)(logger, (0, observability_1.getAnalyticsRebuildLogLevel)({
466
+ duration_ms: durationMs,
467
+ failed_days_count: failedDays.length,
468
+ blocked_days_count: blockedDays.length,
469
+ quality_error_count: qualityErrorCount,
470
+ quality_warning_count: qualityWarningCount,
471
+ }), {
472
+ event: "analytics.rebuild",
473
+ outcome: failedDays.length > 0
474
+ ? "failed"
475
+ : blockedDays.length > 0
476
+ ? "blocked"
477
+ : "completed",
478
+ correlation_id: input.correlation_id,
479
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
480
+ trigger_type: input.trigger_type,
481
+ reason: input.reason,
482
+ duration_ms: durationMs,
483
+ date_from: input.date_from,
484
+ date_to: input.date_to,
485
+ processed_days: processedDays,
486
+ processed_subscriptions: processedSubscriptions,
487
+ upserted_rows: upsertedRows,
488
+ blocked_count: blockedDays.length,
489
+ failure_count: failedDays.length,
490
+ blocked_days: blockedDays,
491
+ failed_days: failedDays,
492
+ quality_issue_count: quality.finding_count,
493
+ quality_error_count: qualityErrorCount,
494
+ quality_warning_count: qualityWarningCount,
495
+ alertable,
496
+ failure_kind: failedDays.length > 0
497
+ ? "unexpected_error"
498
+ : blockedDays.length > 0
499
+ ? "lock_timeout"
500
+ : undefined,
501
+ message: failedDays.length > 0
502
+ ? (0, observability_1.getAnalyticsErrorMessage)(new Error("Analytics rebuild completed with failed days"))
503
+ : blockedDays.length > 0
504
+ ? "Analytics rebuild completed with blocked days"
505
+ : (0, observability_1.isSlowAnalyticsRebuild)(durationMs)
506
+ ? "Analytics rebuild completed slowly"
507
+ : "Analytics rebuild completed",
508
+ });
509
+ return new workflows_sdk_1.StepResponse({
510
+ ...input,
511
+ processed_days: processedDays,
512
+ processed_subscriptions: processedSubscriptions,
513
+ upserted_rows: upsertedRows,
514
+ skipped_rows: blockedDays.length,
515
+ blocked_days: blockedDays,
516
+ failed_days: failedDays,
517
+ });
518
+ });
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVidWlsZC1hbmFseXRpY3MtZGFpbHktc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZWJ1aWxkLWFuYWx5dGljcy1kYWlseS1zbmFwc2hvdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBRTVFLHFEQUE4RTtBQUM5RSx1REFFZ0M7QUFFaEMsaUVBQTZFO0FBQzdFLDZFQUE2RjtBQUM3RiwrRUFNb0Q7QUFDcEQsNERBR3lDO0FBQ3pDLDREQUV5QztBQUN6Qyw0REFHeUM7QUFzSHpDLFNBQVMsUUFBUSxDQUFDLFNBQTBCO0lBQzFDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBWSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsU0FBMEI7SUFDNUMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFpQixlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQVU7SUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN4QyxDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxLQUErQztJQUNqRixPQUFPLDZCQUE2QixLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDbEcsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsUUFBYztJQUM5QyxPQUFPLHVCQUF1QixZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtBQUN4RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxPQUFPLElBQUks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
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rejectRenewalChangesStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const subscription_1 = require("../../modules/subscription");
6
+ const renewal_1 = require("../../modules/renewal");
7
+ const types_1 = require("../../modules/renewal/types");
8
+ const shared_renewal_approval_1 = require("./shared-renewal-approval");
9
+ exports.rejectRenewalChangesStep = (0, workflows_sdk_1.createStep)("reject-renewal-changes", async function (input, { container }) {
10
+ const cycle = await (0, shared_renewal_approval_1.getRenewalCycleApprovalRecord)(container, input.renewal_cycle_id);
11
+ (0, shared_renewal_approval_1.validateRenewalApprovalTransition)(cycle, types_1.RenewalApprovalStatus.REJECTED);
12
+ const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
13
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
14
+ const decidedAt = new Date();
15
+ const subscription = await subscriptionModule.retrieveSubscription(cycle.subscription_id);
16
+ const updated = await renewalModule.updateRenewalCycles({
17
+ id: cycle.id,
18
+ approval_status: types_1.RenewalApprovalStatus.REJECTED,
19
+ approval_decided_at: decidedAt,
20
+ approval_decided_by: input.decided_by ?? null,
21
+ approval_reason: input.reason ?? null,
22
+ });
23
+ return new workflows_sdk_1.StepResponse({
24
+ current: updated,
25
+ previous: {
26
+ id: cycle.id,
27
+ subscription_id: cycle.subscription_id,
28
+ approval_status: cycle.approval_status,
29
+ approval_decided_at: cycle.approval_decided_at,
30
+ approval_decided_by: cycle.approval_decided_by,
31
+ approval_reason: cycle.approval_reason,
32
+ },
33
+ subscription: subscription,
34
+ }, {
35
+ id: cycle.id,
36
+ approval_status: cycle.approval_status,
37
+ approval_decided_at: cycle.approval_decided_at,
38
+ approval_decided_by: cycle.approval_decided_by,
39
+ approval_reason: cycle.approval_reason,
40
+ });
41
+ }, async function (previous, { container }) {
42
+ if (!previous) {
43
+ return;
44
+ }
45
+ const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
46
+ await renewalModule.updateRenewalCycles(previous);
47
+ });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVqZWN0LXJlbmV3YWwtY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmVqZWN0LXJlbmV3YWwtY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLG1EQUFzRDtBQUV0RCx1REFBbUU7QUFDbkUsdUVBR2tDO0FBbUJyQixRQUFBLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDaEQsd0JBQXdCLEVBQ3hCLEtBQUssV0FBVyxLQUFvQyxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSx1REFBNkIsRUFDL0MsU0FBUyxFQUNULEtBQUssQ0FBQyxnQkFBZ0IsQ0FDdkIsQ0FBQTtJQUVELElBQUEsMkRBQWlDLEVBQUMsS0FBSyxFQUFFLDZCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXhFLE1BQU0sYUFBYSxHQUNqQixTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUFjLENBQXlCLENBQUE7SUFDM0QsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsb0JBQW9CLENBQ2hFLEtBQUssQ0FBQyxlQUFlLENBQ3RCLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztRQUN0RCxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixlQUFlLEVBQUUsNkJBQXFCLENBQUMsUUFBUTtRQUMvQyxtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSTtRQUM3QyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJO0tBQ3RDLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUlyQjtRQUNFLE9BQU8sRUFBRSxPQUFjO1FBQ3ZCLFFBQVEsRUFBRTtZQUNSLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNaLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtTQUN2QztRQUNELFlBQVksRUFBRSxZQUFtQjtLQUNsQyxFQUNEO1FBQ0UsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ1osZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1FBQ3RDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7S0FDdkMsQ0FDRixDQUFBO0FBQ0gsQ0FBQyxFQUNELEtBQUssV0FBVyxRQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQ3ZFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQ2pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsd0JBQWMsQ0FBeUIsQ0FBQTtJQUUzRCxNQUFNLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNuRCxDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resumeSubscriptionStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const subscription_1 = require("../../modules/subscription");
6
+ const types_1 = require("../../modules/subscription/types");
7
+ const errors_1 = require("../../modules/subscription/utils/errors");
8
+ const pause_subscription_1 = require("./pause-subscription");
9
+ exports.resumeSubscriptionStep = (0, workflows_sdk_1.createStep)("resume-subscription", async function (input, { container }) {
10
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
11
+ const subscription = await subscriptionModuleService.retrieveSubscription(input.id);
12
+ if (subscription.status !== types_1.SubscriptionStatus.PAUSED) {
13
+ throw errors_1.subscriptionErrors.invalidState(input.id, "be resumed", subscription.status);
14
+ }
15
+ const nextRenewalAt = input.resume_at
16
+ ? new Date(input.resume_at)
17
+ : input.preserve_billing_anchor
18
+ ? subscription.next_renewal_at
19
+ : subscription.next_renewal_at ?? new Date();
20
+ const updated = await subscriptionModuleService.updateSubscriptions({
21
+ id: input.id,
22
+ status: types_1.SubscriptionStatus.ACTIVE,
23
+ paused_at: null,
24
+ next_renewal_at: nextRenewalAt,
25
+ metadata: {
26
+ ...(subscription.metadata ?? {}),
27
+ resume_context: {
28
+ resume_at: input.resume_at ?? null,
29
+ preserve_billing_anchor: input.preserve_billing_anchor ?? false,
30
+ triggered_by: input.triggered_by ?? null,
31
+ },
32
+ },
33
+ });
34
+ return new workflows_sdk_1.StepResponse({
35
+ current: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(updated),
36
+ previous: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription),
37
+ }, (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription));
38
+ }, async function (subscription, { container }) {
39
+ if (!subscription) {
40
+ return;
41
+ }
42
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
43
+ await subscriptionModuleService.updateSubscriptions((0, pause_subscription_1.asSubscriptionUpdateInput)(subscription));
44
+ });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLXN1YnNjcmlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmVzdW1lLXN1YnNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLDREQUFxRTtBQUNyRSxvRUFBNEU7QUFDNUUsNkRBSzZCO0FBU2hCLFFBQUEsc0JBQXNCLEdBQUcsSUFBQSwwQkFBVSxFQUM5QyxxQkFBcUIsRUFDckIsS0FBSyxXQUFXLEtBQWtDLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDL0QsTUFBTSx5QkFBeUIsR0FDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFBO0lBRXhDLE1BQU0sWUFBWSxHQUFHLE1BQU0seUJBQXlCLENBQUMsb0JBQW9CLENBQ3ZFLEtBQUssQ0FBQyxFQUFFLENBQ1QsQ0FBQTtJQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSywwQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCxNQUFNLDJCQUFrQixDQUFDLFlBQVksQ0FDbkMsS0FBSyxDQUFDLEVBQUUsRUFDUixZQUFZLEVBQ1osWUFBWSxDQUFDLE1BQU0sQ0FDcEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUztRQUNuQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QjtZQUMvQixDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWU7WUFDOUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUU5QyxNQUFNLE9BQU8sR0FBRyxNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO1FBQ2xFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUNaLE1BQU0sRUFBRSwwQkFBa0IsQ0FBQyxNQUFNO1FBQ2pDLFNBQVMsRUFBRSxJQUFJO1FBQ2YsZUFBZSxFQUFFLGFBQWE7UUFDOUIsUUFBUSxFQUFFO1lBQ1IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2hDLGNBQWMsRUFBRTtnQkFDZCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJO2dCQUNsQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCLElBQUksS0FBSztnQkFDL0QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTthQUN6QztTQUNGO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLDRCQUFZLENBQ3JCO1FBQ0UsT0FBTyxFQUFFLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1FBQzlDLFFBQVEsRUFBRSxJQUFBLGlEQUE0QixFQUFDLFlBQVksQ0FBQztLQUNyRCxFQUNELElBQUEsaURBQTRCLEVBQUMsWUFBWSxDQUFDLENBQzNDLENBQUE7QUFDSCxDQUFDLEVBQ0QsS0FBSyxXQUFXLFlBQXdDLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDckUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSx5QkFBeUIsR0FDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFBO0lBRXhDLE1BQU0seUJBQXlCLENBQUMsbUJBQW1CLENBQ2pELElBQUEsOENBQXlCLEVBQUMsWUFBWSxDQUFDLENBQ3hDLENBQUE7QUFDSCxDQUFDLENBQ0YsQ0FBQSJ9