@mj-biz-apps/orders-core-entities-server 5.19.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.
Files changed (201) hide show
  1. package/dist/AccessOverride.d.ts +90 -0
  2. package/dist/AccessOverride.d.ts.map +1 -0
  3. package/dist/AccessOverride.js +331 -0
  4. package/dist/AccessOverride.js.map +1 -0
  5. package/dist/AccessOverrideOperations.d.ts +19 -0
  6. package/dist/AccessOverrideOperations.d.ts.map +1 -0
  7. package/dist/AccessOverrideOperations.js +46 -0
  8. package/dist/AccessOverrideOperations.js.map +1 -0
  9. package/dist/AdoptExternalInvoiceOperation.d.ts +33 -0
  10. package/dist/AdoptExternalInvoiceOperation.d.ts.map +1 -0
  11. package/dist/AdoptExternalInvoiceOperation.js +188 -0
  12. package/dist/AdoptExternalInvoiceOperation.js.map +1 -0
  13. package/dist/BaseInvoiceRail.d.ts +159 -0
  14. package/dist/BaseInvoiceRail.d.ts.map +1 -0
  15. package/dist/BaseInvoiceRail.js +41 -0
  16. package/dist/BaseInvoiceRail.js.map +1 -0
  17. package/dist/BasePaymentProvider.d.ts +10 -0
  18. package/dist/BasePaymentProvider.d.ts.map +1 -1
  19. package/dist/BasePaymentProvider.js +10 -0
  20. package/dist/BasePaymentProvider.js.map +1 -1
  21. package/dist/BillComGateway.d.ts +82 -0
  22. package/dist/BillComGateway.d.ts.map +1 -0
  23. package/dist/BillComGateway.js +164 -0
  24. package/dist/BillComGateway.js.map +1 -0
  25. package/dist/BillComInvoiceRail.d.ts +30 -0
  26. package/dist/BillComInvoiceRail.d.ts.map +1 -0
  27. package/dist/BillComInvoiceRail.js +248 -0
  28. package/dist/BillComInvoiceRail.js.map +1 -0
  29. package/dist/BillComPaymentProvider.d.ts +24 -0
  30. package/dist/BillComPaymentProvider.d.ts.map +1 -0
  31. package/dist/BillComPaymentProvider.js +82 -0
  32. package/dist/BillComPaymentProvider.js.map +1 -0
  33. package/dist/BillComWebhook.d.ts +54 -0
  34. package/dist/BillComWebhook.d.ts.map +1 -0
  35. package/dist/BillComWebhook.js +96 -0
  36. package/dist/BillComWebhook.js.map +1 -0
  37. package/dist/CancelExternalInvoiceOperation.d.ts +33 -0
  38. package/dist/CancelExternalInvoiceOperation.d.ts.map +1 -0
  39. package/dist/CancelExternalInvoiceOperation.js +130 -0
  40. package/dist/CancelExternalInvoiceOperation.js.map +1 -0
  41. package/dist/CancelSubscriptionOperation.d.ts.map +1 -1
  42. package/dist/CancelSubscriptionOperation.js +13 -0
  43. package/dist/CancelSubscriptionOperation.js.map +1 -1
  44. package/dist/CapturePaymentOperation.d.ts.map +1 -1
  45. package/dist/CapturePaymentOperation.js +2 -0
  46. package/dist/CapturePaymentOperation.js.map +1 -1
  47. package/dist/CheckoutAccountStep.d.ts +147 -0
  48. package/dist/CheckoutAccountStep.d.ts.map +1 -0
  49. package/dist/CheckoutAccountStep.js +368 -0
  50. package/dist/CheckoutAccountStep.js.map +1 -0
  51. package/dist/CheckoutSessionService.d.ts +12 -2
  52. package/dist/CheckoutSessionService.d.ts.map +1 -1
  53. package/dist/CheckoutSessionService.js +89 -2
  54. package/dist/CheckoutSessionService.js.map +1 -1
  55. package/dist/ContractBalance.d.ts +150 -0
  56. package/dist/ContractBalance.d.ts.map +1 -1
  57. package/dist/ContractBalance.js +156 -0
  58. package/dist/ContractBalance.js.map +1 -1
  59. package/dist/DeliveryBehavior.d.ts +7 -1
  60. package/dist/DeliveryBehavior.d.ts.map +1 -1
  61. package/dist/DeliveryBehavior.js +8 -0
  62. package/dist/DeliveryBehavior.js.map +1 -1
  63. package/dist/DeliveryRecipientResolver.d.ts +7 -0
  64. package/dist/DeliveryRecipientResolver.d.ts.map +1 -1
  65. package/dist/DeliveryRecipientResolver.js +25 -0
  66. package/dist/DeliveryRecipientResolver.js.map +1 -1
  67. package/dist/EntitlementAccessOverrideEntityServer.d.ts +33 -0
  68. package/dist/EntitlementAccessOverrideEntityServer.d.ts.map +1 -0
  69. package/dist/EntitlementAccessOverrideEntityServer.js +118 -0
  70. package/dist/EntitlementAccessOverrideEntityServer.js.map +1 -0
  71. package/dist/EntitlementBehavior.d.ts +71 -0
  72. package/dist/EntitlementBehavior.d.ts.map +1 -1
  73. package/dist/EntitlementBehavior.js +73 -0
  74. package/dist/EntitlementBehavior.js.map +1 -1
  75. package/dist/EntitlementRead.d.ts +1 -0
  76. package/dist/EntitlementRead.d.ts.map +1 -1
  77. package/dist/EntitlementRead.js +36 -23
  78. package/dist/EntitlementRead.js.map +1 -1
  79. package/dist/ExternalInvoiceBehavior.d.ts +156 -0
  80. package/dist/ExternalInvoiceBehavior.d.ts.map +1 -0
  81. package/dist/ExternalInvoiceBehavior.js +267 -0
  82. package/dist/ExternalInvoiceBehavior.js.map +1 -0
  83. package/dist/GLAccountResolver.d.ts +28 -0
  84. package/dist/GLAccountResolver.d.ts.map +1 -1
  85. package/dist/GLAccountResolver.js +44 -0
  86. package/dist/GLAccountResolver.js.map +1 -1
  87. package/dist/GetExternalInvoicingWorklistOperation.d.ts +27 -0
  88. package/dist/GetExternalInvoicingWorklistOperation.d.ts.map +1 -0
  89. package/dist/GetExternalInvoicingWorklistOperation.js +187 -0
  90. package/dist/GetExternalInvoicingWorklistOperation.js.map +1 -0
  91. package/dist/GetProgressWorklistOperation.d.ts +21 -0
  92. package/dist/GetProgressWorklistOperation.d.ts.map +1 -0
  93. package/dist/GetProgressWorklistOperation.js +132 -0
  94. package/dist/GetProgressWorklistOperation.js.map +1 -0
  95. package/dist/GiftCardEngine.d.ts +15 -0
  96. package/dist/GiftCardEngine.d.ts.map +1 -1
  97. package/dist/GiftCardEngine.js +58 -1
  98. package/dist/GiftCardEngine.js.map +1 -1
  99. package/dist/InstalmentInvoiceEntry.d.ts +44 -4
  100. package/dist/InstalmentInvoiceEntry.d.ts.map +1 -1
  101. package/dist/InstalmentInvoiceEntry.js +131 -66
  102. package/dist/InstalmentInvoiceEntry.js.map +1 -1
  103. package/dist/InvoiceBehavior.d.ts +30 -0
  104. package/dist/InvoiceBehavior.d.ts.map +1 -1
  105. package/dist/InvoiceBehavior.js +37 -1
  106. package/dist/InvoiceBehavior.js.map +1 -1
  107. package/dist/InvoiceRailResolver.d.ts +27 -0
  108. package/dist/InvoiceRailResolver.d.ts.map +1 -0
  109. package/dist/InvoiceRailResolver.js +114 -0
  110. package/dist/InvoiceRailResolver.js.map +1 -0
  111. package/dist/IssueExternalInvoiceOperation.d.ts +135 -0
  112. package/dist/IssueExternalInvoiceOperation.d.ts.map +1 -0
  113. package/dist/IssueExternalInvoiceOperation.js +580 -0
  114. package/dist/IssueExternalInvoiceOperation.js.map +1 -0
  115. package/dist/IssueInstalmentInvoiceOperation.d.ts.map +1 -1
  116. package/dist/IssueInstalmentInvoiceOperation.js +33 -4
  117. package/dist/IssueInstalmentInvoiceOperation.js.map +1 -1
  118. package/dist/OrderEntityServer.d.ts +53 -1
  119. package/dist/OrderEntityServer.d.ts.map +1 -1
  120. package/dist/OrderEntityServer.js +182 -32
  121. package/dist/OrderEntityServer.js.map +1 -1
  122. package/dist/OrderHeaderPaymentScheduleEntityServer.d.ts +19 -1
  123. package/dist/OrderHeaderPaymentScheduleEntityServer.d.ts.map +1 -1
  124. package/dist/OrderHeaderPaymentScheduleEntityServer.js +35 -2
  125. package/dist/OrderHeaderPaymentScheduleEntityServer.js.map +1 -1
  126. package/dist/OrderJournalEntryFactory.d.ts +72 -1
  127. package/dist/OrderJournalEntryFactory.d.ts.map +1 -1
  128. package/dist/OrderJournalEntryFactory.js +250 -38
  129. package/dist/OrderJournalEntryFactory.js.map +1 -1
  130. package/dist/OrderLineProgressMeasurementEntityServer.d.ts +47 -0
  131. package/dist/OrderLineProgressMeasurementEntityServer.d.ts.map +1 -0
  132. package/dist/OrderLineProgressMeasurementEntityServer.js +107 -0
  133. package/dist/OrderLineProgressMeasurementEntityServer.js.map +1 -0
  134. package/dist/PaymentAllocationFactory.d.ts +47 -0
  135. package/dist/PaymentAllocationFactory.d.ts.map +1 -1
  136. package/dist/PaymentAllocationFactory.js +112 -24
  137. package/dist/PaymentAllocationFactory.js.map +1 -1
  138. package/dist/PaymentAllocationInputs.d.ts +30 -1
  139. package/dist/PaymentAllocationInputs.d.ts.map +1 -1
  140. package/dist/PaymentAllocationInputs.js +96 -2
  141. package/dist/PaymentAllocationInputs.js.map +1 -1
  142. package/dist/PaymentGatedAccess.d.ts +44 -6
  143. package/dist/PaymentGatedAccess.d.ts.map +1 -1
  144. package/dist/PaymentGatedAccess.js +142 -10
  145. package/dist/PaymentGatedAccess.js.map +1 -1
  146. package/dist/PaymentHeaderEntityServer.d.ts +19 -0
  147. package/dist/PaymentHeaderEntityServer.d.ts.map +1 -1
  148. package/dist/PaymentHeaderEntityServer.js +119 -13
  149. package/dist/PaymentHeaderEntityServer.js.map +1 -1
  150. package/dist/PaymentLineEntityServer.d.ts.map +1 -1
  151. package/dist/PaymentLineEntityServer.js +22 -6
  152. package/dist/PaymentLineEntityServer.js.map +1 -1
  153. package/dist/PaymentReversalFactory.d.ts +12 -2
  154. package/dist/PaymentReversalFactory.d.ts.map +1 -1
  155. package/dist/PaymentReversalFactory.js +5 -2
  156. package/dist/PaymentReversalFactory.js.map +1 -1
  157. package/dist/PaymentScheduleBehavior.d.ts +138 -2
  158. package/dist/PaymentScheduleBehavior.d.ts.map +1 -1
  159. package/dist/PaymentScheduleBehavior.js +215 -2
  160. package/dist/PaymentScheduleBehavior.js.map +1 -1
  161. package/dist/PollExternalPaymentsOperation.d.ts +39 -0
  162. package/dist/PollExternalPaymentsOperation.d.ts.map +1 -0
  163. package/dist/PollExternalPaymentsOperation.js +478 -0
  164. package/dist/PollExternalPaymentsOperation.js.map +1 -0
  165. package/dist/RecordProgressOperation.d.ts +104 -0
  166. package/dist/RecordProgressOperation.d.ts.map +1 -0
  167. package/dist/RecordProgressOperation.js +348 -0
  168. package/dist/RecordProgressOperation.js.map +1 -0
  169. package/dist/RevenueRecognition.d.ts +67 -0
  170. package/dist/RevenueRecognition.d.ts.map +1 -1
  171. package/dist/RevenueRecognition.js +58 -1
  172. package/dist/RevenueRecognition.js.map +1 -1
  173. package/dist/ReversalBehavior.d.ts +17 -1
  174. package/dist/ReversalBehavior.d.ts.map +1 -1
  175. package/dist/ReversalBehavior.js +1 -1
  176. package/dist/ReversalBehavior.js.map +1 -1
  177. package/dist/ReversalResolver.d.ts +43 -0
  178. package/dist/ReversalResolver.d.ts.map +1 -1
  179. package/dist/ReversalResolver.js +87 -3
  180. package/dist/ReversalResolver.js.map +1 -1
  181. package/dist/SendExternalInvoicesOperation.d.ts +25 -0
  182. package/dist/SendExternalInvoicesOperation.d.ts.map +1 -0
  183. package/dist/SendExternalInvoicesOperation.js +110 -0
  184. package/dist/SendExternalInvoicesOperation.js.map +1 -0
  185. package/dist/SpawnRenewalsOperation.d.ts +11 -4
  186. package/dist/SpawnRenewalsOperation.d.ts.map +1 -1
  187. package/dist/SpawnRenewalsOperation.js +47 -7
  188. package/dist/SpawnRenewalsOperation.js.map +1 -1
  189. package/dist/entity-names.d.ts +21 -0
  190. package/dist/entity-names.d.ts.map +1 -1
  191. package/dist/entity-names.js +21 -0
  192. package/dist/entity-names.js.map +1 -1
  193. package/dist/index.d.ts +36 -7
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +29 -5
  196. package/dist/index.js.map +1 -1
  197. package/dist/instalmentIssueGuard.d.ts +27 -0
  198. package/dist/instalmentIssueGuard.d.ts.map +1 -0
  199. package/dist/instalmentIssueGuard.js +34 -0
  200. package/dist/instalmentIssueGuard.js.map +1 -0
  201. package/package.json +8 -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EACH,sBAAsB,EAItB,QAAQ,EACR,OAAO,GAEV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,GAE3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,qBAAqB,IAAI,iBAAiB,GAM7C,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,GAGvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,GAG/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,4FAA4F;AAC5F,kGAAkG;AAClG,iGAAiG;AACjG,sDAAsD;AACtD,iBAAiB,EAAE,CAAC;AAEpB,4GAA4G;AAC5G,MAAM,CAAC,MAAM,8BAA8B,GAAG,wBAAwB,CAAC;AAEvE,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AACzE,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AACzD,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AACzD,MAAM,qBAAqB,GAAG,kCAAkC,CAAC;AACjE,MAAM,6BAA6B,GAAG,0CAA0C,CAAC;AACjF,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAyB,CAAC;AAClF,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1E,kFAAkF;AAElF;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAwB,EAAE,IAAc,EAAE,QAA2B;IAC9G,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CACX,kBAAkB,IAAI,+DAA+D;YACjF,GAAG,oBAAoB,CAAC,MAAM,qDAAqD,CAC1F,CAAC;IACN,CAAC;IACD,OAAO,IAAI,sBAAsB,EAAE,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACvF,CAAC;AAmBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,KAAiC,EACjC,QAA2B,EAC3B,IAAc;IAEd,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,+BAA+B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IACjI,CAAC;IACD,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,KAAK,CAAC,YAAY,0BAA0B,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;IAC9J,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IAC3F,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,UAAU,cAAc,EAAE,CAAC;IACrH,IAAI,CAAC,KAAK,CAAC,gBAAgB;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yEAAyE,EAAE,CAAC;IAC3I,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAExE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAmC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC1G,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA2B,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;IAC3F,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,OAAO,qBAAqB,KAAK,IAAI,EAAE,CAAC;IAEnH,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAC7G,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,CAAC,WAAW,WAAW,IAAI,UAAU,KAAK,CAAC,YAAY,iCAAiC,EAAE,CAAC;IAC/I,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7F,IAAI,IAAI,EAAE,CAAC;QACP,OAAO;YACH,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,IAAI,CAAC,EAAE;YACzB,OAAO,EAAE,4BAA4B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,uDAAuD;SAChI,CAAC;IACN,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE3D,MAAM,EAAE,GAAG,QAA2C,CAAC;IACvD,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAiD,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAC9H,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC7C,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC3C,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,gBAAgB,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC;QAC7D,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;QAC9B,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QACxH,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;QACrE,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,sBAAsB,eAAe,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,KAAK,kBAAkB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAChH,kDAAkD;QAClD,MAAM,IAAI,wBAAwB,EAAE,CAAC,qBAAqB,CACtD;YACI,IAAI,EAAE,oCAAoC,KAAK,CAAC,WAAW,KAAK,KAAK,YAAY,OAAO,EAAE;YAC1F,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,gBAAgB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,aAAa,MAAM,EAAE;YACzE,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,cAAc,CAAC,EAAE;YAC/B,YAAY,EAAE,QAAQ,CAAC,EAAE;SAC5B,EACD,IAAI,CACP,CAAC;QACF,uFAAuF;QACvF,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QAEnH,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;QACjC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6DAA6D,QAAQ,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QAC9I,CAAC;QACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,OAAO;YACH,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,QAAQ,CAAC,EAAE;YAC7B,cAAc,EAAE,MAAM;YACtB,OAAO,EAAE,gFAAgF;SAC5F,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC;IACd,CAAC;AACL,CAAC;AAoBD,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAC9C,KAAwC,EACxC,QAA2B,EAC3B,IAAc;IAEd,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,OAAO,8BAA8B,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,OAAO,GAA4B,KAAK,CAAC,OAAO,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAiD,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAC9H,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qCAAqC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACxG,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,kCAAkC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;IACtH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;IACvH,CAAC;IAED,MAAM,IAAI,wBAAwB,EAAE,CAAC,cAAc,CAC/C,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAC7E,IAAI,CACP,CAAC;IACF,OAAO,2BAA2B,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC7C,MAAc,EACd,QAA2B,EAC3B,IAAc;IAEd,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,EAAE,UAAU,EAAE,sBAAsB,EAAE,WAAW,EAAE,qBAAqB,MAAM,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,EACnI,IAAI,CACP,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,MAAM,sCAAsC,EAAE,CAAC;IACxG,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;IAE/H,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,eAAe,CAA2B,YAAY,EAAE,IAAI,CAAC,CAAC;IAC1F,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,aAAa,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,4BAA4B,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9F,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,IAAI,CAAC,MAAM,yBAAyB,EAAE,CAAC;IACvI,MAAM,OAAO,GAAG,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,CAAC;IAEjE,MAAM,EAAE,GAAG,QAA2C,CAAC;IACvD,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,IAAI,CAAC;QACD,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;QAC1B,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,QAAQ,CAAC,aAAa,GAAG,OAAO;YAC5B,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC;YAC3B,CAAC,CAAC,yBAAyB,IAAI,CAAC,MAAM,+BAA+B,CAAC;QAC1E,IAAI,OAAO;YAAE,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,oDAAoD,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QACrJ,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,2BAA2B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1H,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO,EAAE,mBAAmB,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG;SAChH,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,EAAE,EAAE,oCAAoC,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,GAAG,CAAC;IACd,CAAC;AACL,CAAC;AAED,kFAAkF;AAElF,KAAK,UAAU,gBAAgB,CAC3B,OAAe,EACf,IAAwB,EACxB,QAA2B,EAC3B,IAAc;IAEd,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB;QACI,UAAU,EAAE,sBAAsB;QAClC,WAAW,EACP,oBAAoB,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,yBAAyB,IAAI,IAAI;YAC1F,wCAAwC;QAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,IAAI;KACpB,EACD,IAAI,CACP,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAA2B,EAAE,IAAc;IACxE,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,8BAA8B,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EACjJ,IAAI,CACP,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,aAAa,8BAA8B,oEAAoE,CAAC,CAAC;IACrI,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAA2B,EAAE,IAAc;IAC3G,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB;QACI,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,eAAe,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,qBAAqB,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG;QACtH,OAAO,EAAE,qBAAqB;QAC9B,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,IAAI;KACpB,EACD,IAAI,CACP,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,sBAAsB,CACjC,MAAc,EACd,QAA2B,EAC3B,IAAc;IAEd,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAC7B,EAAE,UAAU,EAAE,6BAA6B,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EACrH,IAAI,CACP,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAC9B,EAAE,UAAU,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,MAAM,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAC9I,IAAI,CACP,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,IAAI,yBAAyB,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;IACxH,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,4GAA4G;AAC5G,KAAK,UAAU,kBAAkB,CAC7B,OAAe,EACf,QAA2B,EAC3B,IAAc;IAEd,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAuC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B;QACI,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,oBAAoB,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG;QACzE,MAAM,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC;QACtC,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,IAAI;KACpB,EACD,IAAI,CACP,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3G,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAC3B;QACI,UAAU,EAAE,wBAAwB;QACpC,WAAW,EACP,mBAAmB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YAC7F,8BAA8B,YAAY,wCAAwC;QACtF,MAAM,EAAE,CAAC,aAAa,EAAE,oBAAoB,CAAC;QAC7C,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,IAAI;KACpB,EACD,IAAI,CACP,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9G,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,CAAC,kBAAkB;QAC5B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK;KAC/D,CAAC,CAAC,CAAC;AACR,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,EAAwB,EAAE,IAAY;IAC1D,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,mBAAmB,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,QAAQ,CAAC,yBAAyB,IAAI,WAAW,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC"}
