@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,519 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rebuildAnalyticsDailySnapshotsStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const analytics_1 = require("../../modules/analytics");
|
|
7
|
+
const constants_1 = require("../../modules/analytics/constants");
|
|
8
|
+
const data_quality_1 = require("../../modules/analytics/utils/data-quality");
|
|
9
|
+
const observability_1 = require("../../modules/analytics/utils/observability");
|
|
10
|
+
const types_1 = require("../../modules/cancellation/types");
|
|
11
|
+
const types_2 = require("../../modules/activity-log/types");
|
|
12
|
+
const types_3 = require("../../modules/subscription/types");
|
|
13
|
+
function getQuery(container) {
|
|
14
|
+
return container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
15
|
+
}
|
|
16
|
+
function getLocking(container) {
|
|
17
|
+
return container.resolve(utils_1.Modules.LOCKING);
|
|
18
|
+
}
|
|
19
|
+
function toUtcDateKey(date) {
|
|
20
|
+
return date.toISOString().slice(0, 10);
|
|
21
|
+
}
|
|
22
|
+
function buildAnalyticsRangeLockKey(input) {
|
|
23
|
+
return `analytics:snapshots:range:${input.date_from.slice(0, 10)}:${input.date_to.slice(0, 10)}`;
|
|
24
|
+
}
|
|
25
|
+
function buildAnalyticsDayLockKey(dayStart) {
|
|
26
|
+
return `analytics:snapshots:${toUtcDateKey(dayStart)}`;
|
|
27
|
+
}
|
|
28
|
+
function toUtcDayStart(dayIso) {
|
|
29
|
+
return new Date(dayIso);
|
|
30
|
+
}
|
|
31
|
+
function toUtcDayEnd(dayStart) {
|
|
32
|
+
return new Date(Date.UTC(dayStart.getUTCFullYear(), dayStart.getUTCMonth(), dayStart.getUTCDate(), 23, 59, 59, 999));
|
|
33
|
+
}
|
|
34
|
+
function normalizeMonthlyRecurringValue(amount, interval, value) {
|
|
35
|
+
if (!Number.isFinite(amount) || !Number.isFinite(value) || value <= 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (interval === types_3.SubscriptionFrequencyInterval.WEEK) {
|
|
39
|
+
return Number(((amount * 52) / (12 * value)).toFixed(2));
|
|
40
|
+
}
|
|
41
|
+
if (interval === types_3.SubscriptionFrequencyInterval.MONTH) {
|
|
42
|
+
return Number((amount / value).toFixed(2));
|
|
43
|
+
}
|
|
44
|
+
return Number((amount / (12 * value)).toFixed(2));
|
|
45
|
+
}
|
|
46
|
+
function isDunningOpenAtDayEnd(dunningCase, dayEnd) {
|
|
47
|
+
const createdAt = new Date(dunningCase.created_at);
|
|
48
|
+
const recoveredAt = dunningCase.recovered_at
|
|
49
|
+
? new Date(dunningCase.recovered_at)
|
|
50
|
+
: null;
|
|
51
|
+
const closedAt = dunningCase.closed_at ? new Date(dunningCase.closed_at) : null;
|
|
52
|
+
return (createdAt <= dayEnd &&
|
|
53
|
+
(!recoveredAt || recoveredAt > dayEnd) &&
|
|
54
|
+
(!closedAt || closedAt > dayEnd));
|
|
55
|
+
}
|
|
56
|
+
function resolveSubscriptionStatusForDay(subscription, latestLifecycleEvent, hasOpenDunningAtDayEnd, dayEnd) {
|
|
57
|
+
if (subscription.cancel_effective_at &&
|
|
58
|
+
new Date(subscription.cancel_effective_at) <= dayEnd) {
|
|
59
|
+
return types_3.SubscriptionStatus.CANCELLED;
|
|
60
|
+
}
|
|
61
|
+
if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_PAUSED) {
|
|
62
|
+
return types_3.SubscriptionStatus.PAUSED;
|
|
63
|
+
}
|
|
64
|
+
if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_CANCELED &&
|
|
65
|
+
subscription.cancel_effective_at &&
|
|
66
|
+
new Date(subscription.cancel_effective_at) > dayEnd) {
|
|
67
|
+
return latestLifecycleEvent.previous_state?.status ?? types_3.SubscriptionStatus.ACTIVE;
|
|
68
|
+
}
|
|
69
|
+
if (latestLifecycleEvent?.event_type === types_2.ActivityLogEventType.SUBSCRIPTION_RESUMED) {
|
|
70
|
+
return types_3.SubscriptionStatus.ACTIVE;
|
|
71
|
+
}
|
|
72
|
+
if (hasOpenDunningAtDayEnd) {
|
|
73
|
+
return types_3.SubscriptionStatus.PAST_DUE;
|
|
74
|
+
}
|
|
75
|
+
if (subscription.status === types_3.SubscriptionStatus.PAUSED &&
|
|
76
|
+
subscription.paused_at &&
|
|
77
|
+
new Date(subscription.paused_at) <= dayEnd) {
|
|
78
|
+
return types_3.SubscriptionStatus.PAUSED;
|
|
79
|
+
}
|
|
80
|
+
if (subscription.status === types_3.SubscriptionStatus.PAST_DUE) {
|
|
81
|
+
return types_3.SubscriptionStatus.PAST_DUE;
|
|
82
|
+
}
|
|
83
|
+
return types_3.SubscriptionStatus.ACTIVE;
|
|
84
|
+
}
|
|
85
|
+
async function listSubscriptionsForDay(container, dayEnd, batchSize, offset) {
|
|
86
|
+
const query = getQuery(container);
|
|
87
|
+
const result = await query.graph({
|
|
88
|
+
entity: "subscription",
|
|
89
|
+
fields: [
|
|
90
|
+
"id",
|
|
91
|
+
"customer_id",
|
|
92
|
+
"product_id",
|
|
93
|
+
"variant_id",
|
|
94
|
+
"status",
|
|
95
|
+
"frequency_interval",
|
|
96
|
+
"frequency_value",
|
|
97
|
+
"started_at",
|
|
98
|
+
"paused_at",
|
|
99
|
+
"cancel_effective_at",
|
|
100
|
+
],
|
|
101
|
+
filters: {
|
|
102
|
+
started_at: {
|
|
103
|
+
$lte: dayEnd.toISOString(),
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
pagination: {
|
|
107
|
+
take: batchSize,
|
|
108
|
+
skip: offset,
|
|
109
|
+
order: {
|
|
110
|
+
id: "ASC",
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
return {
|
|
115
|
+
subscriptions: (result.data ?? []),
|
|
116
|
+
count: result.metadata?.count ?? 0,
|
|
117
|
+
limit: result.metadata?.take ?? batchSize,
|
|
118
|
+
offset: result.metadata?.skip ?? offset,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function listLifecycleEvents(container, subscriptionIds, dayEnd) {
|
|
122
|
+
if (!subscriptionIds.length) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const query = getQuery(container);
|
|
126
|
+
const result = await query.graph({
|
|
127
|
+
entity: "subscription_log",
|
|
128
|
+
fields: [
|
|
129
|
+
"subscription_id",
|
|
130
|
+
"event_type",
|
|
131
|
+
"created_at",
|
|
132
|
+
"previous_state",
|
|
133
|
+
],
|
|
134
|
+
filters: {
|
|
135
|
+
subscription_id: subscriptionIds,
|
|
136
|
+
event_type: [
|
|
137
|
+
types_2.ActivityLogEventType.SUBSCRIPTION_PAUSED,
|
|
138
|
+
types_2.ActivityLogEventType.SUBSCRIPTION_RESUMED,
|
|
139
|
+
types_2.ActivityLogEventType.SUBSCRIPTION_CANCELED,
|
|
140
|
+
],
|
|
141
|
+
created_at: {
|
|
142
|
+
$lte: dayEnd.toISOString(),
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
return (result.data ?? []);
|
|
147
|
+
}
|
|
148
|
+
async function listDunningCases(container, subscriptionIds, dayEnd) {
|
|
149
|
+
if (!subscriptionIds.length) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const query = getQuery(container);
|
|
153
|
+
const result = await query.graph({
|
|
154
|
+
entity: "dunning_case",
|
|
155
|
+
fields: ["subscription_id", "created_at", "recovered_at", "closed_at"],
|
|
156
|
+
filters: {
|
|
157
|
+
subscription_id: subscriptionIds,
|
|
158
|
+
created_at: {
|
|
159
|
+
$lte: dayEnd.toISOString(),
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
return (result.data ?? []);
|
|
164
|
+
}
|
|
165
|
+
async function listChurnEvents(container, subscriptionIds, dayStart, dayEnd) {
|
|
166
|
+
if (!subscriptionIds.length) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
const query = getQuery(container);
|
|
170
|
+
const result = await query.graph({
|
|
171
|
+
entity: "cancellation_case",
|
|
172
|
+
fields: ["subscription_id", "reason_category", "final_outcome", "finalized_at"],
|
|
173
|
+
filters: {
|
|
174
|
+
subscription_id: subscriptionIds,
|
|
175
|
+
final_outcome: [types_1.CancellationFinalOutcome.CANCELED],
|
|
176
|
+
finalized_at: {
|
|
177
|
+
$gte: dayStart.toISOString(),
|
|
178
|
+
$lte: dayEnd.toISOString(),
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
return (result.data ?? []);
|
|
183
|
+
}
|
|
184
|
+
async function listSuccessfulRenewalCycles(container, subscriptionIds, dayEnd) {
|
|
185
|
+
if (!subscriptionIds.length) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const query = getQuery(container);
|
|
189
|
+
const result = await query.graph({
|
|
190
|
+
entity: "renewal_cycle",
|
|
191
|
+
fields: ["subscription_id", "generated_order_id", "scheduled_for"],
|
|
192
|
+
filters: {
|
|
193
|
+
subscription_id: subscriptionIds,
|
|
194
|
+
status: ["succeeded"],
|
|
195
|
+
scheduled_for: {
|
|
196
|
+
$lte: dayEnd.toISOString(),
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
return (result.data ?? []).filter((cycle) => cycle.generated_order_id);
|
|
201
|
+
}
|
|
202
|
+
async function listOrders(container, orderIds) {
|
|
203
|
+
if (!orderIds.length) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
const query = getQuery(container);
|
|
207
|
+
const result = await query.graph({
|
|
208
|
+
entity: "order",
|
|
209
|
+
fields: ["id", "total", "currency_code"],
|
|
210
|
+
filters: {
|
|
211
|
+
id: orderIds,
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
return (result.data ?? []);
|
|
215
|
+
}
|
|
216
|
+
async function rebuildSingleDay(container, analyticsModule, input, dayIso) {
|
|
217
|
+
const dayStart = toUtcDayStart(dayIso);
|
|
218
|
+
const dayEnd = toUtcDayEnd(dayStart);
|
|
219
|
+
const batchSize = 100;
|
|
220
|
+
let offset = 0;
|
|
221
|
+
let processedSubscriptions = 0;
|
|
222
|
+
const rows = [];
|
|
223
|
+
while (true) {
|
|
224
|
+
const page = await listSubscriptionsForDay(container, dayEnd, batchSize, offset);
|
|
225
|
+
const subscriptions = page.subscriptions;
|
|
226
|
+
if (!subscriptions.length) {
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
const subscriptionIds = subscriptions.map((subscription) => subscription.id);
|
|
230
|
+
const [lifecycleEvents, dunningCases, churnEvents, renewalCycles] = await Promise.all([
|
|
231
|
+
listLifecycleEvents(container, subscriptionIds, dayEnd),
|
|
232
|
+
listDunningCases(container, subscriptionIds, dayEnd),
|
|
233
|
+
listChurnEvents(container, subscriptionIds, dayStart, dayEnd),
|
|
234
|
+
listSuccessfulRenewalCycles(container, subscriptionIds, dayEnd),
|
|
235
|
+
]);
|
|
236
|
+
const latestLifecycleEventBySubscription = new Map();
|
|
237
|
+
const openDunningBySubscription = new Map();
|
|
238
|
+
const churnBySubscription = new Map();
|
|
239
|
+
const latestRenewalBySubscription = new Map();
|
|
240
|
+
for (const event of lifecycleEvents) {
|
|
241
|
+
const existing = latestLifecycleEventBySubscription.get(event.subscription_id);
|
|
242
|
+
if (!existing ||
|
|
243
|
+
new Date(existing.created_at).getTime() < new Date(event.created_at).getTime()) {
|
|
244
|
+
latestLifecycleEventBySubscription.set(event.subscription_id, event);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
for (const dunningCase of dunningCases) {
|
|
248
|
+
if (isDunningOpenAtDayEnd(dunningCase, dayEnd)) {
|
|
249
|
+
openDunningBySubscription.set(dunningCase.subscription_id, true);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
for (const churnEvent of churnEvents) {
|
|
253
|
+
churnBySubscription.set(churnEvent.subscription_id, churnEvent);
|
|
254
|
+
}
|
|
255
|
+
for (const renewalCycle of renewalCycles) {
|
|
256
|
+
const existing = latestRenewalBySubscription.get(renewalCycle.subscription_id);
|
|
257
|
+
if (!existing ||
|
|
258
|
+
new Date(existing.scheduled_for).getTime() <
|
|
259
|
+
new Date(renewalCycle.scheduled_for).getTime()) {
|
|
260
|
+
latestRenewalBySubscription.set(renewalCycle.subscription_id, renewalCycle);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const orderIds = [...latestRenewalBySubscription.values()]
|
|
264
|
+
.map((cycle) => cycle.generated_order_id)
|
|
265
|
+
.filter((id) => Boolean(id));
|
|
266
|
+
const orders = await listOrders(container, orderIds);
|
|
267
|
+
const ordersById = new Map(orders.map((order) => [order.id, order]));
|
|
268
|
+
for (const subscription of subscriptions) {
|
|
269
|
+
const lifecycleEvent = latestLifecycleEventBySubscription.get(subscription.id) ?? null;
|
|
270
|
+
const derivedStatus = resolveSubscriptionStatusForDay(subscription, lifecycleEvent, openDunningBySubscription.get(subscription.id) ?? false, dayEnd);
|
|
271
|
+
const isActive = derivedStatus === types_3.SubscriptionStatus.ACTIVE;
|
|
272
|
+
const churnEvent = churnBySubscription.get(subscription.id) ?? null;
|
|
273
|
+
const latestRenewal = latestRenewalBySubscription.get(subscription.id) ?? null;
|
|
274
|
+
const latestOrder = latestRenewal?.generated_order_id
|
|
275
|
+
? ordersById.get(latestRenewal.generated_order_id) ?? null
|
|
276
|
+
: null;
|
|
277
|
+
const orderTotal = latestOrder ? Number(latestOrder.total ?? 0) : null;
|
|
278
|
+
const mrrAmount = isActive && latestOrder && Number.isFinite(orderTotal)
|
|
279
|
+
? normalizeMonthlyRecurringValue(orderTotal, subscription.frequency_interval, subscription.frequency_value)
|
|
280
|
+
: null;
|
|
281
|
+
rows.push({
|
|
282
|
+
metric_date: dayStart,
|
|
283
|
+
subscription_id: subscription.id,
|
|
284
|
+
customer_id: subscription.customer_id,
|
|
285
|
+
product_id: subscription.product_id,
|
|
286
|
+
variant_id: subscription.variant_id,
|
|
287
|
+
status: derivedStatus,
|
|
288
|
+
frequency_interval: subscription.frequency_interval,
|
|
289
|
+
frequency_value: subscription.frequency_value,
|
|
290
|
+
currency_code: latestOrder?.currency_code ?? null,
|
|
291
|
+
is_active: isActive,
|
|
292
|
+
active_subscriptions_count: isActive ? 1 : 0,
|
|
293
|
+
mrr_amount: mrrAmount,
|
|
294
|
+
churned_subscriptions_count: churnEvent ? 1 : 0,
|
|
295
|
+
churn_reason_category: churnEvent?.reason_category ?? null,
|
|
296
|
+
source_snapshot: {
|
|
297
|
+
lifecycle_event_type: lifecycleEvent?.event_type ?? null,
|
|
298
|
+
dunning_open_at_day_end: openDunningBySubscription.get(subscription.id) ?? false,
|
|
299
|
+
renewal_order_id: latestRenewal?.generated_order_id ?? null,
|
|
300
|
+
revenue_source: latestOrder ? "latest_successful_renewal_order" : "unavailable",
|
|
301
|
+
churn_source: churnEvent ? "cancellation_case" : null,
|
|
302
|
+
},
|
|
303
|
+
metadata: {
|
|
304
|
+
metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
|
|
305
|
+
trigger_type: input.trigger_type,
|
|
306
|
+
correlation_id: input.correlation_id,
|
|
307
|
+
reason: input.reason,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
processedSubscriptions += subscriptions.length;
|
|
312
|
+
offset += page.limit;
|
|
313
|
+
if (offset >= page.count) {
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const previousRows = (await analyticsModule.listSubscriptionMetricsDailies({
|
|
318
|
+
metric_date: dayStart,
|
|
319
|
+
}));
|
|
320
|
+
let deletedExistingRows = false;
|
|
321
|
+
try {
|
|
322
|
+
if (previousRows.length) {
|
|
323
|
+
await analyticsModule.deleteSubscriptionMetricsDailies(previousRows.map((row) => row.id));
|
|
324
|
+
deletedExistingRows = true;
|
|
325
|
+
}
|
|
326
|
+
if (rows.length) {
|
|
327
|
+
await analyticsModule.createSubscriptionMetricsDailies(rows);
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
processed_subscriptions: processedSubscriptions,
|
|
331
|
+
upserted_rows: rows.length,
|
|
332
|
+
skipped_rows: 0,
|
|
333
|
+
failed: false,
|
|
334
|
+
quality_snapshot: {
|
|
335
|
+
metric_date: dayStart.toISOString(),
|
|
336
|
+
processed_subscriptions: processedSubscriptions,
|
|
337
|
+
snapshot_rows: rows.length,
|
|
338
|
+
active_subscriptions_count: rows.reduce((sum, row) => sum + row.active_subscriptions_count, 0),
|
|
339
|
+
churned_subscriptions_count: rows.reduce((sum, row) => sum + row.churned_subscriptions_count, 0),
|
|
340
|
+
mrr_amount: rows.length > 0
|
|
341
|
+
? Number(rows.reduce((sum, row) => sum + Number(row.mrr_amount ?? 0), 0).toFixed(2))
|
|
342
|
+
: null,
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
if (deletedExistingRows && previousRows.length) {
|
|
348
|
+
try {
|
|
349
|
+
await analyticsModule.createSubscriptionMetricsDailies(previousRows);
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// Ignore restore failure here; the calling workflow will surface the original failure.
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
throw error;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
exports.rebuildAnalyticsDailySnapshotsStep = (0, workflows_sdk_1.createStep)("rebuild-analytics-daily-snapshots", async function (input, { container }) {
|
|
359
|
+
const logger = container.resolve("logger");
|
|
360
|
+
const analyticsModule = container.resolve(analytics_1.ANALYTICS_MODULE);
|
|
361
|
+
const locking = getLocking(container);
|
|
362
|
+
const startedAt = Date.now();
|
|
363
|
+
let processedSubscriptions = 0;
|
|
364
|
+
let upsertedRows = 0;
|
|
365
|
+
const blockedDays = [];
|
|
366
|
+
const failedDays = [];
|
|
367
|
+
const qualitySnapshots = [];
|
|
368
|
+
(0, observability_1.logAnalyticsEvent)(logger, "info", {
|
|
369
|
+
event: "analytics.rebuild",
|
|
370
|
+
outcome: "started",
|
|
371
|
+
correlation_id: input.correlation_id,
|
|
372
|
+
metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
|
|
373
|
+
trigger_type: input.trigger_type,
|
|
374
|
+
reason: input.reason,
|
|
375
|
+
date_from: input.date_from,
|
|
376
|
+
date_to: input.date_to,
|
|
377
|
+
processed_days: 0,
|
|
378
|
+
processed_subscriptions: 0,
|
|
379
|
+
upserted_rows: 0,
|
|
380
|
+
failure_count: 0,
|
|
381
|
+
blocked_count: 0,
|
|
382
|
+
message: "Analytics rebuild started",
|
|
383
|
+
});
|
|
384
|
+
try {
|
|
385
|
+
await locking.execute(buildAnalyticsRangeLockKey(input), async () => {
|
|
386
|
+
for (const dayIso of input.normalized_days) {
|
|
387
|
+
const dayStart = toUtcDayStart(dayIso);
|
|
388
|
+
try {
|
|
389
|
+
const summary = await locking.execute(buildAnalyticsDayLockKey(dayStart), async () => rebuildSingleDay(container, analyticsModule, input, dayIso), {
|
|
390
|
+
timeout: 1,
|
|
391
|
+
});
|
|
392
|
+
processedSubscriptions += summary.processed_subscriptions;
|
|
393
|
+
upsertedRows += summary.upserted_rows;
|
|
394
|
+
qualitySnapshots.push(summary.quality_snapshot);
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
|
|
398
|
+
if (failureKind === "lock_timeout") {
|
|
399
|
+
blockedDays.push(dayIso);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
failedDays.push(dayIso);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}, {
|
|
407
|
+
timeout: 1,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
|
|
412
|
+
if (failureKind === "lock_timeout") {
|
|
413
|
+
blockedDays.push(...input.normalized_days);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
failedDays.push(...input.normalized_days);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const processedDays = input.normalized_days.length - failedDays.length - blockedDays.length;
|
|
420
|
+
const quality = (0, data_quality_1.evaluateAnalyticsQualityForRange)(qualitySnapshots);
|
|
421
|
+
const qualityErrorCount = quality.findings.filter((entry) => entry.severity === "error").length;
|
|
422
|
+
const qualityWarningCount = quality.findings.filter((entry) => entry.severity === "warn").length;
|
|
423
|
+
if (quality.findings.length) {
|
|
424
|
+
for (const finding of quality.findings) {
|
|
425
|
+
(0, observability_1.logAnalyticsEvent)(logger, finding.severity === "error" ? "error" : "warn", {
|
|
426
|
+
event: "analytics.quality",
|
|
427
|
+
outcome: "completed",
|
|
428
|
+
correlation_id: input.correlation_id,
|
|
429
|
+
metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
|
|
430
|
+
trigger_type: input.trigger_type,
|
|
431
|
+
reason: input.reason,
|
|
432
|
+
date_from: input.date_from,
|
|
433
|
+
date_to: input.date_to,
|
|
434
|
+
quality_issue_count: quality.finding_count,
|
|
435
|
+
quality_error_count: qualityErrorCount,
|
|
436
|
+
quality_warning_count: qualityWarningCount,
|
|
437
|
+
message: finding.message,
|
|
438
|
+
metadata: {
|
|
439
|
+
...finding,
|
|
440
|
+
},
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
(0, observability_1.logAnalyticsEvent)(logger, "info", {
|
|
446
|
+
event: "analytics.quality",
|
|
447
|
+
outcome: "completed",
|
|
448
|
+
correlation_id: input.correlation_id,
|
|
449
|
+
metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
|
|
450
|
+
trigger_type: input.trigger_type,
|
|
451
|
+
reason: input.reason,
|
|
452
|
+
date_from: input.date_from,
|
|
453
|
+
date_to: input.date_to,
|
|
454
|
+
quality_issue_count: 0,
|
|
455
|
+
quality_error_count: 0,
|
|
456
|
+
quality_warning_count: 0,
|
|
457
|
+
message: "Analytics quality checks completed without findings",
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
const durationMs = Date.now() - startedAt;
|
|
461
|
+
const alertable = failedDays.length > 0 ||
|
|
462
|
+
blockedDays.length > 0 ||
|
|
463
|
+
qualityErrorCount > 0 ||
|
|
464
|
+
(0, observability_1.isSlowAnalyticsRebuild)(durationMs);
|
|
465
|
+
(0, observability_1.logAnalyticsEvent)(logger, (0, observability_1.getAnalyticsRebuildLogLevel)({
|
|
466
|
+
duration_ms: durationMs,
|
|
467
|
+
failed_days_count: failedDays.length,
|
|
468
|
+
blocked_days_count: blockedDays.length,
|
|
469
|
+
quality_error_count: qualityErrorCount,
|
|
470
|
+
quality_warning_count: qualityWarningCount,
|
|
471
|
+
}), {
|
|
472
|
+
event: "analytics.rebuild",
|
|
473
|
+
outcome: failedDays.length > 0
|
|
474
|
+
? "failed"
|
|
475
|
+
: blockedDays.length > 0
|
|
476
|
+
? "blocked"
|
|
477
|
+
: "completed",
|
|
478
|
+
correlation_id: input.correlation_id,
|
|
479
|
+
metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
|
|
480
|
+
trigger_type: input.trigger_type,
|
|
481
|
+
reason: input.reason,
|
|
482
|
+
duration_ms: durationMs,
|
|
483
|
+
date_from: input.date_from,
|
|
484
|
+
date_to: input.date_to,
|
|
485
|
+
processed_days: processedDays,
|
|
486
|
+
processed_subscriptions: processedSubscriptions,
|
|
487
|
+
upserted_rows: upsertedRows,
|
|
488
|
+
blocked_count: blockedDays.length,
|
|
489
|
+
failure_count: failedDays.length,
|
|
490
|
+
blocked_days: blockedDays,
|
|
491
|
+
failed_days: failedDays,
|
|
492
|
+
quality_issue_count: quality.finding_count,
|
|
493
|
+
quality_error_count: qualityErrorCount,
|
|
494
|
+
quality_warning_count: qualityWarningCount,
|
|
495
|
+
alertable,
|
|
496
|
+
failure_kind: failedDays.length > 0
|
|
497
|
+
? "unexpected_error"
|
|
498
|
+
: blockedDays.length > 0
|
|
499
|
+
? "lock_timeout"
|
|
500
|
+
: undefined,
|
|
501
|
+
message: failedDays.length > 0
|
|
502
|
+
? (0, observability_1.getAnalyticsErrorMessage)(new Error("Analytics rebuild completed with failed days"))
|
|
503
|
+
: blockedDays.length > 0
|
|
504
|
+
? "Analytics rebuild completed with blocked days"
|
|
505
|
+
: (0, observability_1.isSlowAnalyticsRebuild)(durationMs)
|
|
506
|
+
? "Analytics rebuild completed slowly"
|
|
507
|
+
: "Analytics rebuild completed",
|
|
508
|
+
});
|
|
509
|
+
return new workflows_sdk_1.StepResponse({
|
|
510
|
+
...input,
|
|
511
|
+
processed_days: processedDays,
|
|
512
|
+
processed_subscriptions: processedSubscriptions,
|
|
513
|
+
upserted_rows: upsertedRows,
|
|
514
|
+
skipped_rows: blockedDays.length,
|
|
515
|
+
blocked_days: blockedDays,
|
|
516
|
+
failed_days: failedDays,
|
|
517
|
+
});
|
|
518
|
+
});
|
|
519
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVidWlsZC1hbmFseXRpY3MtZGFpbHktc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZWJ1aWxkLWFuYWx5dGljcy1kYWlseS1zbmFwc2hvdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBRTVFLHFEQUE4RTtBQUM5RSx1REFFZ0M7QUFFaEMsaUVBQTZFO0FBQzdFLDZFQUE2RjtBQUM3RiwrRUFNb0Q7QUFDcEQsNERBR3lDO0FBQ3pDLDREQUV5QztBQUN6Qyw0REFHeUM7QUFzSHpDLFNBQVMsUUFBUSxDQUFDLFNBQTBCO0lBQzFDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBWSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsU0FBMEI7SUFDNUMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFpQixlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQVU7SUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN4QyxDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxLQUErQztJQUNqRixPQUFPLDZCQUE2QixLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDbEcsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsUUFBYztJQUM5QyxPQUFPLHVCQUF1QixZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtBQUN4RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxPQUFPLElBQUks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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rejectRenewalChangesStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const subscription_1 = require("../../modules/subscription");
|
|
6
|
+
const renewal_1 = require("../../modules/renewal");
|
|
7
|
+
const types_1 = require("../../modules/renewal/types");
|
|
8
|
+
const shared_renewal_approval_1 = require("./shared-renewal-approval");
|
|
9
|
+
exports.rejectRenewalChangesStep = (0, workflows_sdk_1.createStep)("reject-renewal-changes", async function (input, { container }) {
|
|
10
|
+
const cycle = await (0, shared_renewal_approval_1.getRenewalCycleApprovalRecord)(container, input.renewal_cycle_id);
|
|
11
|
+
(0, shared_renewal_approval_1.validateRenewalApprovalTransition)(cycle, types_1.RenewalApprovalStatus.REJECTED);
|
|
12
|
+
const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
|
|
13
|
+
const subscriptionModule = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
|
|
14
|
+
const decidedAt = new Date();
|
|
15
|
+
const subscription = await subscriptionModule.retrieveSubscription(cycle.subscription_id);
|
|
16
|
+
const updated = await renewalModule.updateRenewalCycles({
|
|
17
|
+
id: cycle.id,
|
|
18
|
+
approval_status: types_1.RenewalApprovalStatus.REJECTED,
|
|
19
|
+
approval_decided_at: decidedAt,
|
|
20
|
+
approval_decided_by: input.decided_by ?? null,
|
|
21
|
+
approval_reason: input.reason ?? null,
|
|
22
|
+
});
|
|
23
|
+
return new workflows_sdk_1.StepResponse({
|
|
24
|
+
current: updated,
|
|
25
|
+
previous: {
|
|
26
|
+
id: cycle.id,
|
|
27
|
+
subscription_id: cycle.subscription_id,
|
|
28
|
+
approval_status: cycle.approval_status,
|
|
29
|
+
approval_decided_at: cycle.approval_decided_at,
|
|
30
|
+
approval_decided_by: cycle.approval_decided_by,
|
|
31
|
+
approval_reason: cycle.approval_reason,
|
|
32
|
+
},
|
|
33
|
+
subscription: subscription,
|
|
34
|
+
}, {
|
|
35
|
+
id: cycle.id,
|
|
36
|
+
approval_status: cycle.approval_status,
|
|
37
|
+
approval_decided_at: cycle.approval_decided_at,
|
|
38
|
+
approval_decided_by: cycle.approval_decided_by,
|
|
39
|
+
approval_reason: cycle.approval_reason,
|
|
40
|
+
});
|
|
41
|
+
}, async function (previous, { container }) {
|
|
42
|
+
if (!previous) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const renewalModule = container.resolve(renewal_1.RENEWAL_MODULE);
|
|
46
|
+
await renewalModule.updateRenewalCycles(previous);
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVqZWN0LXJlbmV3YWwtY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmVqZWN0LXJlbmV3YWwtY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLG1EQUFzRDtBQUV0RCx1REFBbUU7QUFDbkUsdUVBR2tDO0FBbUJyQixRQUFBLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDaEQsd0JBQXdCLEVBQ3hCLEtBQUssV0FBVyxLQUFvQyxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSx1REFBNkIsRUFDL0MsU0FBUyxFQUNULEtBQUssQ0FBQyxnQkFBZ0IsQ0FDdkIsQ0FBQTtJQUVELElBQUEsMkRBQWlDLEVBQUMsS0FBSyxFQUFFLDZCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXhFLE1BQU0sYUFBYSxHQUNqQixTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUFjLENBQXlCLENBQUE7SUFDM0QsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBOEIsQ0FBQTtJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsb0JBQW9CLENBQ2hFLEtBQUssQ0FBQyxlQUFlLENBQ3RCLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztRQUN0RCxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixlQUFlLEVBQUUsNkJBQXFCLENBQUMsUUFBUTtRQUMvQyxtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSTtRQUM3QyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJO0tBQ3RDLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUlyQjtRQUNFLE9BQU8sRUFBRSxPQUFjO1FBQ3ZCLFFBQVEsRUFBRTtZQUNSLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNaLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtTQUN2QztRQUNELFlBQVksRUFBRSxZQUFtQjtLQUNsQyxFQUNEO1FBQ0UsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ1osZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1FBQ3RDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7S0FDdkMsQ0FDRixDQUFBO0FBQ0gsQ0FBQyxFQUNELEtBQUssV0FBVyxRQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQ3ZFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQ2pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsd0JBQWMsQ0FBeUIsQ0FBQTtJQUUzRCxNQUFNLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNuRCxDQUFDLENBQ0YsQ0FBQSJ9
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resumeSubscriptionStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const subscription_1 = require("../../modules/subscription");
|
|
6
|
+
const types_1 = require("../../modules/subscription/types");
|
|
7
|
+
const errors_1 = require("../../modules/subscription/utils/errors");
|
|
8
|
+
const pause_subscription_1 = require("./pause-subscription");
|
|
9
|
+
exports.resumeSubscriptionStep = (0, workflows_sdk_1.createStep)("resume-subscription", async function (input, { container }) {
|
|
10
|
+
const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
|
|
11
|
+
const subscription = await subscriptionModuleService.retrieveSubscription(input.id);
|
|
12
|
+
if (subscription.status !== types_1.SubscriptionStatus.PAUSED) {
|
|
13
|
+
throw errors_1.subscriptionErrors.invalidState(input.id, "be resumed", subscription.status);
|
|
14
|
+
}
|
|
15
|
+
const nextRenewalAt = input.resume_at
|
|
16
|
+
? new Date(input.resume_at)
|
|
17
|
+
: input.preserve_billing_anchor
|
|
18
|
+
? subscription.next_renewal_at
|
|
19
|
+
: subscription.next_renewal_at ?? new Date();
|
|
20
|
+
const updated = await subscriptionModuleService.updateSubscriptions({
|
|
21
|
+
id: input.id,
|
|
22
|
+
status: types_1.SubscriptionStatus.ACTIVE,
|
|
23
|
+
paused_at: null,
|
|
24
|
+
next_renewal_at: nextRenewalAt,
|
|
25
|
+
metadata: {
|
|
26
|
+
...(subscription.metadata ?? {}),
|
|
27
|
+
resume_context: {
|
|
28
|
+
resume_at: input.resume_at ?? null,
|
|
29
|
+
preserve_billing_anchor: input.preserve_billing_anchor ?? false,
|
|
30
|
+
triggered_by: input.triggered_by ?? null,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
return new workflows_sdk_1.StepResponse({
|
|
35
|
+
current: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(updated),
|
|
36
|
+
previous: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription),
|
|
37
|
+
}, (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription));
|
|
38
|
+
}, async function (subscription, { container }) {
|
|
39
|
+
if (!subscription) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
|
|
43
|
+
await subscriptionModuleService.updateSubscriptions((0, pause_subscription_1.asSubscriptionUpdateInput)(subscription));
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLXN1YnNjcmlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmVzdW1lLXN1YnNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLDREQUFxRTtBQUNyRSxvRUFBNEU7QUFDNUUsNkRBSzZCO0FBU2hCLFFBQUEsc0JBQXNCLEdBQUcsSUFBQSwwQkFBVSxFQUM5QyxxQkFBcUIsRUFDckIsS0FBSyxXQUFXLEtBQWtDLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDL0QsTUFBTSx5QkFBeUIsR0FDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFBO0lBRXhDLE1BQU0sWUFBWSxHQUFHLE1BQU0seUJBQXlCLENBQUMsb0JBQW9CLENBQ3ZFLEtBQUssQ0FBQyxFQUFFLENBQ1QsQ0FBQTtJQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSywwQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCxNQUFNLDJCQUFrQixDQUFDLFlBQVksQ0FDbkMsS0FBSyxDQUFDLEVBQUUsRUFDUixZQUFZLEVBQ1osWUFBWSxDQUFDLE1BQU0sQ0FDcEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUztRQUNuQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QjtZQUMvQixDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWU7WUFDOUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUU5QyxNQUFNLE9BQU8sR0FBRyxNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO1FBQ2xFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUNaLE1BQU0sRUFBRSwwQkFBa0IsQ0FBQyxNQUFNO1FBQ2pDLFNBQVMsRUFBRSxJQUFJO1FBQ2YsZUFBZSxFQUFFLGFBQWE7UUFDOUIsUUFBUSxFQUFFO1lBQ1IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2hDLGNBQWMsRUFBRTtnQkFDZCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJO2dCQUNsQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCLElBQUksS0FBSztnQkFDL0QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTthQUN6QztTQUNGO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLDRCQUFZLENBQ3JCO1FBQ0UsT0FBTyxFQUFFLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1FBQzlDLFFBQVEsRUFBRSxJQUFBLGlEQUE0QixFQUFDLFlBQVksQ0FBQztLQUNyRCxFQUNELElBQUEsaURBQTRCLEVBQUMsWUFBWSxDQUFDLENBQzNDLENBQUE7QUFDSCxDQUFDLEVBQ0QsS0FBSyxXQUFXLFlBQXdDLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDckUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSx5QkFBeUIsR0FDN0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFBO0lBRXhDLE1BQU0seUJBQXlCLENBQUMsbUJBQW1CLENBQ2pELElBQUEsOENBQXlCLEVBQUMsWUFBWSxDQUFDLENBQ3hDLENBQUE7QUFDSCxDQUFDLENBQ0YsQ0FBQSJ9
|