@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.
- package/.medusa/server/scripts/reset-reorder-plugin-data.js +175 -0
- package/.medusa/server/src/admin/index.js +17889 -0
- package/.medusa/server/src/admin/index.mjs +17871 -0
- package/.medusa/server/src/admin/types/activity-log.js +10 -0
- package/.medusa/server/src/admin/types/analytics.js +17 -0
- package/.medusa/server/src/admin/types/cancellation.js +27 -0
- package/.medusa/server/src/admin/types/dunning.js +19 -0
- package/.medusa/server/src/admin/types/plan-offer.js +25 -0
- package/.medusa/server/src/admin/types/renewal.js +23 -0
- package/.medusa/server/src/admin/types/subscription.js +22 -0
- package/.medusa/server/src/api/admin/cancellations/[id]/apply-offer/route.js +30 -0
- package/.medusa/server/src/api/admin/cancellations/[id]/finalize/route.js +31 -0
- package/.medusa/server/src/api/admin/cancellations/[id]/reason/route.js +31 -0
- package/.medusa/server/src/api/admin/cancellations/[id]/route.js +20 -0
- package/.medusa/server/src/api/admin/cancellations/middlewares.js +55 -0
- package/.medusa/server/src/api/admin/cancellations/route.js +20 -0
- package/.medusa/server/src/api/admin/cancellations/utils.js +116 -0
- package/.medusa/server/src/api/admin/cancellations/validators.js +130 -0
- package/.medusa/server/src/api/admin/dunning/[id]/mark-recovered/route.js +27 -0
- package/.medusa/server/src/api/admin/dunning/[id]/mark-unrecovered/route.js +27 -0
- package/.medusa/server/src/api/admin/dunning/[id]/retry-now/route.js +28 -0
- package/.medusa/server/src/api/admin/dunning/[id]/retry-schedule/route.js +29 -0
- package/.medusa/server/src/api/admin/dunning/[id]/route.js +20 -0
- package/.medusa/server/src/api/admin/dunning/middlewares.js +60 -0
- package/.medusa/server/src/api/admin/dunning/route.js +20 -0
- package/.medusa/server/src/api/admin/dunning/utils.js +70 -0
- package/.medusa/server/src/api/admin/dunning/validators.js +81 -0
- package/.medusa/server/src/api/admin/orders/[id]/subscription-summary/route.js +10 -0
- package/.medusa/server/src/api/admin/orders/utils.js +8 -0
- package/.medusa/server/src/api/admin/plugin/route.js +7 -0
- package/.medusa/server/src/api/admin/renewals/[id]/approve-changes/route.js +27 -0
- package/.medusa/server/src/api/admin/renewals/[id]/force/route.js +30 -0
- package/.medusa/server/src/api/admin/renewals/[id]/reject-changes/route.js +27 -0
- package/.medusa/server/src/api/admin/renewals/[id]/route.js +10 -0
- package/.medusa/server/src/api/admin/renewals/middlewares.js +61 -0
- package/.medusa/server/src/api/admin/renewals/route.js +10 -0
- package/.medusa/server/src/api/admin/renewals/utils.js +60 -0
- package/.medusa/server/src/api/admin/renewals/validators.js +62 -0
- package/.medusa/server/src/api/admin/subscription-analytics/export/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-analytics/kpis/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-analytics/middlewares.js +45 -0
- package/.medusa/server/src/api/admin/subscription-analytics/rebuild/route.js +75 -0
- package/.medusa/server/src/api/admin/subscription-analytics/trends/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-analytics/utils.js +81 -0
- package/.medusa/server/src/api/admin/subscription-analytics/validators.js +76 -0
- package/.medusa/server/src/api/admin/subscription-logs/[id]/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-logs/middlewares.js +66 -0
- package/.medusa/server/src/api/admin/subscription-logs/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-logs/utils.js +84 -0
- package/.medusa/server/src/api/admin/subscription-logs/validators.js +32 -0
- package/.medusa/server/src/api/admin/subscription-offers/[id]/route.js +22 -0
- package/.medusa/server/src/api/admin/subscription-offers/[id]/toggle/route.js +17 -0
- package/.medusa/server/src/api/admin/subscription-offers/middlewares.js +58 -0
- package/.medusa/server/src/api/admin/subscription-offers/route.js +20 -0
- package/.medusa/server/src/api/admin/subscription-offers/utils.js +41 -0
- package/.medusa/server/src/api/admin/subscription-offers/validators.js +112 -0
- package/.medusa/server/src/api/admin/subscription-settings/middlewares.js +15 -0
- package/.medusa/server/src/api/admin/subscription-settings/route.js +33 -0
- package/.medusa/server/src/api/admin/subscription-settings/utils.js +109 -0
- package/.medusa/server/src/api/admin/subscription-settings/validators.js +74 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/cancel/route.js +18 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/logs/route.js +20 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/pause/route.js +18 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/resume/route.js +18 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/route.js +10 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/schedule-plan-change/route.js +26 -0
- package/.medusa/server/src/api/admin/subscriptions/[id]/update-shipping-address/route.js +27 -0
- package/.medusa/server/src/api/admin/subscriptions/middlewares.js +79 -0
- package/.medusa/server/src/api/admin/subscriptions/route.js +10 -0
- package/.medusa/server/src/api/admin/subscriptions/utils.js +42 -0
- package/.medusa/server/src/api/admin/subscriptions/validators.js +76 -0
- package/.medusa/server/src/api/middlewares.js +32 -0
- package/.medusa/server/src/api/store/carts/[id]/subscribe/route.js +18 -0
- package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/cancellation/route.js +37 -0
- package/.medusa/server/src/api/store/customers/me/subscriptions/route.js +10 -0
- package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +104 -0
- package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +13 -0
- package/.medusa/server/src/api/store/plugin/route.js +7 -0
- package/.medusa/server/src/jobs/process-analytics-daily-snapshots.js +149 -0
- package/.medusa/server/src/jobs/process-cancellation-operational-metrics.js +102 -0
- package/.medusa/server/src/jobs/process-dunning-retries.js +249 -0
- package/.medusa/server/src/jobs/process-renewal-cycles.js +180 -0
- package/.medusa/server/src/links/cancellation-subscription.js +13 -0
- package/.medusa/server/src/links/renewal-order.js +12 -0
- package/.medusa/server/src/links/renewal-subscription.js +13 -0
- package/.medusa/server/src/links/subscription-cart.js +12 -0
- package/.medusa/server/src/links/subscription-customer.js +13 -0
- package/.medusa/server/src/links/subscription-order.js +13 -0
- package/.medusa/server/src/links/subscription-product.js +13 -0
- package/.medusa/server/src/links/subscription-variant.js +13 -0
- package/.medusa/server/src/modules/activity-log/index.js +13 -0
- package/.medusa/server/src/modules/activity-log/migrations/Migration20260401204521.js +24 -0
- package/.medusa/server/src/modules/activity-log/migrations/Migration20260405112500.js +16 -0
- package/.medusa/server/src/modules/activity-log/models/subscription-log.js +52 -0
- package/.medusa/server/src/modules/activity-log/service.js +13 -0
- package/.medusa/server/src/modules/activity-log/types/index.js +33 -0
- package/.medusa/server/src/modules/activity-log/utils/admin-query.js +261 -0
- package/.medusa/server/src/modules/activity-log/utils/normalize-log-event.js +169 -0
- package/.medusa/server/src/modules/analytics/constants.js +8 -0
- package/.medusa/server/src/modules/analytics/index.js +13 -0
- package/.medusa/server/src/modules/analytics/migrations/Migration20260402183116.js +27 -0
- package/.medusa/server/src/modules/analytics/models/subscription-metrics-daily.js +65 -0
- package/.medusa/server/src/modules/analytics/service.js +13 -0
- package/.medusa/server/src/modules/analytics/utils/admin-query.js +632 -0
- package/.medusa/server/src/modules/analytics/utils/data-quality.js +101 -0
- package/.medusa/server/src/modules/analytics/utils/observability.js +127 -0
- package/.medusa/server/src/modules/cancellation/index.js +13 -0
- package/.medusa/server/src/modules/cancellation/migrations/Migration20260401143914.js +34 -0
- package/.medusa/server/src/modules/cancellation/migrations/Migration20260405112000.js +14 -0
- package/.medusa/server/src/modules/cancellation/models/cancellation-case.js +52 -0
- package/.medusa/server/src/modules/cancellation/models/retention-offer-event.js +47 -0
- package/.medusa/server/src/modules/cancellation/service.js +15 -0
- package/.medusa/server/src/modules/cancellation/types/index.js +43 -0
- package/.medusa/server/src/modules/cancellation/utils/admin-query.js +530 -0
- package/.medusa/server/src/modules/cancellation/utils/audit.js +21 -0
- package/.medusa/server/src/modules/cancellation/utils/errors.js +31 -0
- package/.medusa/server/src/modules/cancellation/utils/observability.js +77 -0
- package/.medusa/server/src/modules/cancellation/utils/operational-metrics.js +131 -0
- package/.medusa/server/src/modules/cancellation/utils/retention-offer-policy.js +31 -0
- package/.medusa/server/src/modules/dunning/index.js +13 -0
- package/.medusa/server/src/modules/dunning/migrations/Migration20260330190157.js +36 -0
- package/.medusa/server/src/modules/dunning/models/dunning-attempt.js +48 -0
- package/.medusa/server/src/modules/dunning/models/dunning-case.js +61 -0
- package/.medusa/server/src/modules/dunning/service.js +15 -0
- package/.medusa/server/src/modules/dunning/types/index.js +19 -0
- package/.medusa/server/src/modules/dunning/utils/admin-query.js +548 -0
- package/.medusa/server/src/modules/dunning/utils/errors.js +40 -0
- package/.medusa/server/src/modules/dunning/utils/observability.js +109 -0
- package/.medusa/server/src/modules/dunning/utils/retry-schedule.js +47 -0
- package/.medusa/server/src/modules/dunning/utils/scheduler-query.js +42 -0
- package/.medusa/server/src/modules/plan-offer/index.js +13 -0
- package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329104245.js +22 -0
- package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329153000.js +25 -0
- package/.medusa/server/src/modules/plan-offer/models/plan-offer.js +35 -0
- package/.medusa/server/src/modules/plan-offer/service.js +13 -0
- package/.medusa/server/src/modules/plan-offer/types/index.js +26 -0
- package/.medusa/server/src/modules/plan-offer/utils/admin-query.js +429 -0
- package/.medusa/server/src/modules/plan-offer/utils/effective-config.js +84 -0
- package/.medusa/server/src/modules/plan-offer/utils/errors.js +55 -0
- package/.medusa/server/src/modules/renewal/index.js +13 -0
- package/.medusa/server/src/modules/renewal/migrations/Migration20260329185930.js +34 -0
- package/.medusa/server/src/modules/renewal/models/renewal-attempt.js +49 -0
- package/.medusa/server/src/modules/renewal/models/renewal-cycle.js +56 -0
- package/.medusa/server/src/modules/renewal/service.js +15 -0
- package/.medusa/server/src/modules/renewal/types/index.js +23 -0
- package/.medusa/server/src/modules/renewal/utils/admin-query.js +450 -0
- package/.medusa/server/src/modules/renewal/utils/errors.js +39 -0
- package/.medusa/server/src/modules/renewal/utils/observability.js +89 -0
- package/.medusa/server/src/modules/renewal/utils/scheduler-query.js +48 -0
- package/.medusa/server/src/modules/renewal/utils/upcoming-cycle.js +54 -0
- package/.medusa/server/src/modules/settings/index.js +13 -0
- package/.medusa/server/src/modules/settings/migrations/Migration20260403121004.js +17 -0
- package/.medusa/server/src/modules/settings/migrations/Migration20260403132519.js +17 -0
- package/.medusa/server/src/modules/settings/models/subscription-settings.js +32 -0
- package/.medusa/server/src/modules/settings/service.js +82 -0
- package/.medusa/server/src/modules/settings/types.js +15 -0
- package/.medusa/server/src/modules/settings/utils/audit.js +43 -0
- package/.medusa/server/src/modules/settings/utils/normalize-settings.js +99 -0
- package/.medusa/server/src/modules/subscription/index.js +13 -0
- package/.medusa/server/src/modules/subscription/migrations/Migration20260327143452.js +24 -0
- package/.medusa/server/src/modules/subscription/migrations/Migration20260329194835.js +16 -0
- package/.medusa/server/src/modules/subscription/models/subscription.js +64 -0
- package/.medusa/server/src/modules/subscription/service.js +13 -0
- package/.medusa/server/src/modules/subscription/types/index.js +17 -0
- package/.medusa/server/src/modules/subscription/utils/admin-query.js +465 -0
- package/.medusa/server/src/modules/subscription/utils/errors.js +28 -0
- package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +178 -0
- package/.medusa/server/src/workflows/apply-retention-offer.js +52 -0
- package/.medusa/server/src/workflows/approve-renewal-changes.js +61 -0
- package/.medusa/server/src/workflows/cancel-subscription.js +64 -0
- package/.medusa/server/src/workflows/create-or-upsert-plan-offer.js +11 -0
- package/.medusa/server/src/workflows/ensure-next-renewal-cycle.js +11 -0
- package/.medusa/server/src/workflows/finalize-cancellation.js +88 -0
- package/.medusa/server/src/workflows/force-renewal-cycle.js +11 -0
- package/.medusa/server/src/workflows/index.js +79 -0
- package/.medusa/server/src/workflows/mark-dunning-recovered.js +11 -0
- package/.medusa/server/src/workflows/mark-dunning-unrecovered.js +11 -0
- package/.medusa/server/src/workflows/pause-subscription.js +61 -0
- package/.medusa/server/src/workflows/process-renewal-cycle.js +43 -0
- package/.medusa/server/src/workflows/rebuild-analytics-daily-snapshots.js +13 -0
- package/.medusa/server/src/workflows/reject-renewal-changes.js +61 -0
- package/.medusa/server/src/workflows/resume-subscription.js +76 -0
- package/.medusa/server/src/workflows/run-dunning-retry.js +23 -0
- package/.medusa/server/src/workflows/schedule-subscription-plan-change.js +57 -0
- package/.medusa/server/src/workflows/start-cancellation-case.js +58 -0
- package/.medusa/server/src/workflows/start-dunning.js +11 -0
- package/.medusa/server/src/workflows/steps/apply-retention-offer.js +200 -0
- package/.medusa/server/src/workflows/steps/approve-renewal-changes.js +48 -0
- package/.medusa/server/src/workflows/steps/cancel-subscription.js +48 -0
- package/.medusa/server/src/workflows/steps/create-initial-renewal-cycle.js +6 -0
- package/.medusa/server/src/workflows/steps/create-subscription-log-event.js +61 -0
- package/.medusa/server/src/workflows/steps/create-subscription-record.js +56 -0
- package/.medusa/server/src/workflows/steps/ensure-next-renewal-cycle.js +151 -0
- package/.medusa/server/src/workflows/steps/finalize-cancellation.js +161 -0
- package/.medusa/server/src/workflows/steps/force-renewal-cycle.js +120 -0
- package/.medusa/server/src/workflows/steps/link-subscription-commerce-entities.js +44 -0
- package/.medusa/server/src/workflows/steps/mark-dunning-recovered.js +72 -0
- package/.medusa/server/src/workflows/steps/mark-dunning-unrecovered.js +53 -0
- package/.medusa/server/src/workflows/steps/normalize-analytics-rebuild-range.js +59 -0
- package/.medusa/server/src/workflows/steps/pause-subscription.js +50 -0
- package/.medusa/server/src/workflows/steps/process-renewal-cycle.js +641 -0
- package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +519 -0
- package/.medusa/server/src/workflows/steps/reject-renewal-changes.js +48 -0
- package/.medusa/server/src/workflows/steps/resume-subscription.js +45 -0
- package/.medusa/server/src/workflows/steps/run-dunning-retry.js +592 -0
- package/.medusa/server/src/workflows/steps/schedule-subscription-plan-change.js +81 -0
- package/.medusa/server/src/workflows/steps/shared-cancellation-log.js +3 -0
- package/.medusa/server/src/workflows/steps/shared-plan-offer.js +280 -0
- package/.medusa/server/src/workflows/steps/shared-renewal-approval.js +34 -0
- package/.medusa/server/src/workflows/steps/start-cancellation-case.js +147 -0
- package/.medusa/server/src/workflows/steps/start-dunning.js +237 -0
- package/.medusa/server/src/workflows/steps/toggle-plan-offer.js +33 -0
- package/.medusa/server/src/workflows/steps/update-cancellation-reason.js +95 -0
- package/.medusa/server/src/workflows/steps/update-dunning-retry-schedule.js +91 -0
- package/.medusa/server/src/workflows/steps/update-plan-offer.js +51 -0
- package/.medusa/server/src/workflows/steps/update-subscription-settings.js +91 -0
- package/.medusa/server/src/workflows/steps/update-subscription-shipping-address.js +54 -0
- package/.medusa/server/src/workflows/steps/upsert-plan-offer.js +48 -0
- package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +280 -0
- package/.medusa/server/src/workflows/toggle-plan-offer.js +11 -0
- package/.medusa/server/src/workflows/update-cancellation-reason.js +53 -0
- package/.medusa/server/src/workflows/update-dunning-retry-schedule.js +11 -0
- package/.medusa/server/src/workflows/update-plan-offer.js +11 -0
- package/.medusa/server/src/workflows/update-subscription-settings.js +11 -0
- package/.medusa/server/src/workflows/update-subscription-shipping-address.js +99 -0
- package/.medusa/server/src/workflows/utils/analytics-incremental.js +24 -0
- package/.medusa/server/src/workflows/utils/date-output.js +13 -0
- package/.medusa/server/src/workflows/utils/subscription-settings.js +13 -0
- package/LICENSE +21 -0
- package/README.md +200 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtZHVubmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3RhcnQtZHVubmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsbURBQXNEO0FBRXRELHVEQUdvQztBQUNwQywrREFBa0U7QUFDbEUsK0VBR21EO0FBQ25ELG1EQUFzRDtBQUV0RCx1REFBZ0U7QUFDaEUsK0RBQWtFO0FBQ2xFLDZEQUFnRTtBQUVoRSw0REFBcUU7QUFDckUsb0VBQTRFO0FBRTVFLDBFQUFpRjtBQUVqRixNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxDQUFvQjtJQUM5RCx5QkFBaUIsQ0FBQyxJQUFJO0lBQ3RCLHlCQUFpQixDQUFDLGVBQWU7SUFDakMseUJBQWlCLENBQUMsUUFBUTtJQUMxQix5QkFBaUIsQ0FBQywwQkFBMEI7Q0FDN0MsQ0FBQyxDQUFBO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtDQUNsQixDQUFDLENBQUE7QUF1RUYsU0FBUyxtQkFBbUIsQ0FBQyxNQUF5QjtJQUNwRCxPQUFPLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixTQUE0QyxFQUM1QyxFQUFVO0lBRVYsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUVyRSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FDbkQsRUFBRSxDQUNILENBQXVCLENBQUE7SUFDMUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sMkJBQWtCLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxnQkFBZ0IsQ0FDN0IsU0FBNEMsRUFDNUMsRUFBVTtJQUVWLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsd0JBQWMsQ0FBeUIsQ0FBQTtJQUUvRSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQXVCLENBQUE7SUFDN0UsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sc0JBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2xELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxRQUErQjtJQUMzRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksSUFBSSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLFFBQVEsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFM0UsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxzQkFBYSxDQUFDLFdBQVcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxTQUE0QyxFQUM1QyxLQUE0QjtJQUU1QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsd0RBQWdDLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDbEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSTtRQUN2QyxRQUFRLEVBQUUsaUJBQTBCO1FBQ3BDLFNBQVMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDO1FBQ2hELFFBQVEsRUFBRSxLQUFjO1FBQ3hCLE1BQU0sRUFBRSxnQkFBeUI7S0FDbEMsQ0FBQTtJQUNELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLG9CQUFvQixDQUFBO0lBRXZFLElBQUksQ0FBQztRQUNILElBQUEsNkNBQTRCLEVBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxzQkFBYSxDQUFDLFdBQVcsQ0FDN0IsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQzFFLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUE7QUFDNUMsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsS0FBNEI7SUFDdkQsT0FBTztRQUNMLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN6QixNQUFNLEVBQUUseUJBQXlCO1FBQ2pDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7UUFDcEQsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtRQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJO0tBQzdCLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsS0FBNEIsRUFDNUIsUUFBbUM7SUFFbkMsT0FBTztRQUNMLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQzdCLGVBQWUsRUFBRTtZQUNmLHVCQUF1QixFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUM7WUFDOUQsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtZQUNuRCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsT0FBTztZQUNsQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7U0FDcEM7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLGdCQUFnRCxFQUNoRCxLQUE0QjtJQUU1QixPQUFPO1FBQ0wsR0FBRyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUMzQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFBO0FBQ0gsQ0FBQztBQUVZLFFBQUEsZ0JBQWdCLEdBQUcsSUFBQSwwQkFBVSxFQUN4QyxlQUFlLEVBQ2YsS0FBSyxXQUNILEtBQTRCLEVBQzVCLEVBQUUsU0FBUyxFQUFFO0lBRWIsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFBO0lBQzdFLE1BQU0sa0JBQWtCLEdBQ3RCLFNBQVMsQ0FBQyxPQUFPLENBQTRCLGtDQUFtQixDQUFDLENBQUE7SUFFbkUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sc0JBQWEsQ0FBQyxXQUFXLENBQzdCLHVDQUF1QyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsQ0FDdkUsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxzQkFBYSxDQUFDLFdBQVcsQ0FDN0IsZ0RBQWdELENBQ2pELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzdFLE1BQU0sS0FBSyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRXZFLElBQUksS0FBSyxDQUFDLGVBQWUsS0FBSyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUMsTUFBTSxzQkFBYSxDQUFDLFdBQVcsQ0FDN0IsaUJBQWlCLEtBQUssQ0FBQyxFQUFFLHFDQUFxQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQ2pGLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLDBCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLE1BQU0sc0JBQWEsQ0FBQyxRQUFRLENBQzFCLCtEQUErRCxLQUFLLENBQUMsRUFBRSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FDaEcsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUNFLFlBQVksQ0FBQyxNQUFNLEtBQUssMEJBQWtCLENBQUMsTUFBTTtRQUNqRCxZQUFZLENBQUMsTUFBTSxLQUFLLDBCQUFrQixDQUFDLFFBQVEsRUFDbkQsQ0FBQztRQUNELE1BQU0sMkJBQWtCLENBQUMsWUFBWSxDQUNuQyxZQUFZLENBQUMsRUFBRSxFQUNmLGVBQWUsRUFDZixZQUFZLENBQUMsTUFBTSxDQUNwQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDM0QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7S0FDcEIsQ0FBQyxDQUF3QixDQUFBO0lBRWpDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLHNCQUFhLENBQUMsUUFBUSxDQUMxQixpQkFBaUIsS0FBSyxDQUFDLEVBQUUsc0NBQXNDLENBQ2hFLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUU5QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDOUQsZUFBZSxFQUFFLFlBQVksQ0FBQyxFQUFFO0tBQzFCLENBQUMsQ0FBd0IsQ0FBQTtJQUVqQyxNQUFNLHlCQUF5QixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FDdEQsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNkLFdBQVcsQ0FBQyxFQUFFLEtBQUssWUFBWSxFQUFFLEVBQUU7UUFDbkMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUMxQyxDQUFBO0lBRUQsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FBQzlCLE1BQU0sc0JBQWEsQ0FBQywwQkFBMEIsQ0FDNUMsWUFBWSxDQUFDLEVBQUUsRUFDZix5QkFBeUIsQ0FBQyxFQUFFLENBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxvQkFBb0IsQ0FDcEUsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sa0JBQWtCLEdBQUcsSUFBQSxxQ0FBb0IsRUFBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXpFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sc0JBQWEsQ0FBQyxXQUFXLENBQzdCLDhEQUE4RCxDQUMvRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sb0JBQW9CLEdBQ3hCLFlBQVksQ0FBQyxNQUFNLEtBQUssMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtJQUUzRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN0RCxlQUFlLEVBQUUsWUFBWSxDQUFDLEVBQUU7WUFDaEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDMUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJO1lBQzVFLE1BQU0sRUFBRSx5QkFBaUIsQ0FBQyxlQUFlO1lBQ3pDLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFlBQVksRUFBRSxXQUFXO1lBQ3pCLGNBQWMsRUFBRSxRQUFRO1lBQ3hCLGFBQWEsRUFBRSxrQkFBa0I7WUFDakMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixJQUFJLElBQUk7WUFDekQsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQjtZQUN2RCxlQUFlLEVBQUUsSUFBSTtZQUNyQixZQUFZLEVBQUUsSUFBSTtZQUNsQixTQUFTLEVBQUUsSUFBSTtZQUNmLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1NBQzFDLENBQUMsQ0FBc0IsQ0FBQTtRQUUvQixJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsTUFBTSxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDM0MsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO2dCQUNuQixNQUFNLEVBQUUsMEJBQWtCLENBQUMsUUFBUTthQUNwQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLDRCQUFZLENBQ3JCO1lBQ0UsTUFBTSxFQUFFLFNBQVM7WUFDakIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLGVBQWUsRUFBRSxZQUFZLENBQUMsRUFBRTtZQUNoQyxtQkFBbUIsRUFBRSwwQkFBa0IsQ0FBQyxRQUFRO1NBQ2pELEVBQ0Q7WUFDRSxNQUFNLEVBQUUsU0FBUztZQUNqQix1QkFBdUIsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNuQyxxQkFBcUIsRUFBRSxvQkFBb0I7U0FDNUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksNEJBQVksQ0FDckI7WUFDRSxNQUFNLEVBQUUsTUFBTTtZQUNkLGVBQWUsRUFBRSxZQUFZLENBQUMsRUFBRTtZQUNoQyxlQUFlLEVBQUUsWUFBWSxDQUFDLEVBQUU7WUFDaEMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDekMsRUFDRDtZQUNFLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxhQUFhLENBQUMsa0JBQWtCLENBQUM7UUFDdEQsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQ25CLGdCQUFnQixFQUNkLFlBQVksQ0FBQyxnQkFBZ0I7WUFDN0IsS0FBSyxDQUFDLGdCQUFnQjtZQUN0QixLQUFLLENBQUMsa0JBQWtCO1lBQ3hCLElBQUk7UUFDTixNQUFNLEVBQ0osWUFBWSxDQUFDLE1BQU0sS0FBSyx5QkFBaUIsQ0FBQyxJQUFJO1lBQzVDLENBQUMsQ0FBQyx5QkFBaUIsQ0FBQyxlQUFlO1lBQ25DLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTTtRQUN6QixZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVksSUFBSSxXQUFXO1FBQ3RELGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYyxJQUFJLFFBQVE7UUFDdkQsYUFBYSxFQUFFLFlBQVksQ0FBQyxhQUFhLElBQUksa0JBQWtCO1FBQy9ELHVCQUF1QixFQUNyQixLQUFLLENBQUMsa0JBQWtCLElBQUksWUFBWSxDQUFDLHVCQUF1QixJQUFJLElBQUk7UUFDMUUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQjtRQUN2RCxRQUFRLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7S0FDdEQsQ0FBQyxDQUFzQixDQUFBO0lBRS9CLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN6QixNQUFNLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO1lBQzNDLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRTtZQUNuQixNQUFNLEVBQUUsMEJBQWtCLENBQUMsUUFBUTtTQUNwQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQ3JCO1FBQ0UsTUFBTSxFQUFFLFNBQVM7UUFDakIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLGVBQWUsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUNoQyxtQkFBbUIsRUFBRSwwQkFBa0IsQ0FBQyxRQUFRO0tBQ2pELEVBQ0Q7UUFDRSxNQUFNLEVBQUUsU0FBUztRQUNqQixxQkFBcUIsRUFBRSxZQUFZO1FBQ25DLHFCQUFxQixFQUFFLG9CQUFvQjtLQUM1QyxDQUNGLENBQUE7QUFDSCxDQUFDLEVBQ0QsS0FBSyxXQUNILFlBQXNDLEVBQ3RDLEVBQUUsU0FBUyxFQUFFO0lBRWIsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3BELE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFBO0lBQzdFLE1BQU0sa0JBQWtCLEdBQ3RCLFNBQVMsQ0FBQyxPQUFPLENBQTRCLGtDQUFtQixDQUFDLENBQUE7SUFFbkUsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQzlFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxhQUFhLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLHFCQUE0QixDQUFDLENBQUE7SUFDbkYsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkMsTUFBTSxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUNsRixDQUFDO0FBQ0gsQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -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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
|