@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,463 @@
|
|
|
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
|
+
* @fileoverview `Orders.CapturePayment` — take a payment and allocate it, in one transaction.
|
|
9
|
+
*
|
|
10
|
+
* WHY THIS EXISTS AT ALL. A payment is a HEADER plus its ALLOCATION LINES, and
|
|
11
|
+
* `PaymentHeaderEntityServer.Lines` is a TRANSIENT collection rather than a column. CodeGen cannot
|
|
12
|
+
* emit it on the client entity, so a browser `entity.Save()` has nowhere to put the allocations.
|
|
13
|
+
* That is precisely the situation `Orders.SaveOrder` was built for, and it needs the same answer.
|
|
14
|
+
*
|
|
15
|
+
* A two-step create-then-allocate flow was rejected: between the steps there would be a captured
|
|
16
|
+
* payment with no allocations in the database — cash recorded against nothing — and any failure in
|
|
17
|
+
* the second step would leave it there permanently.
|
|
18
|
+
*
|
|
19
|
+
* READ WHAT THE ENGINE COMPUTED; DO NOT RECOMPUTE. The fee, the net, and every order rollup are
|
|
20
|
+
* read back from the saved rows. Recomputing them here would eventually disagree with the ledger,
|
|
21
|
+
* and the disagreement surfaces as a balanced journal entry for the wrong amount — which nothing
|
|
22
|
+
* downstream can catch.
|
|
23
|
+
*
|
|
24
|
+
* @module @mj-biz-apps/orders-core-entities-server
|
|
25
|
+
*/
|
|
26
|
+
import { BaseRemotableOperation, RunView, } from '@memberjunction/core';
|
|
27
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
28
|
+
import { OrdersCapturePaymentOperation as OrdersCapturePaymentOperationBase, } from '@mj-biz-apps/orders-entities';
|
|
29
|
+
import { RequireOptionalUUID, RequireUUID } from './sql-guards.js';
|
|
30
|
+
import { ResolvePaymentProvider } from './PaymentProviderResolver.js';
|
|
31
|
+
import { LoadOrdersEngine, OrdersEngine } from '@mj-biz-apps/orders-entities';
|
|
32
|
+
const PAYMENT_HEADER_ENTITY = 'MJ_BizApps_Orders: Payment Headers';
|
|
33
|
+
const PAYMENT_LINE_ENTITY = 'MJ_BizApps_Orders: Payment Lines';
|
|
34
|
+
const PAYMENT_DETAIL_ENTITY = 'MJ_BizApps_Orders: Payment Details';
|
|
35
|
+
const PAYMENT_TYPE_ENTITY = 'MJ_BizApps_Orders: Payment Types';
|
|
36
|
+
const ORDER_HEADER_ENTITY = 'MJ_BizApps_Orders: Order Headers';
|
|
37
|
+
const money = (n) => Math.round((Number(n) + Number.EPSILON) * 100) / 100;
|
|
38
|
+
const key = (id) => (id ?? '').toLowerCase();
|
|
39
|
+
const quote = (ids) => [...new Set(ids.map((i) => `'${i}'`))].join(',');
|
|
40
|
+
let CapturePaymentOperation = class CapturePaymentOperation extends OrdersCapturePaymentOperationBase {
|
|
41
|
+
async InternalExecute(input, provider, user) {
|
|
42
|
+
const blockers = [];
|
|
43
|
+
const rv = new RunView(provider);
|
|
44
|
+
// ── 1. VALIDATE AT THE BOUNDARY ──
|
|
45
|
+
// The page checks these before emitting, but this is the trust boundary and must not rely on
|
|
46
|
+
// that. Ids are validated because they reach SQL filter text: `GetOverdueWorklist`
|
|
47
|
+
// interpolated a caller-supplied id straight into ExtraFilter, and `' OR 1=1 --` widened the
|
|
48
|
+
// result set rather than erroring.
|
|
49
|
+
let receivingCompanyID;
|
|
50
|
+
try {
|
|
51
|
+
receivingCompanyID = RequireUUID(input?.ReceivingCompanyID, 'ReceivingCompanyID');
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return this.refuse([this.blocker('BadCompanyID', String(e.message))]);
|
|
55
|
+
}
|
|
56
|
+
// Validated at the boundary like every other caller-supplied id, even though this one reaches
|
|
57
|
+
// an entity Set() rather than a filter: the FilterInjection guard is a floor, not a ceiling,
|
|
58
|
+
// and an id that is not an id should be refused where the caller can still read the reason.
|
|
59
|
+
try {
|
|
60
|
+
RequireOptionalUUID(input?.PaymentIntentID, 'PaymentIntentID');
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return this.refuse([this.blocker('BadPaymentIntentID', String(e.message))]);
|
|
64
|
+
}
|
|
65
|
+
const allocations = input?.Allocations ?? [];
|
|
66
|
+
if (!allocations.length) {
|
|
67
|
+
blockers.push(this.blocker('NoAllocations', 'A payment must say where the money lands. Send at least one allocation.', 'Allocate the payment to one or more orders before capturing.'));
|
|
68
|
+
}
|
|
69
|
+
// Validated even though these are Set() onto an entity rather than interpolated into a
|
|
70
|
+
// filter. The guard test enforces "every caller-supplied id is checked" with no exceptions,
|
|
71
|
+
// which is the right rule: an id that is safe because of where it happens to be used today
|
|
72
|
+
// stops being safe the moment somebody reads it back in a query.
|
|
73
|
+
let orgID = null;
|
|
74
|
+
let personID = null;
|
|
75
|
+
try {
|
|
76
|
+
orgID = input?.BillToOrganizationID ? RequireUUID(input.BillToOrganizationID, 'BillToOrganizationID') : null;
|
|
77
|
+
personID = input?.BillToPersonID ? RequireUUID(input.BillToPersonID, 'BillToPersonID') : null;
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
return this.refuse([this.blocker('BadPayerID', String(e.message))]);
|
|
81
|
+
}
|
|
82
|
+
if (!!orgID === !!personID) {
|
|
83
|
+
blockers.push(this.blocker('PayerAmbiguous', orgID
|
|
84
|
+
? 'A payment names ONE payer. Both an organization and a person were given.'
|
|
85
|
+
: 'A payment names one payer. Neither an organization nor a person was given.', 'Set exactly one of BillToOrganizationID or BillToPersonID.'));
|
|
86
|
+
}
|
|
87
|
+
for (const [i, a] of allocations.entries()) {
|
|
88
|
+
try {
|
|
89
|
+
RequireUUID(a?.OrderHeaderID, `Allocations[${i}].OrderHeaderID`);
|
|
90
|
+
if (a?.OrderLineID)
|
|
91
|
+
RequireUUID(a.OrderLineID, `Allocations[${i}].OrderLineID`);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
blockers.push(this.blocker('BadOrderID', String(e.message)));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!(Number(a?.Amount ?? 0) > 0)) {
|
|
98
|
+
blockers.push(this.blocker('NonPositiveAllocation', `Allocation ${i + 1} is for ${a?.Amount ?? 0}. Every allocation must be a positive amount — ` +
|
|
99
|
+
`un-applying money is a different operation.`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// D68: the amount received must equal what was allocated. A mismatch means either cash
|
|
103
|
+
// recorded against nothing, or an order credited with money that never arrived. Refused
|
|
104
|
+
// rather than silently adjusted, because both directions are wrong in ways that reconcile.
|
|
105
|
+
const amount = money(Number(input?.Amount ?? 0));
|
|
106
|
+
const allocated = money(allocations.reduce((s, a) => s + Number(a?.Amount ?? 0), 0));
|
|
107
|
+
if (!(amount > 0)) {
|
|
108
|
+
blockers.push(this.blocker('NonPositiveAmount', `A payment must be for a positive amount, got ${amount}.`));
|
|
109
|
+
}
|
|
110
|
+
else if (amount !== allocated) {
|
|
111
|
+
blockers.push(this.blocker('AllocationMismatch', `The payment is for ${amount} but its allocations total ${allocated}, leaving ` +
|
|
112
|
+
`${money(amount - allocated)} unaccounted for. Every part of a payment must land on an order (D68).`, 'Adjust the allocations so they sum to the amount received.'));
|
|
113
|
+
}
|
|
114
|
+
if (blockers.length)
|
|
115
|
+
return this.refuse(blockers);
|
|
116
|
+
// ── 2. IDEMPOTENCY ──
|
|
117
|
+
// Checked BEFORE any write. A repeat call returns the ORIGINAL payment rather than taking
|
|
118
|
+
// money again or reporting a spurious failure.
|
|
119
|
+
//
|
|
120
|
+
// THIS LOOKUP IS AN OPTIMISATION, NOT THE GUARANTEE — and mutation testing proved it.
|
|
121
|
+
// Disabling this block alone leaves CP9 passing, because the insert then hits
|
|
122
|
+
// UX_PaymentHeader_IdempotencyKey and the duplicate-key handler below returns the original
|
|
123
|
+
// payment anyway. CP9 only fails when BOTH are disabled. The two are deliberately redundant:
|
|
124
|
+
// the INDEX is what makes a genuine race safe (two concurrent requests, neither having seen
|
|
125
|
+
// the other's row), while this lookup makes the common case — a user double-clicking a
|
|
126
|
+
// second later — cheap and legible rather than a caught exception.
|
|
127
|
+
const idempotencyKey = (input?.IdempotencyKey ?? '').trim() || null;
|
|
128
|
+
if (idempotencyKey && !input?.Preview) {
|
|
129
|
+
const existing = await rv.RunView({
|
|
130
|
+
EntityName: PAYMENT_HEADER_ENTITY,
|
|
131
|
+
ExtraFilter: `IdempotencyKey = '${idempotencyKey.replace(/'/g, "''")}'`,
|
|
132
|
+
ResultType: 'simple',
|
|
133
|
+
}, user);
|
|
134
|
+
const found = existing.Results?.[0];
|
|
135
|
+
if (found) {
|
|
136
|
+
const out = await this.project(found.ID, provider, user, rv);
|
|
137
|
+
return { ...out, WasRetry: true, IdempotencyKey: idempotencyKey };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── 3. RESOLVE THE TENDER ──
|
|
141
|
+
// By code, so the client does not have to resolve a lookup to take money. An unknown code is
|
|
142
|
+
// refused by NAME rather than falling back to a default: a payment silently recorded as the
|
|
143
|
+
// wrong kind is invisible until somebody reconciles.
|
|
144
|
+
//
|
|
145
|
+
// Read from the lookup cache rather than queried per capture: payment types are eleven rows
|
|
146
|
+
// of seeded metadata read on every payment, and `Code` is unique, so the `IsActive` filter
|
|
147
|
+
// that used to live in the SQL is the same test applied here.
|
|
148
|
+
const code = (input?.TenderCode ?? '').trim();
|
|
149
|
+
await LoadOrdersEngine(provider, user);
|
|
150
|
+
const cachedTender = OrdersEngine.Instance.PaymentTypeByCode(code);
|
|
151
|
+
const tenderRow = cachedTender?.IsActive ? cachedTender : undefined;
|
|
152
|
+
if (!tenderRow) {
|
|
153
|
+
return this.refuse([
|
|
154
|
+
this.blocker('UnknownTender', `There is no active payment type with code '${code}'.`, 'Payment types are seeded metadata — check the code, or add the type.'),
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
if (tenderRow.IsReversal) {
|
|
158
|
+
return this.refuse([
|
|
159
|
+
this.blocker('ReversalTender', `'${code}' is a REVERSAL payment type and cannot be used to take money. Use Orders.RefundPayment.`),
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
// ── 4. THE ORDERS MUST EXIST AND BELONG TO THE RECEIVING COMPANY ──
|
|
163
|
+
const orderIDs = [...new Set(allocations.map((a) => a.OrderHeaderID))];
|
|
164
|
+
const orders = await rv.RunView({ EntityName: ORDER_HEADER_ENTITY, ExtraFilter: `ID IN (${quote(orderIDs)})`, ResultType: 'simple' }, user);
|
|
165
|
+
const orderByID = new Map((orders.Results ?? []).map((o) => [key(o.ID), o]));
|
|
166
|
+
for (const id of orderIDs) {
|
|
167
|
+
const order = orderByID.get(key(id));
|
|
168
|
+
if (!order) {
|
|
169
|
+
blockers.push(this.blocker('OrderNotFound', `Order ${id} does not exist.`));
|
|
170
|
+
}
|
|
171
|
+
else if (key(order.CompanyID) !== key(receivingCompanyID)) {
|
|
172
|
+
// Cash collected by one company against another's order is the intercompany case,
|
|
173
|
+
// and it is handled by ALLOCATION, not by mis-stating who received the money.
|
|
174
|
+
blockers.push(this.blocker('OrderCompanyMismatch', `Order ${order.OrderNumber} belongs to a different company than the one receiving this payment.`, 'Capture against the company that owns the order, or allocate across companies from that side.'));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (blockers.length)
|
|
178
|
+
return this.refuse(blockers);
|
|
179
|
+
// ── 5. WRITE ──
|
|
180
|
+
// Preview runs the REAL capture and rolls back. Not a second model of the arithmetic: a
|
|
181
|
+
// preview that reimplements the calculation eventually disagrees with the capture.
|
|
182
|
+
const dbProvider = provider;
|
|
183
|
+
const preview = !!input?.Preview;
|
|
184
|
+
await dbProvider.BeginTransaction();
|
|
185
|
+
try {
|
|
186
|
+
const paymentID = await this.writePayment(input, { receivingCompanyID, paymentTypeID: tenderRow.ID, amount, idempotencyKey }, provider, user);
|
|
187
|
+
const out = await this.project(paymentID, provider, user, rv);
|
|
188
|
+
if (preview) {
|
|
189
|
+
await dbProvider.RollbackTransaction();
|
|
190
|
+
return { ...out, WasPreview: true, IdempotencyKey: idempotencyKey };
|
|
191
|
+
}
|
|
192
|
+
await dbProvider.CommitTransaction();
|
|
193
|
+
return { ...out, WasPreview: false, WasRetry: false, IdempotencyKey: idempotencyKey };
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
await dbProvider.RollbackTransaction();
|
|
197
|
+
const message = String(e?.message ?? e);
|
|
198
|
+
// A UNIQUE violation on the token means a concurrent request won the race — which is the
|
|
199
|
+
// index doing its job. Report it as a retry rather than a failure.
|
|
200
|
+
if (idempotencyKey && /UX_PaymentHeader_IdempotencyKey|duplicate key/i.test(message)) {
|
|
201
|
+
const again = await rv.RunView({
|
|
202
|
+
EntityName: PAYMENT_HEADER_ENTITY,
|
|
203
|
+
ExtraFilter: `IdempotencyKey = '${idempotencyKey.replace(/'/g, "''")}'`,
|
|
204
|
+
ResultType: 'simple',
|
|
205
|
+
}, user);
|
|
206
|
+
const found = again.Results?.[0];
|
|
207
|
+
if (found) {
|
|
208
|
+
const out = await this.project(found.ID, provider, user, rv);
|
|
209
|
+
return { ...out, WasRetry: true, IdempotencyKey: idempotencyKey };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return this.refuse([this.blocker('CaptureFailed', message)]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Header + detail + allocation lines, saved ONCE.
|
|
217
|
+
*
|
|
218
|
+
* The allocations go onto the transient `Lines` collection and are written inside the header's
|
|
219
|
+
* own transaction — the whole reason this operation exists. Status is set to Captured BEFORE the
|
|
220
|
+
* save, because `savePendingLines` books from that collection and a header saved Pending would
|
|
221
|
+
* persist its lines without booking anything.
|
|
222
|
+
*/
|
|
223
|
+
async writePayment(input, ctx, provider, user) {
|
|
224
|
+
// The SERVER subclass: `Lines` (set below) lives there, and the class factory returns it for
|
|
225
|
+
// this key regardless of what we ask for.
|
|
226
|
+
const header = await provider.GetEntityObject(PAYMENT_HEADER_ENTITY, user);
|
|
227
|
+
header.NewRecord();
|
|
228
|
+
// A payment number is a cash-receipt document number, minted gap-consciously from the same
|
|
229
|
+
// PaymentSequence the confirm path and the account-credit path use — one sequence, so the
|
|
230
|
+
// numbers a customer sees never collide or skip regardless of which door the payment came in.
|
|
231
|
+
header.PaymentNumber = await this.nextPaymentNumber(provider);
|
|
232
|
+
header.ReceivingCompanyID = ctx.receivingCompanyID;
|
|
233
|
+
header.PaymentTypeID = ctx.paymentTypeID;
|
|
234
|
+
header.Amount = ctx.amount;
|
|
235
|
+
header.PaymentDate = input?.PaymentDate ? new Date(input.PaymentDate) : new Date();
|
|
236
|
+
if (input?.BillToOrganizationID)
|
|
237
|
+
header.BillToOrganizationID = input.BillToOrganizationID;
|
|
238
|
+
if (input?.BillToPersonID)
|
|
239
|
+
header.BillToPersonID = input.BillToPersonID;
|
|
240
|
+
if (input?.Reference)
|
|
241
|
+
header.Description = input.Reference;
|
|
242
|
+
if (input?.Notes)
|
|
243
|
+
header.Notes = input.Notes;
|
|
244
|
+
if (ctx.idempotencyKey)
|
|
245
|
+
header.IdempotencyKey = ctx.idempotencyKey;
|
|
246
|
+
// The instrument, when the tender needs one. Its own row (D38/D39): a payment gets its OWN
|
|
247
|
+
// copy rather than pointing at a wallet entry that can later change.
|
|
248
|
+
if (input?.PaymentDetail) {
|
|
249
|
+
const detail = await provider.GetEntityObject(PAYMENT_DETAIL_ENTITY, user);
|
|
250
|
+
detail.NewRecord();
|
|
251
|
+
detail.CompanyID = ctx.receivingCompanyID;
|
|
252
|
+
detail.PaymentTypeID = ctx.paymentTypeID;
|
|
253
|
+
if (input.PaymentDetail.ReferenceNumber)
|
|
254
|
+
detail.ReferenceNumber = input.PaymentDetail.ReferenceNumber;
|
|
255
|
+
if (input.PaymentDetail.ProviderInstrumentRef) {
|
|
256
|
+
detail.ProviderInstrumentRef = input.PaymentDetail.ProviderInstrumentRef;
|
|
257
|
+
}
|
|
258
|
+
if (input.PaymentDetail.SourceCustomerPaymentMethodID) {
|
|
259
|
+
detail.SourceCustomerPaymentMethodID = input.PaymentDetail.SourceCustomerPaymentMethodID;
|
|
260
|
+
}
|
|
261
|
+
if (input.PaymentDetail.InstrumentDate)
|
|
262
|
+
detail.InstrumentDate = new Date(input.PaymentDetail.InstrumentDate);
|
|
263
|
+
if (!(await detail.Save())) {
|
|
264
|
+
throw new Error(`Could not record the payment instrument: ${detail.LatestResult?.CompleteMessage ?? 'no reason given'}`);
|
|
265
|
+
}
|
|
266
|
+
header.PaymentDetailID = detail.ID;
|
|
267
|
+
if (input.PaymentDetail.PaymentProviderID) {
|
|
268
|
+
header.PaymentProviderID = input.PaymentDetail.PaymentProviderID;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// THE LINK THAT MAKES A GATEWAY CAPTURE POSSIBLE. `settleWithProvider` reads the gateway's own
|
|
272
|
+
// intent string through this row; without it a provider-backed payment is refused with
|
|
273
|
+
// "there is nothing for the gateway to capture", which is precisely the state this whole path
|
|
274
|
+
// sat in before `Orders.OpenPaymentIntent` existed.
|
|
275
|
+
if (input?.PaymentIntentID) {
|
|
276
|
+
header.PaymentIntentID = input.PaymentIntentID;
|
|
277
|
+
}
|
|
278
|
+
const lines = [];
|
|
279
|
+
for (const a of input?.Allocations ?? []) {
|
|
280
|
+
const line = await provider.GetEntityObject(PAYMENT_LINE_ENTITY, user);
|
|
281
|
+
line.NewRecord();
|
|
282
|
+
line.OrderHeaderID = a.OrderHeaderID;
|
|
283
|
+
line.Amount = money(Number(a.Amount));
|
|
284
|
+
if (a.OrderLineID)
|
|
285
|
+
line.OrderLineID = a.OrderLineID;
|
|
286
|
+
line.AllocatedAt = new Date();
|
|
287
|
+
if (user?.ID)
|
|
288
|
+
line.AllocatedByUserID = user.ID;
|
|
289
|
+
lines.push(line);
|
|
290
|
+
}
|
|
291
|
+
// Attached, not assigned — the collection stamps the foreign key.
|
|
292
|
+
for (const line of lines)
|
|
293
|
+
header.Lines.Add(line);
|
|
294
|
+
// CAPTURED FOR EVERY RAIL THAT ANSWERS IMMEDIATELY. `savePendingLines` books each allocation
|
|
295
|
+
// from this collection, and a header saved Pending would persist the lines with nothing
|
|
296
|
+
// booked — a captured payment with no cash leg, which balances and is wrong.
|
|
297
|
+
//
|
|
298
|
+
// PENDING FOR A RAIL THAT DOES NOT (D77). A bank debit has moved no money when this runs: the
|
|
299
|
+
// bank answers days later. Writing `Captured` would send `settleWithProvider` to a driver whose
|
|
300
|
+
// Capture is a READ, which correctly refuses an intent that is still processing — so the whole
|
|
301
|
+
// capture would fail and there would be no way to record the debit at all. `Pending` records
|
|
302
|
+
// exactly what is true (submitted, waiting), the allocations persist unbooked, and the webhook
|
|
303
|
+
// promotes it when the bank confirms — at which point `bookPersistedLines` settles the cash
|
|
304
|
+
// leg. The debt is deliberate and is discharged in exactly one place.
|
|
305
|
+
const settlesLate = await this.settlesAsynchronously(header, provider, user);
|
|
306
|
+
header.Status = settlesLate ? 'Pending' : 'Captured';
|
|
307
|
+
if (!(await header.Save())) {
|
|
308
|
+
throw new Error(`Could not capture the payment: ${header.LatestResult?.CompleteMessage ?? 'no reason given'}`);
|
|
309
|
+
}
|
|
310
|
+
return header.ID;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Whether this payment's gateway settles on someone else's schedule.
|
|
314
|
+
*
|
|
315
|
+
* Asked of the DRIVER, not of configuration — see `BasePaymentProvider.SettlesAsynchronously` for
|
|
316
|
+
* why an operator must not be able to declare that ACH settles instantly.
|
|
317
|
+
*
|
|
318
|
+
* FALSE WHEN ANYTHING GOES WRONG, deliberately. A payment with no provider is a recorded one
|
|
319
|
+
* (cheque, cash) and captures immediately; a provider that cannot be resolved is a configuration
|
|
320
|
+
* fault that the save path is about to report far more clearly than a status guess here would.
|
|
321
|
+
* Defaulting to the existing behaviour keeps every rail that worked before working unchanged.
|
|
322
|
+
*/
|
|
323
|
+
async settlesAsynchronously(header, provider, user) {
|
|
324
|
+
const providerID = header.PaymentProviderID;
|
|
325
|
+
if (!providerID)
|
|
326
|
+
return false;
|
|
327
|
+
try {
|
|
328
|
+
const driver = await ResolvePaymentProvider(providerID, provider, user);
|
|
329
|
+
return driver.SettlesAsynchronously === true;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Read back what the engine computed.
|
|
337
|
+
*
|
|
338
|
+
* Every number here comes from the saved rows — the fee the driver decided, the rollups the
|
|
339
|
+
* triggers moved. Nothing is recalculated, because a second calculation is a second opinion, and
|
|
340
|
+
* the one that reaches the screen would not be the one in the ledger.
|
|
341
|
+
*/
|
|
342
|
+
async project(paymentID, provider, user, rv) {
|
|
343
|
+
const header = await rv.RunView({ EntityName: PAYMENT_HEADER_ENTITY, ExtraFilter: `ID = '${paymentID}'`, ResultType: 'simple' }, user);
|
|
344
|
+
const row = header.Results?.[0];
|
|
345
|
+
if (!row) {
|
|
346
|
+
return this.refuse([this.blocker('PaymentNotFound', `Payment ${paymentID} could not be read back.`)]);
|
|
347
|
+
}
|
|
348
|
+
const lines = await rv.RunView({ EntityName: PAYMENT_LINE_ENTITY, ExtraFilter: `PaymentHeaderID = '${paymentID}'`, ResultType: 'simple' }, user);
|
|
349
|
+
const orderIDs = [...new Set((lines.Results ?? []).map((l) => l.OrderHeaderID))];
|
|
350
|
+
const effects = [];
|
|
351
|
+
if (orderIDs.length) {
|
|
352
|
+
const orders = await rv.RunView({ EntityName: ORDER_HEADER_ENTITY, ExtraFilter: `ID IN (${quote(orderIDs)})`, ResultType: 'simple' }, user);
|
|
353
|
+
for (const o of orders.Results ?? []) {
|
|
354
|
+
effects.push({
|
|
355
|
+
OrderHeaderID: o.ID,
|
|
356
|
+
OrderNumber: o.OrderNumber,
|
|
357
|
+
AmountPaid: money(Number(o.AmountPaid ?? 0)),
|
|
358
|
+
Balance: money(Number(o.Balance ?? 0)),
|
|
359
|
+
PaymentStatus: o.PaymentStatus,
|
|
360
|
+
// Over-payment is ACCEPTED (D68). The surplus is a negative balance and becomes
|
|
361
|
+
// spendable credit — the account-credit screen depends on these existing.
|
|
362
|
+
HasCredit: Number(o.Balance ?? 0) < 0,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
const entries = await this.readEntries(paymentID, provider, user, rv);
|
|
367
|
+
return {
|
|
368
|
+
Success: true,
|
|
369
|
+
PaymentHeaderID: row.ID,
|
|
370
|
+
PaymentNumber: row.PaymentNumber,
|
|
371
|
+
Status: row.Status,
|
|
372
|
+
Amount: money(Number(row.Amount ?? 0)),
|
|
373
|
+
ProcessingFeeAmount: money(Number(row.ProcessingFeeAmount ?? 0)),
|
|
374
|
+
NetAmount: money(Number(row.NetAmount ?? row.Amount ?? 0)),
|
|
375
|
+
OrderEffects: effects,
|
|
376
|
+
JournalEntries: entries,
|
|
377
|
+
EntryCount: entries.length,
|
|
378
|
+
AllBalanced: entries.every((e) => e.Balanced),
|
|
379
|
+
Blockers: [],
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
/** The entries this payment's allocations produced, found through accounting's D25 provenance pair. */
|
|
383
|
+
async readEntries(paymentID, provider, user, rv) {
|
|
384
|
+
const rows = await rv.RunView({
|
|
385
|
+
EntityName: 'MJ_BizApps_Accounting: Journal Entry Lines',
|
|
386
|
+
ExtraFilter: `JournalEntryID IN (SELECT je.ID FROM __mj_BizAppsAccounting.JournalEntry je ` +
|
|
387
|
+
`WHERE LOWER(je.LinkedRecordID) IN (SELECT LOWER(CAST(pl.ID AS NVARCHAR(400))) ` +
|
|
388
|
+
`FROM __mj_BizAppsOrders.PaymentLine pl WHERE pl.PaymentHeaderID = '${paymentID}') ` +
|
|
389
|
+
`OR LOWER(je.LinkedRecordID) = LOWER('${paymentID}'))`,
|
|
390
|
+
ResultType: 'simple',
|
|
391
|
+
}, user).catch(() => ({ Results: [] }));
|
|
392
|
+
const byEntry = new Map();
|
|
393
|
+
for (const r of (rows.Results ?? [])) {
|
|
394
|
+
const id = String(r.JournalEntryID ?? r.EntryID ?? '');
|
|
395
|
+
if (!id)
|
|
396
|
+
continue;
|
|
397
|
+
let entry = byEntry.get(key(id));
|
|
398
|
+
if (!entry) {
|
|
399
|
+
entry = {
|
|
400
|
+
CompanyID: String(r.CompanyID ?? ''),
|
|
401
|
+
CompanyName: String(r.Company ?? ''),
|
|
402
|
+
JournalEntryID: id,
|
|
403
|
+
EntryType: String(r.EntryType ?? 'PaymentCapture'),
|
|
404
|
+
Balanced: true,
|
|
405
|
+
Lines: [],
|
|
406
|
+
};
|
|
407
|
+
byEntry.set(key(id), entry);
|
|
408
|
+
}
|
|
409
|
+
const debit = Number(r.DebitAmount ?? 0);
|
|
410
|
+
const credit = Number(r.CreditAmount ?? 0);
|
|
411
|
+
entry.Lines.push({
|
|
412
|
+
Side: debit > 0 ? 'Dr' : 'Cr',
|
|
413
|
+
AccountRole: String(r.Code ?? ''),
|
|
414
|
+
AccountName: String(r.GLAccount ?? r.AccountName ?? ''),
|
|
415
|
+
Amount: money(debit > 0 ? debit : credit),
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
for (const entry of byEntry.values()) {
|
|
419
|
+
const dr = entry.Lines.filter((l) => l.Side === 'Dr').reduce((s, l) => s + l.Amount, 0);
|
|
420
|
+
const cr = entry.Lines.filter((l) => l.Side === 'Cr').reduce((s, l) => s + l.Amount, 0);
|
|
421
|
+
entry.Balanced = Math.abs(money(dr - cr)) < 0.005;
|
|
422
|
+
}
|
|
423
|
+
return [...byEntry.values()];
|
|
424
|
+
}
|
|
425
|
+
/** Gap-conscious payment numbering — the same sequence every other capture path uses. */
|
|
426
|
+
async nextPaymentNumber(db) {
|
|
427
|
+
const rows = (await db.ExecuteSQL(`
|
|
428
|
+
DECLARE @seq TABLE (Seq INT);
|
|
429
|
+
UPDATE __mj_BizAppsOrders.PaymentSequence WITH (UPDLOCK, HOLDLOCK)
|
|
430
|
+
SET NextSequenceNumber = NextSequenceNumber + 1
|
|
431
|
+
OUTPUT deleted.NextSequenceNumber INTO @seq(Seq)
|
|
432
|
+
WHERE ID = 1;
|
|
433
|
+
SELECT Seq FROM @seq;`));
|
|
434
|
+
const seq = rows?.[0]?.Seq;
|
|
435
|
+
if (!seq) {
|
|
436
|
+
throw new Error('Could not obtain the next payment number — PaymentSequence (ID=1) is missing.');
|
|
437
|
+
}
|
|
438
|
+
return `PAY-${String(seq).padStart(6, '0')}`;
|
|
439
|
+
}
|
|
440
|
+
blocker(code, message, hint) {
|
|
441
|
+
return { Code: code, Message: message, ResolutionHint: hint ?? null, LineNumber: null };
|
|
442
|
+
}
|
|
443
|
+
refuse(blockers) {
|
|
444
|
+
return {
|
|
445
|
+
Success: false,
|
|
446
|
+
Message: blockers.map((b) => b.Message).join(' '),
|
|
447
|
+
Blockers: blockers,
|
|
448
|
+
OrderEffects: [],
|
|
449
|
+
JournalEntries: [],
|
|
450
|
+
EntryCount: 0,
|
|
451
|
+
AllBalanced: true,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
CapturePaymentOperation = __decorate([
|
|
456
|
+
RegisterClass(BaseRemotableOperation, 'Orders.CapturePayment')
|
|
457
|
+
], CapturePaymentOperation);
|
|
458
|
+
export { CapturePaymentOperation };
|
|
459
|
+
/** Tree-shaking anchor — call from the server bootstrap so @RegisterClass is retained. */
|
|
460
|
+
export function LoadCapturePaymentOperation() {
|
|
461
|
+
// intentionally empty
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=CapturePaymentOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapturePaymentOperation.js","sourceRoot":"","sources":["../src/CapturePaymentOperation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orders.CheckEntitlement — does this person currently have this capability?
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS IS AN OPERATION AND NOT A VIEW. Access is computed: Status is not trustworthy
|
|
5
|
+
* (cancel does not touch grants; elapsed ValidTo is never swept). A view of the flag would
|
|
6
|
+
* re-teach every consumer the evaluator, and the two would drift. The LXP asks; this answers.
|
|
7
|
+
*
|
|
8
|
+
* Asked by `ProductEntitlement.Code`, not SKU — a bundle, an upgrade and a grandfathered
|
|
9
|
+
* tier can all confer the same capability. PersonID is authoritative; email is convenience
|
|
10
|
+
* and is refused when it matches more than one person. v1 evaluates person grants only.
|
|
11
|
+
*
|
|
12
|
+
* Fail closed. Unknown person and known-person-without-access share one response shape.
|
|
13
|
+
*
|
|
14
|
+
* CONNECTS TO:
|
|
15
|
+
* PURE: ./EntitlementBehavior.ts (EvaluateGrantAccess)
|
|
16
|
+
* LOAD: ./EntitlementRead.ts
|
|
17
|
+
* DOC: plans/entitlement-read-contract.md
|
|
18
|
+
*/
|
|
19
|
+
import { BaseRemotableOperation, type IMetadataProvider, type UserInfo } from '@memberjunction/core';
|
|
20
|
+
import { type CheckEntitlementInput, type CheckEntitlementOutput } from './EntitlementRead.js';
|
|
21
|
+
export declare class CheckEntitlementOperation extends BaseRemotableOperation<CheckEntitlementInput, CheckEntitlementOutput> {
|
|
22
|
+
OperationKey: string;
|
|
23
|
+
protected InternalExecute(input: CheckEntitlementInput, provider: IMetadataProvider, user: UserInfo): Promise<CheckEntitlementOutput>;
|
|
24
|
+
}
|
|
25
|
+
/** Tree-shaking anchor — called from the server bootstrap so the registration is retained. */
|
|
26
|
+
export declare function LoadCheckEntitlementOperation(): void;
|
|
27
|
+
//# sourceMappingURL=CheckEntitlementOperation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckEntitlementOperation.d.ts","sourceRoot":"","sources":["../src/CheckEntitlementOperation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErG,OAAO,EAEH,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC9B,MAAM,sBAAsB,CAAC;AAE9B,qBACa,yBAA0B,SAAQ,sBAAsB,CACjE,qBAAqB,EACrB,sBAAsB,CACzB;IACU,YAAY,SAA6B;cAEhC,eAAe,CAC3B,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,sBAAsB,CAAC;CAGrC;AAED,8FAA8F;AAC9F,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
* Orders.CheckEntitlement — does this person currently have this capability?
|
|
9
|
+
*
|
|
10
|
+
* WHY THIS IS AN OPERATION AND NOT A VIEW. Access is computed: Status is not trustworthy
|
|
11
|
+
* (cancel does not touch grants; elapsed ValidTo is never swept). A view of the flag would
|
|
12
|
+
* re-teach every consumer the evaluator, and the two would drift. The LXP asks; this answers.
|
|
13
|
+
*
|
|
14
|
+
* Asked by `ProductEntitlement.Code`, not SKU — a bundle, an upgrade and a grandfathered
|
|
15
|
+
* tier can all confer the same capability. PersonID is authoritative; email is convenience
|
|
16
|
+
* and is refused when it matches more than one person. v1 evaluates person grants only.
|
|
17
|
+
*
|
|
18
|
+
* Fail closed. Unknown person and known-person-without-access share one response shape.
|
|
19
|
+
*
|
|
20
|
+
* CONNECTS TO:
|
|
21
|
+
* PURE: ./EntitlementBehavior.ts (EvaluateGrantAccess)
|
|
22
|
+
* LOAD: ./EntitlementRead.ts
|
|
23
|
+
* DOC: plans/entitlement-read-contract.md
|
|
24
|
+
*/
|
|
25
|
+
import { BaseRemotableOperation } from '@memberjunction/core';
|
|
26
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
27
|
+
import { CheckPersonEntitlement, } from './EntitlementRead.js';
|
|
28
|
+
let CheckEntitlementOperation = class CheckEntitlementOperation extends BaseRemotableOperation {
|
|
29
|
+
constructor() {
|
|
30
|
+
super(...arguments);
|
|
31
|
+
this.OperationKey = 'Orders.CheckEntitlement';
|
|
32
|
+
}
|
|
33
|
+
async InternalExecute(input, provider, user) {
|
|
34
|
+
return CheckPersonEntitlement(input, provider, user);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
CheckEntitlementOperation = __decorate([
|
|
38
|
+
RegisterClass(BaseRemotableOperation, 'Orders.CheckEntitlement')
|
|
39
|
+
], CheckEntitlementOperation);
|
|
40
|
+
export { CheckEntitlementOperation };
|
|
41
|
+
/** Tree-shaking anchor — called from the server bootstrap so the registration is retained. */
|
|
42
|
+
export function LoadCheckEntitlementOperation() {
|
|
43
|
+
void CheckEntitlementOperation;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=CheckEntitlementOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckEntitlementOperation.js","sourceRoot":"","sources":["../src/CheckEntitlementOperation.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,sBAAsB,EAAyC,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACH,sBAAsB,GAGzB,MAAM,sBAAsB,CAAC;AAGvB,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,sBAG9C;IAHM;;QAII,iBAAY,GAAG,yBAAyB,CAAC;IASpD,CAAC;IAPa,KAAK,CAAC,eAAe,CAC3B,KAA4B,EAC5B,QAA2B,EAC3B,IAAc;QAEd,OAAO,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;CACJ,CAAA;AAbY,yBAAyB;IADrC,aAAa,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;GACpD,yBAAyB,CAarC;;AAED,8FAA8F;AAC9F,MAAM,UAAU,6BAA6B;IACzC,KAAK,yBAAyB,CAAC;AACnC,CAAC"}
|