@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,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scheduleSubscriptionPlanChangeStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const effective_config_1 = require("../../modules/plan-offer/utils/effective-config");
7
+ const subscription_1 = require("../../modules/subscription");
8
+ const types_1 = require("../../modules/subscription/types");
9
+ const errors_1 = require("../../modules/subscription/utils/errors");
10
+ const pause_subscription_1 = require("./pause-subscription");
11
+ exports.scheduleSubscriptionPlanChangeStep = (0, workflows_sdk_1.createStep)("schedule-subscription-plan-change", async function (input, { container }) {
12
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
13
+ const subscription = await subscriptionModuleService.retrieveSubscription(input.id);
14
+ if (subscription.status !== types_1.SubscriptionStatus.ACTIVE &&
15
+ subscription.status !== types_1.SubscriptionStatus.PAUSED &&
16
+ subscription.status !== types_1.SubscriptionStatus.PAST_DUE) {
17
+ throw errors_1.subscriptionErrors.invalidState(input.id, "schedule a plan change", subscription.status);
18
+ }
19
+ if (input.frequency_value <= 0) {
20
+ throw errors_1.subscriptionErrors.invalidData("frequency_value must be greater than 0");
21
+ }
22
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
23
+ const { data: variants } = await query.graph({
24
+ entity: "variant",
25
+ fields: ["id", "title", "sku", "product.id", "product.title"],
26
+ filters: {
27
+ id: [input.variant_id],
28
+ },
29
+ });
30
+ const variant = variants[0];
31
+ if (!variant) {
32
+ throw errors_1.subscriptionErrors.notFound("Variant", input.variant_id);
33
+ }
34
+ if (variant.product?.id !== subscription.product_id) {
35
+ throw errors_1.subscriptionErrors.planChangeVariantMismatch(input.variant_id, subscription.product_id);
36
+ }
37
+ const effectiveConfig = await (0, effective_config_1.resolveProductSubscriptionConfig)(container, {
38
+ product_id: subscription.product_id,
39
+ variant_id: variant.id,
40
+ });
41
+ if (!effectiveConfig.is_enabled) {
42
+ throw errors_1.subscriptionErrors.planChangeNotAllowed(subscription.product_id, variant.id);
43
+ }
44
+ const isAllowedFrequency = effectiveConfig.allowed_frequencies.some((frequency) => String(frequency.interval) === input.frequency_interval &&
45
+ frequency.value === input.frequency_value);
46
+ if (!isAllowedFrequency) {
47
+ throw errors_1.subscriptionErrors.planChangeFrequencyNotAllowed(input.frequency_interval, input.frequency_value);
48
+ }
49
+ const requestedAt = new Date().toISOString();
50
+ const updated = await subscriptionModuleService.updateSubscriptions({
51
+ id: input.id,
52
+ pending_update_data: {
53
+ variant_id: variant.id,
54
+ variant_title: variant.title,
55
+ sku: variant.sku ?? null,
56
+ frequency_interval: input.frequency_interval,
57
+ frequency_value: input.frequency_value,
58
+ effective_at: input.effective_at ?? null,
59
+ requested_at: requestedAt,
60
+ requested_by: input.requested_by ?? null,
61
+ },
62
+ metadata: {
63
+ ...(subscription.metadata ?? {}),
64
+ scheduled_plan_change_context: {
65
+ requested_at: requestedAt,
66
+ requested_by: input.requested_by ?? null,
67
+ },
68
+ },
69
+ });
70
+ return new workflows_sdk_1.StepResponse({
71
+ current: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(updated),
72
+ previous: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription),
73
+ }, (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription));
74
+ }, async function (subscription, { container }) {
75
+ if (!subscription) {
76
+ return;
77
+ }
78
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
79
+ await subscriptionModuleService.updateSubscriptions((0, pause_subscription_1.asSubscriptionUpdateInput)(subscription));
80
+ });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtc3Vic2NyaXB0aW9uLXBsYW4tY2hhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zY2hlZHVsZS1zdWJzY3JpcHRpb24tcGxhbi1jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXFFO0FBQ3JFLHFFQUE0RTtBQUM1RSxzRkFBa0c7QUFDbEcsNkRBQWdFO0FBRWhFLDREQUFvRztBQUNwRyxvRUFBNEU7QUFDNUUsNkRBSzZCO0FBV2hCLFFBQUEsa0NBQWtDLEdBQUcsSUFBQSwwQkFBVSxFQUMxRCxtQ0FBbUMsRUFDbkMsS0FBSyxXQUNILEtBQThDLEVBQzlDLEVBQUUsU0FBUyxFQUFFO0lBRWIsTUFBTSx5QkFBeUIsR0FDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFBO0lBRXhDLE1BQU0sWUFBWSxHQUFHLE1BQU0seUJBQXlCLENBQUMsb0JBQW9CLENBQ3ZFLEtBQUssQ0FBQyxFQUFFLENBQ1QsQ0FBQTtJQUVELElBQ0UsWUFBWSxDQUFDLE1BQU0sS0FBSywwQkFBa0IsQ0FBQyxNQUFNO1FBQ2pELFlBQVksQ0FBQyxNQUFNLEtBQUssMEJBQWtCLENBQUMsTUFBTTtRQUNqRCxZQUFZLENBQUMsTUFBTSxLQUFLLDBCQUFrQixDQUFDLFFBQVEsRUFDbkQsQ0FBQztRQUNELE1BQU0sMkJBQWtCLENBQUMsWUFBWSxDQUNuQyxLQUFLLENBQUMsRUFBRSxFQUNSLHdCQUF3QixFQUN4QixZQUFZLENBQUMsTUFBTSxDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLDJCQUFrQixDQUFDLFdBQVcsQ0FDbEMsd0NBQXdDLENBQ3pDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FB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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNhbmNlbGxhdGlvbi1sb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3NoYXJlZC1jYW5jZWxsYXRpb24tbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertPlanOfferTargetExists = assertPlanOfferTargetExists;
4
+ exports.findPlanOfferByTarget = findPlanOfferByTarget;
5
+ exports.getPlanOfferRecordById = getPlanOfferRecordById;
6
+ exports.normalizePlanOfferPayload = normalizePlanOfferPayload;
7
+ exports.getPlanOfferId = getPlanOfferId;
8
+ exports.toUpdatePlanOfferServiceInput = toUpdatePlanOfferServiceInput;
9
+ const utils_1 = require("@medusajs/framework/utils");
10
+ const types_1 = require("../../modules/plan-offer/types");
11
+ const errors_1 = require("../../modules/plan-offer/utils/errors");
12
+ const planOfferFields = [
13
+ "id",
14
+ "name",
15
+ "scope",
16
+ "product_id",
17
+ "variant_id",
18
+ "is_enabled",
19
+ "allowed_frequencies",
20
+ "frequency_intervals",
21
+ "discount_per_frequency",
22
+ "rules",
23
+ "metadata",
24
+ ];
25
+ function assertPositiveInteger(value, field) {
26
+ if (!Number.isInteger(value) || value <= 0) {
27
+ throw errors_1.planOfferErrors.invalidFrequencyMix(`'${field}' must be a positive integer`);
28
+ }
29
+ }
30
+ function validateTarget(input) {
31
+ if (normalizeScope(input.scope) === types_1.PlanOfferScope.PRODUCT) {
32
+ if (input.variant_id) {
33
+ throw errors_1.planOfferErrors.productScopeDisallowsVariantId();
34
+ }
35
+ return;
36
+ }
37
+ if (!input.variant_id) {
38
+ throw errors_1.planOfferErrors.variantScopeRequiresVariantId();
39
+ }
40
+ }
41
+ function normalizeScope(scope) {
42
+ switch (scope) {
43
+ case "variant":
44
+ case types_1.PlanOfferScope.VARIANT:
45
+ return types_1.PlanOfferScope.VARIANT;
46
+ case "product":
47
+ case types_1.PlanOfferScope.PRODUCT:
48
+ return types_1.PlanOfferScope.PRODUCT;
49
+ }
50
+ }
51
+ function normalizeFrequencyInterval(interval) {
52
+ switch (interval) {
53
+ case "week":
54
+ case types_1.PlanOfferFrequencyInterval.WEEK:
55
+ return types_1.PlanOfferFrequencyInterval.WEEK;
56
+ case "month":
57
+ case types_1.PlanOfferFrequencyInterval.MONTH:
58
+ return types_1.PlanOfferFrequencyInterval.MONTH;
59
+ case "year":
60
+ case types_1.PlanOfferFrequencyInterval.YEAR:
61
+ return types_1.PlanOfferFrequencyInterval.YEAR;
62
+ }
63
+ }
64
+ function normalizeDiscountType(type) {
65
+ switch (type) {
66
+ case "fixed":
67
+ case types_1.PlanOfferDiscountType.FIXED:
68
+ return types_1.PlanOfferDiscountType.FIXED;
69
+ case "percentage":
70
+ case types_1.PlanOfferDiscountType.PERCENTAGE:
71
+ return types_1.PlanOfferDiscountType.PERCENTAGE;
72
+ }
73
+ }
74
+ function normalizeStackingPolicy(stackingPolicy) {
75
+ switch (stackingPolicy) {
76
+ case "allowed":
77
+ case types_1.PlanOfferStackingPolicy.ALLOWED:
78
+ return types_1.PlanOfferStackingPolicy.ALLOWED;
79
+ case "disallow_all":
80
+ case types_1.PlanOfferStackingPolicy.DISALLOW_ALL:
81
+ return types_1.PlanOfferStackingPolicy.DISALLOW_ALL;
82
+ case "disallow_subscription_discounts":
83
+ case types_1.PlanOfferStackingPolicy.DISALLOW_SUBSCRIPTION_DISCOUNTS:
84
+ return types_1.PlanOfferStackingPolicy.DISALLOW_SUBSCRIPTION_DISCOUNTS;
85
+ }
86
+ }
87
+ function normalizeAllowedFrequencies(allowedFrequencies) {
88
+ if (!allowedFrequencies.length) {
89
+ throw errors_1.planOfferErrors.allowedFrequenciesRequired();
90
+ }
91
+ const seen = new Set();
92
+ return allowedFrequencies.map((frequency) => {
93
+ assertPositiveInteger(frequency.value, `allowed_frequencies.${frequency.interval}.value`);
94
+ const key = `${frequency.interval}:${frequency.value}`;
95
+ if (seen.has(key)) {
96
+ throw errors_1.planOfferErrors.duplicateFrequency(String(frequency.interval), frequency.value);
97
+ }
98
+ seen.add(key);
99
+ return {
100
+ interval: normalizeFrequencyInterval(frequency.interval),
101
+ value: frequency.value,
102
+ };
103
+ });
104
+ }
105
+ function normalizeDiscounts(discounts, allowedFrequencies) {
106
+ if (!discounts?.length) {
107
+ return [];
108
+ }
109
+ const allowedFrequencyKeys = new Set(allowedFrequencies.map((frequency) => `${frequency.interval}:${frequency.value}`));
110
+ const seen = new Set();
111
+ return discounts.map((discount) => {
112
+ assertPositiveInteger(discount.frequency_value, `discounts.${discount.interval}.frequency_value`);
113
+ const frequencyKey = `${discount.interval}:${discount.frequency_value}`;
114
+ if (!allowedFrequencyKeys.has(frequencyKey)) {
115
+ throw errors_1.planOfferErrors.discountFrequencyNotAllowed(String(discount.interval), discount.frequency_value);
116
+ }
117
+ if (seen.has(frequencyKey)) {
118
+ throw errors_1.planOfferErrors.duplicateDiscountForFrequency(String(discount.interval), discount.frequency_value);
119
+ }
120
+ seen.add(frequencyKey);
121
+ if (normalizeDiscountType(discount.type) === types_1.PlanOfferDiscountType.PERCENTAGE) {
122
+ if (discount.value <= 0 || discount.value > 100) {
123
+ throw errors_1.planOfferErrors.discountOutOfRange("Percentage discounts must be greater than 0 and at most 100");
124
+ }
125
+ }
126
+ else if (discount.value <= 0) {
127
+ throw errors_1.planOfferErrors.discountOutOfRange("Fixed discounts must be greater than 0");
128
+ }
129
+ return {
130
+ interval: normalizeFrequencyInterval(discount.interval),
131
+ value: discount.frequency_value,
132
+ discount_type: normalizeDiscountType(discount.type),
133
+ discount_value: discount.value,
134
+ };
135
+ });
136
+ }
137
+ function normalizeRules(rules) {
138
+ if (rules === undefined || rules === null) {
139
+ return null;
140
+ }
141
+ if (rules.minimum_cycles !== null && rules.minimum_cycles !== undefined) {
142
+ assertPositiveInteger(rules.minimum_cycles, "rules.minimum_cycles");
143
+ }
144
+ if (!rules.trial_enabled) {
145
+ if (rules.trial_days !== null && rules.trial_days !== undefined) {
146
+ throw errors_1.planOfferErrors.invalidTrialConfiguration("'rules.trial_days' must be null when trial is disabled");
147
+ }
148
+ }
149
+ else {
150
+ if (rules.trial_days === null || rules.trial_days === undefined) {
151
+ throw errors_1.planOfferErrors.invalidTrialConfiguration("'rules.trial_days' is required when trial is enabled");
152
+ }
153
+ assertPositiveInteger(rules.trial_days, "rules.trial_days");
154
+ }
155
+ return {
156
+ minimum_cycles: rules.minimum_cycles ?? null,
157
+ trial_enabled: rules.trial_enabled,
158
+ trial_days: rules.trial_days ?? null,
159
+ stacking_policy: normalizeStackingPolicy(rules.stacking_policy),
160
+ };
161
+ }
162
+ async function assertPlanOfferTargetExists(container, input) {
163
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
164
+ const { data } = await query.graph({
165
+ entity: "product",
166
+ fields: ["id", "variants.id"],
167
+ filters: {
168
+ id: [input.product_id],
169
+ },
170
+ });
171
+ const product = data[0];
172
+ if (!product) {
173
+ throw errors_1.planOfferErrors.productNotFound(input.product_id);
174
+ }
175
+ if (normalizeScope(input.scope) === types_1.PlanOfferScope.VARIANT) {
176
+ const variantId = input.variant_id;
177
+ if (!product.variants?.some((variant) => variant.id === variantId)) {
178
+ throw errors_1.planOfferErrors.variantDoesNotBelongToProduct(variantId, input.product_id);
179
+ }
180
+ }
181
+ }
182
+ async function findPlanOfferByTarget(container, input) {
183
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
184
+ const filters = normalizeScope(input.scope) === types_1.PlanOfferScope.PRODUCT
185
+ ? {
186
+ scope: types_1.PlanOfferScope.PRODUCT,
187
+ product_id: input.product_id,
188
+ }
189
+ : {
190
+ scope: types_1.PlanOfferScope.VARIANT,
191
+ variant_id: input.variant_id,
192
+ };
193
+ const { data } = await query.graph({
194
+ entity: "plan_offer",
195
+ fields: [...planOfferFields],
196
+ filters,
197
+ });
198
+ const records = data;
199
+ if (!records.length) {
200
+ return null;
201
+ }
202
+ if (records.length > 1) {
203
+ throw errors_1.planOfferErrors.conflictingOverrideConfiguration(normalizeScope(input.scope) === types_1.PlanOfferScope.PRODUCT
204
+ ? `Multiple plan offers were found for product '${input.product_id}'`
205
+ : `Multiple plan offers were found for variant '${input.variant_id}'`);
206
+ }
207
+ const record = records[0];
208
+ return {
209
+ ...record,
210
+ scope: record.scope === "product"
211
+ ? types_1.PlanOfferScope.PRODUCT
212
+ : types_1.PlanOfferScope.VARIANT,
213
+ };
214
+ }
215
+ async function getPlanOfferRecordById(container, id) {
216
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
217
+ const { data } = await query.graph({
218
+ entity: "plan_offer",
219
+ fields: [...planOfferFields],
220
+ filters: {
221
+ id: [id],
222
+ },
223
+ pagination: {
224
+ take: 1,
225
+ },
226
+ });
227
+ const record = data[0];
228
+ if (!record) {
229
+ return null;
230
+ }
231
+ return {
232
+ ...record,
233
+ scope: record.scope === "product"
234
+ ? types_1.PlanOfferScope.PRODUCT
235
+ : types_1.PlanOfferScope.VARIANT,
236
+ };
237
+ }
238
+ function normalizePlanOfferPayload(input) {
239
+ validateTarget(input);
240
+ const normalizedScope = normalizeScope(input.scope);
241
+ const allowed_frequencies = normalizeAllowedFrequencies(input.allowed_frequencies);
242
+ const discount_per_frequency = normalizeDiscounts(input.discounts, allowed_frequencies);
243
+ const rules = normalizeRules(input.rules);
244
+ return {
245
+ name: input.name.trim(),
246
+ scope: normalizedScope,
247
+ product_id: input.product_id,
248
+ variant_id: normalizedScope === types_1.PlanOfferScope.PRODUCT ? null : input.variant_id,
249
+ is_enabled: input.is_enabled,
250
+ allowed_frequencies,
251
+ frequency_intervals: [
252
+ ...new Set(allowed_frequencies.map((frequency) => String(frequency.interval))),
253
+ ],
254
+ discount_per_frequency,
255
+ rules,
256
+ metadata: input.metadata ?? null,
257
+ };
258
+ }
259
+ function getPlanOfferId(result) {
260
+ if (Array.isArray(result)) {
261
+ return result[0]?.id;
262
+ }
263
+ return result?.id;
264
+ }
265
+ function toUpdatePlanOfferServiceInput(record) {
266
+ return {
267
+ id: record.id,
268
+ name: record.name,
269
+ scope: record.scope,
270
+ product_id: record.product_id,
271
+ variant_id: record.variant_id,
272
+ is_enabled: record.is_enabled,
273
+ allowed_frequencies: record.allowed_frequencies,
274
+ frequency_intervals: record.frequency_intervals,
275
+ discount_per_frequency: record.discount_per_frequency ?? [],
276
+ rules: record.rules,
277
+ metadata: record.metadata,
278
+ };
279
+ }
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXBsYW4tb2ZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3NoYXJlZC1wbGFuLW9mZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbVRBLGtFQTZCQztBQUVELHNEQStDQztBQUVELHdEQStCQztBQUVELDhEQTJCQztBQUVELHdDQVFDO0FBRUQsc0VBZ0JDO0FBMWRELHFEQUFxRTtBQU1yRSwwREFLdUM7QUFDdkMsa0VBQXVFO0FBMEV2RSxNQUFNLGVBQWUsR0FBRztJQUN0QixJQUFJO0lBQ0osTUFBTTtJQUNOLE9BQU87SUFDUCxZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLHdCQUF3QjtJQUN4QixPQUFPO0lBQ1AsVUFBVTtDQUNGLENBQUE7QUFFVixTQUFTLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLHdCQUFlLENBQUMsbUJBQW1CLENBQ3ZDLElBQUksS0FBSyw4QkFBOEIsQ0FDeEMsQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBMkI7SUFDakQsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLHNCQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSx3QkFBZSxDQUFDLDhCQUE4QixFQUFFLENBQUE7UUFDeEQsQ0FBQztRQUVELE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixNQUFNLHdCQUFlLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtJQUN2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
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRenewalCycleApprovalRecord = getRenewalCycleApprovalRecord;
4
+ exports.validateRenewalApprovalTransition = validateRenewalApprovalTransition;
5
+ const renewal_1 = require("../../modules/renewal");
6
+ const types_1 = require("../../modules/renewal/types");
7
+ const errors_1 = require("../../modules/renewal/utils/errors");
8
+ async function getRenewalCycleApprovalRecord(container, id) {
9
+ const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
10
+ try {
11
+ return (await renewalModule.retrieveRenewalCycle(id));
12
+ }
13
+ catch {
14
+ throw errors_1.renewalErrors.notFound("RenewalCycle", id);
15
+ }
16
+ }
17
+ function validateRenewalApprovalTransition(cycle, targetStatus) {
18
+ if (!cycle.approval_required) {
19
+ throw errors_1.renewalErrors.approvalNotRequired(cycle.id);
20
+ }
21
+ if (cycle.status === types_1.RenewalCycleStatus.PROCESSING) {
22
+ throw errors_1.renewalErrors.invalidTransition(cycle.id, `Renewal '${cycle.id}' can't change approval state while processing`);
23
+ }
24
+ if (cycle.status === types_1.RenewalCycleStatus.SUCCEEDED) {
25
+ throw errors_1.renewalErrors.invalidTransition(cycle.id, `Renewal '${cycle.id}' can't change approval state after success`);
26
+ }
27
+ if (cycle.approval_status !== types_1.RenewalApprovalStatus.PENDING) {
28
+ throw errors_1.renewalErrors.approvalAlreadyDecided(cycle.id);
29
+ }
30
+ if (targetStatus !== types_1.RenewalApprovalStatus.APPROVED && targetStatus !== types_1.RenewalApprovalStatus.REJECTED) {
31
+ throw errors_1.renewalErrors.invalidData(`Unsupported approval transition '${targetStatus}'`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXJlbmV3YWwtYXBwcm92YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3NoYXJlZC1yZW5ld2FsLWFwcHJvdmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLHNFQWFDO0FBRUQsOEVBK0JDO0FBakVELG1EQUFzRDtBQUV0RCx1REFHb0M7QUFDcEMsK0RBQWtFO0FBYTNELEtBQUssVUFBVSw2QkFBNkIsQ0FDakQsU0FBMEIsRUFDMUIsRUFBVTtJQUVWLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXVCLHdCQUFjLENBQUMsQ0FBQTtJQUU3RSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxhQUFhLENBQUMsb0JBQW9CLENBQzlDLEVBQUUsQ0FDSCxDQUEwQyxDQUFBO0lBQzdDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLHNCQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGlDQUFpQyxDQUMvQyxLQUFpQyxFQUNqQyxZQUFtQztJQUVuQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsTUFBTSxzQkFBYSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLDBCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25ELE1BQU0sc0JBQWEsQ0FBQyxpQkFBaUIsQ0FDbkMsS0FBSyxDQUFDLEVBQUUsRUFDUixZQUFZLEtBQUssQ0FBQyxFQUFFLGdEQUFnRCxDQUNyRSxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSywwQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsRCxNQUFNLHNCQUFhLENBQUMsaUJBQWlCLENBQ25DLEtBQUssQ0FBQyxFQUFFLEVBQ1IsWUFBWSxLQUFLLENBQUMsRUFBRSw2Q0FBNkMsQ0FDbEUsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssNkJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUQsTUFBTSxzQkFBYSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBRUQsSUFBSSxZQUFZLEtBQUssNkJBQXFCLENBQUMsUUFBUSxJQUFJLFlBQVksS0FBSyw2QkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2RyxNQUFNLHNCQUFhLENBQUMsV0FBVyxDQUM3QixvQ0FBb0MsWUFBWSxHQUFHLENBQ3BELENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startCancellationCaseStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const cancellation_1 = require("../../modules/cancellation");
6
+ const types_1 = require("../../modules/cancellation/types");
7
+ const audit_1 = require("../../modules/cancellation/utils/audit");
8
+ const errors_1 = require("../../modules/cancellation/utils/errors");
9
+ const subscription_1 = require("../../modules/subscription");
10
+ const types_2 = require("../../modules/subscription/types");
11
+ const errors_2 = require("../../modules/subscription/utils/errors");
12
+ const subscription_settings_1 = require("../utils/subscription-settings");
13
+ const ACTIVE_CANCELLATION_CASE_STATUSES = new Set([
14
+ types_1.CancellationCaseStatus.REQUESTED,
15
+ types_1.CancellationCaseStatus.EVALUATING_RETENTION,
16
+ types_1.CancellationCaseStatus.RETENTION_OFFERED,
17
+ ]);
18
+ function isActiveCancellationCase(status) {
19
+ return ACTIVE_CANCELLATION_CASE_STATUSES.has(status);
20
+ }
21
+ function normalizeEntryContext(input) {
22
+ const rawTriggeredAt = input.entry_context?.triggered_at;
23
+ const triggeredAt = rawTriggeredAt
24
+ ? rawTriggeredAt instanceof Date
25
+ ? rawTriggeredAt
26
+ : new Date(rawTriggeredAt)
27
+ : new Date();
28
+ if (Number.isNaN(triggeredAt.getTime())) {
29
+ throw errors_1.cancellationErrors.invalidData("Cancellation entry_context.triggered_at must be a valid date");
30
+ }
31
+ return {
32
+ source: input.entry_context?.source ?? "admin_manual",
33
+ triggered_by: input.entry_context?.triggered_by ?? null,
34
+ triggered_at: triggeredAt.toISOString(),
35
+ reason: input.entry_context?.reason ?? input.reason ?? null,
36
+ };
37
+ }
38
+ async function loadSubscription(container, id) {
39
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
40
+ try {
41
+ return (await subscriptionModule.retrieveSubscription(id));
42
+ }
43
+ catch {
44
+ throw errors_2.subscriptionErrors.notFound("Subscription", id);
45
+ }
46
+ }
47
+ function validateSubscriptionEntryState(subscription) {
48
+ if (subscription.status !== types_2.SubscriptionStatus.ACTIVE &&
49
+ subscription.status !== types_2.SubscriptionStatus.PAUSED &&
50
+ subscription.status !== types_2.SubscriptionStatus.PAST_DUE) {
51
+ throw errors_2.subscriptionErrors.invalidState(subscription.id, "enter cancellation handling", subscription.status);
52
+ }
53
+ }
54
+ function mergeCaseMetadata(existingMetadata, input, entryContext, settings) {
55
+ const base = {
56
+ ...(existingMetadata ?? {}),
57
+ ...(input.metadata ?? {}),
58
+ origin: "admin_cancel_intent",
59
+ entry_context: entryContext,
60
+ ...(settings
61
+ ? {
62
+ settings_policy: {
63
+ default_cancellation_behavior: settings.default_cancellation_behavior,
64
+ settings_version: settings.version,
65
+ is_persisted: settings.is_persisted,
66
+ },
67
+ }
68
+ : {}),
69
+ };
70
+ return (0, audit_1.appendCancellationManualAction)(base, {
71
+ action: "start_case",
72
+ who: entryContext.triggered_by,
73
+ when: entryContext.triggered_at,
74
+ why: entryContext.reason,
75
+ data: {
76
+ entry_source: entryContext.source,
77
+ },
78
+ });
79
+ }
80
+ exports.startCancellationCaseStep = (0, workflows_sdk_1.createStep)("start-cancellation-case", async function (input, { container }) {
81
+ const cancellationModule = container.resolve(cancellation_1.CANCELLATION_MODULE);
82
+ if (!input.subscription_id?.trim()) {
83
+ throw errors_1.cancellationErrors.invalidData("Cancellation start requires a subscription_id");
84
+ }
85
+ const subscription = await loadSubscription(container, input.subscription_id);
86
+ validateSubscriptionEntryState(subscription);
87
+ const entryContext = normalizeEntryContext(input);
88
+ const settings = await (0, subscription_settings_1.getEffectiveSubscriptionSettings)(container);
89
+ const subscriptionCases = (await cancellationModule.listCancellationCases({
90
+ subscription_id: subscription.id,
91
+ }));
92
+ const activeCases = subscriptionCases.filter((cancellationCase) => isActiveCancellationCase(cancellationCase.status));
93
+ if (activeCases.length > 1) {
94
+ throw errors_1.cancellationErrors.multipleActiveCases(subscription.id);
95
+ }
96
+ const activeCase = activeCases[0] ?? null;
97
+ if (activeCase) {
98
+ const updated = (await cancellationModule.updateCancellationCases({
99
+ id: activeCase.id,
100
+ reason: activeCase.reason ?? input.reason ?? null,
101
+ reason_category: activeCase.reason_category ?? input.reason_category ?? null,
102
+ notes: activeCase.notes ?? input.notes ?? null,
103
+ metadata: mergeCaseMetadata(activeCase.metadata, input, entryContext),
104
+ }));
105
+ return new workflows_sdk_1.StepResponse({
106
+ action: "updated",
107
+ current: updated,
108
+ previous: activeCase,
109
+ subscription: subscription,
110
+ }, {
111
+ action: "updated",
112
+ previous_case: activeCase,
113
+ });
114
+ }
115
+ const created = (await cancellationModule.createCancellationCases({
116
+ subscription_id: subscription.id,
117
+ status: types_1.CancellationCaseStatus.REQUESTED,
118
+ reason: input.reason ?? null,
119
+ reason_category: input.reason_category ?? null,
120
+ notes: input.notes ?? null,
121
+ final_outcome: null,
122
+ finalized_at: null,
123
+ finalized_by: null,
124
+ cancellation_effective_at: null,
125
+ metadata: mergeCaseMetadata(null, input, entryContext, settings),
126
+ }));
127
+ return new workflows_sdk_1.StepResponse({
128
+ action: "created",
129
+ current: created,
130
+ previous: null,
131
+ subscription: subscription,
132
+ }, {
133
+ action: "created",
134
+ created_case_id: created.id,
135
+ });
136
+ }, async function (compensation, { container }) {
137
+ if (!compensation) {
138
+ return;
139
+ }
140
+ const cancellationModule = container.resolve(cancellation_1.CANCELLATION_MODULE);
141
+ if (compensation.action === "created") {
142
+ await cancellationModule.deleteCancellationCases(compensation.created_case_id);
143
+ return;
144
+ }
145
+ await cancellationModule.updateCancellationCases(compensation.previous_case);
146
+ });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtY2FuY2VsbGF0aW9uLWNhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N0YXJ0LWNhbmNlbGxhdGlvbi1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSw2REFBZ0U7QUFFaEUsNERBR3lDO0FBQ3pDLGtFQUF1RjtBQUN2RixvRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLDREQUFxRTtBQUNyRSxvRUFBNEU7QUFHNUUsMEVBQWlGO0FBRWpGLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxHQUFHLENBQXlCO0lBQ3hFLDhCQUFzQixDQUFDLFNBQVM7SUFDaEMsOEJBQXNCLENBQUMsb0JBQW9CO0lBQzNDLDhCQUFzQixDQUFDLGlCQUFpQjtDQUN6QyxDQUFDLENBQUE7QUFrRUYsU0FBUyx3QkFBd0IsQ0FBQyxNQUE4QjtJQUM5RCxPQUFPLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxLQUFxQztJQUNsRSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQTtJQUN4RCxNQUFNLFdBQVcsR0FBRyxjQUFjO1FBQ2hDLENBQUMsQ0FBQyxjQUFjLFlBQVksSUFBSTtZQUM5QixDQUFDLENBQUMsY0FBYztZQUNoQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBRWQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSwyQkFBa0IsQ0FBQyxXQUFXLENBQ2xDLDhEQUE4RCxDQUMvRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEs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