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