@zeniai/client-epic-state 5.0.82-betaAR8 → 5.0.82-betaAS1
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/lib/entity/approvalRule/approvalRulePayload.d.ts +5 -34
- package/lib/entity/approvalRule/approvalRulePayload.js +10 -130
- package/lib/entity/approvalRule/approvalRuleSelector.d.ts +1 -25
- package/lib/entity/approvalRule/approvalRuleSelector.js +0 -40
- package/lib/entity/approvalRule/approvalRuleState.d.ts +7 -59
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +0 -2
- package/lib/entity/tenant/tenantPayload.d.ts +3 -0
- package/lib/entity/tenant/tenantReducer.d.ts +1 -1
- package/lib/entity/tenant/tenantReducer.js +23 -3
- package/lib/entity/tenant/tenantState.d.ts +3 -0
- package/lib/epic.d.ts +3 -3
- package/lib/epic.js +3 -3
- package/lib/esm/entity/approvalRule/approvalRulePayload.js +10 -130
- package/lib/esm/entity/approvalRule/approvalRuleSelector.js +0 -35
- package/lib/esm/entity/snackbar/snackbarTypes.js +0 -2
- package/lib/esm/entity/tenant/tenantReducer.js +22 -2
- package/lib/esm/epic.js +3 -3
- package/lib/esm/index.js +10 -12
- package/lib/esm/view/dashboard/dashboardReducer.js +1 -5
- package/lib/esm/view/dashboard/dashboardSelector.js +1 -2
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +12 -74
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +2 -11
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +4 -9
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +7 -11
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +4 -14
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +16 -122
- package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +2 -7
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +2 -11
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +2 -9
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +7 -11
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +4 -14
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +11 -63
- package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +18 -0
- package/lib/esm/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +18 -0
- package/lib/esm/view/spendManagement/treasury/treasurySetUp/treasurySetupViewReducer.js +45 -1
- package/lib/index.d.ts +11 -13
- package/lib/index.js +32 -41
- package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
- package/lib/view/companyView/types/cockpitTypes.d.ts +1 -1
- package/lib/view/dashboard/dashboardReducer.d.ts +1 -1
- package/lib/view/dashboard/dashboardReducer.js +2 -6
- package/lib/view/dashboard/dashboardSelector.d.ts +0 -1
- package/lib/view/dashboard/dashboardSelector.js +1 -2
- package/lib/view/dashboard/dashboardState.d.ts +0 -1
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/people/peopleTypes.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +3 -14
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +13 -75
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +0 -8
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +2 -11
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +4 -9
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +6 -10
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +3 -13
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +1 -50
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +17 -124
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +5 -31
- package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +2 -7
- package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +2 -11
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +2 -9
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +6 -10
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +3 -13
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +3 -14
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +12 -64
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +0 -5
- package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.d.ts +8 -0
- package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoIntroClosedByOutsideClickEpic.js +22 -0
- package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.d.ts +8 -0
- package/lib/view/spendManagement/treasury/treasurySetUp/epic/updateTreasuryPromoRemindMeLaterClickedEpic.js +22 -0
- package/lib/view/spendManagement/treasury/treasurySetUp/treasurySetupViewReducer.d.ts +1 -1
- package/lib/view/spendManagement/treasury/treasurySetUp/treasurySetupViewReducer.js +46 -2
- package/lib/view/spendManagement/treasury/treasurySetUp/treasurySetupViewState.d.ts +2 -0
- package/lib/view/taskManager/taskListView/taskList.d.ts +3 -3
- package/package.json +1 -1
- package/lib/entity/approvalRule/approvalRuleConflict.d.ts +0 -56
- package/lib/entity/approvalRule/approvalRuleConflict.js +0 -77
- package/lib/esm/entity/approvalRule/approvalRuleConflict.js +0 -74
- package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +0 -57
- package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +0 -52
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.d.ts +0 -23
- package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +0 -61
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.d.ts +0 -14
- package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +0 -56
|
@@ -1,27 +1,11 @@
|
|
|
1
1
|
import { ApprovalRule } from './approvalRuleState';
|
|
2
|
-
/**
|
|
3
|
-
* Condition Payload — one entry inside criteria.conditions[].
|
|
4
|
-
*
|
|
5
|
-
* field examples: 'amount' | 'vendor_id' | 'department_id'
|
|
6
|
-
* type examples: 'gte' | 'lte' | 'eq' | 'in' | 'not_in'
|
|
7
|
-
* value: number for amount comparisons; string[] for in / not_in lookups.
|
|
8
|
-
*/
|
|
9
|
-
export interface ConditionPayload {
|
|
10
|
-
field: string;
|
|
11
|
-
type: string;
|
|
12
|
-
value: number | string[];
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Criteria Payload — list of conditions joined by `criteria_operator`.
|
|
16
|
-
*
|
|
17
|
-
* `currency_code` / `currency_symbol` apply to amount conditions inside
|
|
18
|
-
* `conditions[]`. Kept here pending confirmation that they should remain.
|
|
19
|
-
*/
|
|
20
2
|
export interface CriteriaPayload {
|
|
21
|
-
conditions: ConditionPayload[];
|
|
22
|
-
criteria_operator: string;
|
|
23
3
|
currency_code: string;
|
|
24
4
|
currency_symbol: string;
|
|
5
|
+
min: number;
|
|
6
|
+
range_entity: string;
|
|
7
|
+
type: string;
|
|
8
|
+
max?: number | null;
|
|
25
9
|
}
|
|
26
10
|
export interface ActorPayload {
|
|
27
11
|
type: string;
|
|
@@ -41,24 +25,11 @@ export interface StepPayload {
|
|
|
41
25
|
export interface ApprovalRulePayload {
|
|
42
26
|
approval_rule_id: string;
|
|
43
27
|
create_time: string;
|
|
44
|
-
criteria: CriteriaPayload;
|
|
28
|
+
criteria: CriteriaPayload[];
|
|
45
29
|
entity_type: string;
|
|
46
30
|
name: string | null;
|
|
47
31
|
steps: StepPayload[];
|
|
48
32
|
update_time: string;
|
|
49
|
-
are_approvals_serialized?: boolean;
|
|
50
|
-
description?: string | null;
|
|
51
|
-
is_fallback?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Approval Rules 3.0 — when `true`, the rule enforces separation of
|
|
54
|
-
* duties (a user can't approve their own request even if they are
|
|
55
|
-
* also an approver). The list-page rule card surfaces this as a
|
|
56
|
-
* green "Separation of duties" capsule.
|
|
57
|
-
*/
|
|
58
|
-
is_separation_of_duty_enabled?: boolean;
|
|
59
|
-
pending_approvals_count?: number;
|
|
60
|
-
pending_entity_approval_update_status?: string;
|
|
61
|
-
priority?: number;
|
|
62
33
|
version?: number | string;
|
|
63
34
|
}
|
|
64
35
|
/**
|
|
@@ -17,139 +17,19 @@ const toApprovalRule = (payload) => ({
|
|
|
17
17
|
version: payload.version,
|
|
18
18
|
criteria: toApprovalCriteria(payload.criteria),
|
|
19
19
|
steps: toApprovalSteps(payload.steps),
|
|
20
|
-
description: payload.description ?? undefined,
|
|
21
|
-
priority: payload.priority,
|
|
22
|
-
isFallback: payload.is_fallback ?? false,
|
|
23
|
-
separationOfDuties: payload.is_separation_of_duty_enabled ?? false,
|
|
24
|
-
areApprovalsSerialized: payload.are_approvals_serialized,
|
|
25
|
-
pendingApprovalsCount: payload.pending_approvals_count,
|
|
26
|
-
pendingEntityApprovalUpdateStatus: payload.pending_entity_approval_update_status,
|
|
27
20
|
});
|
|
28
21
|
exports.toApprovalRule = toApprovalRule;
|
|
29
|
-
/**
|
|
30
|
-
* Maps the wire-level criteria block into the state-side discriminated
|
|
31
|
-
* `Criteria[]` union.
|
|
32
|
-
*
|
|
33
|
-
* The wire keeps each condition as a flat row inside `conditions[]`.
|
|
34
|
-
* Amount comparisons can show up as a `gte` only, a `lte` only, or a
|
|
35
|
-
* `gte` + `lte` pair — those collapse into a single AmountCriteria whose
|
|
36
|
-
* `comparator` is `greater_than`, `less_than`, or `range` respectively.
|
|
37
|
-
*
|
|
38
|
-
* Vendor and department conditions map one-to-one: `in` becomes `is`,
|
|
39
|
-
* `not_in` becomes `is_not`.
|
|
40
|
-
*
|
|
41
|
-
* Resilient to two forms of upstream drift:
|
|
42
|
-
* - Missing / null criteria → returns [].
|
|
43
|
-
* - Legacy criteria shape (array of amount-range objects, the pre-3.0
|
|
44
|
-
* wire) → converted to an AmountCriteria so existing rules in production
|
|
45
|
-
* still render while the backend rolls out.
|
|
46
|
-
*/
|
|
47
22
|
const toApprovalCriteria = (payload) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
const results = [];
|
|
59
|
-
const amountCriteria = toAmountCriteria(payload);
|
|
60
|
-
if (amountCriteria != null) {
|
|
61
|
-
results.push(amountCriteria);
|
|
62
|
-
}
|
|
63
|
-
payload.conditions
|
|
64
|
-
.filter((condition) => condition.field === 'vendor_id')
|
|
65
|
-
.forEach((condition) => {
|
|
66
|
-
const vendor = toVendorCriteria(condition);
|
|
67
|
-
if (vendor != null) {
|
|
68
|
-
results.push(vendor);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
payload.conditions
|
|
72
|
-
.filter((condition) => condition.field === 'department_id')
|
|
73
|
-
.forEach((condition) => {
|
|
74
|
-
const department = toDepartmentCriteria(condition);
|
|
75
|
-
if (department != null) {
|
|
76
|
-
results.push(department);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
return results;
|
|
80
|
-
};
|
|
81
|
-
const legacyAmountRangeToCriteria = (legacy) => {
|
|
82
|
-
if (legacy.length === 0) {
|
|
83
|
-
return [];
|
|
84
|
-
}
|
|
85
|
-
const first = legacy[0] ?? {};
|
|
86
|
-
const currency = first.currency_code ?? 'USD';
|
|
87
|
-
const symbol = first.currency_symbol ?? '$';
|
|
88
|
-
const min = typeof first.min === 'number'
|
|
89
|
-
? (0, amount_1.toAmount)(first.min, currency, symbol)
|
|
90
|
-
: undefined;
|
|
91
|
-
const max = typeof first.max === 'number'
|
|
92
|
-
? (0, amount_1.toAmount)(first.max, currency, symbol)
|
|
93
|
-
: undefined;
|
|
94
|
-
if (min == null && max == null) {
|
|
95
|
-
return [];
|
|
96
|
-
}
|
|
97
|
-
const comparator = min != null && max != null
|
|
98
|
-
? 'range'
|
|
99
|
-
: min != null
|
|
100
|
-
? 'greater_than'
|
|
101
|
-
: 'less_than';
|
|
102
|
-
return [{ type: 'amount', comparator, min, max }];
|
|
103
|
-
};
|
|
104
|
-
const toAmountCriteria = (payload) => {
|
|
105
|
-
if (!Array.isArray(payload.conditions)) {
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
const amountConditions = payload.conditions.filter((condition) => condition.field === 'amount');
|
|
109
|
-
const gteCondition = amountConditions.find((condition) => condition.type === 'gte' || condition.type === 'eq');
|
|
110
|
-
const lteCondition = amountConditions.find((condition) => condition.type === 'lte');
|
|
111
|
-
if (gteCondition == null && lteCondition == null) {
|
|
112
|
-
return undefined;
|
|
113
|
-
}
|
|
114
|
-
const currencyCode = payload.currency_code ?? 'USD';
|
|
115
|
-
const currencySymbol = payload.currency_symbol ?? '$';
|
|
116
|
-
const min = typeof gteCondition?.value === 'number'
|
|
117
|
-
? (0, amount_1.toAmount)(gteCondition.value, currencyCode, currencySymbol)
|
|
118
|
-
: undefined;
|
|
119
|
-
const max = typeof lteCondition?.value === 'number'
|
|
120
|
-
? (0, amount_1.toAmount)(lteCondition.value, currencyCode, currencySymbol)
|
|
121
|
-
: undefined;
|
|
122
|
-
let comparator;
|
|
123
|
-
if (min != null && max != null) {
|
|
124
|
-
comparator = 'range';
|
|
125
|
-
}
|
|
126
|
-
else if (min != null) {
|
|
127
|
-
comparator = 'greater_than';
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
comparator = 'less_than';
|
|
131
|
-
}
|
|
132
|
-
return { type: 'amount', comparator, min, max };
|
|
133
|
-
};
|
|
134
|
-
const toVendorCriteria = (condition) => {
|
|
135
|
-
if (!Array.isArray(condition.value)) {
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
type: 'vendor',
|
|
140
|
-
operator: condition.type === 'not_in' ? 'is_not' : 'is',
|
|
141
|
-
vendorIds: condition.value,
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
const toDepartmentCriteria = (condition) => {
|
|
145
|
-
if (!Array.isArray(condition.value)) {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
type: 'department',
|
|
150
|
-
operator: condition.type === 'not_in' ? 'is_not' : 'is',
|
|
151
|
-
departmentIds: condition.value,
|
|
152
|
-
};
|
|
23
|
+
return payload.map((criteria) => ({
|
|
24
|
+
rangeType: criteria.type,
|
|
25
|
+
rangeEntity: criteria.range_entity,
|
|
26
|
+
range: {
|
|
27
|
+
min: (0, amount_1.toAmount)(criteria.min, criteria.currency_code, criteria.currency_symbol),
|
|
28
|
+
max: criteria.max != null
|
|
29
|
+
? (0, amount_1.toAmount)(criteria.max, criteria.currency_code, criteria.currency_symbol)
|
|
30
|
+
: undefined,
|
|
31
|
+
},
|
|
32
|
+
}));
|
|
153
33
|
};
|
|
154
34
|
const toApprovalSteps = (payload) => {
|
|
155
35
|
return payload.map((step) => ({
|
|
@@ -1,28 +1,4 @@
|
|
|
1
1
|
import { ID } from '../../commonStateTypes/common';
|
|
2
|
-
import {
|
|
3
|
-
import { AmountCriteria, ApprovalRule, ApprovalRuleState, Criteria, DepartmentCriteria, VendorCriteria } from './approvalRuleState';
|
|
2
|
+
import { ApprovalRule, ApprovalRuleState } from './approvalRuleState';
|
|
4
3
|
export declare function getApprovalRuleById(approvalRuleState: ApprovalRuleState, approvalRuleId: ID): ApprovalRule | undefined;
|
|
5
4
|
export declare function getApprovalRulesByIds(approvalRuleState: ApprovalRuleState, approvalRuleIds: ID[]): ApprovalRule[];
|
|
6
|
-
/**
|
|
7
|
-
* Returns the amount-range portion of a rule's criteria, if any.
|
|
8
|
-
*
|
|
9
|
-
* Use this whenever a caller needs to read amount min/max from the new
|
|
10
|
-
* discriminated `Criteria` union without inlining a type guard.
|
|
11
|
-
*/
|
|
12
|
-
export declare function getAmountCriteria(criteria: Criteria[]): AmountCriteria | undefined;
|
|
13
|
-
export declare function getVendorCriteria(criteria: Criteria[]): VendorCriteria | undefined;
|
|
14
|
-
export declare function getDepartmentCriteria(criteria: Criteria[]): DepartmentCriteria | undefined;
|
|
15
|
-
/**
|
|
16
|
-
* Returns all rules of the given entityType, sorted by `priority` ascending.
|
|
17
|
-
*
|
|
18
|
-
* Rules without a `priority` value sort to the end (treated as Infinity).
|
|
19
|
-
* Use this for the list page where rules render in evaluation order.
|
|
20
|
-
*/
|
|
21
|
-
export declare function getApprovalRulesByEntityType(approvalRuleState: ApprovalRuleState, entityType: EntityType): ApprovalRule[];
|
|
22
|
-
/**
|
|
23
|
-
* Returns the tenant's fallback rule for the given entityType, if one exists.
|
|
24
|
-
*
|
|
25
|
-
* The fallback rule is shown by the "fallback engine active" banner on the
|
|
26
|
-
* list page and is used to handle bills/reimbursements that match no other rule.
|
|
27
|
-
*/
|
|
28
|
-
export declare function getFallbackApprovalRule(approvalRuleState: ApprovalRuleState, entityType: EntityType): ApprovalRule | undefined;
|
|
@@ -2,11 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getApprovalRuleById = getApprovalRuleById;
|
|
4
4
|
exports.getApprovalRulesByIds = getApprovalRulesByIds;
|
|
5
|
-
exports.getAmountCriteria = getAmountCriteria;
|
|
6
|
-
exports.getVendorCriteria = getVendorCriteria;
|
|
7
|
-
exports.getDepartmentCriteria = getDepartmentCriteria;
|
|
8
|
-
exports.getApprovalRulesByEntityType = getApprovalRulesByEntityType;
|
|
9
|
-
exports.getFallbackApprovalRule = getFallbackApprovalRule;
|
|
10
5
|
function getApprovalRuleById(approvalRuleState, approvalRuleId) {
|
|
11
6
|
return approvalRuleState.approvalRuleById[approvalRuleId] ?? undefined;
|
|
12
7
|
}
|
|
@@ -16,38 +11,3 @@ function getApprovalRulesByIds(approvalRuleState, approvalRuleIds) {
|
|
|
16
11
|
.filter((value) => value != null);
|
|
17
12
|
return approvalRulesByIds;
|
|
18
13
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Returns the amount-range portion of a rule's criteria, if any.
|
|
21
|
-
*
|
|
22
|
-
* Use this whenever a caller needs to read amount min/max from the new
|
|
23
|
-
* discriminated `Criteria` union without inlining a type guard.
|
|
24
|
-
*/
|
|
25
|
-
function getAmountCriteria(criteria) {
|
|
26
|
-
return criteria.find((c) => c.type === 'amount');
|
|
27
|
-
}
|
|
28
|
-
function getVendorCriteria(criteria) {
|
|
29
|
-
return criteria.find((c) => c.type === 'vendor');
|
|
30
|
-
}
|
|
31
|
-
function getDepartmentCriteria(criteria) {
|
|
32
|
-
return criteria.find((c) => c.type === 'department');
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Returns all rules of the given entityType, sorted by `priority` ascending.
|
|
36
|
-
*
|
|
37
|
-
* Rules without a `priority` value sort to the end (treated as Infinity).
|
|
38
|
-
* Use this for the list page where rules render in evaluation order.
|
|
39
|
-
*/
|
|
40
|
-
function getApprovalRulesByEntityType(approvalRuleState, entityType) {
|
|
41
|
-
return Object.values(approvalRuleState.approvalRuleById)
|
|
42
|
-
.filter((rule) => rule.entityType === entityType)
|
|
43
|
-
.sort((a, b) => (a.priority ?? Infinity) - (b.priority ?? Infinity));
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Returns the tenant's fallback rule for the given entityType, if one exists.
|
|
47
|
-
*
|
|
48
|
-
* The fallback rule is shown by the "fallback engine active" banner on the
|
|
49
|
-
* list page and is used to handle bills/reimbursements that match no other rule.
|
|
50
|
-
*/
|
|
51
|
-
function getFallbackApprovalRule(approvalRuleState, entityType) {
|
|
52
|
-
return Object.values(approvalRuleState.approvalRuleById).find((rule) => rule.entityType === entityType && rule.isFallback === true);
|
|
53
|
-
}
|
|
@@ -25,48 +25,14 @@ export interface Actor {
|
|
|
25
25
|
subType?: AttributeType | RoleType;
|
|
26
26
|
userId?: ID;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* Form-side, the rule create/edit form uses `ApprovalRuleFormCriteria`
|
|
36
|
-
* (defined in commonState) — a structured object with named slots for
|
|
37
|
-
* amount/vendor/department. Epics translate between the two.
|
|
38
|
-
*/
|
|
39
|
-
export type AmountComparator = 'greater_than' | 'less_than' | 'range';
|
|
40
|
-
export interface AmountCriteria {
|
|
41
|
-
comparator: AmountComparator;
|
|
42
|
-
type: 'amount';
|
|
43
|
-
/** Upper bound. Present for `less_than` and `range`. */
|
|
44
|
-
max?: Amount;
|
|
45
|
-
/** Lower bound. Present for `greater_than` and `range`. */
|
|
46
|
-
min?: Amount;
|
|
47
|
-
}
|
|
48
|
-
export interface VendorCriteria {
|
|
49
|
-
operator: 'is' | 'is_not';
|
|
50
|
-
type: 'vendor';
|
|
51
|
-
vendorIds: ID[];
|
|
28
|
+
export interface Criteria {
|
|
29
|
+
range: {
|
|
30
|
+
min: Amount;
|
|
31
|
+
max?: Amount;
|
|
32
|
+
};
|
|
33
|
+
rangeEntity: string;
|
|
34
|
+
rangeType: string;
|
|
52
35
|
}
|
|
53
|
-
export interface DepartmentCriteria {
|
|
54
|
-
departmentIds: ID[];
|
|
55
|
-
operator: 'is' | 'is_not';
|
|
56
|
-
type: 'department';
|
|
57
|
-
}
|
|
58
|
-
export type Criteria = AmountCriteria | VendorCriteria | DepartmentCriteria;
|
|
59
|
-
/**
|
|
60
|
-
* Approval Rules 3.0 — canonical discriminator across the three
|
|
61
|
-
* condition variants. Derived from the `Criteria` union's `type`
|
|
62
|
-
* field so it can't drift from the underlying data model.
|
|
63
|
-
*
|
|
64
|
-
* Used by the unified `ConditionRow` UI component to switch which
|
|
65
|
-
* variant body to render, and by chip-rendering helpers on the list
|
|
66
|
-
* page to pick a label format. Consumers should import this type
|
|
67
|
-
* rather than redeclaring the three string literals locally.
|
|
68
|
-
*/
|
|
69
|
-
export type ConditionType = Criteria['type'];
|
|
70
36
|
export interface Step {
|
|
71
37
|
actors: Actor[];
|
|
72
38
|
operator: StepOperatorType;
|
|
@@ -85,25 +51,7 @@ export interface ApprovalRule {
|
|
|
85
51
|
entityType: EntityType;
|
|
86
52
|
steps: Step[];
|
|
87
53
|
updateTime: ZeniDate;
|
|
88
|
-
/** Backend bookkeeping: whether approval steps must run serialized. */
|
|
89
|
-
areApprovalsSerialized?: boolean;
|
|
90
|
-
/** Free-text description shown beneath the rule name on the list page. */
|
|
91
|
-
description?: string;
|
|
92
|
-
/** True when this rule is the tenant's default fallback rule. */
|
|
93
|
-
isFallback?: boolean;
|
|
94
54
|
name?: string;
|
|
95
|
-
/** Backend bookkeeping: number of entities currently pending against this rule. */
|
|
96
|
-
pendingApprovalsCount?: number;
|
|
97
|
-
/** Backend bookkeeping: status of background updates against this rule. */
|
|
98
|
-
pendingEntityApprovalUpdateStatus?: string;
|
|
99
|
-
/** Rule's position in the evaluation order; lower number = higher priority. */
|
|
100
|
-
priority?: number;
|
|
101
|
-
/**
|
|
102
|
-
* When on, the creator of a bill/reimbursement cannot auto-approve
|
|
103
|
-
* their own request even if they are also an approver. Backend spec
|
|
104
|
-
* is still pending — kept optional for now.
|
|
105
|
-
*/
|
|
106
|
-
separationOfDuties?: boolean;
|
|
107
55
|
version?: number | string;
|
|
108
56
|
}
|
|
109
57
|
export interface Approvers {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const toSnackbarMessageSection: (v: string) => "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "
|
|
1
|
+
export declare const toSnackbarMessageSection: (v: string) => "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "reimbursement_create_mileage" | "reimbursement_update_mileage" | "reimbursement_accept_term" | "reimbursement_accept_employee_term" | "reimbursement_bulk_submit" | "reimbursement_bulk_processed" | "bill_pay_setup" | "zeni_accounts_setup" | "bill_pay_approval_create" | "bill_pay_duplicate_approval_create" | "bill_pay_approval_update" | "bill_pay_duplicate_approval_update" | "bill_pay_approval_delete" | "bill_pay_updated" | "bill_pay_deleted" | "bill_pay_cancelled_deleted" | "bill_pay_cancelled" | "bill_pay_approved" | "real_time_approver_added" | "bill_pay_rejected" | "bill_pay_sent_for_approval" | "bill_pay_accept_term" | "bill_pay_bulk_submit" | "bill_pay_bulk_processed" | "bill_pay_refund" | "bill_pay_retry" | "bill_pay_marked_as_paid" | "zeni_account_accept_term" | "update_vendor" | "data_refresh_update" | "delete_bank_account" | "create_bank_account" | "create_bank_account_ach" | "create_bank_account_wire" | "create_bank_account_international" | "transfer_money" | "update_zeni_account_nickname" | "create_checking_account" | "deposit_check" | "create_vendor" | "onboarding_customer_view" | "onboarding_customer_view_complete" | "onboarding_customer_identity_verification_save" | "onboarding_customer_identity_verification_submit" | "onboarding_customer_business_verification_save" | "onboarding_customer_business_verification_submit" | "retry_bank_account_connection" | "dashboard_invite_sent" | "onboarding_info_saved" | "approve_original_merchant" | "approve_global_merchant" | "reject_global_merchant" | "create_global_merchant" | "fetch_global_merchant_no_recommendation" | "save_vendor_renamed" | "save_vendor_sent_for_review" | "save_vendor_marked_as_employee" | "save_vendor_marked_as_local_contractor" | "charge_card_setup" | "charge_card_accept_term" | "charge_card_receipt_upload" | "charge_card_resend_invite" | "charge_card_revoke_invite" | "charge_card_update_limit" | "charge_cards_update_limit" | "close_charge_card" | "lock_charge_card" | "lock_charge_card_card_user" | "lock_charge_cards" | "unlock_charge_card" | "unlock_charge_card_card_user" | "unlock_charge_cards" | "close_charge_cards" | "revoke_invite_charge_cards" | "charge_card_express_interest" | "create_schedule" | "save_schedule" | "delete_schedule" | "ignore_schedule" | "save_task_detail" | "fetch_task_detail" | "delete_task" | "archive_task" | "snooze_task" | "unsnooze_task" | "create_tag" | "delete_tag" | "update_charge_card" | "update_charge_card_name" | "update_charge_card_name_card_user" | "issue_charge_card" | "issue_charge_cards" | "notification_settings_saved" | "referral_invite_sent" | "notification_mark_as_read" | "mark_as_complete_schedule" | "cancel_journal_entry" | "settings_accounting_accounts_updated" | "create_card_setup" | "confirm_card_setup" | "add_card_payment_source" | "fetch_payment_sources" | "task_assigned_toast_notification" | "task_due_tomorrow_toast_notification" | "task_deleted_toast_notification" | "task_archived_toast_notification" | "task_overdue_toast_notification" | "task_overdue_toast_notification_creator" | "task_notification_count" | "task_activities_toast_notification" | "task_created_toast_notification" | "task_group_creation_success" | "task_group_deletion_success" | "task_group_update_success" | "primary_funding_account_updated" | "task_time_spent_validation" | "missing_receipts_attachment" | "flux_analysis_unreviewed" | "flux_analysis_reviewed" | "receipt_match" | "receipts_upload" | "receipts_bulk_match" | "billing_address_view" | "express_pay_submit" | "exclude_transaction" | "reconcile" | "save_reconcile_for_later" | "recon_transaction_categorize" | "recon_transaction_match" | "update_debit_card_pin_attempt" | "set_debit_card_pin" | "ai_cfo_create_session_and_submit" | "ai_cfo_chat_session_deleted" | "charge_card_auto_pay_enable" | "charge_card_auto_pay_disable" | "treasury_setup" | "treasury_accept_term" | "treasury_transfer_money" | "treasury_transfer_money_failed" | "auto_transfer_rule_create" | "auto_transfer_rule_update" | "auto_transfer_rule_delete" | "auto_transfer_rule_pause" | "auto_transfer_rule_resume" | "treasury_update_portfolio_allocation" | "send_email_magic_link_to_user" | "complete_profile_done" | "create_transfer_entry" | "reports_resync" | "invalid_phone_number" | "transactions_categorized_updated_failed" | "transaction_categorized_updated_failed" | "transactionsCategorized_transactionsUpdated" | "transactionsCategorized_transactionUpdated" | "transactionCategorized_transactionsUpdated" | "transactionCategorized_transactionUpdated" | "transactionsCategorized_transactionsFailed" | "transactionsCategorized_transactionFailed" | "transactionCategorized_transactionsFailed" | "transactionCategorized_transactionFailed" | "transactionsUpdated_transactionsFailed" | "transactionsUpdated_transactionFailed" | "transactionUpdated_transactionsFailed" | "transactionUpdated_transactionFailed" | "transactionsCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionsUpdated_transactionFailed" | "transactionsCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionUpdated_transactionFailed" | "transactionCategorized_transactionsUpdated_transactionFailed" | "transactionCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionUpdated_transactionFailed" | "accounting_classes_enabled_update" | "account_excluded_from_reconciliation" | "account_included_in_reconciliation" | "ai_accountant_trigger_job" | "oauth_consent_approve" | "oauth_consent_invalid_request" | "credit_agent_update_profile" | "credit_agent_save_macro" | "credit_agent_schedule_cron";
|
|
2
2
|
export type SnackbarMessageSections = ReturnType<typeof toSnackbarMessageSection>;
|
|
3
3
|
export declare const toSnackbarMessageSectionTexts: (v: string) => "notification" | "failed" | "success";
|
|
4
4
|
export type SnackbarMessageSectionTexts = ReturnType<typeof toSnackbarMessageSectionTexts>;
|
|
@@ -35,7 +35,6 @@ const ALL_SNACKBAR_MESSAGE_SECTIONS = [
|
|
|
35
35
|
'reimbursement_approval_update',
|
|
36
36
|
'reimbursement_duplicate_approval_update',
|
|
37
37
|
'reimbursement_approval_delete',
|
|
38
|
-
'reimbursement_approval_reorder',
|
|
39
38
|
'reimbursement_create_mileage',
|
|
40
39
|
'reimbursement_update_mileage',
|
|
41
40
|
'reimbursement_accept_term',
|
|
@@ -49,7 +48,6 @@ const ALL_SNACKBAR_MESSAGE_SECTIONS = [
|
|
|
49
48
|
'bill_pay_approval_update',
|
|
50
49
|
'bill_pay_duplicate_approval_update',
|
|
51
50
|
'bill_pay_approval_delete',
|
|
52
|
-
'bill_pay_approval_reorder',
|
|
53
51
|
'bill_pay_updated',
|
|
54
52
|
'bill_pay_deleted',
|
|
55
53
|
'bill_pay_cancelled_deleted',
|
|
@@ -18,7 +18,10 @@ export interface TenantsData {
|
|
|
18
18
|
*/
|
|
19
19
|
export interface TenantUserPayload {
|
|
20
20
|
rewards_feature_last_viewed_time: string | null;
|
|
21
|
+
is_treasury_promo_intro_closed_by_outside_click?: boolean;
|
|
21
22
|
is_treasury_promo_video_played?: boolean;
|
|
23
|
+
is_treasury_promo_video_remind_me_later_clicked?: boolean;
|
|
24
|
+
login_counter_for_treasury_promo_video?: number;
|
|
22
25
|
}
|
|
23
26
|
interface TenantPayload {
|
|
24
27
|
accounting_class_ids: string[];
|
|
@@ -198,7 +198,7 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
|
|
|
198
198
|
}, "tenant/updateSubscriptionSummaryForTenantFailure", never, never>, updateOnboardingTenants: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[tenants: TenantPayload[], tenantUpdated?: any], {
|
|
199
199
|
tenants: TenantPayload[];
|
|
200
200
|
tenantUpdated: any;
|
|
201
|
-
}, "tenant/updateOnboardingTenants", never, never>, removeOnboardingTenant: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "tenant/removeOnboardingTenant">, updateTenantReimbursementInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserRolePayload, "tenant/updateTenantReimbursementInfo">, updateReferViewedForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateReferViewedForLoggedInUser">, updateTreasuryVideoViewedForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateTreasuryVideoViewedForLoggedInUser">, resetSignInState: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/resetSignInState">, trigger2FA: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[otpChallenge: string, userEmail: string, twoFAPhoneNumber: string], {
|
|
201
|
+
}, "tenant/updateOnboardingTenants", never, never>, removeOnboardingTenant: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "tenant/removeOnboardingTenant">, updateTenantReimbursementInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserRolePayload, "tenant/updateTenantReimbursementInfo">, updateReferViewedForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateReferViewedForLoggedInUser">, updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser">, updateTreasuryPromoRemindMeLaterClickedForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateTreasuryPromoRemindMeLaterClickedForLoggedInUser">, updateTreasuryVideoViewedForLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/updateTreasuryVideoViewedForLoggedInUser">, resetSignInState: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/resetSignInState">, trigger2FA: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[otpChallenge: string, userEmail: string, twoFAPhoneNumber: string], {
|
|
202
202
|
otpChallenge: string;
|
|
203
203
|
userEmail: string;
|
|
204
204
|
twoFAPhoneNumber: string;
|
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
var _a;
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.updateSubscriptionSummaryForTenantFailure = exports.updateSubscriptionSummaryForTenantSuccess = exports.fetchSubscriptionSummaryForTenant = exports.clearAll = exports.deleteConnectionFailure = exports.deleteConnectionSuccess = exports.deleteConnection = exports.saveConnectorCredentialsFailure = exports.saveConnectorCredentialsSuccess = exports.saveConnectorCredentials = exports.saveOAuthConnectionFailure = exports.saveOAuthConnectionSuccess = exports.saveOAuthConnection = exports.saveAPIKeyConnectionFailure = exports.saveAPIKeyConnectionSuccess = exports.saveAPIKeyConnection = exports.fetchExternalConnectionsSuccess = exports.fetchExternalConnectionsFailure = exports.saveExternalConnectionFailure = exports.saveExternalConnectionSuccess = exports.saveExternalConnection = exports.fetchExternalConnections = exports.updateLoggedInUser = exports.sessionHeartbeatFailure = exports.sessionHeartbeatSuccess = exports.sendSessionHeartbeat = exports.signOutSuccess = exports.doSignOut = exports.updateSignInState = exports.sendEmailMagicLinkToUserFailure = exports.sendEmailMagicLinkToUserSuccess = exports.sendEmailMagicLinkToUser = exports.magicLinkSignInFailure = exports.magicLinkSignInSuccess = exports.doMagicLinkSignIn = exports.doSignIn = exports.updateExcludedResourcesFailure = exports.updateExcludedResourcesSuccess = exports.fetchExcludedResources = exports.updateCurrentTenant = exports.updateTenantFailure = exports.updateTenantSuccess = exports.fetchActiveTenant = exports.updateTenantsFailure = exports.updateTenantsSuccess = exports.fetchAllTenants = exports.updateTenants = exports.initialState = exports.toExternalSupportedTool = exports.toExternalIntegrationType = void 0;
|
|
8
|
-
exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = void 0;
|
|
8
|
+
exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateTreasuryPromoRemindMeLaterClickedForLoggedInUser = exports.updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = void 0;
|
|
9
9
|
exports.mapConnectionsPayloadToState = mapConnectionsPayloadToState;
|
|
10
10
|
const toolkit_1 = require("@reduxjs/toolkit");
|
|
11
11
|
const js_base64_1 = require("js-base64");
|
|
@@ -119,12 +119,18 @@ const tenant = (0, toolkit_1.createSlice)({
|
|
|
119
119
|
draft.fetchState = 'Completed';
|
|
120
120
|
draft.error = undefined;
|
|
121
121
|
const [tenantsbyId, tenantIds, firstUser] = mapTenantsPayloadToState(tenants, user);
|
|
122
|
-
// Preserve existing
|
|
122
|
+
// Preserve existing treasury promo video values
|
|
123
123
|
tenantIds.forEach((tenantId) => {
|
|
124
124
|
const existingTenant = draft.tenantsById[tenantId];
|
|
125
125
|
if (existingTenant != null) {
|
|
126
126
|
tenantsbyId[tenantId].isTreasuryVideoViewed =
|
|
127
127
|
existingTenant.isTreasuryVideoViewed;
|
|
128
|
+
tenantsbyId[tenantId].isTreasuryPromoRemindMeLaterClicked =
|
|
129
|
+
existingTenant.isTreasuryPromoRemindMeLaterClicked;
|
|
130
|
+
tenantsbyId[tenantId].treasuryPromoLoginCountAfterRemindMeLater =
|
|
131
|
+
existingTenant.treasuryPromoLoginCountAfterRemindMeLater;
|
|
132
|
+
tenantsbyId[tenantId].isTreasuryPromoIntroClosedByOutsideClick =
|
|
133
|
+
existingTenant.isTreasuryPromoIntroClosedByOutsideClick;
|
|
128
134
|
}
|
|
129
135
|
});
|
|
130
136
|
draft.tenantsById = tenantsbyId;
|
|
@@ -737,6 +743,17 @@ const tenant = (0, toolkit_1.createSlice)({
|
|
|
737
743
|
draft.tenantsById[draft.currentTenantId].isTreasuryVideoViewed = true;
|
|
738
744
|
}
|
|
739
745
|
},
|
|
746
|
+
updateTreasuryPromoRemindMeLaterClickedForLoggedInUser(draft) {
|
|
747
|
+
if (draft.currentTenantId != null) {
|
|
748
|
+
draft.tenantsById[draft.currentTenantId].isTreasuryPromoRemindMeLaterClicked = true;
|
|
749
|
+
draft.tenantsById[draft.currentTenantId].treasuryPromoLoginCountAfterRemindMeLater = 0;
|
|
750
|
+
}
|
|
751
|
+
},
|
|
752
|
+
updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser(draft) {
|
|
753
|
+
if (draft.currentTenantId != null) {
|
|
754
|
+
draft.tenantsById[draft.currentTenantId].isTreasuryPromoIntroClosedByOutsideClick = true;
|
|
755
|
+
}
|
|
756
|
+
},
|
|
740
757
|
trigger2FA: {
|
|
741
758
|
prepare(otpChallenge, userEmail, twoFAPhoneNumber) {
|
|
742
759
|
return { payload: { otpChallenge, userEmail, twoFAPhoneNumber } };
|
|
@@ -796,7 +813,7 @@ const tenant = (0, toolkit_1.createSlice)({
|
|
|
796
813
|
},
|
|
797
814
|
},
|
|
798
815
|
});
|
|
799
|
-
_a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.sendSessionHeartbeat = _a.sendSessionHeartbeat, exports.sessionHeartbeatSuccess = _a.sessionHeartbeatSuccess, exports.sessionHeartbeatFailure = _a.sessionHeartbeatFailure, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.saveAPIKeyConnection = _a.saveAPIKeyConnection, exports.saveAPIKeyConnectionSuccess = _a.saveAPIKeyConnectionSuccess, exports.saveAPIKeyConnectionFailure = _a.saveAPIKeyConnectionFailure, exports.saveOAuthConnection = _a.saveOAuthConnection, exports.saveOAuthConnectionSuccess = _a.saveOAuthConnectionSuccess, exports.saveOAuthConnectionFailure = _a.saveOAuthConnectionFailure, exports.saveConnectorCredentials = _a.saveConnectorCredentials, exports.saveConnectorCredentialsSuccess = _a.saveConnectorCredentialsSuccess, exports.saveConnectorCredentialsFailure = _a.saveConnectorCredentialsFailure, exports.deleteConnection = _a.deleteConnection, exports.deleteConnectionSuccess = _a.deleteConnectionSuccess, exports.deleteConnectionFailure = _a.deleteConnectionFailure, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
|
|
816
|
+
_a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.sendSessionHeartbeat = _a.sendSessionHeartbeat, exports.sessionHeartbeatSuccess = _a.sessionHeartbeatSuccess, exports.sessionHeartbeatFailure = _a.sessionHeartbeatFailure, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.saveAPIKeyConnection = _a.saveAPIKeyConnection, exports.saveAPIKeyConnectionSuccess = _a.saveAPIKeyConnectionSuccess, exports.saveAPIKeyConnectionFailure = _a.saveAPIKeyConnectionFailure, exports.saveOAuthConnection = _a.saveOAuthConnection, exports.saveOAuthConnectionSuccess = _a.saveOAuthConnectionSuccess, exports.saveOAuthConnectionFailure = _a.saveOAuthConnectionFailure, exports.saveConnectorCredentials = _a.saveConnectorCredentials, exports.saveConnectorCredentialsSuccess = _a.saveConnectorCredentialsSuccess, exports.saveConnectorCredentialsFailure = _a.saveConnectorCredentialsFailure, exports.deleteConnection = _a.deleteConnection, exports.deleteConnectionSuccess = _a.deleteConnectionSuccess, exports.deleteConnectionFailure = _a.deleteConnectionFailure, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser = _a.updateTreasuryPromoIntroClosedByOutsideClickForLoggedInUser, exports.updateTreasuryPromoRemindMeLaterClickedForLoggedInUser = _a.updateTreasuryPromoRemindMeLaterClickedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
|
|
800
817
|
exports.default = tenant.reducer;
|
|
801
818
|
/**
|
|
802
819
|
* Converts tenants payload to Tenant and User State
|
|
@@ -874,6 +891,9 @@ function mapTenantPayloadToTenant(payload, userTenantPayload) {
|
|
|
874
891
|
? (0, zeniDayJS_1.date)(userTenantPayload.rewards_feature_last_viewed_time)
|
|
875
892
|
: undefined,
|
|
876
893
|
isTreasuryVideoViewed: userTenantPayload?.is_treasury_promo_video_played,
|
|
894
|
+
isTreasuryPromoRemindMeLaterClicked: userTenantPayload?.is_treasury_promo_video_remind_me_later_clicked,
|
|
895
|
+
treasuryPromoLoginCountAfterRemindMeLater: userTenantPayload?.login_counter_for_treasury_promo_video ?? 0,
|
|
896
|
+
isTreasuryPromoIntroClosedByOutsideClick: userTenantPayload?.is_treasury_promo_intro_closed_by_outside_click,
|
|
877
897
|
zeniBookCloseDate: payload.zeni_book_close_date != null
|
|
878
898
|
? (0, zeniDayJS_1.date)(payload.zeni_book_close_date)
|
|
879
899
|
: undefined,
|
|
@@ -100,9 +100,12 @@ export interface Tenant {
|
|
|
100
100
|
userRoleId: ID;
|
|
101
101
|
bookCloseDate?: ZeniDate;
|
|
102
102
|
hubSpotId?: ID;
|
|
103
|
+
isTreasuryPromoIntroClosedByOutsideClick?: boolean;
|
|
104
|
+
isTreasuryPromoRemindMeLaterClicked?: boolean;
|
|
103
105
|
isTreasuryVideoViewed?: boolean;
|
|
104
106
|
masterTOSInfo?: MasterTOSInfo;
|
|
105
107
|
rewardsLastViewedTime?: ZeniDate;
|
|
108
|
+
treasuryPromoLoginCountAfterRemindMeLater?: number;
|
|
106
109
|
userReimbursementInfo?: UserReimbursementInfo;
|
|
107
110
|
zeniBookCloseDate?: ZeniDate;
|
|
108
111
|
zeniBookCloseMonthAndYear?: MonthYearPeriod;
|