@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,237 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startDunningStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const dunning_1 = require("../../modules/dunning");
6
+ const types_1 = require("../../modules/dunning/types");
7
+ const errors_1 = require("../../modules/dunning/utils/errors");
8
+ const retry_schedule_1 = require("../../modules/dunning/utils/retry-schedule");
9
+ const renewal_1 = require("../../modules/renewal");
10
+ const types_2 = require("../../modules/renewal/types");
11
+ const errors_2 = require("../../modules/renewal/utils/errors");
12
+ const subscription_1 = require("../../modules/subscription");
13
+ const types_3 = require("../../modules/subscription/types");
14
+ const errors_3 = require("../../modules/subscription/utils/errors");
15
+ const subscription_settings_1 = require("../utils/subscription-settings");
16
+ const ACTIVE_DUNNING_CASE_STATUSES = new Set([
17
+ types_1.DunningCaseStatus.OPEN,
18
+ types_1.DunningCaseStatus.RETRY_SCHEDULED,
19
+ types_1.DunningCaseStatus.RETRYING,
20
+ types_1.DunningCaseStatus.AWAITING_MANUAL_RESOLUTION,
21
+ ]);
22
+ const PAYMENT_FAILURE_SOURCES = new Set([
23
+ "payment_provider",
24
+ "payment_session",
25
+ "payment_capture",
26
+ ]);
27
+ function isActiveDunningCase(status) {
28
+ return ACTIVE_DUNNING_CASE_STATUSES.has(status);
29
+ }
30
+ async function loadSubscription(container, id) {
31
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
32
+ try {
33
+ return (await subscriptionModule.retrieveSubscription(id));
34
+ }
35
+ catch {
36
+ throw errors_3.subscriptionErrors.notFound("Subscription", id);
37
+ }
38
+ }
39
+ async function loadRenewalCycle(container, id) {
40
+ const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
41
+ try {
42
+ return (await renewalModule.retrieveRenewalCycle(id));
43
+ }
44
+ catch {
45
+ throw errors_2.renewalErrors.notFound("RenewalCycle", id);
46
+ }
47
+ }
48
+ function normalizeFailureTime(failedAt) {
49
+ if (!failedAt) {
50
+ return new Date();
51
+ }
52
+ const normalized = failedAt instanceof Date ? failedAt : new Date(failedAt);
53
+ if (Number.isNaN(normalized.getTime())) {
54
+ throw errors_1.dunningErrors.invalidData("Dunning failed_at must be a valid date");
55
+ }
56
+ return normalized;
57
+ }
58
+ async function normalizeRetryPolicy(container, input) {
59
+ const settings = await (0, subscription_settings_1.getEffectiveSubscriptionSettings)(container);
60
+ const schedule = input.retry_schedule ?? {
61
+ strategy: "fixed_intervals",
62
+ intervals: [...settings.dunning_retry_intervals],
63
+ timezone: "UTC",
64
+ source: "default_policy",
65
+ };
66
+ const maxAttempts = input.max_attempts ?? settings.max_dunning_attempts;
67
+ try {
68
+ (0, retry_schedule_1.validateDunningRetrySchedule)(schedule, maxAttempts);
69
+ }
70
+ catch (error) {
71
+ throw errors_1.dunningErrors.invalidData(error instanceof Error ? error.message : "Invalid dunning retry schedule");
72
+ }
73
+ return { schedule, maxAttempts, settings };
74
+ }
75
+ function baseDunningMetadata(input) {
76
+ return {
77
+ ...(input.metadata ?? {}),
78
+ origin: "renewal_payment_failure",
79
+ payment_failure_source: input.payment_failure_source,
80
+ triggered_by: input.triggered_by ?? null,
81
+ reason: input.reason ?? null,
82
+ };
83
+ }
84
+ function createDunningMetadata(input, settings) {
85
+ return {
86
+ ...baseDunningMetadata(input),
87
+ settings_policy: {
88
+ dunning_retry_intervals: [...settings.dunning_retry_intervals],
89
+ max_dunning_attempts: settings.max_dunning_attempts,
90
+ settings_version: settings.version,
91
+ is_persisted: settings.is_persisted,
92
+ },
93
+ };
94
+ }
95
+ function mergeDunningMetadata(existingMetadata, input) {
96
+ return {
97
+ ...(existingMetadata ?? {}),
98
+ ...baseDunningMetadata(input),
99
+ };
100
+ }
101
+ exports.startDunningStep = (0, workflows_sdk_1.createStep)("start-dunning", async function (input, { container }) {
102
+ const dunningModule = container.resolve(dunning_1.DUNNING_MODULE);
103
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
104
+ if (!PAYMENT_FAILURE_SOURCES.has(input.payment_failure_source)) {
105
+ throw errors_1.dunningErrors.invalidData(`Unsupported payment failure source '${input.payment_failure_source}'`);
106
+ }
107
+ if (!input.payment_error_message?.trim()) {
108
+ throw errors_1.dunningErrors.invalidData("Dunning start requires a payment_error_message");
109
+ }
110
+ const subscription = await loadSubscription(container, input.subscription_id);
111
+ const cycle = await loadRenewalCycle(container, input.renewal_cycle_id);
112
+ if (cycle.subscription_id !== subscription.id) {
113
+ throw errors_1.dunningErrors.invalidData(`RenewalCycle '${cycle.id}' doesn't belong to Subscription '${subscription.id}'`);
114
+ }
115
+ if (cycle.status !== types_2.RenewalCycleStatus.FAILED) {
116
+ throw errors_1.dunningErrors.conflict(`Dunning can only start from failed renewal cycles. Renewal '${cycle.id}' is '${cycle.status}'`);
117
+ }
118
+ if (subscription.status !== types_3.SubscriptionStatus.ACTIVE &&
119
+ subscription.status !== types_3.SubscriptionStatus.PAST_DUE) {
120
+ throw errors_3.subscriptionErrors.invalidState(subscription.id, "enter dunning", subscription.status);
121
+ }
122
+ const sameCycleCases = (await dunningModule.listDunningCases({
123
+ renewal_cycle_id: cycle.id,
124
+ }));
125
+ if (sameCycleCases.length > 1) {
126
+ throw errors_1.dunningErrors.conflict(`RenewalCycle '${cycle.id}' already has multiple dunning cases`);
127
+ }
128
+ const existingCase = sameCycleCases[0] ?? null;
129
+ const subscriptionCases = (await dunningModule.listDunningCases({
130
+ subscription_id: subscription.id,
131
+ }));
132
+ const activeCaseForSubscription = subscriptionCases.find((dunningCase) => dunningCase.id !== existingCase?.id &&
133
+ isActiveDunningCase(dunningCase.status));
134
+ if (activeCaseForSubscription) {
135
+ throw errors_1.dunningErrors.duplicateActiveCaseBlocked(subscription.id, activeCaseForSubscription.id);
136
+ }
137
+ const { schedule, maxAttempts, settings } = await normalizeRetryPolicy(container, input);
138
+ const failureTime = normalizeFailureTime(input.failed_at);
139
+ const defaultNextRetryAt = (0, retry_schedule_1.calculateNextRetryAt)(schedule, 0, failureTime);
140
+ if (!defaultNextRetryAt) {
141
+ throw errors_1.dunningErrors.invalidData("Dunning retry policy didn't produce an initial next_retry_at");
142
+ }
143
+ const previousSubscription = subscription.status === types_3.SubscriptionStatus.PAST_DUE ? null : subscription;
144
+ if (!existingCase) {
145
+ const created = (await dunningModule.createDunningCases({
146
+ subscription_id: subscription.id,
147
+ renewal_cycle_id: cycle.id,
148
+ renewal_order_id: input.renewal_order_id ?? cycle.generated_order_id ?? null,
149
+ status: types_1.DunningCaseStatus.RETRY_SCHEDULED,
150
+ attempt_count: 0,
151
+ max_attempts: maxAttempts,
152
+ retry_schedule: schedule,
153
+ next_retry_at: defaultNextRetryAt,
154
+ last_payment_error_code: input.payment_error_code ?? null,
155
+ last_payment_error_message: input.payment_error_message,
156
+ last_attempt_at: null,
157
+ recovered_at: null,
158
+ closed_at: null,
159
+ recovery_reason: null,
160
+ metadata: createDunningMetadata(input, settings),
161
+ }));
162
+ if (previousSubscription) {
163
+ await subscriptionModule.updateSubscriptions({
164
+ id: subscription.id,
165
+ status: types_3.SubscriptionStatus.PAST_DUE,
166
+ });
167
+ }
168
+ return new workflows_sdk_1.StepResponse({
169
+ action: "created",
170
+ dunning_case_id: created.id,
171
+ subscription_id: subscription.id,
172
+ subscription_status: types_3.SubscriptionStatus.PAST_DUE,
173
+ }, {
174
+ action: "created",
175
+ created_dunning_case_id: created.id,
176
+ previous_subscription: previousSubscription,
177
+ });
178
+ }
179
+ if (!isActiveDunningCase(existingCase.status)) {
180
+ return new workflows_sdk_1.StepResponse({
181
+ action: "noop",
182
+ dunning_case_id: existingCase.id,
183
+ subscription_id: subscription.id,
184
+ subscription_status: subscription.status,
185
+ }, {
186
+ action: "noop",
187
+ });
188
+ }
189
+ const updated = (await dunningModule.updateDunningCases({
190
+ id: existingCase.id,
191
+ renewal_order_id: existingCase.renewal_order_id ??
192
+ input.renewal_order_id ??
193
+ cycle.generated_order_id ??
194
+ null,
195
+ status: existingCase.status === types_1.DunningCaseStatus.OPEN
196
+ ? types_1.DunningCaseStatus.RETRY_SCHEDULED
197
+ : existingCase.status,
198
+ max_attempts: existingCase.max_attempts || maxAttempts,
199
+ retry_schedule: existingCase.retry_schedule ?? schedule,
200
+ next_retry_at: existingCase.next_retry_at ?? defaultNextRetryAt,
201
+ last_payment_error_code: input.payment_error_code ?? existingCase.last_payment_error_code ?? null,
202
+ last_payment_error_message: input.payment_error_message,
203
+ metadata: mergeDunningMetadata(existingCase.metadata, input),
204
+ }));
205
+ if (previousSubscription) {
206
+ await subscriptionModule.updateSubscriptions({
207
+ id: subscription.id,
208
+ status: types_3.SubscriptionStatus.PAST_DUE,
209
+ });
210
+ }
211
+ return new workflows_sdk_1.StepResponse({
212
+ action: "updated",
213
+ dunning_case_id: updated.id,
214
+ subscription_id: subscription.id,
215
+ subscription_status: types_3.SubscriptionStatus.PAST_DUE,
216
+ }, {
217
+ action: "updated",
218
+ previous_dunning_case: existingCase,
219
+ previous_subscription: previousSubscription,
220
+ });
221
+ }, async function (compensation, { container }) {
222
+ if (!compensation || compensation.action === "noop") {
223
+ return;
224
+ }
225
+ const dunningModule = container.resolve(dunning_1.DUNNING_MODULE);
226
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
227
+ if (compensation.action === "created") {
228
+ await dunningModule.deleteDunningCases(compensation.created_dunning_case_id);
229
+ }
230
+ else {
231
+ await dunningModule.updateDunningCases(compensation.previous_dunning_case);
232
+ }
233
+ if (compensation.previous_subscription) {
234
+ await subscriptionModule.updateSubscriptions(compensation.previous_subscription);
235
+ }
236
+ });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtZHVubmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3RhcnQtZHVubmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsbURBQXNEO0FBRXRELHVEQUdvQztBQUNwQywrREFBa0U7QUFDbEUsK0VBR21EO0FBQ25ELG1EQUFzRDtBQUV0RCx1REFBZ0U7QUFDaEUsK0RBQWtFO0FBQ2xFLDZEQUFnRTtBQUVoRSw0REFBcUU7QUFDckUsb0VBQTRFO0FBRTVFLDBFQUFpRjtBQUVqRixNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxDQUFvQjtJQUM5RCx5QkFBaUIsQ0FBQyxJQUFJO0lBQ3RCLHlCQUFpQixDQUFDLGVBQWU7SUFDakMseUJBQWlCLENBQUMsUUFBUTtJQUMxQix5QkFBaUIsQ0FBQywwQkFBMEI7Q0FDN0MsQ0FBQyxDQUFBO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtDQUNsQixDQUFDLENBQUE7QUF1RUYsU0FBUyxtQkFBbUIsQ0FBQyxNQUF5QjtJQUNwRCxPQUFPLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixTQUE0QyxFQUM1QyxFQUFVO0lBRVYsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUVyRSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FDbkQsRUFBRSxDQUNILENBQXVCLENBQUE7SUFDMUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sMkJBQWtCLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FB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
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.togglePlanOfferStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const plan_offer_1 = require("../../modules/plan-offer");
6
+ const errors_1 = require("../../modules/plan-offer/utils/errors");
7
+ const shared_plan_offer_1 = require("./shared-plan-offer");
8
+ exports.togglePlanOfferStep = (0, workflows_sdk_1.createStep)("toggle-plan-offer", async function (input, { container }) {
9
+ const existing = await (0, shared_plan_offer_1.getPlanOfferRecordById)(container, input.id);
10
+ if (!existing) {
11
+ throw errors_1.planOfferErrors.notFound("PlanOffer", input.id);
12
+ }
13
+ const planOfferModuleService = container.resolve(plan_offer_1.PLAN_OFFER_MODULE);
14
+ const updated = await planOfferModuleService.updatePlanOffers({
15
+ id: input.id,
16
+ is_enabled: input.is_enabled,
17
+ });
18
+ const planOfferId = (0, shared_plan_offer_1.getPlanOfferId)(updated);
19
+ if (!planOfferId) {
20
+ throw new Error("Failed to resolve toggled plan offer id");
21
+ }
22
+ return new workflows_sdk_1.StepResponse(planOfferId, (0, shared_plan_offer_1.toUpdatePlanOfferServiceInput)(existing));
23
+ }, async function (existing, { container }) {
24
+ if (!existing) {
25
+ return;
26
+ }
27
+ const planOfferModuleService = container.resolve(plan_offer_1.PLAN_OFFER_MODULE);
28
+ await planOfferModuleService.updatePlanOffers({
29
+ id: existing.id,
30
+ is_enabled: existing.is_enabled,
31
+ });
32
+ });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLXBsYW4tb2ZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3RvZ2dsZS1wbGFuLW9mZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSx5REFBNEQ7QUFFNUQsa0VBQXVFO0FBQ3ZFLDJEQUk0QjtBQU9mLFFBQUEsbUJBQW1CLEdBQUcsSUFBQSwwQkFBVSxFQUszQyxtQkFBbUIsRUFDbkIsS0FBSyxXQUFXLEtBQStCLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBDQUFzQixFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSx3QkFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxNQUFNLHNCQUFzQixHQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFFdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1RCxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7S0FDN0IsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBQSxrQ0FBYyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRTNDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLFdBQVcsRUFBRSxJQUFBLGlEQUE2QixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDL0UsQ0FBQyxFQUNELEtBQUssV0FBVyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLHNCQUFzQixHQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFFdEMsTUFBTSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7UUFDZixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7S0FDekIsQ0FBQyxDQUFBO0FBQ1gsQ0FBQyxDQUNGLENBQUEifQ==
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateCancellationReasonStep = 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 REASON_MUTABLE_CASE_STATUSES = new Set([
11
+ types_1.CancellationCaseStatus.REQUESTED,
12
+ types_1.CancellationCaseStatus.EVALUATING_RETENTION,
13
+ types_1.CancellationCaseStatus.RETENTION_OFFERED,
14
+ ]);
15
+ async function loadCancellationCase(container, id) {
16
+ const cancellationModule = container.resolve(cancellation_1.CANCELLATION_MODULE);
17
+ try {
18
+ return (await cancellationModule.retrieveCancellationCase(id));
19
+ }
20
+ catch {
21
+ throw errors_1.cancellationErrors.notFound("CancellationCase", id);
22
+ }
23
+ }
24
+ async function loadSubscription(container, id) {
25
+ const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
26
+ return (await subscriptionModule.retrieveSubscription(id));
27
+ }
28
+ function validateCaseState(cancellationCase) {
29
+ if (cancellationCase.status === types_1.CancellationCaseStatus.RETAINED) {
30
+ throw errors_1.cancellationErrors.alreadyFinalized(cancellationCase.id, cancellationCase.status);
31
+ }
32
+ if (cancellationCase.status === types_1.CancellationCaseStatus.PAUSED) {
33
+ throw errors_1.cancellationErrors.alreadyFinalized(cancellationCase.id, cancellationCase.status);
34
+ }
35
+ if (cancellationCase.status === types_1.CancellationCaseStatus.CANCELED) {
36
+ throw errors_1.cancellationErrors.alreadyFinalized(cancellationCase.id, cancellationCase.status);
37
+ }
38
+ if (!REASON_MUTABLE_CASE_STATUSES.has(cancellationCase.status)) {
39
+ throw errors_1.cancellationErrors.invalidCaseState(cancellationCase.id, "update cancellation reason", cancellationCase.status);
40
+ }
41
+ }
42
+ exports.updateCancellationReasonStep = (0, workflows_sdk_1.createStep)("update-cancellation-reason", async function (input, { container }) {
43
+ const cancellationModule = container.resolve(cancellation_1.CANCELLATION_MODULE);
44
+ if (!input.reason?.trim()) {
45
+ throw errors_1.cancellationErrors.invalidData("Cancellation reason update requires a non-empty reason");
46
+ }
47
+ const cancellationCase = await loadCancellationCase(container, input.cancellation_case_id);
48
+ const subscription = await loadSubscription(container, cancellationCase.subscription_id);
49
+ validateCaseState(cancellationCase);
50
+ const changedAt = new Date().toISOString();
51
+ const updated = (await cancellationModule.updateCancellationCases({
52
+ id: cancellationCase.id,
53
+ reason: input.reason.trim(),
54
+ reason_category: input.reason_category ?? cancellationCase.reason_category ?? null,
55
+ notes: input.notes ?? cancellationCase.notes ?? null,
56
+ metadata: (0, audit_1.appendCancellationManualAction)({
57
+ ...(cancellationCase.metadata ?? {}),
58
+ ...(input.metadata ?? {}),
59
+ reason_update: {
60
+ reason: input.reason.trim(),
61
+ reason_category: input.reason_category ?? cancellationCase.reason_category ?? null,
62
+ notes: input.notes ?? cancellationCase.notes ?? null,
63
+ updated_by: input.updated_by ?? null,
64
+ updated_at: changedAt,
65
+ },
66
+ }, {
67
+ action: "update_reason",
68
+ who: input.updated_by ?? null,
69
+ when: changedAt,
70
+ why: input.update_reason ?? input.reason.trim(),
71
+ data: {
72
+ reason_category: input.reason_category ?? cancellationCase.reason_category ?? null,
73
+ },
74
+ }),
75
+ }));
76
+ return new workflows_sdk_1.StepResponse({
77
+ current: updated,
78
+ previous: cancellationCase,
79
+ subscription,
80
+ cancellation_case_id: updated.id,
81
+ subscription_id: updated.subscription_id,
82
+ status: updated.status,
83
+ reason: updated.reason ?? input.reason.trim(),
84
+ reason_category: updated.reason_category,
85
+ }, {
86
+ previous_case: cancellationCase,
87
+ });
88
+ }, async function (compensation, { container }) {
89
+ if (!compensation) {
90
+ return;
91
+ }
92
+ const cancellationModule = container.resolve(cancellation_1.CANCELLATION_MODULE);
93
+ await cancellationModule.updateCancellationCases(compensation.previous_case);
94
+ });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWNhbmNlbGxhdGlvbi1yZWFzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1jYW5jZWxsYXRpb24tcmVhc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSw2REFBZ0U7QUFFaEUsNERBR3lDO0FBQ3pDLGtFQUF1RjtBQUN2RixvRUFBNEU7QUFDNUUsNkRBQWdFO0FBSWhFLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLENBQXlCO0lBQ25FLDhCQUFzQixDQUFDLFNBQVM7SUFDaEMsOEJBQXNCLENBQUMsb0JBQW9CO0lBQzNDLDhCQUFzQixDQUFDLGlCQUFpQjtDQUN6QyxDQUFDLENBQUE7QUEwQ0YsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxTQUE0QyxFQUM1QyxFQUFVO0lBRVYsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUVyRSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FDdkQsRUFBRSxDQUNILENBQTJCLENBQUE7SUFDOUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sMkJBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzNELENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixTQUE0QyxFQUM1QyxFQUFVO0lBRVYsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUVyRSxPQUFPLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBdUIsQ0FBQTtBQUNsRixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxnQkFBd0M7SUFDakUsSUFBSSxnQkFB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
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateDunningRetryScheduleStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const dunning_1 = require("../../modules/dunning");
6
+ const types_1 = require("../../modules/dunning/types");
7
+ const errors_1 = require("../../modules/dunning/utils/errors");
8
+ const retry_schedule_1 = require("../../modules/dunning/utils/retry-schedule");
9
+ function appendAuditMetadata(metadata, input, at) {
10
+ const existing = Array.isArray(metadata?.manual_actions)
11
+ ? [...metadata?.manual_actions]
12
+ : [];
13
+ existing.push({
14
+ action: "update_retry_schedule",
15
+ who: input.triggered_by ?? null,
16
+ when: at,
17
+ reason: input.reason ?? null,
18
+ schedule: {
19
+ intervals: input.intervals,
20
+ max_attempts: input.max_attempts,
21
+ },
22
+ });
23
+ return {
24
+ ...(metadata ?? {}),
25
+ manual_actions: existing,
26
+ last_manual_action: existing[existing.length - 1],
27
+ };
28
+ }
29
+ exports.updateDunningRetryScheduleStep = (0, workflows_sdk_1.createStep)("update-dunning-retry-schedule", async function (input, { container }) {
30
+ const dunningModule = container.resolve(dunning_1.DUNNING_MODULE);
31
+ const dunningCase = (await dunningModule.retrieveDunningCase(input.dunning_case_id));
32
+ if (dunningCase.status === types_1.DunningCaseStatus.RECOVERED) {
33
+ throw errors_1.dunningErrors.alreadyRecovered(dunningCase.id);
34
+ }
35
+ if (dunningCase.status === types_1.DunningCaseStatus.UNRECOVERED) {
36
+ throw errors_1.dunningErrors.alreadyUnrecovered(dunningCase.id);
37
+ }
38
+ if (dunningCase.status === types_1.DunningCaseStatus.RETRYING) {
39
+ throw errors_1.dunningErrors.retryInFlightTransitionBlocked(dunningCase.id, "update retry schedule");
40
+ }
41
+ const retrySchedule = {
42
+ strategy: "fixed_intervals",
43
+ intervals: [...input.intervals],
44
+ timezone: "UTC",
45
+ source: "manual_override",
46
+ };
47
+ try {
48
+ (0, retry_schedule_1.validateDunningRetrySchedule)(retrySchedule, input.max_attempts);
49
+ }
50
+ catch (error) {
51
+ throw errors_1.dunningErrors.invalidData(error instanceof Error ? error.message : "Invalid retry schedule");
52
+ }
53
+ if (input.max_attempts < dunningCase.attempt_count) {
54
+ throw errors_1.dunningErrors.conflict(`DunningCase '${dunningCase.id}' already has ${dunningCase.attempt_count} attempts, which exceeds the requested max_attempts`);
55
+ }
56
+ const changedAt = new Date();
57
+ let nextRetryAt = dunningCase.next_retry_at;
58
+ let nextStatus = dunningCase.status;
59
+ if (dunningCase.status === types_1.DunningCaseStatus.OPEN) {
60
+ nextRetryAt = (0, retry_schedule_1.calculateNextRetryAt)(retrySchedule, 0, changedAt);
61
+ nextStatus = types_1.DunningCaseStatus.RETRY_SCHEDULED;
62
+ }
63
+ else if (dunningCase.status === types_1.DunningCaseStatus.RETRY_SCHEDULED) {
64
+ nextRetryAt = (0, retry_schedule_1.calculateNextRetryAt)(retrySchedule, dunningCase.attempt_count, changedAt);
65
+ nextStatus = types_1.DunningCaseStatus.RETRY_SCHEDULED;
66
+ }
67
+ else if (dunningCase.status === types_1.DunningCaseStatus.AWAITING_MANUAL_RESOLUTION) {
68
+ nextRetryAt = null;
69
+ nextStatus = types_1.DunningCaseStatus.AWAITING_MANUAL_RESOLUTION;
70
+ }
71
+ if (nextStatus === types_1.DunningCaseStatus.RETRY_SCHEDULED &&
72
+ !nextRetryAt) {
73
+ throw errors_1.dunningErrors.invalidRetryScheduleOverride(dunningCase.id);
74
+ }
75
+ const updated = await dunningModule.updateDunningCases({
76
+ id: dunningCase.id,
77
+ status: nextStatus,
78
+ retry_schedule: retrySchedule,
79
+ max_attempts: input.max_attempts,
80
+ next_retry_at: nextRetryAt,
81
+ metadata: appendAuditMetadata(dunningCase.metadata, input, changedAt.toISOString()),
82
+ });
83
+ return new workflows_sdk_1.StepResponse(updated, dunningCase);
84
+ }, async function (previousCase, { container }) {
85
+ if (!previousCase) {
86
+ return;
87
+ }
88
+ const dunningModule = container.resolve(dunning_1.DUNNING_MODULE);
89
+ await dunningModule.updateDunningCases(previousCase);
90
+ });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWR1bm5pbmctcmV0cnktc2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1kdW5uaW5nLXJldHJ5LXNjaGVkdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxtREFBc0Q7QUFFdEQsdURBR29DO0FBQ3BDLCtEQUFrRTtBQUNsRSwrRUFHbUQ7QUFvQm5ELFNBQVMsbUJBQW1CLENBQzFCLFFBQXdDLEVBQ3hDLEtBQTBDLEVBQzFDLEVBQVU7SUFFVixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUMsR0FBSSxRQUFRLEVBQUUsY0FBNEMsQ0FBQztRQUM5RCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRU4sUUFBUSxDQUFDLElBQUksQ0FBQztRQUNaLE1BQU0sRUFBRSx1QkFBdUI7UUFDL0IsR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtRQUMvQixJQUFJLEVBQUUsRUFBRTtRQUNSLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUk7UUFDNUIsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtTQUNqQztLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU87UUFDTCxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNuQixjQUFjLEVBQUUsUUFBUTtRQUN4QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDbEQsQ0FBQTtBQUNILENBQUM7QUFFWSxRQUFBLDhCQUE4QixHQUFHLElBQUEsMEJBQVUsRUFDdEQsK0JBQStCLEVBQy9CLEtBQUssV0FDSCxLQUEwQyxFQUMxQyxFQUFF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
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updatePlanOfferStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const plan_offer_1 = require("../../modules/plan-offer");
6
+ const errors_1 = require("../../modules/plan-offer/utils/errors");
7
+ const shared_plan_offer_1 = require("./shared-plan-offer");
8
+ exports.updatePlanOfferStep = (0, workflows_sdk_1.createStep)("update-plan-offer", async function (input, { container }) {
9
+ const existing = await (0, shared_plan_offer_1.getPlanOfferRecordById)(container, input.id);
10
+ if (!existing) {
11
+ throw errors_1.planOfferErrors.notFound("PlanOffer", input.id);
12
+ }
13
+ const mergedInput = {
14
+ name: input.name ?? existing.name,
15
+ scope: existing.scope,
16
+ product_id: existing.product_id,
17
+ variant_id: existing.variant_id,
18
+ is_enabled: input.is_enabled ?? existing.is_enabled,
19
+ allowed_frequencies: input.allowed_frequencies ?? existing.allowed_frequencies,
20
+ discounts: input.discounts ??
21
+ (existing.discount_per_frequency ?? []).map((discount) => ({
22
+ interval: discount.interval,
23
+ frequency_value: discount.value,
24
+ type: discount.discount_type,
25
+ value: discount.discount_value,
26
+ })),
27
+ rules: input.rules === undefined
28
+ ? existing.rules
29
+ : input.rules,
30
+ metadata: input.metadata === undefined ? existing.metadata : input.metadata,
31
+ };
32
+ await (0, shared_plan_offer_1.assertPlanOfferTargetExists)(container, mergedInput);
33
+ const payload = (0, shared_plan_offer_1.normalizePlanOfferPayload)(mergedInput);
34
+ const planOfferModuleService = container.resolve(plan_offer_1.PLAN_OFFER_MODULE);
35
+ const updated = await planOfferModuleService.updatePlanOffers({
36
+ ...payload,
37
+ id: existing.id,
38
+ });
39
+ const planOfferId = (0, shared_plan_offer_1.getPlanOfferId)(updated);
40
+ if (!planOfferId) {
41
+ throw new Error("Failed to resolve updated plan offer id");
42
+ }
43
+ return new workflows_sdk_1.StepResponse(planOfferId, (0, shared_plan_offer_1.toUpdatePlanOfferServiceInput)(existing));
44
+ }, async function (existing, { container }) {
45
+ if (!existing) {
46
+ return;
47
+ }
48
+ const planOfferModuleService = container.resolve(plan_offer_1.PLAN_OFFER_MODULE);
49
+ await planOfferModuleService.updatePlanOffers(existing);
50
+ });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBsYW4tb2ZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wbGFuLW9mZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSx5REFBNEQ7QUFFNUQsa0VBQXVFO0FBQ3ZFLDJEQU80QjtBQVlmLFFBQUEsbUJBQW1CLEdBQUcsSUFBQSwwQkFBVSxFQUszQyxtQkFBbUIsRUFDbkIsS0FBSyxXQUFXLEtBQStCLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBDQUFzQixFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSx3QkFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBeUI7UUFDeEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUk7UUFDakMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1FBQ3JCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtRQUMvQixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVU7UUFDbkQsbUJBQW1CLEVBQ2pCLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxRQUFRLENBQUMsbUJBQW1CO1FBQzNELFNBQVMsRUFDUCxLQUFLLENBQUMsU0FBUztZQUNmLENBQUMsUUFBUSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixlQUFlLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQy9CLElBQUksRUFBRSxRQUFRLENBQUMsYUFBYTtnQkFDNUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxjQUFjO2FBQy9CLENBQUMsQ0FBQztRQUNMLEtBQUssRUFDSCxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLO1lBQ2hCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSztRQUNqQixRQUFRLEVBQ04sS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRO0tBQ3BFLENBQUE7SUFFRCxNQUFNLElBQUEsK0NBQTJCLEVBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXpELE1BQU0sT0FBTyxHQUFHLElBQUEsNkNBQXlCLEVBQUMsV0FBVyxDQUFDLENBQUE7SUFDdEQsTUFBTSxzQkFBc0IsR0FDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBQyxDQUFBO0lBRXRDLE1BQU0sT0FBTyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsZ0JBQWdCLENBQUM7UUFDNUQsR0FBRyxPQUFPO1FBQ1YsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0tBQ1QsQ0FBQyxDQUFBO0lBQ1QsTUFBTSxXQUFXLEdBQUcsSUFBQSxrQ0FBYyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRTNDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLFdBQVcsRUFBRSxJQUFBLGlEQUE2QixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDL0UsQ0FBQyxFQUNELEtBQUssV0FBVyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLHNCQUFzQixHQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFFdEMsTUFBTSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFlLENBQUMsQ0FBQTtBQUNoRSxDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSubscriptionSettingsStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const settings_1 = require("../../modules/settings");
7
+ const types_1 = require("../../modules/settings/types");
8
+ const audit_1 = require("../../modules/settings/utils/audit");
9
+ function buildRestorationPayload(previous) {
10
+ return {
11
+ settings_key: types_1.GLOBAL_SUBSCRIPTION_SETTINGS_KEY,
12
+ default_trial_days: previous.default_trial_days,
13
+ dunning_retry_intervals: previous.dunning_retry_intervals,
14
+ max_dunning_attempts: previous.max_dunning_attempts,
15
+ default_renewal_behavior: previous.default_renewal_behavior,
16
+ default_cancellation_behavior: previous.default_cancellation_behavior,
17
+ version: previous.version,
18
+ updated_by: previous.updated_by,
19
+ metadata: previous.metadata,
20
+ };
21
+ }
22
+ exports.updateSubscriptionSettingsStep = (0, workflows_sdk_1.createStep)("update-subscription-settings", async function (input, { container }) {
23
+ const logger = container.resolve("logger");
24
+ const settingsModule = container.resolve(settings_1.SETTINGS_MODULE);
25
+ const previous = await settingsModule.getSettings();
26
+ if (input.expected_version !== previous.version) {
27
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `SubscriptionSettings version conflict: expected ${input.expected_version}, current ${previous.version}`);
28
+ }
29
+ const changedAt = new Date().toISOString();
30
+ const settings = await settingsModule.updateSettings({
31
+ ...input,
32
+ metadata: previous.metadata,
33
+ });
34
+ const metadataWithAudit = (0, audit_1.appendSettingsAuditMetadata)(previous.metadata, {
35
+ previous,
36
+ next: settings,
37
+ updated_by: input.updated_by ?? null,
38
+ reason: input.reason ?? null,
39
+ changed_at: changedAt,
40
+ });
41
+ const [record] = (await settingsModule.listSubscriptionSettings({
42
+ settings_key: types_1.GLOBAL_SUBSCRIPTION_SETTINGS_KEY,
43
+ }));
44
+ if (record) {
45
+ await settingsModule.updateSubscriptionSettings({
46
+ id: record.id,
47
+ metadata: metadataWithAudit,
48
+ });
49
+ }
50
+ const persistedSettings = await settingsModule.getSettings();
51
+ const lastUpdate = metadataWithAudit.last_update ??
52
+ null;
53
+ logger.info(JSON.stringify({
54
+ domain: "settings",
55
+ event: "settings.update",
56
+ outcome: "completed",
57
+ settings_key: persistedSettings.settings_key,
58
+ previous_version: previous.version,
59
+ version: persistedSettings.version,
60
+ updated_by: persistedSettings.updated_by,
61
+ updated_at: persistedSettings.updated_at?.toISOString?.() ?? null,
62
+ reason: input.reason ?? null,
63
+ change_summary: lastUpdate?.change_summary ?? [],
64
+ }));
65
+ return new workflows_sdk_1.StepResponse({
66
+ settings: persistedSettings,
67
+ }, {
68
+ previous,
69
+ created_new_record: !previous.is_persisted,
70
+ });
71
+ }, async function (compensation, { container }) {
72
+ if (!compensation) {
73
+ return;
74
+ }
75
+ const settingsModule = container.resolve(settings_1.SETTINGS_MODULE);
76
+ if (compensation.created_new_record) {
77
+ await settingsModule.resetSettings();
78
+ return;
79
+ }
80
+ const [record] = (await settingsModule.listSubscriptionSettings({
81
+ settings_key: types_1.GLOBAL_SUBSCRIPTION_SETTINGS_KEY,
82
+ }));
83
+ if (!record) {
84
+ return;
85
+ }
86
+ await settingsModule.updateSubscriptionSettings({
87
+ id: record.id,
88
+ ...buildRestorationPayload(compensation.previous),
89
+ });
90
+ });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN1YnNjcmlwdGlvbi1zZXR0aW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvdXBkYXRlLXN1YnNjcmlwdGlvbi1zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUscURBQXVEO0FBQ3ZELHFEQUF3RDtBQUV4RCx3REFBK0U7QUFDL0UsOERBQWdGO0FBNEJoRixTQUFTLHVCQUF1QixDQUFDLFFBQW1DO0lBQ2xFLE9BQU87UUFDTCxZQUFZLEVBQUUsd0NBQWdDO1FBQzlDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7UUFDL0MsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLHVCQUF1QjtRQUN6RCxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO1FBQ25ELHdCQUF3QixFQUFFLFFBQVEsQ0FBQyx3QkFBd0I7UUFDM0QsNkJBQTZCLEVBQUUsUUFBUSxDQUFDLDZCQUE2QjtRQUNyRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtLQUM1QixDQUFBO0FBQ0gsQ0FBQztBQUVZLFFBQUEsOEJBQThCLEdBQUcsSUFBQSwwQkFBVSxFQUN0RCw4QkFBOEIsRUFDOUIsS0FBSyxXQUNILEtBQTBDLEVBQzFDLEVBQUUsU0FBUyxFQUFFO0lBRWIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBRXhDLENBQUE7SUFDRCxNQUFNLGNBQWMsR0FDbEIsU0FBUyxDQUFDLE9BQU8sQ0FBd0IsMEJBQWUsQ0FBQyxDQUFBO0lBRTNELE1BQU0sUUFBUSxHQUFHLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRW5ELElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxPQUFPLEVBQUUs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