@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,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateAnalyticsQualityForRange = evaluateAnalyticsQualityForRange;
|
|
4
|
+
const MRR_CHANGE_THRESHOLD_PERCENT = 50;
|
|
5
|
+
const CHURN_RATE_ABSOLUTE_THRESHOLD = 25;
|
|
6
|
+
const CHURN_RATE_DELTA_THRESHOLD = 15;
|
|
7
|
+
function round(value) {
|
|
8
|
+
return Number(value.toFixed(2));
|
|
9
|
+
}
|
|
10
|
+
function computeChurnRate(churnedSubscriptionsCount, activeSubscriptionsCount) {
|
|
11
|
+
if (activeSubscriptionsCount <= 0) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
return (churnedSubscriptionsCount / activeSubscriptionsCount) * 100;
|
|
15
|
+
}
|
|
16
|
+
function evaluateAnalyticsQualityForRange(snapshots) {
|
|
17
|
+
const findings = [];
|
|
18
|
+
const ordered = [...snapshots].sort((left, right) => left.metric_date.localeCompare(right.metric_date));
|
|
19
|
+
ordered.forEach((snapshot, index) => {
|
|
20
|
+
if (snapshot.processed_subscriptions > 0 && snapshot.snapshot_rows === 0) {
|
|
21
|
+
findings.push({
|
|
22
|
+
code: "analytics.snapshot.empty_day",
|
|
23
|
+
severity: "error",
|
|
24
|
+
metric: "snapshot",
|
|
25
|
+
date: snapshot.metric_date,
|
|
26
|
+
message: "Analytics rebuild produced no snapshot rows for a day with processed subscriptions",
|
|
27
|
+
metadata: {
|
|
28
|
+
processed_subscriptions: snapshot.processed_subscriptions,
|
|
29
|
+
snapshot_rows: snapshot.snapshot_rows,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (snapshot.processed_subscriptions > 0 &&
|
|
34
|
+
snapshot.snapshot_rows !== snapshot.processed_subscriptions) {
|
|
35
|
+
findings.push({
|
|
36
|
+
code: "analytics.snapshot.incomplete_day",
|
|
37
|
+
severity: "error",
|
|
38
|
+
metric: "snapshot",
|
|
39
|
+
date: snapshot.metric_date,
|
|
40
|
+
message: "Analytics rebuild produced a snapshot row count that does not match processed subscriptions",
|
|
41
|
+
metadata: {
|
|
42
|
+
processed_subscriptions: snapshot.processed_subscriptions,
|
|
43
|
+
snapshot_rows: snapshot.snapshot_rows,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const previousSnapshot = index > 0 ? ordered[index - 1] : null;
|
|
48
|
+
if (!previousSnapshot) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (snapshot.mrr_amount !== null &&
|
|
52
|
+
previousSnapshot.mrr_amount !== null &&
|
|
53
|
+
previousSnapshot.mrr_amount > 0) {
|
|
54
|
+
const deltaPercent = ((snapshot.mrr_amount - previousSnapshot.mrr_amount) /
|
|
55
|
+
previousSnapshot.mrr_amount) *
|
|
56
|
+
100;
|
|
57
|
+
if (Math.abs(deltaPercent) >= MRR_CHANGE_THRESHOLD_PERCENT) {
|
|
58
|
+
findings.push({
|
|
59
|
+
code: "analytics.mrr.spike",
|
|
60
|
+
severity: "warn",
|
|
61
|
+
metric: "mrr",
|
|
62
|
+
date: snapshot.metric_date,
|
|
63
|
+
message: "Daily MRR changed more than the configured anomaly threshold compared with the previous day",
|
|
64
|
+
metadata: {
|
|
65
|
+
current_mrr: round(snapshot.mrr_amount),
|
|
66
|
+
previous_mrr: round(previousSnapshot.mrr_amount),
|
|
67
|
+
delta_percentage: round(deltaPercent),
|
|
68
|
+
threshold_percentage: MRR_CHANGE_THRESHOLD_PERCENT,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const currentChurnRate = computeChurnRate(snapshot.churned_subscriptions_count, snapshot.active_subscriptions_count);
|
|
74
|
+
const previousChurnRate = computeChurnRate(previousSnapshot.churned_subscriptions_count, previousSnapshot.active_subscriptions_count);
|
|
75
|
+
if (currentChurnRate >= CHURN_RATE_ABSOLUTE_THRESHOLD ||
|
|
76
|
+
Math.abs(currentChurnRate - previousChurnRate) >=
|
|
77
|
+
CHURN_RATE_DELTA_THRESHOLD) {
|
|
78
|
+
findings.push({
|
|
79
|
+
code: "analytics.churn_rate.spike",
|
|
80
|
+
severity: "warn",
|
|
81
|
+
metric: "churn_rate",
|
|
82
|
+
date: snapshot.metric_date,
|
|
83
|
+
message: "Daily churn rate exceeded the configured threshold or changed sharply compared with the previous day",
|
|
84
|
+
metadata: {
|
|
85
|
+
current_churn_rate: round(currentChurnRate),
|
|
86
|
+
previous_churn_rate: round(previousChurnRate),
|
|
87
|
+
delta_percentage: round(currentChurnRate - previousChurnRate),
|
|
88
|
+
absolute_threshold: CHURN_RATE_ABSOLUTE_THRESHOLD,
|
|
89
|
+
delta_threshold: CHURN_RATE_DELTA_THRESHOLD,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
findings,
|
|
96
|
+
finding_count: findings.length,
|
|
97
|
+
has_errors: findings.some((finding) => finding.severity === "error"),
|
|
98
|
+
has_warnings: findings.some((finding) => finding.severity === "warn"),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1xdWFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYW5hbHl0aWNzL3V0aWxzL2RhdGEtcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJDQSw0RUFrSEM7QUFySUQsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUE7QUFDdkMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUE7QUFDeEMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUE7QUFFckMsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUMxQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLHlCQUFpQyxFQUNqQyx3QkFBZ0M7SUFFaEMsSUFBSSx3QkFBd0IsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCxPQUFPLENBQUMseUJBQXlCLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxHQUFHLENBQUE7QUFDckUsQ0FBQztBQUVELFNBQWdCLGdDQUFnQyxDQUM5QyxTQUFpQztJQUVqQyxNQUFNLFFBQVEsR0FBOEIsRUFBRSxDQUFBO0lBQzlDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUNsRCxDQUFBO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNsQyxJQUFJLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxRQUFR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
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAnalyticsCorrelationId = createAnalyticsCorrelationId;
|
|
4
|
+
exports.getAnalyticsErrorMessage = getAnalyticsErrorMessage;
|
|
5
|
+
exports.classifyAnalyticsFailure = classifyAnalyticsFailure;
|
|
6
|
+
exports.isAlertableAnalyticsFailure = isAlertableAnalyticsFailure;
|
|
7
|
+
exports.isSlowAnalyticsRebuild = isSlowAnalyticsRebuild;
|
|
8
|
+
exports.isSlowAnalyticsJob = isSlowAnalyticsJob;
|
|
9
|
+
exports.isSlowAnalyticsRead = isSlowAnalyticsRead;
|
|
10
|
+
exports.getAnalyticsRebuildLogLevel = getAnalyticsRebuildLogLevel;
|
|
11
|
+
exports.getAnalyticsJobLogLevel = getAnalyticsJobLogLevel;
|
|
12
|
+
exports.getAnalyticsReadLogLevel = getAnalyticsReadLogLevel;
|
|
13
|
+
exports.buildAnalyticsReadEventName = buildAnalyticsReadEventName;
|
|
14
|
+
exports.logAnalyticsEvent = logAnalyticsEvent;
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
const SLOW_ANALYTICS_REBUILD_THRESHOLD_MS = 5_000;
|
|
17
|
+
const SLOW_ANALYTICS_JOB_THRESHOLD_MS = 5_000;
|
|
18
|
+
const SLOW_ANALYTICS_READ_THRESHOLD_MS = 1_000;
|
|
19
|
+
function getNestedMessage(value) {
|
|
20
|
+
if (!value) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "string") {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
if (value instanceof Error) {
|
|
27
|
+
const causeMessage = getNestedMessage(value.cause);
|
|
28
|
+
return value.message || causeMessage || null;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === "object") {
|
|
31
|
+
const record = value;
|
|
32
|
+
const candidates = [
|
|
33
|
+
record.message,
|
|
34
|
+
record.error,
|
|
35
|
+
record.details,
|
|
36
|
+
record.cause,
|
|
37
|
+
record.response?.data,
|
|
38
|
+
record.response?.message,
|
|
39
|
+
record.data?.message,
|
|
40
|
+
record.body?.message,
|
|
41
|
+
];
|
|
42
|
+
for (const candidate of candidates) {
|
|
43
|
+
const nested = getNestedMessage(candidate);
|
|
44
|
+
if (nested) {
|
|
45
|
+
return nested;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function createAnalyticsCorrelationId(prefix) {
|
|
52
|
+
return `${prefix}-${(0, crypto_1.randomUUID)()}`;
|
|
53
|
+
}
|
|
54
|
+
function getAnalyticsErrorMessage(error) {
|
|
55
|
+
const direct = getNestedMessage(error);
|
|
56
|
+
if (direct) {
|
|
57
|
+
return direct;
|
|
58
|
+
}
|
|
59
|
+
return "Analytics processing failed";
|
|
60
|
+
}
|
|
61
|
+
function classifyAnalyticsFailure(error) {
|
|
62
|
+
const message = getAnalyticsErrorMessage(error).toLowerCase();
|
|
63
|
+
if (message.includes("timed-out acquiring lock") ||
|
|
64
|
+
message.includes("timeout acquiring lock") ||
|
|
65
|
+
message.includes("timed out acquiring lock")) {
|
|
66
|
+
return "lock_timeout";
|
|
67
|
+
}
|
|
68
|
+
if (message.includes("already running") ||
|
|
69
|
+
message.includes("already rebuilding") ||
|
|
70
|
+
message.includes("another job instance")) {
|
|
71
|
+
return "already_running";
|
|
72
|
+
}
|
|
73
|
+
return "unexpected_error";
|
|
74
|
+
}
|
|
75
|
+
function isAlertableAnalyticsFailure(kind) {
|
|
76
|
+
return !["already_running", "lock_timeout"].includes(kind);
|
|
77
|
+
}
|
|
78
|
+
function isSlowAnalyticsRebuild(durationMs) {
|
|
79
|
+
return durationMs > SLOW_ANALYTICS_REBUILD_THRESHOLD_MS;
|
|
80
|
+
}
|
|
81
|
+
function isSlowAnalyticsJob(durationMs) {
|
|
82
|
+
return durationMs > SLOW_ANALYTICS_JOB_THRESHOLD_MS;
|
|
83
|
+
}
|
|
84
|
+
function isSlowAnalyticsRead(durationMs) {
|
|
85
|
+
return durationMs > SLOW_ANALYTICS_READ_THRESHOLD_MS;
|
|
86
|
+
}
|
|
87
|
+
function getAnalyticsRebuildLogLevel(input) {
|
|
88
|
+
if (input.failed_days_count > 0 || input.quality_error_count > 0) {
|
|
89
|
+
return "error";
|
|
90
|
+
}
|
|
91
|
+
if (input.blocked_days_count > 0 ||
|
|
92
|
+
input.quality_warning_count > 0 ||
|
|
93
|
+
isSlowAnalyticsRebuild(input.duration_ms)) {
|
|
94
|
+
return "warn";
|
|
95
|
+
}
|
|
96
|
+
return "info";
|
|
97
|
+
}
|
|
98
|
+
function getAnalyticsJobLogLevel(input) {
|
|
99
|
+
if (input.failed_days_count > 0) {
|
|
100
|
+
return "error";
|
|
101
|
+
}
|
|
102
|
+
if (input.blocked_days_count > 0 ||
|
|
103
|
+
isSlowAnalyticsJob(input.duration_ms)) {
|
|
104
|
+
return "warn";
|
|
105
|
+
}
|
|
106
|
+
return "info";
|
|
107
|
+
}
|
|
108
|
+
function getAnalyticsReadLogLevel(input) {
|
|
109
|
+
if (input.failed) {
|
|
110
|
+
return "error";
|
|
111
|
+
}
|
|
112
|
+
if (isSlowAnalyticsRead(input.duration_ms)) {
|
|
113
|
+
return "warn";
|
|
114
|
+
}
|
|
115
|
+
return "info";
|
|
116
|
+
}
|
|
117
|
+
function buildAnalyticsReadEventName(kind) {
|
|
118
|
+
return `analytics.read.${kind}`;
|
|
119
|
+
}
|
|
120
|
+
function logAnalyticsEvent(logger, level, payload) {
|
|
121
|
+
const line = JSON.stringify({
|
|
122
|
+
domain: "analytics",
|
|
123
|
+
...payload,
|
|
124
|
+
});
|
|
125
|
+
logger[level](line);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FuYWx5dGljcy91dGlscy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUZBLG9FQUVDO0FBRUQsNERBUUM7QUFFRCw0REFvQkM7QUFFRCxrRUFFQztBQUVELHdEQUVDO0FBRUQsZ0RBRUM7QUFFRCxrREFFQztBQUVELGtFQW9CQztBQUVELDBEQWlCQztBQUVELDREQWFDO0FBRUQsa0VBRUM7QUFFRCw4Q0FXQztBQXBORCxtQ0FBbUM7QUFXbkMsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSwrQkFBK0IsR0FBRyxLQUFLLENBQUE7QUFDN0MsTUFBTSxnQ0FBZ0MsR0FBRyxLQUFLLENBQUE7QUFFOUMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUUsS0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuRixPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQTtJQUM5QyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFnQyxDQUFBO1FBRS9DLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLE1BQU0sQ0FBQyxPQUFPO1lBQ2QsTUFBTSxDQUFDLEtBQUs7WUFDWixNQUFNLENBQUMsT0FBTztZQUNkLE1BQU0sQ0FBQyxLQUFLO1lBQ1gs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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CANCELLATION_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.CANCELLATION_MODULE = "cancellation";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.CANCELLATION_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUFpRDtBQUVwQyxRQUFBLG1CQUFtQixHQUFHLGNBQWMsQ0FBQTtBQUVqRCxrQkFBZSxJQUFBLGNBQU0sRUFBQywyQkFBbUIsRUFBRTtJQUN6QyxPQUFPLEVBQUUsaUJBQXlCO0NBQ25DLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260401143914 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260401143914 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`create table if not exists "cancellation_case" ("id" text not null, "subscription_id" text not null, "status" text check ("status" in ('requested', 'evaluating_retention', 'retention_offered', 'retained', 'paused', 'canceled')) not null default 'requested', "reason" text null, "reason_category" text check ("reason_category" in ('price', 'product_fit', 'delivery', 'billing', 'temporary_pause', 'switched_competitor', 'other')) null, "notes" text null, "recommended_action" text check ("recommended_action" in ('pause_offer', 'discount_offer', 'bonus_offer', 'direct_cancel')) null, "final_outcome" text check ("final_outcome" in ('retained', 'paused', 'canceled')) null, "finalized_at" timestamptz null, "finalized_by" text null, "cancellation_effective_at" timestamptz null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "cancellation_case_pkey" primary key ("id"));`);
|
|
8
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_deleted_at" ON "cancellation_case" ("deleted_at") WHERE deleted_at IS NULL;`);
|
|
9
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_subscription_id" ON "cancellation_case" ("subscription_id") WHERE deleted_at IS NULL;`);
|
|
10
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_status" ON "cancellation_case" ("status") WHERE deleted_at IS NULL;`);
|
|
11
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_final_outcome" ON "cancellation_case" ("final_outcome") WHERE deleted_at IS NULL;`);
|
|
12
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_reason_category" ON "cancellation_case" ("reason_category") WHERE deleted_at IS NULL;`);
|
|
13
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_created_at" ON "cancellation_case" ("created_at") WHERE deleted_at IS NULL;`);
|
|
14
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_subscription_id_status" ON "cancellation_case" ("subscription_id", "status") WHERE deleted_at IS NULL;`);
|
|
15
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_cancellation_case_status_created_at" ON "cancellation_case" ("status", "created_at") WHERE deleted_at IS NULL;`);
|
|
16
|
+
this.addSql(`create table if not exists "retention_offer_event" ("id" text not null, "cancellation_case_id" text not null, "offer_type" text check ("offer_type" in ('pause_offer', 'discount_offer', 'bonus_offer')) not null, "offer_payload" jsonb null, "decision_status" text check ("decision_status" in ('proposed', 'accepted', 'rejected', 'applied', 'expired')) not null default 'proposed', "decision_reason" text null, "decided_at" timestamptz null, "decided_by" text null, "applied_at" timestamptz null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "retention_offer_event_pkey" primary key ("id"));`);
|
|
17
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_cancellation_case_id" ON "retention_offer_event" ("cancellation_case_id") WHERE deleted_at IS NULL;`);
|
|
18
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_deleted_at" ON "retention_offer_event" ("deleted_at") WHERE deleted_at IS NULL;`);
|
|
19
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_offer_type" ON "retention_offer_event" ("offer_type") WHERE deleted_at IS NULL;`);
|
|
20
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_decision_status" ON "retention_offer_event" ("decision_status") WHERE deleted_at IS NULL;`);
|
|
21
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_created_at" ON "retention_offer_event" ("created_at") WHERE deleted_at IS NULL;`);
|
|
22
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_cancellation_case_id_created_at" ON "retention_offer_event" ("cancellation_case_id", "created_at") WHERE deleted_at IS NULL;`);
|
|
23
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_retention_offer_event_offer_type_decision_status" ON "retention_offer_event" ("offer_type", "decision_status") WHERE deleted_at IS NULL;`);
|
|
24
|
+
this.addSql(`alter table if exists "retention_offer_event" drop constraint if exists "retention_offer_event_cancellation_case_id_foreign";`);
|
|
25
|
+
this.addSql(`alter table if exists "retention_offer_event" add constraint "retention_offer_event_cancellation_case_id_foreign" foreign key ("cancellation_case_id") references "cancellation_case" ("id") on update cascade;`);
|
|
26
|
+
}
|
|
27
|
+
async down() {
|
|
28
|
+
this.addSql(`alter table if exists "retention_offer_event" drop constraint if exists "retention_offer_event_cancellation_case_id_foreign";`);
|
|
29
|
+
this.addSql(`drop table if exists "cancellation_case" cascade;`);
|
|
30
|
+
this.addSql(`drop table if exists "retention_offer_event" cascade;`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.Migration20260401143914 = Migration20260401143914;
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDExNDM5MTQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDQwMTE0MzkxNC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsNDlCQUE0OUIsQ0FBQyxDQUFDO1FBQzErQixJQUFJLENBQUMsTUFBTSxDQUFDLCtIQUErSCxDQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsdUhBQXVILENBQUMsQ0FBQztRQUNySSxJQUFJLENBQUMsTUFBTSxDQUFDLHFJQUFxSSxDQUFDLENBQUM7UUFDbkosSUFBSSxDQUFDLE1BQU0sQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsK0hBQStILENBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsTUFBTSxDQUFDLDBKQUEwSixDQUFDLENBQUM7UUFDeEssSUFBSSxDQUFDLE1BQU0sQ0FBQyxnSkFBZ0osQ0FBQyxDQUFDO1FBRTlKLElBQUksQ0FBQyxNQUFNLENBQUMsb3NCQUFvc0IsQ0FBQyxDQUFDO1FBQ2x0QixJQUFJLENBQUMsTUFBTSxDQUFDLDJKQUEySixDQUFDLENBQUM7UUFDekssSUFBSSxDQUFDLE1BQU0sQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO1FBQ3JKLElBQUksQ0FBQyxNQUFNLENBQUMsdUlBQXVJLENBQUMsQ0FBQztRQUNySixJQUFJLENBQUMsTUFBTSxDQUFDLGlKQUFpSixDQUFDLENBQUM7UUFDL0osSUFBSSxDQUFDLE1BQU0sQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO1FBQ3JKLElBQUksQ0FBQyxNQUFNLENBQUMsb0xBQW9MLENBQUMsQ0FBQztRQUNsTSxJQUFJLENBQUMsTUFBTSxDQUFDLDBLQUEwSyxDQUFDLENBQUM7UUFFeEwsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSEFBK0gsQ0FBQyxDQUFDO1FBQzdJLElBQUksQ0FBQyxNQUFNLENBQUMsaU5BQWlOLENBQUMsQ0FBQztJQUNqTyxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSEFBK0gsQ0FBQyxDQUFDO1FBRTdJLElBQUksQ0FBQyxNQUFNLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUVGO0FBbENELDBEQWtDQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260405112000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260405112000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "cancellation_case" drop column if exists "recommended_action";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "cancellation_case" add column if not exists "recommended_action" text check ("recommended_action" in ('pause_offer', 'discount_offer', 'bonus_offer', 'direct_cancel')) null;`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20260405112000 = Migration20260405112000;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDUxMTIwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDQwNTExMjAwMC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUMzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQ1QsdUZBQXVGLENBQ3hGLENBQUM7SUFDSixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FDVCxzTUFBc00sQ0FDdk0sQ0FBQztJQUNKLENBQUM7Q0FDRjtBQVpELDBEQVlDIn0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const retention_offer_event_1 = __importDefault(require("./retention-offer-event"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const CancellationCase = utils_1.model
|
|
10
|
+
.define("cancellation_case", {
|
|
11
|
+
id: utils_1.model.id().primaryKey(),
|
|
12
|
+
subscription_id: utils_1.model.text(),
|
|
13
|
+
status: utils_1.model
|
|
14
|
+
.enum(types_1.CancellationCaseStatus)
|
|
15
|
+
.default(types_1.CancellationCaseStatus.REQUESTED),
|
|
16
|
+
reason: utils_1.model.text().nullable(),
|
|
17
|
+
reason_category: utils_1.model.enum(types_1.CancellationReasonCategory).nullable(),
|
|
18
|
+
notes: utils_1.model.text().nullable(),
|
|
19
|
+
final_outcome: utils_1.model.enum(types_1.CancellationFinalOutcome).nullable(),
|
|
20
|
+
finalized_at: utils_1.model.dateTime().nullable(),
|
|
21
|
+
finalized_by: utils_1.model.text().nullable(),
|
|
22
|
+
cancellation_effective_at: utils_1.model.dateTime().nullable(),
|
|
23
|
+
offer_events: utils_1.model.hasMany(() => retention_offer_event_1.default, {
|
|
24
|
+
mappedBy: "cancellation_case",
|
|
25
|
+
}),
|
|
26
|
+
metadata: utils_1.model.json().nullable(),
|
|
27
|
+
})
|
|
28
|
+
.indexes([
|
|
29
|
+
{
|
|
30
|
+
on: ["subscription_id"],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
on: ["status"],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
on: ["final_outcome"],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
on: ["reason_category"],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
on: ["created_at"],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
on: ["subscription_id", "status"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
on: ["status", "created_at"],
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
exports.default = CancellationCase;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsbGF0aW9uLWNhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vbW9kZWxzL2NhbmNlbGxhdGlvbi1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQWlEO0FBQ2pELG9GQUF5RDtBQUN6RCxvQ0FJaUI7QUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxhQUFLO0tBQzNCLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtJQUMzQixFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM3QixNQUFNLEVBQUUsYUFBSztTQUNWLElBQUksQ0FBQyw4QkFBc0IsQ0FBQztTQUM1QixPQUFPLENBQUMsOEJBQXNCLENBQUMsU0FBUyxDQUFDO0lBQzVDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQy9CLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLGtDQUEwQixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ2xFLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLGdDQUF3QixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlELFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLFlBQVksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3JDLHlCQUF5QixFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEQsWUFBWSxFQUFFLGFBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsK0JBQW1CLEVBQUU7UUFDckQsUUFBUSxFQUFFLG1CQUFtQjtLQUM5QixDQUFDO0lBQ0YsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDbEMsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQO1FBQ0UsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUM7S0FDeEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUNmO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUM7S0FDdEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQ3hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQztLQUNsQztJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztLQUM3QjtDQUNGLENBQUMsQ0FBQTtBQUVKLGtCQUFlLGdCQUFnQixDQUFBIn0=
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const cancellation_case_1 = __importDefault(require("./cancellation-case"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const RetentionOfferEvent = utils_1.model
|
|
10
|
+
.define("retention_offer_event", {
|
|
11
|
+
id: utils_1.model.id().primaryKey(),
|
|
12
|
+
cancellation_case: utils_1.model.belongsTo(() => cancellation_case_1.default, {
|
|
13
|
+
mappedBy: "offer_events",
|
|
14
|
+
}),
|
|
15
|
+
offer_type: utils_1.model.enum(types_1.RetentionOfferType),
|
|
16
|
+
offer_payload: utils_1.model.json().nullable(),
|
|
17
|
+
decision_status: utils_1.model
|
|
18
|
+
.enum(types_1.RetentionOfferDecisionStatus)
|
|
19
|
+
.default(types_1.RetentionOfferDecisionStatus.PROPOSED),
|
|
20
|
+
decision_reason: utils_1.model.text().nullable(),
|
|
21
|
+
decided_at: utils_1.model.dateTime().nullable(),
|
|
22
|
+
decided_by: utils_1.model.text().nullable(),
|
|
23
|
+
applied_at: utils_1.model.dateTime().nullable(),
|
|
24
|
+
metadata: utils_1.model.json().nullable(),
|
|
25
|
+
})
|
|
26
|
+
.indexes([
|
|
27
|
+
{
|
|
28
|
+
on: ["cancellation_case_id"],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
on: ["offer_type"],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
on: ["decision_status"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
on: ["created_at"],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
on: ["cancellation_case_id", "created_at"],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
on: ["offer_type", "decision_status"],
|
|
44
|
+
},
|
|
45
|
+
]);
|
|
46
|
+
exports.default = RetentionOfferEvent;
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0ZW50aW9uLW9mZmVyLWV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY2FuY2VsbGF0aW9uL21vZGVscy9yZXRlbnRpb24tb2ZmZXItZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBaUQ7QUFDakQsNEVBQWtEO0FBQ2xELG9DQUdpQjtBQUVqQixNQUFNLG1CQUFtQixHQUFHLGFBQUs7S0FDOUIsTUFBTSxDQUFDLHVCQUF1QixFQUFFO0lBQy9CLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQWdCLEVBQUU7UUFDekQsUUFBUSxFQUFFLGNBQWM7S0FDekIsQ0FBQztJQUNGLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLDBCQUFrQixDQUFDO0lBQzFDLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3RDLGVBQWUsRUFBRSxhQUFLO1NBQ25CLElBQUksQ0FBQyxvQ0FBNEIsQ0FBQztTQUNsQyxPQUFPLENBQUMsb0NBQTRCLENBQUMsUUFBUSxDQUFDO0lBQ2pELGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3hDLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ25DLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2xDLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUDtRQUNFLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDO0tBQzdCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0tBQ3hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7S0FDbkI7SUFDRDtRQUNFLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixFQUFFLFlBQVksQ0FBQztLQUMzQztJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO0tBQ3RDO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsbUJBQW1CLENBQUEifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const cancellation_case_1 = __importDefault(require("./models/cancellation-case"));
|
|
8
|
+
const retention_offer_event_1 = __importDefault(require("./models/retention-offer-event"));
|
|
9
|
+
class CancellationModuleService extends (0, utils_1.MedusaService)({
|
|
10
|
+
CancellationCase: cancellation_case_1.default,
|
|
11
|
+
RetentionOfferEvent: retention_offer_event_1.default,
|
|
12
|
+
}) {
|
|
13
|
+
}
|
|
14
|
+
exports.default = CancellationModuleService;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NhbmNlbGxhdGlvbi9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQXlEO0FBQ3pELG1GQUF5RDtBQUN6RCwyRkFBZ0U7QUFFaEUsTUFBTSx5QkFBMEIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDcEQsZ0JBQWdCLEVBQWhCLDJCQUFnQjtJQUNoQixtQkFBbUIsRUFBbkIsK0JBQW1CO0NBQ3BCLENBQUM7Q0FBRztBQUVMLGtCQUFlLHlCQUF5QixDQUFBIn0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RetentionOfferDecisionStatus = exports.RetentionOfferType = exports.CancellationFinalOutcome = exports.CancellationReasonCategory = exports.CancellationCaseStatus = void 0;
|
|
4
|
+
var CancellationCaseStatus;
|
|
5
|
+
(function (CancellationCaseStatus) {
|
|
6
|
+
CancellationCaseStatus["REQUESTED"] = "requested";
|
|
7
|
+
CancellationCaseStatus["EVALUATING_RETENTION"] = "evaluating_retention";
|
|
8
|
+
CancellationCaseStatus["RETENTION_OFFERED"] = "retention_offered";
|
|
9
|
+
CancellationCaseStatus["RETAINED"] = "retained";
|
|
10
|
+
CancellationCaseStatus["PAUSED"] = "paused";
|
|
11
|
+
CancellationCaseStatus["CANCELED"] = "canceled";
|
|
12
|
+
})(CancellationCaseStatus || (exports.CancellationCaseStatus = CancellationCaseStatus = {}));
|
|
13
|
+
var CancellationReasonCategory;
|
|
14
|
+
(function (CancellationReasonCategory) {
|
|
15
|
+
CancellationReasonCategory["PRICE"] = "price";
|
|
16
|
+
CancellationReasonCategory["PRODUCT_FIT"] = "product_fit";
|
|
17
|
+
CancellationReasonCategory["DELIVERY"] = "delivery";
|
|
18
|
+
CancellationReasonCategory["BILLING"] = "billing";
|
|
19
|
+
CancellationReasonCategory["TEMPORARY_PAUSE"] = "temporary_pause";
|
|
20
|
+
CancellationReasonCategory["SWITCHED_COMPETITOR"] = "switched_competitor";
|
|
21
|
+
CancellationReasonCategory["OTHER"] = "other";
|
|
22
|
+
})(CancellationReasonCategory || (exports.CancellationReasonCategory = CancellationReasonCategory = {}));
|
|
23
|
+
var CancellationFinalOutcome;
|
|
24
|
+
(function (CancellationFinalOutcome) {
|
|
25
|
+
CancellationFinalOutcome["RETAINED"] = "retained";
|
|
26
|
+
CancellationFinalOutcome["PAUSED"] = "paused";
|
|
27
|
+
CancellationFinalOutcome["CANCELED"] = "canceled";
|
|
28
|
+
})(CancellationFinalOutcome || (exports.CancellationFinalOutcome = CancellationFinalOutcome = {}));
|
|
29
|
+
var RetentionOfferType;
|
|
30
|
+
(function (RetentionOfferType) {
|
|
31
|
+
RetentionOfferType["PAUSE_OFFER"] = "pause_offer";
|
|
32
|
+
RetentionOfferType["DISCOUNT_OFFER"] = "discount_offer";
|
|
33
|
+
RetentionOfferType["BONUS_OFFER"] = "bonus_offer";
|
|
34
|
+
})(RetentionOfferType || (exports.RetentionOfferType = RetentionOfferType = {}));
|
|
35
|
+
var RetentionOfferDecisionStatus;
|
|
36
|
+
(function (RetentionOfferDecisionStatus) {
|
|
37
|
+
RetentionOfferDecisionStatus["PROPOSED"] = "proposed";
|
|
38
|
+
RetentionOfferDecisionStatus["ACCEPTED"] = "accepted";
|
|
39
|
+
RetentionOfferDecisionStatus["REJECTED"] = "rejected";
|
|
40
|
+
RetentionOfferDecisionStatus["APPLIED"] = "applied";
|
|
41
|
+
RetentionOfferDecisionStatus["EXPIRED"] = "expired";
|
|
42
|
+
})(RetentionOfferDecisionStatus || (exports.RetentionOfferDecisionStatus = RetentionOfferDecisionStatus = {}));
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxzQkFPWDtBQVBELFdBQVksc0JBQXNCO0lBQ2hDLGlEQUF1QixDQUFBO0lBQ3ZCLHVFQUE2QyxDQUFBO0lBQzdDLGlFQUF1QyxDQUFBO0lBQ3ZDLCtDQUFxQixDQUFBO0lBQ3JCLDJDQUFpQixDQUFBO0lBQ2pCLCtDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFQVyxzQkFBc0Isc0NBQXRCLHNCQUFzQixRQU9qQztBQUVELElBQVksMEJBUVg7QUFSRCxXQUFZLDBCQUEwQjtJQUNwQyw2Q0FBZSxDQUFBO0lBQ2YseURBQTJCLENBQUE7SUFDM0IsbURBQXFCLENBQUE7SUFDckIsaURBQW1CLENBQUE7SUFDbkIsaUVBQW1DLENBQUE7SUFDbkMseUVBQTJDLENBQUE7SUFDM0MsNkNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUlcsMEJBQTBCLDBDQUExQiwwQkFBMEIsUUFRckM7QUFFRCxJQUFZLHdCQUlYO0FBSkQsV0FBWSx3QkFBd0I7SUFDbEMsaURBQXFCLENBQUE7SUFDckIsNkNBQWlCLENBQUE7SUFDakIsaURBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLHdCQUF3Qix3Q0FBeEIsd0JBQXdCLFFBSW5DO0FBRUQsSUFBWSxrQkFJWDtBQUpELFdBQVksa0JBQWtCO0lBQzVCLGlEQUEyQixDQUFBO0lBQzNCLHVEQUFpQyxDQUFBO0lBQ2pDLGlEQUEyQixDQUFBO0FBQzdCLENBQUMsRUFKVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQUk3QjtBQUVELElBQVksNEJBTVg7QUFORCxXQUFZLDRCQUE0QjtJQUN0QyxxREFBcUIsQ0FBQTtJQUNyQixxREFBcUIsQ0FBQTtJQUNyQixxREFBcUIsQ0FBQTtJQUNyQixtREFBbUIsQ0FBQTtJQUNuQixtREFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTlcsNEJBQTRCLDRDQUE1Qiw0QkFBNEIsUUFNdkMifQ==
|