@mj-biz-apps/orders-core-entities-server 0.0.1 → 5.2.0
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/LICENSE +183 -0
- package/README.md +141 -2
- package/dist/AccountingBridge.d.ts +65 -0
- package/dist/AccountingBridge.d.ts.map +1 -0
- package/dist/AccountingBridge.js +102 -0
- package/dist/AccountingBridge.js.map +1 -0
- package/dist/AdvanceOrderStateOperation.d.ts +80 -0
- package/dist/AdvanceOrderStateOperation.d.ts.map +1 -0
- package/dist/AdvanceOrderStateOperation.js +267 -0
- package/dist/AdvanceOrderStateOperation.js.map +1 -0
- package/dist/ApplyAccountCreditOperation.d.ts +97 -0
- package/dist/ApplyAccountCreditOperation.d.ts.map +1 -0
- package/dist/ApplyAccountCreditOperation.js +275 -0
- package/dist/ApplyAccountCreditOperation.js.map +1 -0
- package/dist/BaseDeliveryChannel.d.ts +106 -0
- package/dist/BaseDeliveryChannel.d.ts.map +1 -0
- package/dist/BaseDeliveryChannel.js +36 -0
- package/dist/BaseDeliveryChannel.js.map +1 -0
- package/dist/BasePaymentProvider.d.ts +239 -0
- package/dist/BasePaymentProvider.d.ts.map +1 -0
- package/dist/BasePaymentProvider.js +91 -0
- package/dist/BasePaymentProvider.js.map +1 -0
- package/dist/BundleBehavior.d.ts +139 -0
- package/dist/BundleBehavior.d.ts.map +1 -0
- package/dist/BundleBehavior.js +173 -0
- package/dist/BundleBehavior.js.map +1 -0
- package/dist/BundleEngine.d.ts +60 -0
- package/dist/BundleEngine.d.ts.map +1 -0
- package/dist/BundleEngine.js +197 -0
- package/dist/BundleEngine.js.map +1 -0
- package/dist/CancelSubscriptionOperation.d.ts +98 -0
- package/dist/CancelSubscriptionOperation.d.ts.map +1 -0
- package/dist/CancelSubscriptionOperation.js +317 -0
- package/dist/CancelSubscriptionOperation.js.map +1 -0
- package/dist/CapturePaymentOperation.d.ts +62 -0
- package/dist/CapturePaymentOperation.d.ts.map +1 -0
- package/dist/CapturePaymentOperation.js +463 -0
- package/dist/CapturePaymentOperation.js.map +1 -0
- package/dist/CheckEntitlementOperation.d.ts +27 -0
- package/dist/CheckEntitlementOperation.d.ts.map +1 -0
- package/dist/CheckEntitlementOperation.js +45 -0
- package/dist/CheckEntitlementOperation.js.map +1 -0
- package/dist/CheckoutSessionService.d.ts +258 -0
- package/dist/CheckoutSessionService.d.ts.map +1 -0
- package/dist/CheckoutSessionService.js +1557 -0
- package/dist/CheckoutSessionService.js.map +1 -0
- package/dist/DeliveryBehavior.d.ts +121 -0
- package/dist/DeliveryBehavior.d.ts.map +1 -0
- package/dist/DeliveryBehavior.js +145 -0
- package/dist/DeliveryBehavior.js.map +1 -0
- package/dist/DeliveryRecipientResolver.d.ts +38 -0
- package/dist/DeliveryRecipientResolver.d.ts.map +1 -0
- package/dist/DeliveryRecipientResolver.js +93 -0
- package/dist/DeliveryRecipientResolver.js.map +1 -0
- package/dist/DeliveryResolver.d.ts +14 -0
- package/dist/DeliveryResolver.d.ts.map +1 -0
- package/dist/DeliveryResolver.js +45 -0
- package/dist/DeliveryResolver.js.map +1 -0
- package/dist/EmailDeliveryChannel.d.ts +31 -0
- package/dist/EmailDeliveryChannel.d.ts.map +1 -0
- package/dist/EmailDeliveryChannel.js +158 -0
- package/dist/EmailDeliveryChannel.js.map +1 -0
- package/dist/EntitlementBehavior.d.ts +235 -0
- package/dist/EntitlementBehavior.d.ts.map +1 -0
- package/dist/EntitlementBehavior.js +330 -0
- package/dist/EntitlementBehavior.js.map +1 -0
- package/dist/EntitlementEngine.d.ts +97 -0
- package/dist/EntitlementEngine.d.ts.map +1 -0
- package/dist/EntitlementEngine.js +338 -0
- package/dist/EntitlementEngine.js.map +1 -0
- package/dist/EntitlementGrantClaimDriver.d.ts +42 -0
- package/dist/EntitlementGrantClaimDriver.d.ts.map +1 -0
- package/dist/EntitlementGrantClaimDriver.js +158 -0
- package/dist/EntitlementGrantClaimDriver.js.map +1 -0
- package/dist/EntitlementRead.d.ts +82 -0
- package/dist/EntitlementRead.d.ts.map +1 -0
- package/dist/EntitlementRead.js +368 -0
- package/dist/EntitlementRead.js.map +1 -0
- package/dist/FulfillOrderLinesOperation.d.ts +34 -0
- package/dist/FulfillOrderLinesOperation.d.ts.map +1 -0
- package/dist/FulfillOrderLinesOperation.js +208 -0
- package/dist/FulfillOrderLinesOperation.js.map +1 -0
- package/dist/FulfillmentBehavior.d.ts +101 -0
- package/dist/FulfillmentBehavior.d.ts.map +1 -0
- package/dist/FulfillmentBehavior.js +145 -0
- package/dist/FulfillmentBehavior.js.map +1 -0
- package/dist/GLAccountResolver.d.ts +123 -0
- package/dist/GLAccountResolver.d.ts.map +1 -0
- package/dist/GLAccountResolver.js +175 -0
- package/dist/GLAccountResolver.js.map +1 -0
- package/dist/GetFulfillmentQueueOperation.d.ts +35 -0
- package/dist/GetFulfillmentQueueOperation.d.ts.map +1 -0
- package/dist/GetFulfillmentQueueOperation.js +221 -0
- package/dist/GetFulfillmentQueueOperation.js.map +1 -0
- package/dist/GetOverdueWorklistOperation.d.ts +41 -0
- package/dist/GetOverdueWorklistOperation.d.ts.map +1 -0
- package/dist/GetOverdueWorklistOperation.js +210 -0
- package/dist/GetOverdueWorklistOperation.js.map +1 -0
- package/dist/GiftCardBehavior.d.ts +97 -0
- package/dist/GiftCardBehavior.d.ts.map +1 -0
- package/dist/GiftCardBehavior.js +121 -0
- package/dist/GiftCardBehavior.js.map +1 -0
- package/dist/GiftCardEngine.d.ts +59 -0
- package/dist/GiftCardEngine.d.ts.map +1 -0
- package/dist/GiftCardEngine.js +197 -0
- package/dist/GiftCardEngine.js.map +1 -0
- package/dist/GuestOrderClaimDriver.d.ts +36 -0
- package/dist/GuestOrderClaimDriver.d.ts.map +1 -0
- package/dist/GuestOrderClaimDriver.js +161 -0
- package/dist/GuestOrderClaimDriver.js.map +1 -0
- package/dist/InvoiceBehavior.d.ts +394 -0
- package/dist/InvoiceBehavior.d.ts.map +1 -0
- package/dist/InvoiceBehavior.js +496 -0
- package/dist/InvoiceBehavior.js.map +1 -0
- package/dist/InvoiceBuilder.d.ts +48 -0
- package/dist/InvoiceBuilder.d.ts.map +1 -0
- package/dist/InvoiceBuilder.js +352 -0
- package/dist/InvoiceBuilder.js.map +1 -0
- package/dist/InvoiceDisplay.d.ts +96 -0
- package/dist/InvoiceDisplay.d.ts.map +1 -0
- package/dist/InvoiceDisplay.js +121 -0
- package/dist/InvoiceDisplay.js.map +1 -0
- package/dist/ListEntitlementsOperation.d.ts +21 -0
- package/dist/ListEntitlementsOperation.d.ts.map +1 -0
- package/dist/ListEntitlementsOperation.js +39 -0
- package/dist/ListEntitlementsOperation.js.map +1 -0
- package/dist/ManualPaymentProvider.d.ts +19 -0
- package/dist/ManualPaymentProvider.d.ts.map +1 -0
- package/dist/ManualPaymentProvider.js +92 -0
- package/dist/ManualPaymentProvider.js.map +1 -0
- package/dist/OrderEntityServer.d.ts +542 -0
- package/dist/OrderEntityServer.d.ts.map +1 -0
- package/dist/OrderEntityServer.js +2100 -0
- package/dist/OrderEntityServer.js.map +1 -0
- package/dist/OrderJournalEntryFactory.d.ts +140 -0
- package/dist/OrderJournalEntryFactory.d.ts.map +1 -0
- package/dist/OrderJournalEntryFactory.js +466 -0
- package/dist/OrderJournalEntryFactory.js.map +1 -0
- package/dist/OrderLineEntityServer.d.ts +90 -0
- package/dist/OrderLineEntityServer.d.ts.map +1 -0
- package/dist/OrderLineEntityServer.js +260 -0
- package/dist/OrderLineEntityServer.js.map +1 -0
- package/dist/OrdersSettings.d.ts +36 -0
- package/dist/OrdersSettings.d.ts.map +1 -0
- package/dist/OrdersSettings.js +147 -0
- package/dist/OrdersSettings.js.map +1 -0
- package/dist/PaymentAllocationFactory.d.ts +128 -0
- package/dist/PaymentAllocationFactory.d.ts.map +1 -0
- package/dist/PaymentAllocationFactory.js +235 -0
- package/dist/PaymentAllocationFactory.js.map +1 -0
- package/dist/PaymentHeaderEntityServer.d.ts +180 -0
- package/dist/PaymentHeaderEntityServer.d.ts.map +1 -0
- package/dist/PaymentHeaderEntityServer.js +656 -0
- package/dist/PaymentHeaderEntityServer.js.map +1 -0
- package/dist/PaymentIntentService.d.ts +101 -0
- package/dist/PaymentIntentService.d.ts.map +1 -0
- package/dist/PaymentIntentService.js +150 -0
- package/dist/PaymentIntentService.js.map +1 -0
- package/dist/PaymentJournalEntryFactory.d.ts +99 -0
- package/dist/PaymentJournalEntryFactory.d.ts.map +1 -0
- package/dist/PaymentJournalEntryFactory.js +127 -0
- package/dist/PaymentJournalEntryFactory.js.map +1 -0
- package/dist/PaymentLineEntityServer.d.ts +73 -0
- package/dist/PaymentLineEntityServer.d.ts.map +1 -0
- package/dist/PaymentLineEntityServer.js +303 -0
- package/dist/PaymentLineEntityServer.js.map +1 -0
- package/dist/PaymentProviderBehavior.d.ts +222 -0
- package/dist/PaymentProviderBehavior.d.ts.map +1 -0
- package/dist/PaymentProviderBehavior.js +368 -0
- package/dist/PaymentProviderBehavior.js.map +1 -0
- package/dist/PaymentProviderResolver.d.ts +84 -0
- package/dist/PaymentProviderResolver.d.ts.map +1 -0
- package/dist/PaymentProviderResolver.js +220 -0
- package/dist/PaymentProviderResolver.js.map +1 -0
- package/dist/PaymentReversalFactory.d.ts +107 -0
- package/dist/PaymentReversalFactory.d.ts.map +1 -0
- package/dist/PaymentReversalFactory.js +174 -0
- package/dist/PaymentReversalFactory.js.map +1 -0
- package/dist/PaymentSettlement.d.ts +56 -0
- package/dist/PaymentSettlement.d.ts.map +1 -0
- package/dist/PaymentSettlement.js +243 -0
- package/dist/PaymentSettlement.js.map +1 -0
- package/dist/PaymentTermsBehavior.d.ts +109 -0
- package/dist/PaymentTermsBehavior.d.ts.map +1 -0
- package/dist/PaymentTermsBehavior.js +172 -0
- package/dist/PaymentTermsBehavior.js.map +1 -0
- package/dist/PaymentWebhookHandler.d.ts +103 -0
- package/dist/PaymentWebhookHandler.d.ts.map +1 -0
- package/dist/PaymentWebhookHandler.js +246 -0
- package/dist/PaymentWebhookHandler.js.map +1 -0
- package/dist/PreviewPriceOperation.d.ts +62 -0
- package/dist/PreviewPriceOperation.d.ts.map +1 -0
- package/dist/PreviewPriceOperation.js +161 -0
- package/dist/PreviewPriceOperation.js.map +1 -0
- package/dist/PriceOrderOperation.d.ts +93 -0
- package/dist/PriceOrderOperation.d.ts.map +1 -0
- package/dist/PriceOrderOperation.js +146 -0
- package/dist/PriceOrderOperation.js.map +1 -0
- package/dist/ProductPriceEntityServer.d.ts +34 -0
- package/dist/ProductPriceEntityServer.d.ts.map +1 -0
- package/dist/ProductPriceEntityServer.js +97 -0
- package/dist/ProductPriceEntityServer.js.map +1 -0
- package/dist/RefundPaymentOperation.d.ts +61 -0
- package/dist/RefundPaymentOperation.d.ts.map +1 -0
- package/dist/RefundPaymentOperation.js +177 -0
- package/dist/RefundPaymentOperation.js.map +1 -0
- package/dist/RevenueRecognition.d.ts +76 -0
- package/dist/RevenueRecognition.d.ts.map +1 -0
- package/dist/RevenueRecognition.js +133 -0
- package/dist/RevenueRecognition.js.map +1 -0
- package/dist/ReversalBehavior.d.ts +82 -0
- package/dist/ReversalBehavior.d.ts.map +1 -0
- package/dist/ReversalBehavior.js +100 -0
- package/dist/ReversalBehavior.js.map +1 -0
- package/dist/ReversalResolver.d.ts +37 -0
- package/dist/ReversalResolver.d.ts.map +1 -0
- package/dist/ReversalResolver.js +96 -0
- package/dist/ReversalResolver.js.map +1 -0
- package/dist/SpawnRenewalsOperation.d.ts +109 -0
- package/dist/SpawnRenewalsOperation.d.ts.map +1 -0
- package/dist/SpawnRenewalsOperation.js +295 -0
- package/dist/SpawnRenewalsOperation.js.map +1 -0
- package/dist/StoredValuePaymentProvider.d.ts +52 -0
- package/dist/StoredValuePaymentProvider.d.ts.map +1 -0
- package/dist/StoredValuePaymentProvider.js +205 -0
- package/dist/StoredValuePaymentProvider.js.map +1 -0
- package/dist/StripeACHPaymentProvider.d.ts +50 -0
- package/dist/StripeACHPaymentProvider.d.ts.map +1 -0
- package/dist/StripeACHPaymentProvider.js +211 -0
- package/dist/StripeACHPaymentProvider.js.map +1 -0
- package/dist/StripePaymentProvider.d.ts +83 -0
- package/dist/StripePaymentProvider.d.ts.map +1 -0
- package/dist/StripePaymentProvider.js +442 -0
- package/dist/StripePaymentProvider.js.map +1 -0
- package/dist/SubscriptionBehavior.d.ts +197 -0
- package/dist/SubscriptionBehavior.d.ts.map +1 -0
- package/dist/SubscriptionBehavior.js +415 -0
- package/dist/SubscriptionBehavior.js.map +1 -0
- package/dist/checkoutCaptureAlert.d.ts +16 -0
- package/dist/checkoutCaptureAlert.d.ts.map +1 -0
- package/dist/checkoutCaptureAlert.js +55 -0
- package/dist/checkoutCaptureAlert.js.map +1 -0
- package/dist/checkoutCaptureRetry.d.ts +27 -0
- package/dist/checkoutCaptureRetry.d.ts.map +1 -0
- package/dist/checkoutCaptureRetry.js +50 -0
- package/dist/checkoutCaptureRetry.js.map +1 -0
- package/dist/claimDriverHelpers.d.ts +15 -0
- package/dist/claimDriverHelpers.d.ts.map +1 -0
- package/dist/claimDriverHelpers.js +34 -0
- package/dist/claimDriverHelpers.js.map +1 -0
- package/dist/entity-names.d.ts +15 -0
- package/dist/entity-names.d.ts.map +1 -0
- package/dist/entity-names.js +15 -0
- package/dist/entity-names.js.map +1 -0
- package/dist/identityClaimContracts.d.ts +118 -0
- package/dist/identityClaimContracts.d.ts.map +1 -0
- package/dist/identityClaimContracts.js +58 -0
- package/dist/identityClaimContracts.js.map +1 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/sql-guards.d.ts +78 -0
- package/dist/sql-guards.d.ts.map +1 -0
- package/dist/sql-guards.js +115 -0
- package/dist/sql-guards.js.map +1 -0
- package/package.json +50 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionBehavior.d.ts","sourceRoot":"","sources":["../src/SubscriptionBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Subscription behaviour — the rules engine over `SubscriptionType` (plan D45).
|
|
9
|
+
*
|
|
10
|
+
* PATTERN — deliberately DIFFERENT from RevenueRecognitionDriver (D43):
|
|
11
|
+
*
|
|
12
|
+
* RevRec is BEHAVIOUR-first. The type row names a driver, and the driver computes everything,
|
|
13
|
+
* because "how is revenue earned over time" is genuinely an algorithm.
|
|
14
|
+
*
|
|
15
|
+
* Subscriptions are DATA-first. Anchor dates, cadences, concurrency, grace windows are
|
|
16
|
+
* CONFIGURATION. So the `SubscriptionType` COLUMNS are the rules, this base class reads them and
|
|
17
|
+
* implements the standard flows, and `SubscriptionType.DriverClass` is NULLABLE. Supply a driver
|
|
18
|
+
* only when a customer needs something the columns cannot express — and it SUBCLASSES this class,
|
|
19
|
+
* inheriting every rule it does not override:
|
|
20
|
+
*
|
|
21
|
+
* @RegisterClass(SubscriptionBehavior, 'AcmeCalendarYear')
|
|
22
|
+
* export class AcmeCalendarYear extends SubscriptionBehavior {
|
|
23
|
+
* protected override ComputeProration(...) { ... } // everything else inherited
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* A driver-only model would have forced a class per permutation of anchor × cadence × concurrency.
|
|
27
|
+
*
|
|
28
|
+
* This class is PURE: it computes dates, amounts, and decisions. It never touches the database and
|
|
29
|
+
* never opens a transaction — `OrderEntityServer` persists the results inside the booking
|
|
30
|
+
* transaction, which keeps transaction management in one place (same discipline as the rev-rec
|
|
31
|
+
* drivers).
|
|
32
|
+
*
|
|
33
|
+
* CONNECTS TO:
|
|
34
|
+
* TABLE: __mj_BizAppsOrders.SubscriptionType
|
|
35
|
+
* CALLER: OrderEntityServer (term creation at confirm)
|
|
36
|
+
*/
|
|
37
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
38
|
+
function money(v) {
|
|
39
|
+
return Math.round((v + Number.EPSILON) * 100) / 100;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Snap to UTC midnight — the ONLY safe basis for this arithmetic.
|
|
43
|
+
*
|
|
44
|
+
* Every date here is a calendar date, not an instant: `SubscriptionTerm.StartDate`/`EndDate` are
|
|
45
|
+
* SQL `DATE` columns, and a term "starts July 1" regardless of who is looking. But `OrderDate`
|
|
46
|
+
* round-trips through the database as UTC midnight while `new Date(y, m, d)` builds LOCAL midnight,
|
|
47
|
+
* so mixing the two puts them hours apart. West of Greenwich that is enough to make a term END
|
|
48
|
+
* BEFORE IT STARTS — a purchase on the anchor date resolves its "next anchor" to the SAME day it was
|
|
49
|
+
* bought, and `EndDate = anchor − 1 day` lands before the start, violating CK_SubscriptionTerm_Dates.
|
|
50
|
+
*
|
|
51
|
+
* So: normalize at the boundary, and do all shifting in UTC.
|
|
52
|
+
*/
|
|
53
|
+
function utcDay(d) {
|
|
54
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
|
55
|
+
}
|
|
56
|
+
function addMonths(d, n) {
|
|
57
|
+
const day = d.getUTCDate();
|
|
58
|
+
const shifted = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + n, day));
|
|
59
|
+
// Clamp: Jan 31 + 1 month is Feb 28/29, not Mar 2/3.
|
|
60
|
+
if (shifted.getUTCDate() < day)
|
|
61
|
+
shifted.setUTCDate(0);
|
|
62
|
+
return shifted;
|
|
63
|
+
}
|
|
64
|
+
function addDays(d, n) {
|
|
65
|
+
return new Date(d.getTime() + n * 86400000);
|
|
66
|
+
}
|
|
67
|
+
function daysBetween(a, b) {
|
|
68
|
+
return Math.round((b.getTime() - a.getTime()) / 86400000);
|
|
69
|
+
}
|
|
70
|
+
/** Calendar date for user-facing explanations. */
|
|
71
|
+
function isoDay(d) {
|
|
72
|
+
return d.toISOString().slice(0, 10);
|
|
73
|
+
}
|
|
74
|
+
let SubscriptionBehavior = class SubscriptionBehavior {
|
|
75
|
+
/**
|
|
76
|
+
* The one entry point: given the rules and what already exists, decide what to do and compute
|
|
77
|
+
* the term. Override individual `protected` members below to customize a single aspect.
|
|
78
|
+
*/
|
|
79
|
+
Decide(rawContext) {
|
|
80
|
+
// Normalize once, here, so every protected method below is guaranteed a calendar date.
|
|
81
|
+
const ctx = {
|
|
82
|
+
...rawContext,
|
|
83
|
+
PurchaseDate: utcDay(rawContext.PurchaseDate),
|
|
84
|
+
Existing: rawContext.Existing
|
|
85
|
+
? { ...rawContext.Existing, LatestTermEnd: rawContext.Existing.LatestTermEnd ? utcDay(rawContext.Existing.LatestTermEnd) : null }
|
|
86
|
+
: rawContext.Existing,
|
|
87
|
+
};
|
|
88
|
+
const scopeError = this.ValidateSubscriberScope(ctx);
|
|
89
|
+
if (scopeError) {
|
|
90
|
+
return { Action: 'Reject', RejectReason: scopeError };
|
|
91
|
+
}
|
|
92
|
+
const action = this.ChooseAction(ctx);
|
|
93
|
+
if (action === 'Reject') {
|
|
94
|
+
return {
|
|
95
|
+
Action: 'Reject',
|
|
96
|
+
RejectReason: `This subscription type (${ctx.Rules.Code}) does not allow a second concurrent ` +
|
|
97
|
+
`subscription for the same subscriber, and an active one already exists.`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// An extension starts where the existing coverage ends — never overlapping it.
|
|
101
|
+
const extending = action === 'ExtendExisting';
|
|
102
|
+
const start = extending && ctx.Existing?.LatestTermEnd
|
|
103
|
+
? addDays(ctx.Existing.LatestTermEnd, 1)
|
|
104
|
+
: utcDay(this.ComputeStartDate(ctx));
|
|
105
|
+
const end = this.ComputeEndDate(ctx, start, extending);
|
|
106
|
+
const { isProrated, factor } = this.ComputeProration(ctx, start, end, extending);
|
|
107
|
+
return {
|
|
108
|
+
Action: action,
|
|
109
|
+
SubscriptionID: action === 'CreateNew' ? undefined : ctx.Existing?.ID,
|
|
110
|
+
Term: {
|
|
111
|
+
StartDate: start,
|
|
112
|
+
EndDate: end,
|
|
113
|
+
TermNumber: (ctx.Existing?.LatestTermNumber ?? 0) + 1,
|
|
114
|
+
IsProrated: isProrated,
|
|
115
|
+
ProrationFactor: isProrated ? factor : null,
|
|
116
|
+
Amount: money(ctx.Amount * (isProrated ? factor : 1)),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ─── Overridable pieces ────────────────────────────────────────────────────
|
|
121
|
+
ValidateSubscriberScope(ctx) {
|
|
122
|
+
const { SubscriberScope, BenefitModel, Code } = ctx.Rules;
|
|
123
|
+
const org = ctx.Subscriber.OrganizationID;
|
|
124
|
+
const person = ctx.Subscriber.PersonID;
|
|
125
|
+
if (!org && !person) {
|
|
126
|
+
return (`Subscription type ${Code} needs a subscriber, but neither a ship-to organization nor ` +
|
|
127
|
+
`a ship-to person is set on the order line, and the order header names no customer.`);
|
|
128
|
+
}
|
|
129
|
+
if (SubscriberScope === 'Organization' && !org) {
|
|
130
|
+
return `Subscription type ${Code} is organization-only, but no organization was resolved for this line.`;
|
|
131
|
+
}
|
|
132
|
+
if (SubscriberScope === 'Person' && !person) {
|
|
133
|
+
return `Subscription type ${Code} is individual-only, but no person was resolved for this line.`;
|
|
134
|
+
}
|
|
135
|
+
// The benefit model is the stricter of the two rules, so it is checked second.
|
|
136
|
+
if (BenefitModel === 'Organization' && !org) {
|
|
137
|
+
return (`Subscription type ${Code} benefits an organization's members, so it must be held by ` +
|
|
138
|
+
`an organization — none was resolved for this line, the order's ship-to, or its customer.`);
|
|
139
|
+
}
|
|
140
|
+
// `Holder` needs no extra check: SubscriberScope already guaranteed a holder exists, and
|
|
141
|
+
// the benefit simply follows them.
|
|
142
|
+
if (BenefitModel === 'Individual' && !person) {
|
|
143
|
+
// Note WHERE this can be satisfied from. The person is NOT required on the line: it
|
|
144
|
+
// falls back to the order's ship-to and then its customer, so a bulk order for one
|
|
145
|
+
// recipient states them once on the header. The failure only fires when no person is
|
|
146
|
+
// resolvable ANYWHERE, which genuinely leaves nobody to benefit.
|
|
147
|
+
return (`Subscription type ${Code} benefits a named person, but none was resolved from the ` +
|
|
148
|
+
`line's ship-to, the order's ship-to, or the order's customer.`);
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The identity a duplicate is judged against — the heart of the concurrency rule.
|
|
154
|
+
*
|
|
155
|
+
* `Organization` keys on the ORG alone: a company holds ONE membership however many
|
|
156
|
+
* employees benefit, so a second purchase extends it. `Individual` keys on the PAIR, so
|
|
157
|
+
* ten seats bought for ten staff on one order are ten distinct subscriptions rather than ten
|
|
158
|
+
* collisions with each other. Getting this wrong is what made a bulk seat purchase impossible.
|
|
159
|
+
*/
|
|
160
|
+
DedupeIdentity(rules, subscriber) {
|
|
161
|
+
switch (rules.BenefitModel) {
|
|
162
|
+
case 'Holder':
|
|
163
|
+
// Key on whichever side holds it, so a personal membership dedupes by person and an
|
|
164
|
+
// org-held one by org — without either leaking into the other's identity.
|
|
165
|
+
return subscriber.PersonID && !subscriber.OrganizationID
|
|
166
|
+
? { OrganizationID: null, PersonID: subscriber.PersonID }
|
|
167
|
+
: { OrganizationID: subscriber.OrganizationID ?? null, PersonID: null };
|
|
168
|
+
case 'Organization':
|
|
169
|
+
// The org holds ONE, however many of its people benefit — so a second purchase
|
|
170
|
+
// extends rather than duplicating.
|
|
171
|
+
return { OrganizationID: subscriber.OrganizationID, PersonID: null };
|
|
172
|
+
case 'Individual':
|
|
173
|
+
// Both sides as resolved. For a seat that is (org, person), so ten staff are ten
|
|
174
|
+
// subscriptions. For a personal membership the org is simply absent, leaving the
|
|
175
|
+
// person as the key.
|
|
176
|
+
return { OrganizationID: subscriber.OrganizationID ?? null, PersonID: subscriber.PersonID };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
ChooseAction(ctx) {
|
|
180
|
+
const existing = ctx.Existing;
|
|
181
|
+
if (!existing)
|
|
182
|
+
return 'CreateNew';
|
|
183
|
+
// A renewal continues THIS subscription, whatever the concurrency rule says (see IsRenewal).
|
|
184
|
+
// Reactivation still applies below when the subscription has lapsed — a renewal arriving
|
|
185
|
+
// after a lapse should revive it rather than silently extend a dead one.
|
|
186
|
+
const isActive = existing.Status === 'Active' || existing.Status === 'Trialing';
|
|
187
|
+
if (ctx.IsRenewal && isActive)
|
|
188
|
+
return 'ExtendExisting';
|
|
189
|
+
if (isActive) {
|
|
190
|
+
switch (ctx.Rules.ConcurrencyMode) {
|
|
191
|
+
case 'AllowMultiple': return 'CreateNew';
|
|
192
|
+
case 'ExtendExisting': return 'ExtendExisting';
|
|
193
|
+
case 'RejectDuplicate': return 'Reject';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Lapsed or canceled — reactivation policy decides.
|
|
197
|
+
switch (ctx.Rules.ReactivationMode) {
|
|
198
|
+
case 'AlwaysCreateNew':
|
|
199
|
+
return 'CreateNew';
|
|
200
|
+
case 'ReactivateExisting':
|
|
201
|
+
return 'Reactivate';
|
|
202
|
+
case 'ReactivateWithinWindow': {
|
|
203
|
+
const window = ctx.Rules.ReactivationWindowDays ?? 0;
|
|
204
|
+
const end = existing.LatestTermEnd ? new Date(existing.LatestTermEnd) : null;
|
|
205
|
+
const withinWindow = end != null && daysBetween(end, ctx.PurchaseDate) <= window;
|
|
206
|
+
return withinWindow ? 'Reactivate' : 'CreateNew';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Immediate / Deferred / snap-forward to the calendar anchor. */
|
|
211
|
+
ComputeStartDate(ctx) {
|
|
212
|
+
const purchase = ctx.PurchaseDate;
|
|
213
|
+
switch (ctx.Rules.StartMode) {
|
|
214
|
+
case 'Immediate':
|
|
215
|
+
return purchase;
|
|
216
|
+
case 'Deferred':
|
|
217
|
+
return addDays(purchase, ctx.Rules.DeferredStartDays ?? 0);
|
|
218
|
+
case 'CalendarAnchored':
|
|
219
|
+
// ExtendToNextAnchor waits for the anchor; Prorate/ChargeFull start NOW and run to
|
|
220
|
+
// the anchor, which is what makes the first term partial.
|
|
221
|
+
return ctx.Rules.PartialPeriodMode === 'ExtendToNextAnchor'
|
|
222
|
+
? this.NextAnchor(ctx, purchase)
|
|
223
|
+
: purchase;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
ComputeEndDate(ctx, start, extending) {
|
|
227
|
+
const months = ctx.Rules.DefaultTermMonths ?? this.MonthsForCadence(ctx.Rules.BillingCadence, ctx.Rules.CustomCycleDays);
|
|
228
|
+
if (ctx.Rules.StartMode === 'CalendarAnchored' && !extending) {
|
|
229
|
+
// A partial first term runs from the purchase to the day before the next anchor.
|
|
230
|
+
const anchor = this.NextAnchor(ctx, start);
|
|
231
|
+
if (ctx.Rules.PartialPeriodMode !== 'ExtendToNextAnchor' && anchor.getTime() > start.getTime()) {
|
|
232
|
+
return addDays(anchor, -1);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return addDays(addMonths(start, months), -1);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Only `Prorate` actually reduces the amount. `ChargeFull` deliberately charges a whole term for
|
|
239
|
+
* a partial window — the customer pays full freight to join mid-cycle — and
|
|
240
|
+
* `ExtendToNextAnchor` has no partial window at all.
|
|
241
|
+
*/
|
|
242
|
+
ComputeProration(ctx, start, end, extending) {
|
|
243
|
+
if (extending)
|
|
244
|
+
return { isProrated: false, factor: 1 };
|
|
245
|
+
if (ctx.Rules.StartMode !== 'CalendarAnchored')
|
|
246
|
+
return { isProrated: false, factor: 1 };
|
|
247
|
+
if (ctx.Rules.PartialPeriodMode !== 'Prorate')
|
|
248
|
+
return { isProrated: false, factor: 1 };
|
|
249
|
+
const fullMonths = ctx.Rules.DefaultTermMonths ?? 12;
|
|
250
|
+
const fullDays = daysBetween(start, addMonths(start, fullMonths));
|
|
251
|
+
const actualDays = daysBetween(start, end) + 1;
|
|
252
|
+
if (fullDays <= 0 || actualDays >= fullDays)
|
|
253
|
+
return { isProrated: false, factor: 1 };
|
|
254
|
+
return { isProrated: true, factor: Math.round((actualDays / fullDays) * 1e6) / 1e6 };
|
|
255
|
+
}
|
|
256
|
+
/** The next occurrence of AnchorMonth/AnchorDay strictly after `from`. */
|
|
257
|
+
NextAnchor(ctx, from) {
|
|
258
|
+
const month = (ctx.Rules.AnchorMonth ?? 1) - 1;
|
|
259
|
+
const day = ctx.Rules.AnchorDay ?? 1;
|
|
260
|
+
const base = utcDay(from);
|
|
261
|
+
let anchor = new Date(Date.UTC(base.getUTCFullYear(), month, day));
|
|
262
|
+
// Strictly after: buying ON the anchor date starts a FULL term at that anchor rather than
|
|
263
|
+
// a zero-length stub ending the day before itself.
|
|
264
|
+
if (anchor.getTime() <= base.getTime()) {
|
|
265
|
+
anchor = new Date(Date.UTC(base.getUTCFullYear() + 1, month, day));
|
|
266
|
+
}
|
|
267
|
+
return anchor;
|
|
268
|
+
}
|
|
269
|
+
MonthsForCadence(cadence, customDays) {
|
|
270
|
+
switch (cadence) {
|
|
271
|
+
case 'Monthly': return 1;
|
|
272
|
+
case 'Quarterly': return 3;
|
|
273
|
+
case 'Annual': return 12;
|
|
274
|
+
case 'Custom': return Math.max(1, Math.round((customDays ?? 30) / 30));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** Months per recognition slice — `MatchBilling` follows the billing cadence. */
|
|
278
|
+
RecognitionMonths(rules) {
|
|
279
|
+
const cadence = rules.RecognitionCadence === 'MatchBilling' ? rules.BillingCadence : rules.RecognitionCadence;
|
|
280
|
+
return this.MonthsForCadence(cadence, rules.CustomCycleDays);
|
|
281
|
+
}
|
|
282
|
+
// ─── Cancellation (design §5) ──────────────────────────────────────────────
|
|
283
|
+
//
|
|
284
|
+
// The mechanics of a cancellation already work: a reversal order line with a negative quantity
|
|
285
|
+
// produces mirrored journal entries through the ordinary booking path (D16). What was missing is
|
|
286
|
+
// the POLICY — and the raw mechanic is terrible data entry. Amith's case: a subscription running
|
|
287
|
+
// 1/1-12/31, cancelled on 7/1, needs a line of quantity -0.5. The user should pick a DATE; the
|
|
288
|
+
// engine derives the fraction. That is what this computes.
|
|
289
|
+
/**
|
|
290
|
+
* Apply the type's cancellation rules to a request. Pure — computes dates and amounts, touches
|
|
291
|
+
* nothing. Override any protected piece below to change one aspect.
|
|
292
|
+
*/
|
|
293
|
+
DecideCancellation(rawContext) {
|
|
294
|
+
const ctx = {
|
|
295
|
+
...rawContext,
|
|
296
|
+
RequestDate: utcDay(rawContext.RequestDate),
|
|
297
|
+
Term: {
|
|
298
|
+
...rawContext.Term,
|
|
299
|
+
StartDate: utcDay(rawContext.Term.StartDate),
|
|
300
|
+
EndDate: utcDay(rawContext.Term.EndDate),
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
const effective = this.ClampToTerm(ctx, this.ComputeCancellationDate(ctx));
|
|
304
|
+
const { amount, explanation } = this.ComputeRefund(ctx, effective);
|
|
305
|
+
const uncapped = money(Math.min(Math.max(amount, 0), ctx.Term.Amount));
|
|
306
|
+
// Round the FRACTION to the reversal line's own precision, then derive the refund back from
|
|
307
|
+
// it — not the other way round. `OrderLine.Quantity` is DECIMAL(18,4), so a fraction with
|
|
308
|
+
// more precision than that is silently truncated on insert, and the line total recomputed
|
|
309
|
+
// from the truncated quantity no longer matches the one stored at insert. The immutability
|
|
310
|
+
// trigger sees a "changed" financial column and rejects the very next write to that line.
|
|
311
|
+
// Deriving both numbers from one rounded fraction keeps the reversed revenue and the
|
|
312
|
+
// refunded cash exactly equal, which is the invariant that actually matters.
|
|
313
|
+
const rawFraction = ctx.Term.Amount > 0 ? uncapped / ctx.Term.Amount : 0;
|
|
314
|
+
const fraction = Math.round(rawFraction * 1e4) / 1e4;
|
|
315
|
+
const refund = money(ctx.Term.Amount * fraction);
|
|
316
|
+
return {
|
|
317
|
+
EffectiveDate: effective,
|
|
318
|
+
AccessThroughDate: addDays(effective, ctx.Rules.GracePeriodDays ?? 0),
|
|
319
|
+
RefundAmount: refund,
|
|
320
|
+
ReversalFraction: fraction,
|
|
321
|
+
// Riding the term out is not a cancellation of coverage — the customer got everything
|
|
322
|
+
// they paid for. Only a cut-short term is `Canceled`.
|
|
323
|
+
TermStatus: effective.getTime() >= ctx.Term.EndDate.getTime() ? 'Completed' : 'Canceled',
|
|
324
|
+
Explanation: explanation,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/** When coverage ends, per `CancellationMode`. */
|
|
328
|
+
ComputeCancellationDate(ctx) {
|
|
329
|
+
switch (ctx.Rules.CancellationMode) {
|
|
330
|
+
case 'Immediate':
|
|
331
|
+
return ctx.RequestDate;
|
|
332
|
+
case 'EndOfTerm':
|
|
333
|
+
return ctx.Term.EndDate;
|
|
334
|
+
case 'EndOfBillingPeriod':
|
|
335
|
+
return this.EndOfBillingPeriod(ctx);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* The last day of the billing cycle the request falls in. Cycles are counted forward from the
|
|
340
|
+
* TERM START, not from the request — a monthly subscription started on the 12th bills on the
|
|
341
|
+
* 12th, and cancelling on the 20th runs to the 11th of the next month.
|
|
342
|
+
*/
|
|
343
|
+
EndOfBillingPeriod(ctx) {
|
|
344
|
+
const step = this.MonthsForCadence(ctx.Rules.BillingCadence, ctx.Rules.CustomCycleDays);
|
|
345
|
+
let boundary = addMonths(ctx.Term.StartDate, step);
|
|
346
|
+
// Bounded by the term itself, so a mis-configured cadence cannot spin.
|
|
347
|
+
while (boundary.getTime() <= ctx.RequestDate.getTime() && boundary.getTime() < ctx.Term.EndDate.getTime()) {
|
|
348
|
+
boundary = addMonths(boundary, step);
|
|
349
|
+
}
|
|
350
|
+
return addDays(boundary, -1);
|
|
351
|
+
}
|
|
352
|
+
/** Cancellation never resurrects a finished term, and never ends coverage before it began. */
|
|
353
|
+
ClampToTerm(ctx, date) {
|
|
354
|
+
if (date.getTime() < ctx.Term.StartDate.getTime())
|
|
355
|
+
return ctx.Term.StartDate;
|
|
356
|
+
if (date.getTime() > ctx.Term.EndDate.getTime())
|
|
357
|
+
return ctx.Term.EndDate;
|
|
358
|
+
return date;
|
|
359
|
+
}
|
|
360
|
+
/** What to give back, per `CancellationRefundMode`. */
|
|
361
|
+
ComputeRefund(ctx, effective) {
|
|
362
|
+
const { Rules: rules, Term: term } = ctx;
|
|
363
|
+
switch (rules.CancellationRefundMode) {
|
|
364
|
+
case 'NoRefund':
|
|
365
|
+
return {
|
|
366
|
+
amount: 0,
|
|
367
|
+
explanation: `Coverage ends ${isoDay(effective)} (${rules.CancellationMode}). This subscription ` +
|
|
368
|
+
`type does not refund, so nothing is reversed.`,
|
|
369
|
+
};
|
|
370
|
+
case 'FullRefundWithinWindow': {
|
|
371
|
+
const window = rules.CancellationWindowDays ?? 0;
|
|
372
|
+
const elapsed = daysBetween(term.StartDate, ctx.RequestDate);
|
|
373
|
+
if (elapsed <= window) {
|
|
374
|
+
return {
|
|
375
|
+
amount: term.Amount,
|
|
376
|
+
explanation: `Cancelled ${elapsed} day(s) into the term, within the ${window}-day refund ` +
|
|
377
|
+
`window — the full ${term.Amount} is refunded and reversed.`,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
amount: 0,
|
|
382
|
+
explanation: `Cancelled ${elapsed} day(s) into the term, past the ${window}-day refund window. ` +
|
|
383
|
+
`Coverage ends ${isoDay(effective)} with no refund.`,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
case 'ProrateUnused': {
|
|
387
|
+
// Inclusive day counts on both sides, so a cancellation on the term's first day
|
|
388
|
+
// refunds the whole term rather than all-but-one-day.
|
|
389
|
+
const totalDays = daysBetween(term.StartDate, term.EndDate) + 1;
|
|
390
|
+
const unusedDays = daysBetween(effective, term.EndDate);
|
|
391
|
+
if (totalDays <= 0 || unusedDays <= 0) {
|
|
392
|
+
return {
|
|
393
|
+
amount: 0,
|
|
394
|
+
explanation: `Coverage ends ${isoDay(effective)} with no unused period remaining.`,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
const fraction = unusedDays / totalDays;
|
|
398
|
+
return {
|
|
399
|
+
amount: term.Amount * fraction,
|
|
400
|
+
explanation: `Coverage ends ${isoDay(effective)}; ${unusedDays} of ${totalDays} day(s) go ` +
|
|
401
|
+
`unused, so ${Math.round(fraction * 1000) / 10}% of the term is refunded.`,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
SubscriptionBehavior = __decorate([
|
|
408
|
+
RegisterClass(SubscriptionBehavior, 'Default')
|
|
409
|
+
], SubscriptionBehavior);
|
|
410
|
+
export { SubscriptionBehavior };
|
|
411
|
+
/** Tree-shaking anchor — the base behaviour must be registered before booking runs. */
|
|
412
|
+
export function LoadSubscriptionBehavior() {
|
|
413
|
+
// intentionally empty
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=SubscriptionBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionBehavior.js","sourceRoot":"","sources":["../src/SubscriptionBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable signal when a settled checkout payment will never book on retry.
|
|
3
|
+
*
|
|
4
|
+
* The log marker is the alert floor. A Tasks row is the human-visible artifact —
|
|
5
|
+
* only if bizapps-tasks is installed AND a GENERAL TaskType can be resolved by
|
|
6
|
+
* Code. TypeID is NOT NULL with no default; writing a Task without it always fails.
|
|
7
|
+
*
|
|
8
|
+
* Reads and writes go through the generated Tasks subclasses, not `.Get()` / `.Set()`.
|
|
9
|
+
*/
|
|
10
|
+
import { type UserInfo } from '@memberjunction/core';
|
|
11
|
+
export declare const CHECKOUT_CAPTURE_TASK_ENTITY = "MJ_BizApps_Tasks: Tasks";
|
|
12
|
+
export declare const CHECKOUT_CAPTURE_TASK_TYPE_ENTITY = "MJ_BizApps_Tasks: Task Types";
|
|
13
|
+
/** Seeded TaskType.Code — resolved at runtime, never a hardcoded GUID. */
|
|
14
|
+
export declare const CHECKOUT_CAPTURE_TASK_TYPE_CODE = "GENERAL";
|
|
15
|
+
export declare function raiseCheckoutCaptureTerminalAlert(orderID: string, sessionID: string | undefined, reason: string, contextUser?: UserInfo): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=checkoutCaptureAlert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkoutCaptureAlert.d.ts","sourceRoot":"","sources":["../src/checkoutCaptureAlert.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAA+B,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQlF,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AACtE,eAAO,MAAM,iCAAiC,iCAAiC,CAAC;AAChF,0EAA0E;AAC1E,eAAO,MAAM,+BAA+B,YAAY,CAAC;AAEzD,wBAAsB,iCAAiC,CACnD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,QAAQ,GACvB,OAAO,CAAC,IAAI,CAAC,CAkDf"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable signal when a settled checkout payment will never book on retry.
|
|
3
|
+
*
|
|
4
|
+
* The log marker is the alert floor. A Tasks row is the human-visible artifact —
|
|
5
|
+
* only if bizapps-tasks is installed AND a GENERAL TaskType can be resolved by
|
|
6
|
+
* Code. TypeID is NOT NULL with no default; writing a Task without it always fails.
|
|
7
|
+
*
|
|
8
|
+
* Reads and writes go through the generated Tasks subclasses, not `.Get()` / `.Set()`.
|
|
9
|
+
*/
|
|
10
|
+
import { LogError, Metadata, RunView } from '@memberjunction/core';
|
|
11
|
+
import { CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER } from './checkoutCaptureRetry.js';
|
|
12
|
+
import { EscapeText } from './sql-guards.js';
|
|
13
|
+
export const CHECKOUT_CAPTURE_TASK_ENTITY = 'MJ_BizApps_Tasks: Tasks';
|
|
14
|
+
export const CHECKOUT_CAPTURE_TASK_TYPE_ENTITY = 'MJ_BizApps_Tasks: Task Types';
|
|
15
|
+
/** Seeded TaskType.Code — resolved at runtime, never a hardcoded GUID. */
|
|
16
|
+
export const CHECKOUT_CAPTURE_TASK_TYPE_CODE = 'GENERAL';
|
|
17
|
+
export async function raiseCheckoutCaptureTerminalAlert(orderID, sessionID, reason, contextUser) {
|
|
18
|
+
LogError(`${CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER} Settled payment was not booked onto confirmed checkout order ${orderID}` +
|
|
19
|
+
`${sessionID ? ` session=${sessionID}` : ''}: ${reason}`);
|
|
20
|
+
if (!contextUser) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const md = new Metadata();
|
|
25
|
+
if (!md.EntityByName(CHECKOUT_CAPTURE_TASK_ENTITY)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const rv = new RunView();
|
|
29
|
+
const types = await rv.RunView({
|
|
30
|
+
EntityName: CHECKOUT_CAPTURE_TASK_TYPE_ENTITY,
|
|
31
|
+
ExtraFilter: `Code = '${EscapeText(CHECKOUT_CAPTURE_TASK_TYPE_CODE)}'`,
|
|
32
|
+
ResultType: 'entity_object',
|
|
33
|
+
MaxRows: 1,
|
|
34
|
+
}, contextUser);
|
|
35
|
+
const typeID = types.Success ? types.Results?.[0]?.ID : undefined;
|
|
36
|
+
if (!typeID) {
|
|
37
|
+
LogError(`${CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER} No GENERAL TaskType — cannot raise a Task`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const task = await md.GetEntityObject(CHECKOUT_CAPTURE_TASK_ENTITY, contextUser);
|
|
41
|
+
task.NewRecord();
|
|
42
|
+
task.TypeID = typeID;
|
|
43
|
+
task.Name = `Checkout capture not booked: ${orderID}`;
|
|
44
|
+
task.Description =
|
|
45
|
+
`A Stripe payment settled and the checkout order is Confirmed, but Orders.CapturePayment was refused and will not succeed on retry.\n\nOrder: ${orderID}\nSession: ${sessionID ?? '(unknown)'}\nReason: ${reason}`;
|
|
46
|
+
task.Status = 'Open';
|
|
47
|
+
if (!(await task.Save())) {
|
|
48
|
+
LogError(`${CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER} Could not raise a Task: ${task.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
LogError(`${CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER} Could not raise a Task: ${err instanceof Error ? err.message : String(err)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=checkoutCaptureAlert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkoutCaptureAlert.js","sourceRoot":"","sources":["../src/checkoutCaptureAlert.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAiB,MAAM,sBAAsB,CAAC;AAKlF,OAAO,EAAE,oCAAoC,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAC;AACtE,MAAM,CAAC,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAChF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,+BAA+B,GAAG,SAAS,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACnD,OAAe,EACf,SAA6B,EAC7B,MAAc,EACd,WAAsB;IAEtB,QAAQ,CACJ,GAAG,oCAAoC,iEAAiE,OAAO,EAAE;QAC7G,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAC/D,CAAC;IACF,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO;IACX,CAAC;IACD,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,4BAA4B,CAAC,EAAE,CAAC;YACjD,OAAO;QACX,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B;YACI,UAAU,EAAE,iCAAiC;YAC7C,WAAW,EAAE,WAAW,UAAU,CAAC,+BAA+B,CAAC,GAAG;YACtE,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,CAAC;SACb,EACD,WAAW,CACd,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,QAAQ,CAAC,GAAG,oCAAoC,4CAA4C,CAAC,CAAC;YAC9F,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,eAAe,CACjC,4BAA4B,EAC5B,WAAW,CACd,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,gCAAgC,OAAO,EAAE,CAAC;QACtD,IAAI,CAAC,WAAW;YACZ,gJAAgJ,OAAO,cAAc,SAAS,IAAI,WAAW,aAAa,MAAM,EAAE,CAAC;QACvN,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACvB,QAAQ,CACJ,GAAG,oCAAoC,4BAA4B,IAAI,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAC7H,CAAC;QACN,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,QAAQ,CACJ,GAAG,oCAAoC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxH,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify a failed checkout CapturePayment as terminal vs transient so the
|
|
3
|
+
* payment webhook 500s (Stripe retries) only when a later attempt might work.
|
|
4
|
+
*
|
|
5
|
+
* Unclassified defaults to transient: convergence matters more than tidiness,
|
|
6
|
+
* and the event-age bound makes that bias affordable.
|
|
7
|
+
*/
|
|
8
|
+
import type { WebhookEvent } from './BasePaymentProvider.js';
|
|
9
|
+
/** Stripe retries ~3 days; stop 500ing well inside that envelope. */
|
|
10
|
+
export declare const CHECKOUT_CAPTURE_RETRY_WINDOW_MS: number;
|
|
11
|
+
/** Grep / alert marker when a settled checkout payment will never book on retry. */
|
|
12
|
+
export declare const CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER = "[CHECKOUT-CAPTURE-TERMINAL]";
|
|
13
|
+
/**
|
|
14
|
+
* CapturePayment `Blockers[].Code` values that will not change on replay.
|
|
15
|
+
* `CaptureFailed` is deliberately absent — it wraps a thrown save-path error.
|
|
16
|
+
*/
|
|
17
|
+
export declare const TERMINAL_CAPTURE_BLOCKER_CODES: ReadonlySet<string>;
|
|
18
|
+
export declare const TERMINAL_CAPTURE_PRECHECKS: ReadonlySet<string>;
|
|
19
|
+
export declare function isTerminalCapturePrecheck(message: string): boolean;
|
|
20
|
+
/** True when a later CapturePayment might succeed. Empty / unknown codes retry. */
|
|
21
|
+
export declare function isCaptureRefusalRetryable(blockerCodes: readonly string[]): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Missing OccurredAt does NOT disable retries (the bound cannot be applied, and
|
|
24
|
+
* that is logged by the caller). Present-and-older-than-window → stop 500ing.
|
|
25
|
+
*/
|
|
26
|
+
export declare function webhookEventExceedsRetryWindow(event: Pick<WebhookEvent, 'OccurredAt'>, nowMs?: number, windowMs?: number): boolean;
|
|
27
|
+
//# sourceMappingURL=checkoutCaptureRetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkoutCaptureRetry.d.ts","sourceRoot":"","sources":["../src/checkoutCaptureRetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,qEAAqE;AACrE,eAAO,MAAM,gCAAgC,QAAsB,CAAC;AAEpE,oFAAoF;AACpF,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAe7D,CAAC;AAEH,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAIzD,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAKlF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EACvC,KAAK,GAAE,MAAmB,EAC1B,QAAQ,GAAE,MAAyC,GACpD,OAAO,CAKT"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Stripe retries ~3 days; stop 500ing well inside that envelope. */
|
|
2
|
+
export const CHECKOUT_CAPTURE_RETRY_WINDOW_MS = 12 * 60 * 60 * 1000;
|
|
3
|
+
/** Grep / alert marker when a settled checkout payment will never book on retry. */
|
|
4
|
+
export const CHECKOUT_CAPTURE_TERMINAL_LOG_MARKER = '[CHECKOUT-CAPTURE-TERMINAL]';
|
|
5
|
+
/**
|
|
6
|
+
* CapturePayment `Blockers[].Code` values that will not change on replay.
|
|
7
|
+
* `CaptureFailed` is deliberately absent — it wraps a thrown save-path error.
|
|
8
|
+
*/
|
|
9
|
+
export const TERMINAL_CAPTURE_BLOCKER_CODES = new Set([
|
|
10
|
+
'BadCompanyID',
|
|
11
|
+
'BadPaymentIntentID',
|
|
12
|
+
'BadPayerID',
|
|
13
|
+
'BadOrderID',
|
|
14
|
+
'NonPositiveAmount',
|
|
15
|
+
'NonPositiveAllocation',
|
|
16
|
+
'NoAllocations',
|
|
17
|
+
'AllocationMismatch',
|
|
18
|
+
'PayerAmbiguous',
|
|
19
|
+
'OrderNotFound',
|
|
20
|
+
'PaymentNotFound',
|
|
21
|
+
'UnknownTender',
|
|
22
|
+
'ReversalTender',
|
|
23
|
+
'OrderCompanyMismatch',
|
|
24
|
+
]);
|
|
25
|
+
export const TERMINAL_CAPTURE_PRECHECKS = new Set([
|
|
26
|
+
'no bill-to party',
|
|
27
|
+
'payment intent not found',
|
|
28
|
+
'no context user',
|
|
29
|
+
]);
|
|
30
|
+
export function isTerminalCapturePrecheck(message) {
|
|
31
|
+
return TERMINAL_CAPTURE_PRECHECKS.has(message);
|
|
32
|
+
}
|
|
33
|
+
/** True when a later CapturePayment might succeed. Empty / unknown codes retry. */
|
|
34
|
+
export function isCaptureRefusalRetryable(blockerCodes) {
|
|
35
|
+
if (!blockerCodes.length) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return blockerCodes.some((code) => !TERMINAL_CAPTURE_BLOCKER_CODES.has(code));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Missing OccurredAt does NOT disable retries (the bound cannot be applied, and
|
|
42
|
+
* that is logged by the caller). Present-and-older-than-window → stop 500ing.
|
|
43
|
+
*/
|
|
44
|
+
export function webhookEventExceedsRetryWindow(event, nowMs = Date.now(), windowMs = CHECKOUT_CAPTURE_RETRY_WINDOW_MS) {
|
|
45
|
+
if (!event.OccurredAt) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return nowMs - event.OccurredAt.getTime() > windowMs;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=checkoutCaptureRetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkoutCaptureRetry.js","sourceRoot":"","sources":["../src/checkoutCaptureRetry.ts"],"names":[],"mappings":"AASA,qEAAqE;AACrE,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpE,oFAAoF;AACpF,MAAM,CAAC,MAAM,oCAAoC,GAAG,6BAA6B,CAAC;AAElF;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAwB,IAAI,GAAG,CAAC;IACvE,cAAc;IACd,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,uBAAuB;IACvB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,sBAAsB;CACzB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IACnE,kBAAkB;IAClB,0BAA0B;IAC1B,iBAAiB;CACpB,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACrD,OAAO,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,yBAAyB,CAAC,YAA+B;IACrE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC1C,KAAuC,EACvC,QAAgB,IAAI,CAAC,GAAG,EAAE,EAC1B,WAAmB,gCAAgC;IAEnD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared helper utilities for Identity Claim drivers in BizApps Orders.
|
|
3
|
+
*
|
|
4
|
+
* @module @mj-biz-apps/orders-core-entities-server/claimDriverHelpers
|
|
5
|
+
*/
|
|
6
|
+
import { UserInfo, IEntityDataProvider, IMetadataProvider } from '@memberjunction/core';
|
|
7
|
+
/**
|
|
8
|
+
* Resolves or looks up the primary Person record associated with an authenticated UserInfo.
|
|
9
|
+
*
|
|
10
|
+
* @param user The authenticated UserInfo from the claim context
|
|
11
|
+
* @param provider Optional scoped entity/metadata provider
|
|
12
|
+
* @returns Person ID string if found, or null
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolvePersonID(user: UserInfo, provider?: IEntityDataProvider | IMetadataProvider | null): Promise<string | null>;
|
|
15
|
+
//# sourceMappingURL=claimDriverHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claimDriverHelpers.d.ts","sourceRoot":"","sources":["../src/claimDriverHelpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAW,QAAQ,EAAoB,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAInH;;;;;;GAMG;AACH,wBAAsB,eAAe,CACjC,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,GAAG,IAAI,GAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|