@@ -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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `Orders.AdoptExternalInvoice` — resolve a claimed unit by attaching the invoice the rail already holds.
3
+ *
4
+ * WHY THIS EXISTS. A send that times out leaves the unit claimed (`Sending`) deliberately: the rail
5
+ * may or may not have committed the invoice, and retrying blindly is how one billing unit becomes two
6
+ * invoices in a customer's inbox. Resolving that is a person's job and it has exactly two answers.
7
+ * The rail has nothing → re-issue with `AllowReissue`, which supersedes the claim. The rail HAS the
8
+ * invoice → bring its reference here.
9
+ *
10
+ * Until this operation existed only the first answer was implementable; the second was a hand edit in
11
+ * Explorer, which the claimed row's own message nonetheless told people to perform.
12
+ *
13
+ * IT READS THE INVOICE BACK AND REFUSES THREE WAYS, because a person is typing a reference off a
14
+ * screen and every one of these is a plausible slip:
15
+ * · ARCHIVED — an invoice the rail has withdrawn is not one the customer holds. This is the slip
16
+ * the total check cannot catch: a previously cancelled invoice for THIS unit ties exactly, by
17
+ * construction, so adopting it would mark the unit Sent for ever against a document nobody has.
18
+ * The unit would then be skipped by the sweep, refused by `CanSend`, and never billed.
19
+ * · A DIFFERENT DOCUMENT — the rail carries our own `DocumentNumber` as its invoice number (the
20
+ * send sets it), so a reference belonging to some other invoice is identifiable without guessing.
21
+ * Compared only when the rail reports one; a rail that does not is left to the total check.
22
+ * · A TOTAL THAT DOES NOT TIE — the same figure the send path proves, from the other direction.
23
+ *
24
+ * @module @mj-biz-apps/orders-core-entities-server
25
+ */
26
+ import { type IMetadataProvider, type UserInfo } from '@memberjunction/core';
27
+ import { OrdersAdoptExternalInvoiceOperation as OrdersAdoptExternalInvoiceOperationBase, type OrdersAdoptExternalInvoiceInput, type OrdersAdoptExternalInvoiceOutput } from '@mj-biz-apps/orders-entities';
28
+ export declare class AdoptExternalInvoiceOperation extends OrdersAdoptExternalInvoiceOperationBase {
29
+ protected InternalExecute(input: OrdersAdoptExternalInvoiceInput, provider: IMetadataProvider, user: UserInfo): Promise<OrdersAdoptExternalInvoiceOutput>;
30
+ }
31
+ /** Registers {@link AdoptExternalInvoiceOperation}. Called from the server bootstrap. */
32
+ export declare function LoadAdoptExternalInvoiceOperation(): void;
33
+ //# sourceMappingURL=AdoptExternalInvoiceOperation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdoptExternalInvoiceOperation.d.ts","sourceRoot":"","sources":["../src/AdoptExternalInvoiceOperation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAA6C,KAAK,iBAAiB,EAAyB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE/I,OAAO,EACH,mCAAmC,IAAI,uCAAuC,EAC9E,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACxC,MAAM,8BAA8B,CAAC;AActC,qBACa,6BAA8B,SAAQ,uCAAuC;cACtE,eAAe,CAC3B,KAAK,EAAE,+BAA+B,EACtC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,GACf,OAAO,CAAC,gCAAgC,CAAC;CAqI/C;AAiBD,yFAAyF;AACzF,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}