@mj-biz-apps/orders-core-entities-server 5.20.0 → 5.21.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/dist/AccessOverride.d.ts +90 -0
- package/dist/AccessOverride.d.ts.map +1 -0
- package/dist/AccessOverride.js +331 -0
- package/dist/AccessOverride.js.map +1 -0
- package/dist/AccessOverrideOperations.d.ts +19 -0
- package/dist/AccessOverrideOperations.d.ts.map +1 -0
- package/dist/AccessOverrideOperations.js +46 -0
- package/dist/AccessOverrideOperations.js.map +1 -0
- package/dist/CheckoutAccountStep.d.ts +147 -0
- package/dist/CheckoutAccountStep.d.ts.map +1 -0
- package/dist/CheckoutAccountStep.js +368 -0
- package/dist/CheckoutAccountStep.js.map +1 -0
- package/dist/CheckoutSessionService.d.ts +12 -2
- package/dist/CheckoutSessionService.d.ts.map +1 -1
- package/dist/CheckoutSessionService.js +89 -2
- package/dist/CheckoutSessionService.js.map +1 -1
- package/dist/EntitlementAccessOverrideEntityServer.d.ts +33 -0
- package/dist/EntitlementAccessOverrideEntityServer.d.ts.map +1 -0
- package/dist/EntitlementAccessOverrideEntityServer.js +118 -0
- package/dist/EntitlementAccessOverrideEntityServer.js.map +1 -0
- package/dist/EntitlementBehavior.d.ts +71 -0
- package/dist/EntitlementBehavior.d.ts.map +1 -1
- package/dist/EntitlementBehavior.js +73 -0
- package/dist/EntitlementBehavior.js.map +1 -1
- package/dist/EntitlementRead.d.ts +1 -0
- package/dist/EntitlementRead.d.ts.map +1 -1
- package/dist/EntitlementRead.js +36 -23
- package/dist/EntitlementRead.js.map +1 -1
- package/dist/OrderEntityServer.js +2 -2
- package/dist/OrderEntityServer.js.map +1 -1
- package/dist/PaymentGatedAccess.d.ts +44 -6
- package/dist/PaymentGatedAccess.d.ts.map +1 -1
- package/dist/PaymentGatedAccess.js +142 -10
- package/dist/PaymentGatedAccess.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approved exceptions to payment-gated access (bizapps-orders#268).
|
|
3
|
+
*
|
|
4
|
+
* An `EntitlementAccessOverride` lets one order's grants stand Active past the rule that would
|
|
5
|
+
* suspend them: `WaivePaymentHold` past the hold on a new purchase awaiting its first payment,
|
|
6
|
+
* `DeferCutoff` past the renewal cutoff. It is a row, with a reason, a last day and a Tasks approval,
|
|
7
|
+
* so an exception is on the record and the payment re-decision honours it instead of reversing it.
|
|
8
|
+
*
|
|
9
|
+
* THREE ENTRY POINTS:
|
|
10
|
+
* · {@link RequestAccessOverride} — checks the requester's authorization for that override type,
|
|
11
|
+
* writes the Requested row, and raises its approval task.
|
|
12
|
+
* · {@link RecordAccessOverrideDecision} — the in-app decision. Records the Tasks decision, then
|
|
13
|
+
* applies it.
|
|
14
|
+
* · {@link ApplyAccessOverrideDecision} — reads the task's outcome and moves the override to
|
|
15
|
+
* Approved, Rejected or Withdrawn. Idempotent: an override that is no longer Requested is left
|
|
16
|
+
* alone. The in-app decision and the task type's hook Action (a decision made in the Tasks inbox)
|
|
17
|
+
* both call it, so either path lands the same result, once.
|
|
18
|
+
*
|
|
19
|
+
* WHO MAY APPROVE is not settled (bizapps-orders#360). The approval task is raised unassigned, and a
|
|
20
|
+
* decision takes effect only through that task; who may record one is left to #360.
|
|
21
|
+
*
|
|
22
|
+
* FAILS CLOSED. Without the authorization rows in metadata nobody may request — an exception to a
|
|
23
|
+
* payment rule is not something to hand out because a sync has not run.
|
|
24
|
+
*
|
|
25
|
+
* CONNECTS TO:
|
|
26
|
+
* RULE: ./EntitlementBehavior.ts (ApplyAccessOverrides, AccessOverrideCanApply)
|
|
27
|
+
* ENFORCE: ./PaymentGatedAccess.ts (ReconcilePaymentGatedGrants, the nightly expiry)
|
|
28
|
+
* TASKS: @mj-biz-apps/tasks-core TaskOrchestrationService (CreateApprovalRequest, RecordDecision)
|
|
29
|
+
* CALLERS: RequestAccessOverrideOperation, RecordAccessOverrideDecisionOperation,
|
|
30
|
+
* packages/Server/src/custom/apply-access-override-decision.action.ts
|
|
31
|
+
*/
|
|
32
|
+
import { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
33
|
+
import { ACCESS_OVERRIDE_AUTH } from '@mj-biz-apps/orders-entities';
|
|
34
|
+
import { type AccessOverrideType } from './EntitlementBehavior.js';
|
|
35
|
+
export { ACCESS_OVERRIDE_AUTH };
|
|
36
|
+
/** The TaskType the approval is raised under. Its hook Actions apply a decision made in the Tasks inbox. */
|
|
37
|
+
export declare const ACCESS_OVERRIDE_TASK_TYPE_CODE = "ORDERS_ACCESS_OVERRIDE";
|
|
38
|
+
/**
|
|
39
|
+
* Whether `user` may request an override of this type, through its own authorization or the parent.
|
|
40
|
+
* Throws when the authorization rows are not in metadata: see FAILS CLOSED above.
|
|
41
|
+
*/
|
|
42
|
+
export declare function UserMayRequestAccessOverride(type: AccessOverrideType, user: UserInfo, provider: IMetadataProvider): boolean;
|
|
43
|
+
export interface RequestAccessOverrideInput {
|
|
44
|
+
OrderHeaderID: string;
|
|
45
|
+
OverrideType: AccessOverrideType;
|
|
46
|
+
Reason: string;
|
|
47
|
+
/** Last day the override holds, `YYYY-MM-DD`, inclusive. Required; not before today. */
|
|
48
|
+
EffectiveThrough: string;
|
|
49
|
+
}
|
|
50
|
+
export interface RequestAccessOverrideOutput {
|
|
51
|
+
Success: boolean;
|
|
52
|
+
Message?: string;
|
|
53
|
+
AccessOverrideID?: string;
|
|
54
|
+
ApprovalTaskID?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Record a request for an access override and raise its approval task. Nothing about access changes
|
|
58
|
+
* until the request is approved.
|
|
59
|
+
*
|
|
60
|
+
* Logical refusals come back as `Success: false` with the reason; only faults throw.
|
|
61
|
+
*/
|
|
62
|
+
export declare function RequestAccessOverride(input: RequestAccessOverrideInput, provider: IMetadataProvider, user: UserInfo): Promise<RequestAccessOverrideOutput>;
|
|
63
|
+
export interface RecordAccessOverrideDecisionInput {
|
|
64
|
+
AccessOverrideID: string;
|
|
65
|
+
/** A Tasks decision outcome code: `Approved`, `ApprovedWithConditions` or `Rejected`. */
|
|
66
|
+
Outcome: string;
|
|
67
|
+
Notes?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface AccessOverrideDecisionOutput {
|
|
70
|
+
Success: boolean;
|
|
71
|
+
Message?: string;
|
|
72
|
+
/** The override's status after the call. */
|
|
73
|
+
Status?: string;
|
|
74
|
+
/** Grants whose status changed because the override was approved. */
|
|
75
|
+
GrantsChanged?: number;
|
|
76
|
+
}
|
|
77
|
+
/** Approve or reject an access override from the app: record the Tasks decision, then apply it. */
|
|
78
|
+
export declare function RecordAccessOverrideDecision(input: RecordAccessOverrideDecisionInput, provider: IMetadataProvider, user: UserInfo): Promise<AccessOverrideDecisionOutput>;
|
|
79
|
+
/**
|
|
80
|
+
* Bring an override in line with its approval task's outcome. `user` is whoever decided the task.
|
|
81
|
+
*
|
|
82
|
+
* Completed with an approving decision → Approved, and the order's grants re-decided at once
|
|
83
|
+
* Cancelled with a Rejected decision → Rejected
|
|
84
|
+
* closed any other way → Withdrawn
|
|
85
|
+
* still open, or blocked → unchanged
|
|
86
|
+
*
|
|
87
|
+
* A second call after the first has applied it changes nothing.
|
|
88
|
+
*/
|
|
89
|
+
export declare function ApplyAccessOverrideDecision(taskID: string, provider: IMetadataProvider, user: UserInfo): Promise<AccessOverrideDecisionOutput>;
|
|
90
|
+
//# sourceMappingURL=AccessOverride.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessOverride.d.ts","sourceRoot":"","sources":["../src/AccessOverride.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAGH,iBAAiB,EAIjB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAe9B,OAAO,EACH,oBAAoB,EAGvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAKH,KAAK,kBAAkB,EAE1B,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAQhC,4GAA4G;AAC5G,eAAO,MAAM,8BAA8B,2BAA2B,CAAC;AAevE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAW3H;AAID,MAAM,WAAW,0BAA0B;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,kBAAkB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACvC,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,2BAA2B,CAAC,CAuFtC;AAID,MAAM,WAAW,iCAAiC;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,mGAAmG;AACnG,wBAAsB,4BAA4B,CAC9C,KAAK,EAAE,iCAAiC,EACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,4BAA4B,CAAC,CAsBvC;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,4BAA4B,CAAC,CA2CvC"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approved exceptions to payment-gated access (bizapps-orders#268).
|
|
3
|
+
*
|
|
4
|
+
* An `EntitlementAccessOverride` lets one order's grants stand Active past the rule that would
|
|
5
|
+
* suspend them: `WaivePaymentHold` past the hold on a new purchase awaiting its first payment,
|
|
6
|
+
* `DeferCutoff` past the renewal cutoff. It is a row, with a reason, a last day and a Tasks approval,
|
|
7
|
+
* so an exception is on the record and the payment re-decision honours it instead of reversing it.
|
|
8
|
+
*
|
|
9
|
+
* THREE ENTRY POINTS:
|
|
10
|
+
* · {@link RequestAccessOverride} — checks the requester's authorization for that override type,
|
|
11
|
+
* writes the Requested row, and raises its approval task.
|
|
12
|
+
* · {@link RecordAccessOverrideDecision} — the in-app decision. Records the Tasks decision, then
|
|
13
|
+
* applies it.
|
|
14
|
+
* · {@link ApplyAccessOverrideDecision} — reads the task's outcome and moves the override to
|
|
15
|
+
* Approved, Rejected or Withdrawn. Idempotent: an override that is no longer Requested is left
|
|
16
|
+
* alone. The in-app decision and the task type's hook Action (a decision made in the Tasks inbox)
|
|
17
|
+
* both call it, so either path lands the same result, once.
|
|
18
|
+
*
|
|
19
|
+
* WHO MAY APPROVE is not settled (bizapps-orders#360). The approval task is raised unassigned, and a
|
|
20
|
+
* decision takes effect only through that task; who may record one is left to #360.
|
|
21
|
+
*
|
|
22
|
+
* FAILS CLOSED. Without the authorization rows in metadata nobody may request — an exception to a
|
|
23
|
+
* payment rule is not something to hand out because a sync has not run.
|
|
24
|
+
*
|
|
25
|
+
* CONNECTS TO:
|
|
26
|
+
* RULE: ./EntitlementBehavior.ts (ApplyAccessOverrides, AccessOverrideCanApply)
|
|
27
|
+
* ENFORCE: ./PaymentGatedAccess.ts (ReconcilePaymentGatedGrants, the nightly expiry)
|
|
28
|
+
* TASKS: @mj-biz-apps/tasks-core TaskOrchestrationService (CreateApprovalRequest, RecordDecision)
|
|
29
|
+
* CALLERS: RequestAccessOverrideOperation, RecordAccessOverrideDecisionOperation,
|
|
30
|
+
* packages/Server/src/custom/apply-access-override-decision.action.ts
|
|
31
|
+
*/
|
|
32
|
+
import { AuthorizationEvaluator, LogError, RunView, } from '@memberjunction/core';
|
|
33
|
+
import { IsApprovalOutcome, IsTaskDecisionOutcomeCode, TaskOrchestrationService, } from '@mj-biz-apps/tasks-core';
|
|
34
|
+
import { LoadGeneratedEntities as LoadTasksEntities, } from '@mj-biz-apps/tasks-entities';
|
|
35
|
+
import { ACCESS_OVERRIDE_AUTH, } from '@mj-biz-apps/orders-entities';
|
|
36
|
+
import { ACCESS_OVERRIDE_LIFTS, AccessOverrideCanApply, PAYMENT_GATED_TIMINGS, ResolveAccessOverrideOutcome, } from './EntitlementBehavior.js';
|
|
37
|
+
import { ORDER_HEADER_ENTITY, ORDER_LINE_ENTITY } from './entity-names.js';
|
|
38
|
+
import { ACCESS_OVERRIDE_ENTITY, BusinessDay, ReconcilePaymentGatedGrants } from './PaymentGatedAccess.js';
|
|
39
|
+
import { RequireDate, RequireUUID } from './sql-guards.js';
|
|
40
|
+
export { ACCESS_OVERRIDE_AUTH };
|
|
41
|
+
// The Tasks entity subclasses must be registered before a task is created: without them the
|
|
42
|
+
// ClassFactory hands back a plain BaseEntity, the field setters do nothing, and the save fails on
|
|
43
|
+
// "Name cannot be null". A host running the Tasks app registers them itself; a process that only
|
|
44
|
+
// loads Orders (an integration run, a job) would not.
|
|
45
|
+
LoadTasksEntities();
|
|
46
|
+
/** The TaskType the approval is raised under. Its hook Actions apply a decision made in the Tasks inbox. */
|
|
47
|
+
export const ACCESS_OVERRIDE_TASK_TYPE_CODE = 'ORDERS_ACCESS_OVERRIDE';
|
|
48
|
+
const ENTITLEMENT_GRANT_ENTITY = 'MJ_BizApps_Orders: Entitlement Grants';
|
|
49
|
+
const TASKS_ENTITY = 'MJ_BizApps_Tasks: Tasks';
|
|
50
|
+
const TASK_TYPES_ENTITY = 'MJ_BizApps_Tasks: Task Types';
|
|
51
|
+
const TASK_LINKS_ENTITY = 'MJ_BizApps_Tasks: Task Links';
|
|
52
|
+
const TASK_DECISIONS_ENTITY = 'MJ_BizApps_Tasks: Task Decisions';
|
|
53
|
+
const TASK_DECISION_OUTCOMES_ENTITY = 'MJ_BizApps_Tasks: Task Decision Outcomes';
|
|
54
|
+
const REASON_MAX = 1000;
|
|
55
|
+
const OVERRIDE_TYPES = Object.keys(ACCESS_OVERRIDE_LIFTS);
|
|
56
|
+
const gatedTimings = PAYMENT_GATED_TIMINGS.map((t) => `'${t}'`).join(',');
|
|
57
|
+
// ─── authorization ─────────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Whether `user` may request an override of this type, through its own authorization or the parent.
|
|
60
|
+
* Throws when the authorization rows are not in metadata: see FAILS CLOSED above.
|
|
61
|
+
*/
|
|
62
|
+
export function UserMayRequestAccessOverride(type, user, provider) {
|
|
63
|
+
const name = ACCESS_OVERRIDE_AUTH[type];
|
|
64
|
+
const auths = provider.Authorizations ?? [];
|
|
65
|
+
const auth = auths.find((a) => a.Name === name);
|
|
66
|
+
if (!auth) {
|
|
67
|
+
throw new Error(`Authorization '${name}' is not in metadata. Access overrides are refused until the ` +
|
|
68
|
+
`${ACCESS_OVERRIDE_AUTH.Parent} authorizations are installed and granted to roles.`);
|
|
69
|
+
}
|
|
70
|
+
return new AuthorizationEvaluator().UserCanExecuteWithAncestors(auth, user, auths);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Record a request for an access override and raise its approval task. Nothing about access changes
|
|
74
|
+
* until the request is approved.
|
|
75
|
+
*
|
|
76
|
+
* Logical refusals come back as `Success: false` with the reason; only faults throw.
|
|
77
|
+
*/
|
|
78
|
+
export async function RequestAccessOverride(input, provider, user) {
|
|
79
|
+
RequireUUID(input.OrderHeaderID, 'OrderHeaderID');
|
|
80
|
+
if (!OVERRIDE_TYPES.includes(input.OverrideType)) {
|
|
81
|
+
return { Success: false, Message: `OverrideType must be one of ${OVERRIDE_TYPES.join(', ')}; got '${input.OverrideType}'.` };
|
|
82
|
+
}
|
|
83
|
+
if (!UserMayRequestAccessOverride(input.OverrideType, user, provider)) {
|
|
84
|
+
return { Success: false, Message: `Requesting a ${input.OverrideType} override requires the ${ACCESS_OVERRIDE_AUTH[input.OverrideType]} authorization.` };
|
|
85
|
+
}
|
|
86
|
+
const reason = (input.Reason ?? '').trim();
|
|
87
|
+
if (!reason)
|
|
88
|
+
return { Success: false, Message: 'An access override must state a reason.' };
|
|
89
|
+
if (reason.length > REASON_MAX)
|
|
90
|
+
return { Success: false, Message: `Reason is limited to ${REASON_MAX} characters.` };
|
|
91
|
+
if (!input.EffectiveThrough)
|
|
92
|
+
return { Success: false, Message: 'An access override must state the last day it holds (EffectiveThrough).' };
|
|
93
|
+
const through = RequireDate(input.EffectiveThrough, 'EffectiveThrough');
|
|
94
|
+
const order = await provider.GetEntityObject(ORDER_HEADER_ENTITY, user);
|
|
95
|
+
if (!(await order.Load(input.OrderHeaderID))) {
|
|
96
|
+
return { Success: false, Message: `No order found with ID '${input.OrderHeaderID}'.` };
|
|
97
|
+
}
|
|
98
|
+
const today = await BusinessDay(provider, user);
|
|
99
|
+
if (through < today)
|
|
100
|
+
return { Success: false, Message: `EffectiveThrough ${through} is before today (${today}).` };
|
|
101
|
+
if (!AccessOverrideCanApply(input.OverrideType, await gatedGrantsOnOrder(input.OrderHeaderID, provider, user))) {
|
|
102
|
+
const what = input.OverrideType === 'DeferCutoff' ? 'an OnFirstPayment renewal' : 'a grant held for payment';
|
|
103
|
+
return { Success: false, Message: `Order ${order.OrderNumber} has no ${what}, so a ${input.OverrideType} override would change nothing.` };
|
|
104
|
+
}
|
|
105
|
+
const open = await findOpenOverride(input.OrderHeaderID, input.OverrideType, provider, user);
|
|
106
|
+
if (open) {
|
|
107
|
+
return {
|
|
108
|
+
Success: false,
|
|
109
|
+
AccessOverrideID: open.ID,
|
|
110
|
+
Message: `This order already has a ${open.Status} ${input.OverrideType} override; it must close before another is requested.`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const taskTypeID = await resolveTaskTypeID(provider, user);
|
|
114
|
+
const db = provider;
|
|
115
|
+
await db.BeginTransaction();
|
|
116
|
+
try {
|
|
117
|
+
const override = await provider.GetEntityObject(ACCESS_OVERRIDE_ENTITY, user);
|
|
118
|
+
override.NewRecord();
|
|
119
|
+
override.OrderHeaderID = input.OrderHeaderID;
|
|
120
|
+
override.OverrideType = input.OverrideType;
|
|
121
|
+
override.Reason = reason;
|
|
122
|
+
override.EffectiveThrough = new Date(`${through}T00:00:00Z`);
|
|
123
|
+
override.Status = 'Requested';
|
|
124
|
+
override.RequestedByUserID = user.ID;
|
|
125
|
+
if (!(await override.Save())) {
|
|
126
|
+
throw new Error(`Failed to save the access override: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
127
|
+
}
|
|
128
|
+
const overrideEntity = provider.EntityByName(ACCESS_OVERRIDE_ENTITY);
|
|
129
|
+
if (!overrideEntity)
|
|
130
|
+
throw new Error(`Entity metadata for '${ACCESS_OVERRIDE_ENTITY}' is missing.`);
|
|
131
|
+
const label = input.OverrideType === 'WaivePaymentHold' ? 'waive the payment hold' : 'defer the renewal cutoff';
|
|
132
|
+
// Unassigned: who approves is bizapps-orders#360.
|
|
133
|
+
await new TaskOrchestrationService().CreateApprovalRequest({
|
|
134
|
+
Name: `Approve access override on order ${order.OrderNumber}: ${label} through ${through}`,
|
|
135
|
+
TypeID: taskTypeID,
|
|
136
|
+
Description: `Requested by ${user.Name ?? user.Email}. Reason: ${reason}`,
|
|
137
|
+
Priority: 'High',
|
|
138
|
+
LinkEntityID: overrideEntity.ID,
|
|
139
|
+
LinkRecordID: override.ID,
|
|
140
|
+
}, user);
|
|
141
|
+
// CreateApprovalRequest logs rather than throws on a failed link; without the link the
|
|
142
|
+
// decision could never be traced back here, so its absence is a fault.
|
|
143
|
+
const taskID = await findLinkedTaskID(overrideEntity.ID, override.ID, provider, user);
|
|
144
|
+
if (!taskID)
|
|
145
|
+
throw new Error('The approval task was created but its link to the access override did not persist.');
|
|
146
|
+
override.ApprovalTaskID = taskID;
|
|
147
|
+
override.ApprovalTaskRaisedAt = new Date();
|
|
148
|
+
if (!(await override.Save())) {
|
|
149
|
+
throw new Error(`Failed to stamp the approval task on the access override: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
150
|
+
}
|
|
151
|
+
await db.CommitTransaction();
|
|
152
|
+
return {
|
|
153
|
+
Success: true,
|
|
154
|
+
AccessOverrideID: override.ID,
|
|
155
|
+
ApprovalTaskID: taskID,
|
|
156
|
+
Message: 'Access override requested; it takes effect once its approval task is approved.',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
await rollback(db, 'access override request');
|
|
161
|
+
throw err;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Approve or reject an access override from the app: record the Tasks decision, then apply it. */
|
|
165
|
+
export async function RecordAccessOverrideDecision(input, provider, user) {
|
|
166
|
+
RequireUUID(input.AccessOverrideID, 'AccessOverrideID');
|
|
167
|
+
if (!IsTaskDecisionOutcomeCode(input.Outcome)) {
|
|
168
|
+
return { Success: false, Message: `'${input.Outcome}' is not a decision outcome.` };
|
|
169
|
+
}
|
|
170
|
+
const outcome = input.Outcome;
|
|
171
|
+
const override = await provider.GetEntityObject(ACCESS_OVERRIDE_ENTITY, user);
|
|
172
|
+
if (!(await override.Load(input.AccessOverrideID))) {
|
|
173
|
+
return { Success: false, Message: `No access override found with ID '${input.AccessOverrideID}'.` };
|
|
174
|
+
}
|
|
175
|
+
if (override.Status !== 'Requested') {
|
|
176
|
+
return { Success: false, Status: override.Status, Message: `The access override is already ${override.Status}.` };
|
|
177
|
+
}
|
|
178
|
+
if (!override.ApprovalTaskID) {
|
|
179
|
+
return { Success: false, Status: override.Status, Message: 'The access override has no approval task to decide.' };
|
|
180
|
+
}
|
|
181
|
+
await new TaskOrchestrationService().RecordDecision({ TaskID: override.ApprovalTaskID, OutcomeCode: outcome, Notes: input.Notes }, user);
|
|
182
|
+
return ApplyAccessOverrideDecision(override.ApprovalTaskID, provider, user);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Bring an override in line with its approval task's outcome. `user` is whoever decided the task.
|
|
186
|
+
*
|
|
187
|
+
* Completed with an approving decision → Approved, and the order's grants re-decided at once
|
|
188
|
+
* Cancelled with a Rejected decision → Rejected
|
|
189
|
+
* closed any other way → Withdrawn
|
|
190
|
+
* still open, or blocked → unchanged
|
|
191
|
+
*
|
|
192
|
+
* A second call after the first has applied it changes nothing.
|
|
193
|
+
*/
|
|
194
|
+
export async function ApplyAccessOverrideDecision(taskID, provider, user) {
|
|
195
|
+
RequireUUID(taskID, 'TaskID');
|
|
196
|
+
const rv = new RunView(provider);
|
|
197
|
+
const found = await rv.RunView({ EntityName: ACCESS_OVERRIDE_ENTITY, ExtraFilter: `ApprovalTaskID = '${taskID}'`, ResultType: 'entity_object', BypassCache: true }, user);
|
|
198
|
+
if (!found.Success)
|
|
199
|
+
throw new Error(`Could not read access overrides: ${found.ErrorMessage}`);
|
|
200
|
+
const override = found.Results?.[0];
|
|
201
|
+
if (!override)
|
|
202
|
+
return { Success: false, Message: `Task ${taskID} is not an access override approval.` };
|
|
203
|
+
if (override.Status !== 'Requested')
|
|
204
|
+
return { Success: true, Status: override.Status, Message: `Already ${override.Status}.` };
|
|
205
|
+
const task = await provider.GetEntityObject(TASKS_ENTITY, user);
|
|
206
|
+
if (!(await task.Load(taskID)))
|
|
207
|
+
throw new Error(`Approval task ${taskID} not found.`);
|
|
208
|
+
const decision = await latestTerminalDecision(taskID, provider, user);
|
|
209
|
+
const outcome = ResolveAccessOverrideOutcome({ TaskStatus: task.Status, Decision: decision });
|
|
210
|
+
if (!outcome)
|
|
211
|
+
return { Success: true, Status: override.Status, Message: `The approval task is ${task.Status}; nothing to apply yet.` };
|
|
212
|
+
const applied = outcome === 'Approved' || outcome === 'Rejected';
|
|
213
|
+
const db = provider;
|
|
214
|
+
await db.BeginTransaction();
|
|
215
|
+
try {
|
|
216
|
+
override.Status = outcome;
|
|
217
|
+
override.DecidedAt = new Date();
|
|
218
|
+
override.DecisionNotes = applied
|
|
219
|
+
? (decision?.Notes ?? null)
|
|
220
|
+
: `The approval task was ${task.Status} without a matching decision.`;
|
|
221
|
+
if (applied)
|
|
222
|
+
override.DecidedByUserID = user.ID;
|
|
223
|
+
if (!(await override.Save())) {
|
|
224
|
+
throw new Error(`Failed to record the decision on access override ${override.ID}: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
225
|
+
}
|
|
226
|
+
const changes = outcome === 'Approved' ? await ReconcilePaymentGatedGrants([override.OrderHeaderID], provider, user) : [];
|
|
227
|
+
await db.CommitTransaction();
|
|
228
|
+
return {
|
|
229
|
+
Success: true,
|
|
230
|
+
Status: override.Status,
|
|
231
|
+
GrantsChanged: changes.length,
|
|
232
|
+
Message: `Access override ${override.Status}${changes.length ? `; ${changes.length} grant(s) changed` : ''}.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
await rollback(db, `access override decision on task ${taskID}`);
|
|
237
|
+
throw err;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// ─── helpers ───────────────────────────────────────────────────────────────────
|
|
241
|
+
async function findOpenOverride(orderID, type, provider, user) {
|
|
242
|
+
const rv = new RunView(provider);
|
|
243
|
+
const res = await rv.RunView({
|
|
244
|
+
EntityName: ACCESS_OVERRIDE_ENTITY,
|
|
245
|
+
ExtraFilter: `OrderHeaderID = '${RequireUUID(orderID, 'OrderHeaderID')}' AND OverrideType = '${type}' ` +
|
|
246
|
+
`AND Status IN ('Requested','Approved')`,
|
|
247
|
+
Fields: ['ID', 'Status'],
|
|
248
|
+
ResultType: 'simple',
|
|
249
|
+
BypassCache: true,
|
|
250
|
+
}, user);
|
|
251
|
+
if (!res.Success)
|
|
252
|
+
throw new Error(`Could not read access overrides: ${res.ErrorMessage}`);
|
|
253
|
+
return res.Results?.[0] ?? null;
|
|
254
|
+
}
|
|
255
|
+
async function resolveTaskTypeID(provider, user) {
|
|
256
|
+
const rv = new RunView(provider);
|
|
257
|
+
const res = await rv.RunView({ EntityName: TASK_TYPES_ENTITY, ExtraFilter: `Code = '${ACCESS_OVERRIDE_TASK_TYPE_CODE}'`, MaxRows: 1, ResultType: 'simple', BypassCache: true }, user);
|
|
258
|
+
const type = res.Results?.[0];
|
|
259
|
+
if (!res.Success || !type) {
|
|
260
|
+
throw new Error(`TaskType '${ACCESS_OVERRIDE_TASK_TYPE_CODE}' not found; the Orders task-type metadata has not been installed.`);
|
|
261
|
+
}
|
|
262
|
+
return type.ID;
|
|
263
|
+
}
|
|
264
|
+
async function findLinkedTaskID(entityID, recordID, provider, user) {
|
|
265
|
+
const rv = new RunView(provider);
|
|
266
|
+
const res = await rv.RunView({
|
|
267
|
+
EntityName: TASK_LINKS_ENTITY,
|
|
268
|
+
ExtraFilter: `EntityID = '${RequireUUID(entityID, 'EntityID')}' AND RecordID = '${RequireUUID(recordID, 'RecordID')}'`,
|
|
269
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
270
|
+
ResultType: 'simple',
|
|
271
|
+
BypassCache: true,
|
|
272
|
+
}, user);
|
|
273
|
+
return res.Results?.[0]?.TaskID ?? null;
|
|
274
|
+
}
|
|
275
|
+
/** The most recent terminal decision on the task, and whether its outcome approves. */
|
|
276
|
+
async function latestTerminalDecision(taskID, provider, user) {
|
|
277
|
+
const rv = new RunView(provider);
|
|
278
|
+
const outcomes = await rv.RunView({ EntityName: TASK_DECISION_OUTCOMES_ENTITY, ExtraFilter: 'IsTerminal = 1', ResultType: 'simple', BypassCache: true }, user);
|
|
279
|
+
if (!outcomes.Success)
|
|
280
|
+
throw new Error(`Could not read task decision outcomes: ${outcomes.ErrorMessage}`);
|
|
281
|
+
const codeByID = new Map((outcomes.Results ?? []).map((o) => [o.ID.toLowerCase(), o.Code]));
|
|
282
|
+
const decisions = await rv.RunView({ EntityName: TASK_DECISIONS_ENTITY, ExtraFilter: `TaskID = '${taskID}'`, OrderBy: 'DecidedAt DESC', ResultType: 'simple', BypassCache: true }, user);
|
|
283
|
+
if (!decisions.Success)
|
|
284
|
+
throw new Error(`Could not read task decisions: ${decisions.ErrorMessage}`);
|
|
285
|
+
for (const d of decisions.Results ?? []) {
|
|
286
|
+
const code = codeByID.get(d.OutcomeID.toLowerCase());
|
|
287
|
+
if (IsTaskDecisionOutcomeCode(code))
|
|
288
|
+
return { IsApproval: IsApprovalOutcome(code), Notes: d.DecisionNotes ?? null };
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
/** The payment-gated grants in force or suspended on this order, with whether each is on a renewal line. */
|
|
293
|
+
async function gatedGrantsOnOrder(orderID, provider, user) {
|
|
294
|
+
const rv = new RunView(provider);
|
|
295
|
+
const lines = await rv.RunView({
|
|
296
|
+
EntityName: ORDER_LINE_ENTITY,
|
|
297
|
+
ExtraFilter: `OrderHeaderID = '${RequireUUID(orderID, 'OrderHeaderID')}'`,
|
|
298
|
+
Fields: ['ID', 'RenewsSubscriptionID'],
|
|
299
|
+
ResultType: 'simple',
|
|
300
|
+
BypassCache: true,
|
|
301
|
+
}, user);
|
|
302
|
+
if (!lines.Success)
|
|
303
|
+
throw new Error(`Could not read the lines of order ${orderID}: ${lines.ErrorMessage}`);
|
|
304
|
+
const lineRows = lines.Results ?? [];
|
|
305
|
+
if (!lineRows.length)
|
|
306
|
+
return [];
|
|
307
|
+
const renewal = new Map(lineRows.map((l) => [l.ID.toLowerCase(), !!l.RenewsSubscriptionID]));
|
|
308
|
+
const grants = await rv.RunView({
|
|
309
|
+
EntityName: ENTITLEMENT_GRANT_ENTITY,
|
|
310
|
+
ExtraFilter: `OrderLineID IN (${lineRows.map((l) => `'${RequireUUID(l.ID, 'OrderLineID')}'`).join(',')}) ` +
|
|
311
|
+
`AND GrantTimingApplied IN (${gatedTimings}) AND Status IN ('Active','Suspended')`,
|
|
312
|
+
Fields: ['OrderLineID', 'GrantTimingApplied'],
|
|
313
|
+
ResultType: 'simple',
|
|
314
|
+
BypassCache: true,
|
|
315
|
+
}, user);
|
|
316
|
+
if (!grants.Success)
|
|
317
|
+
throw new Error(`Could not read the grants on order ${orderID}: ${grants.ErrorMessage}`);
|
|
318
|
+
return (grants.Results ?? []).map((g) => ({
|
|
319
|
+
Timing: g.GrantTimingApplied,
|
|
320
|
+
IsRenewal: renewal.get(g.OrderLineID.toLowerCase()) ?? false,
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
async function rollback(db, what) {
|
|
324
|
+
try {
|
|
325
|
+
await db.RollbackTransaction();
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
LogError(`Rollback failed after ${what} error: ${err}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=AccessOverride.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessOverride.js","sourceRoot":"","sources":["../src/AccessOverride.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orders.RequestAccessOverride and Orders.RecordAccessOverrideDecision (bizapps-orders#268).
|
|
3
|
+
*
|
|
4
|
+
* Thin: the rules, the authorization checks and the writes are in `AccessOverride.ts`. Logical
|
|
5
|
+
* refusals come back as `Success: false` with the reason; only faults throw.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseRemotableOperation, IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
8
|
+
import { type AccessOverrideDecisionOutput, type RecordAccessOverrideDecisionInput, type RequestAccessOverrideInput, type RequestAccessOverrideOutput } from './AccessOverride.js';
|
|
9
|
+
export declare class RequestAccessOverrideOperation extends BaseRemotableOperation<RequestAccessOverrideInput, RequestAccessOverrideOutput> {
|
|
10
|
+
OperationKey: string;
|
|
11
|
+
protected InternalExecute(input: RequestAccessOverrideInput, provider: IMetadataProvider, user: UserInfo): Promise<RequestAccessOverrideOutput>;
|
|
12
|
+
}
|
|
13
|
+
export declare class RecordAccessOverrideDecisionOperation extends BaseRemotableOperation<RecordAccessOverrideDecisionInput, AccessOverrideDecisionOutput> {
|
|
14
|
+
OperationKey: string;
|
|
15
|
+
protected InternalExecute(input: RecordAccessOverrideDecisionInput, provider: IMetadataProvider, user: UserInfo): Promise<AccessOverrideDecisionOutput>;
|
|
16
|
+
}
|
|
17
|
+
/** Tree-shaking anchor — call from the server bootstrap so @RegisterClass is retained. */
|
|
18
|
+
export declare function LoadAccessOverrideOperations(): void;
|
|
19
|
+
//# sourceMappingURL=AccessOverrideOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessOverrideOperations.d.ts","sourceRoot":"","sources":["../src/AccessOverrideOperations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EAGH,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACnC,MAAM,qBAAqB,CAAC;AAE7B,qBACa,8BAA+B,SAAQ,sBAAsB,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IACxH,YAAY,SAAkC;cAErC,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAGxJ;AAED,qBACa,qCAAsC,SAAQ,sBAAsB,CAC7E,iCAAiC,EACjC,4BAA4B,CAC/B;IACU,YAAY,SAAyC;cAE5C,eAAe,CAC3B,KAAK,EAAE,iCAAiC,EACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,4BAA4B,CAAC;CAG3C;AAED,0FAA0F;AAC1F,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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.RequestAccessOverride and Orders.RecordAccessOverrideDecision (bizapps-orders#268).
|
|
9
|
+
*
|
|
10
|
+
* Thin: the rules, the authorization checks and the writes are in `AccessOverride.ts`. Logical
|
|
11
|
+
* refusals come back as `Success: false` with the reason; only faults throw.
|
|
12
|
+
*/
|
|
13
|
+
import { BaseRemotableOperation } from '@memberjunction/core';
|
|
14
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
15
|
+
import { RecordAccessOverrideDecision, RequestAccessOverride, } from './AccessOverride.js';
|
|
16
|
+
let RequestAccessOverrideOperation = class RequestAccessOverrideOperation extends BaseRemotableOperation {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.OperationKey = 'Orders.RequestAccessOverride';
|
|
20
|
+
}
|
|
21
|
+
async InternalExecute(input, provider, user) {
|
|
22
|
+
return RequestAccessOverride(input, provider, user);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
RequestAccessOverrideOperation = __decorate([
|
|
26
|
+
RegisterClass(BaseRemotableOperation, 'Orders.RequestAccessOverride')
|
|
27
|
+
], RequestAccessOverrideOperation);
|
|
28
|
+
export { RequestAccessOverrideOperation };
|
|
29
|
+
let RecordAccessOverrideDecisionOperation = class RecordAccessOverrideDecisionOperation extends BaseRemotableOperation {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.OperationKey = 'Orders.RecordAccessOverrideDecision';
|
|
33
|
+
}
|
|
34
|
+
async InternalExecute(input, provider, user) {
|
|
35
|
+
return RecordAccessOverrideDecision(input, provider, user);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
RecordAccessOverrideDecisionOperation = __decorate([
|
|
39
|
+
RegisterClass(BaseRemotableOperation, 'Orders.RecordAccessOverrideDecision')
|
|
40
|
+
], RecordAccessOverrideDecisionOperation);
|
|
41
|
+
export { RecordAccessOverrideDecisionOperation };
|
|
42
|
+
/** Tree-shaking anchor — call from the server bootstrap so @RegisterClass is retained. */
|
|
43
|
+
export function LoadAccessOverrideOperations() {
|
|
44
|
+
// intentionally empty
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=AccessOverrideOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessOverrideOperations.js","sourceRoot":"","sources":["../src/AccessOverrideOperations.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAA+B,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACH,4BAA4B,EAC5B,qBAAqB,GAKxB,MAAM,qBAAqB,CAAC;AAGtB,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,sBAA+E;IAA5H;;QACI,iBAAY,GAAG,8BAA8B,CAAC;IAKzD,CAAC;IAHa,KAAK,CAAC,eAAe,CAAC,KAAiC,EAAE,QAA2B,EAAE,IAAc;QAC1G,OAAO,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;CACJ,CAAA;AANY,8BAA8B;IAD1C,aAAa,CAAC,sBAAsB,EAAE,8BAA8B,CAAC;GACzD,8BAA8B,CAM1C;;AAGM,IAAM,qCAAqC,GAA3C,MAAM,qCAAsC,SAAQ,sBAG1D;IAHM;;QAII,iBAAY,GAAG,qCAAqC,CAAC;IAShE,CAAC;IAPa,KAAK,CAAC,eAAe,CAC3B,KAAwC,EACxC,QAA2B,EAC3B,IAAc;QAEd,OAAO,4BAA4B,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;CACJ,CAAA;AAbY,qCAAqC;IADjD,aAAa,CAAC,sBAAsB,EAAE,qCAAqC,CAAC;GAChE,qCAAqC,CAajD;;AAED,0FAA0F;AAC1F,MAAM,UAAU,4BAA4B;IACxC,sBAAsB;AAC1B,CAAC"}
|