@zeniai/client-epic-state 5.0.95-betaAK1 → 5.0.95
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/commonStateTypes/amount.d.ts +0 -1
- package/lib/commonStateTypes/amount.js +1 -9
- package/lib/commonStateTypes/workingDayHelper.d.ts +0 -9
- package/lib/commonStateTypes/workingDayHelper.js +1 -28
- package/lib/entity/tenant/clearAllEpic.d.ts +1 -3
- package/lib/entity/tenant/clearAllEpic.js +0 -4
- package/lib/epic.d.ts +1 -7
- package/lib/epic.js +1 -7
- package/lib/esm/commonStateTypes/amount.js +0 -7
- package/lib/esm/commonStateTypes/workingDayHelper.js +0 -26
- package/lib/esm/entity/tenant/clearAllEpic.js +0 -4
- package/lib/esm/epic.js +1 -7
- package/lib/esm/index.js +2 -7
- package/lib/esm/reducer.js +0 -6
- package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +2 -22
- package/lib/index.d.ts +3 -12
- package/lib/index.js +17 -37
- package/lib/reducer.d.ts +0 -6
- package/lib/reducer.js +0 -6
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.d.ts +1 -8
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +1 -21
- package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.d.ts +0 -22
- package/lib/zeniAPI.d.ts +0 -1
- package/package.json +1 -1
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +0 -29
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +0 -78
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +0 -47
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +0 -47
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +0 -34
- package/lib/esm/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +0 -32
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +0 -54
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +0 -92
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +0 -225
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +0 -10
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +0 -23
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +0 -36
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +0 -27
- package/lib/esm/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +0 -28
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.d.ts +0 -47
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowPayload.js +0 -34
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.d.ts +0 -23
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowReducer.js +0 -82
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.d.ts +0 -40
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowSelector.js +0 -51
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.d.ts +0 -37
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/autoSweepFlowState.js +0 -53
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.d.ts +0 -14
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/fetchCashManagementSettingsEpic.js +0 -38
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.d.ts +0 -7
- package/lib/view/spendManagement/cashManagement/autoSweepFlow/epics/saveAutoSweepSettingsEpic.js +0 -36
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.d.ts +0 -56
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewPayload.js +0 -60
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.d.ts +0 -22
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewReducer.js +0 -96
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.d.ts +0 -59
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewSelector.js +0 -230
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.d.ts +0 -122
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/cashManagementOverviewState.js +0 -13
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.d.ts +0 -7
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementBannerEpic.js +0 -27
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.d.ts +0 -9
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementOverviewPageEpic.js +0 -40
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.d.ts +0 -7
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchCashManagementRecommendationEpic.js +0 -31
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.d.ts +0 -15
- package/lib/view/spendManagement/cashManagement/cashManagementOverview/epics/fetchRecentTransferEpic.js +0 -32
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { zeroAmount } from '../../../../commonStateTypes/amount';
|
|
2
|
-
import { reduceAllFetchState } from '../../../../commonStateTypes/reduceFetchState';
|
|
3
|
-
import { getDepositAccountByDepositAccountId } from '../../../../entity/depositAccount/depositAccountSelector';
|
|
4
|
-
import { mapDepositAccToFundingAccount, } from '../../commonSetup/setupViewSelector';
|
|
5
|
-
/**
|
|
6
|
-
* Default account type used when the recommend payload has no movement to
|
|
7
|
-
* expose yet (e.g. before the first fetch resolves). Callers that care about
|
|
8
|
-
* the movement should also gate on `fetchState === 'Completed'`.
|
|
9
|
-
*/
|
|
10
|
-
const DEFAULT_BANK_ACCOUNT_TYPE = 'deposit_account';
|
|
11
|
-
const DEFAULT_SUB_MOVEMENT_TYPE = 'push';
|
|
12
|
-
export const getCashManagementOverviewBanner = (state) => {
|
|
13
|
-
const { banner, recentTransfer } = state.cashManagementOverviewState;
|
|
14
|
-
const autoSweep = state.autoSweepFlowState;
|
|
15
|
-
// The banner today surfaces a single recommended movement (the first one
|
|
16
|
-
// returned by the agent). When the agent returns multiple groups/movements
|
|
17
|
-
// we'll need to broaden this — for now consumers only render one.
|
|
18
|
-
const movement = banner.data?.moneyMovements[0]?.movements[0];
|
|
19
|
-
const aggregate = reduceAllFetchState([
|
|
20
|
-
{ fetchState: banner.fetchState, error: banner.error },
|
|
21
|
-
{ fetchState: autoSweep.fetchState, error: autoSweep.error },
|
|
22
|
-
{ fetchState: recentTransfer.fetchState, error: recentTransfer.error },
|
|
23
|
-
]);
|
|
24
|
-
const subMovementType = movement?.subMovementType ?? DEFAULT_SUB_MOVEMENT_TYPE;
|
|
25
|
-
// The "primary" account is the deposit-account side of the movement —
|
|
26
|
-
// source for a push (money leaving primary → treasury) and destination
|
|
27
|
-
// for a pull (money returning to primary).
|
|
28
|
-
const primaryAccountId = subMovementType === 'pull'
|
|
29
|
-
? movement?.destinationBankAccountId
|
|
30
|
-
: movement?.sourceBankAccountId;
|
|
31
|
-
const primaryDepositAccount = primaryAccountId != null && primaryAccountId !== ''
|
|
32
|
-
? getDepositAccountByDepositAccountId(state.depositAccountState, primaryAccountId)
|
|
33
|
-
: undefined;
|
|
34
|
-
const primaryFundingAccount = primaryDepositAccount != null
|
|
35
|
-
? mapDepositAccToFundingAccount(primaryDepositAccount)
|
|
36
|
-
: undefined;
|
|
37
|
-
// For pull, surface the largest outflow in the horizon as the
|
|
38
|
-
// "triggering" event. This is a heuristic — the agent doesn't tag a
|
|
39
|
-
// specific outflow today, but the largest one is the most likely cause
|
|
40
|
-
// of the buffer breach and matches what the design wants to highlight.
|
|
41
|
-
const triggeringOutflow = subMovementType === 'pull'
|
|
42
|
-
? pickLargestOutflow(banner.data?.outflows)
|
|
43
|
-
: undefined;
|
|
44
|
-
return {
|
|
45
|
-
fetchState: aggregate.fetchState,
|
|
46
|
-
error: aggregate.error,
|
|
47
|
-
amount: movement?.amount ?? zeroAmount(),
|
|
48
|
-
cashManagementSettingsId: autoSweep.settingsId,
|
|
49
|
-
destinationBankAccountId: movement?.destinationBankAccountId ?? '',
|
|
50
|
-
destinationBankAccountType: movement?.destinationBankAccountType ?? DEFAULT_BANK_ACCOUNT_TYPE,
|
|
51
|
-
reasoning: movement?.reasoning ?? '',
|
|
52
|
-
sourceBankAccountId: movement?.sourceBankAccountId ?? '',
|
|
53
|
-
sourceBankAccountType: movement?.sourceBankAccountType ?? DEFAULT_BANK_ACCOUNT_TYPE,
|
|
54
|
-
subMovementType,
|
|
55
|
-
primaryFundingAccount,
|
|
56
|
-
triggeringOutflow,
|
|
57
|
-
recentTransfer: recentTransfer.data,
|
|
58
|
-
version: 0,
|
|
59
|
-
};
|
|
60
|
-
};
|
|
61
|
-
const pickLargestOutflow = (outflows) => {
|
|
62
|
-
if (outflows == null || outflows.length === 0) {
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
return outflows.reduce((largest, event) => event.amount.amount > largest.amount.amount ? event : largest);
|
|
66
|
-
};
|
|
67
|
-
export const getCashManagementOverview = (state) => {
|
|
68
|
-
const { cashManagementOverviewState, depositAccountListState, depositAccountState, paymentAccountListState, paymentAccountState, treasuryDetailState, } = state;
|
|
69
|
-
const aggregate = reduceAllFetchState([
|
|
70
|
-
{
|
|
71
|
-
fetchState: paymentAccountListState.fetchState,
|
|
72
|
-
error: paymentAccountListState.error,
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
fetchState: depositAccountListState.fetchState,
|
|
76
|
-
error: depositAccountListState.error,
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
fetchState: treasuryDetailState.fetchState,
|
|
80
|
-
error: treasuryDetailState.error,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
fetchState: cashManagementOverviewState.banner.fetchState,
|
|
84
|
-
error: cashManagementOverviewState.banner.error,
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
fetchState: state.autoSweepFlowState.fetchState,
|
|
88
|
-
error: state.autoSweepFlowState.error,
|
|
89
|
-
},
|
|
90
|
-
]);
|
|
91
|
-
const treasuryBalance = treasuryDetailState.accountSummary?.totalBalance ?? zeroAmount();
|
|
92
|
-
const cashBalance = sumCashBalances(paymentAccountListState.paymentAccountIds, paymentAccountState, depositAccountListState.accountIds, depositAccountState);
|
|
93
|
-
const totalCash = addAmounts(treasuryBalance, cashBalance);
|
|
94
|
-
const bannerData = cashManagementOverviewState.banner.data;
|
|
95
|
-
const inflowEvents = bannerData?.inflows ?? [];
|
|
96
|
-
const outflowEvents = bannerData?.outflows ?? [];
|
|
97
|
-
const totalInFlow = sumEventAmounts(inflowEvents);
|
|
98
|
-
const totalOutFlow = sumEventAmounts(outflowEvents);
|
|
99
|
-
const cashflow = subtractAmounts(totalInFlow, totalOutFlow);
|
|
100
|
-
const projectionData = buildProjectionData(cashBalance, inflowEvents, outflowEvents);
|
|
101
|
-
return {
|
|
102
|
-
banner: getCashManagementOverviewBanner(state),
|
|
103
|
-
cashBalance,
|
|
104
|
-
cashflow,
|
|
105
|
-
inflowEvents,
|
|
106
|
-
outflowEvents,
|
|
107
|
-
projectionData,
|
|
108
|
-
totalCash,
|
|
109
|
-
totalInFlow,
|
|
110
|
-
totalOutFlow,
|
|
111
|
-
treasuryBalance,
|
|
112
|
-
fetchState: aggregate.fetchState,
|
|
113
|
-
error: aggregate.error,
|
|
114
|
-
version: 0,
|
|
115
|
-
};
|
|
116
|
-
};
|
|
117
|
-
/**
|
|
118
|
-
* Walks the inflow / outflow events in chronological order, stepping the
|
|
119
|
-
* running balance from today's `cashBalance`. Emits a point per event so the
|
|
120
|
-
* chart can render colored markers at each cash event. Events with the same
|
|
121
|
-
* payment date are kept as separate steps (preserves the marker count even
|
|
122
|
-
* if Recharts overlays them at the same X position).
|
|
123
|
-
*/
|
|
124
|
-
const buildProjectionData = (cashBalance, inflowEvents, outflowEvents) => {
|
|
125
|
-
const events = [
|
|
126
|
-
...inflowEvents.map((e) => ({
|
|
127
|
-
amount: e.amount,
|
|
128
|
-
date: e.paymentDate,
|
|
129
|
-
isInflow: true,
|
|
130
|
-
})),
|
|
131
|
-
...outflowEvents.map((e) => ({
|
|
132
|
-
amount: e.amount,
|
|
133
|
-
date: e.paymentDate,
|
|
134
|
-
isInflow: false,
|
|
135
|
-
})),
|
|
136
|
-
].sort((a, b) => {
|
|
137
|
-
const diff = a.date.valueOf() - b.date.valueOf();
|
|
138
|
-
if (diff !== 0) {
|
|
139
|
-
return diff;
|
|
140
|
-
}
|
|
141
|
-
// Same-day tie-breaker: apply outflows before inflows so the projection
|
|
142
|
-
// shows the worst-case low first, then the recovery — matches the
|
|
143
|
-
// "show me the dip" framing on the cash management overview.
|
|
144
|
-
if (a.isInflow === b.isInflow) {
|
|
145
|
-
return 0;
|
|
146
|
-
}
|
|
147
|
-
return a.isInflow ? 1 : -1;
|
|
148
|
-
});
|
|
149
|
-
let balance = cashBalance;
|
|
150
|
-
const points = [{ balance, date: 'Today' }];
|
|
151
|
-
events.forEach((event) => {
|
|
152
|
-
balance = event.isInflow
|
|
153
|
-
? addAmounts(balance, event.amount)
|
|
154
|
-
: subtractAmounts(balance, event.amount);
|
|
155
|
-
points.push({
|
|
156
|
-
balance,
|
|
157
|
-
date: event.date.format('MMM D'),
|
|
158
|
-
isInflow: event.isInflow ? true : undefined,
|
|
159
|
-
isOutflow: event.isInflow ? undefined : true,
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
return points;
|
|
163
|
-
};
|
|
164
|
-
const sumEventAmounts = (events) => events.reduce((acc, event) => addAmounts(acc, event.amount), zeroAmount());
|
|
165
|
-
/**
|
|
166
|
-
* Subtracts `b` from `a`, sharing the currency-match guard with `addAmounts`.
|
|
167
|
-
* Used to compute net cash flow (`inflow - outflow`).
|
|
168
|
-
*/
|
|
169
|
-
const subtractAmounts = (a, b) => {
|
|
170
|
-
if (isZeroAmount(b)) {
|
|
171
|
-
return { ...a };
|
|
172
|
-
}
|
|
173
|
-
if (isZeroAmount(a)) {
|
|
174
|
-
return { ...b, amount: -b.amount };
|
|
175
|
-
}
|
|
176
|
-
if (a.currencyCode !== b.currencyCode ||
|
|
177
|
-
a.currencySymbol !== b.currencySymbol) {
|
|
178
|
-
console.warn(`cashManagementOverview: skipping balance with mismatched currency. Expected ${a.currencyCode} (${a.currencySymbol}), got ${b.currencyCode} (${b.currencySymbol}).`);
|
|
179
|
-
return a;
|
|
180
|
-
}
|
|
181
|
-
return {
|
|
182
|
-
amount: a.amount - b.amount,
|
|
183
|
-
currencyCode: a.currencyCode,
|
|
184
|
-
currencySymbol: a.currencySymbol,
|
|
185
|
-
};
|
|
186
|
-
};
|
|
187
|
-
const isZeroAmount = (a) => a.amount === 0 && a.currencyCode === 'USD' && a.currencySymbol === '$';
|
|
188
|
-
/**
|
|
189
|
-
* Adds two Amounts. Currencies must match (the seeded zeroAmount() counts as
|
|
190
|
-
* "no currency yet" and adopts `b`'s currency). Mismatches return `a`
|
|
191
|
-
* unchanged and warn — mixing currencies in a total is a bug, not silent
|
|
192
|
-
* conversion.
|
|
193
|
-
*/
|
|
194
|
-
const addAmounts = (a, b) => {
|
|
195
|
-
if (isZeroAmount(a)) {
|
|
196
|
-
return { ...b };
|
|
197
|
-
}
|
|
198
|
-
if (a.currencyCode !== b.currencyCode ||
|
|
199
|
-
a.currencySymbol !== b.currencySymbol) {
|
|
200
|
-
console.warn(`cashManagementOverview: skipping balance with mismatched currency. Expected ${a.currencyCode} (${a.currencySymbol}), got ${b.currencyCode} (${b.currencySymbol}).`);
|
|
201
|
-
return a;
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
204
|
-
amount: a.amount + b.amount,
|
|
205
|
-
currencyCode: a.currencyCode,
|
|
206
|
-
currencySymbol: a.currencySymbol,
|
|
207
|
-
};
|
|
208
|
-
};
|
|
209
|
-
const sumCashBalances = (paymentAccountIds, paymentAccountState, depositAccountIds, depositAccountState) => {
|
|
210
|
-
let total = zeroAmount();
|
|
211
|
-
paymentAccountIds.forEach((id) => {
|
|
212
|
-
const balance = paymentAccountState.paymentAccountByID[id]?.balances
|
|
213
|
-
?.available;
|
|
214
|
-
if (balance != null) {
|
|
215
|
-
total = addAmounts(total, balance);
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
depositAccountIds.forEach((id) => {
|
|
219
|
-
const balance = depositAccountState.depositAccountByID[id]?.accountBalance?.available;
|
|
220
|
-
if (balance != null) {
|
|
221
|
-
total = addAmounts(total, balance);
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
return total;
|
|
225
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { from } from 'rxjs';
|
|
2
|
-
import { filter, mergeMap } from 'rxjs/operators';
|
|
3
|
-
import { fetchCashManagementSettings } from '../../autoSweepFlow/autoSweepFlowReducer';
|
|
4
|
-
import { fetchCashManagementBanner, fetchCashManagementRecommendation, fetchRecentTransfer, } from '../cashManagementOverviewReducer';
|
|
5
|
-
export const fetchCashManagementBannerEpic = (actions$, state$) => actions$.pipe(filter(fetchCashManagementBanner.match), mergeMap((action) => {
|
|
6
|
-
const { cacheOverride } = action.payload;
|
|
7
|
-
const state = state$.value;
|
|
8
|
-
const actions = [];
|
|
9
|
-
if (cacheOverride === true ||
|
|
10
|
-
needsFetch(state.cashManagementOverviewState.banner.fetchState)) {
|
|
11
|
-
actions.push(fetchCashManagementRecommendation());
|
|
12
|
-
}
|
|
13
|
-
if (cacheOverride === true ||
|
|
14
|
-
needsFetch(state.autoSweepFlowState.fetchState)) {
|
|
15
|
-
actions.push(fetchCashManagementSettings());
|
|
16
|
-
}
|
|
17
|
-
if (cacheOverride === true ||
|
|
18
|
-
needsFetch(state.cashManagementOverviewState.recentTransfer.fetchState)) {
|
|
19
|
-
actions.push(fetchRecentTransfer());
|
|
20
|
-
}
|
|
21
|
-
return from(actions);
|
|
22
|
-
}));
|
|
23
|
-
const needsFetch = (fetchState) => fetchState !== 'Completed' && fetchState !== 'In-Progress';
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { concat, from } from 'rxjs';
|
|
2
|
-
import { filter, mergeMap } from 'rxjs/operators';
|
|
3
|
-
import { fetchAutoTransferRules } from '../../../autotransferRules/autoTransferRulesReducer';
|
|
4
|
-
import { fetchTreasuryOverviewDetail } from '../../../treasury/treasuryList/treasuryDetailReducer';
|
|
5
|
-
import { fetchZeniAccountList } from '../../../zeniAccounts/zeniAccountList/zeniAccountListReducer';
|
|
6
|
-
import { fetchCashManagementBanner, fetchCashManagementOverviewPage, } from '../cashManagementOverviewReducer';
|
|
7
|
-
export const fetchCashManagementOverviewPageEpic = (actions$, state$) => actions$.pipe(filter(fetchCashManagementOverviewPage.match), mergeMap((action) => {
|
|
8
|
-
const { cacheOverride } = action.payload;
|
|
9
|
-
const state = state$.value;
|
|
10
|
-
const pageActions = [];
|
|
11
|
-
if (cacheOverride === true) {
|
|
12
|
-
// Banner orchestrator (fetchCashManagementBannerEpic) fans out to
|
|
13
|
-
// recommendation + settings + recent-transfer internally.
|
|
14
|
-
pageActions.push(fetchTreasuryOverviewDetail(true), fetchZeniAccountList(true), fetchCashManagementBanner(true), fetchAutoTransferRules(true));
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
const treasuryDetailState = state.treasuryDetailState;
|
|
18
|
-
if (treasuryDetailState.hasValidState() === false &&
|
|
19
|
-
treasuryDetailState.fetchState !== 'In-Progress') {
|
|
20
|
-
pageActions.push(fetchTreasuryOverviewDetail(false));
|
|
21
|
-
}
|
|
22
|
-
// zeniAccountListState has no top-level fetchState to dedup against
|
|
23
|
-
// (only `newCheckingAccount.fetchState`), and the downstream epic is
|
|
24
|
-
// cheap. Always re-dispatch so the summary stays fresh on page entry.
|
|
25
|
-
pageActions.push(fetchZeniAccountList(false));
|
|
26
|
-
// Banner orchestrator handles its own per-slice dedup across
|
|
27
|
-
// recommendation, settings, and recent-transfer.
|
|
28
|
-
pageActions.push(fetchCashManagementBanner(false));
|
|
29
|
-
const autoTransferRules = state.autotransferRulesState;
|
|
30
|
-
if (autoTransferRules.fetchState !== 'Completed' &&
|
|
31
|
-
autoTransferRules.fetchState !== 'In-Progress') {
|
|
32
|
-
pageActions.push(fetchAutoTransferRules(false));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return concat(from(pageActions));
|
|
36
|
-
}));
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { of } from 'rxjs';
|
|
2
|
-
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
|
|
4
|
-
import { fetchCashManagementRecommendation, updateCashManagementRecommendation, updateCashManagementRecommendationFetchStatus, } from '../cashManagementOverviewReducer';
|
|
5
|
-
/**
|
|
6
|
-
* Hits the cash agent's recommend endpoint and stores the full response on
|
|
7
|
-
* the banner state — `inflows[]`, `outflows[]`, and `money_movements[]` all
|
|
8
|
-
* live there, so consumers can read them directly without an entity-bucket
|
|
9
|
-
* lookup.
|
|
10
|
-
*/
|
|
11
|
-
const DEFAULT_RECOMMEND_HORIZON_DAYS = 30;
|
|
12
|
-
export const fetchCashManagementRecommendationEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchCashManagementRecommendation.match), switchMap(() => {
|
|
13
|
-
const endpoint = `${zeniAPI.apiEndPoints.cashManagementAgentBaseUrl}/1.0/cash-agent/recommend?horizon_days=${DEFAULT_RECOMMEND_HORIZON_DAYS}`;
|
|
14
|
-
return zeniAPI.getJSON(endpoint).pipe(mergeMap((response) => {
|
|
15
|
-
if (isSuccessResponse(response) && response.data != null) {
|
|
16
|
-
return of(updateCashManagementRecommendation({ data: response.data }));
|
|
17
|
-
}
|
|
18
|
-
return of(updateCashManagementRecommendationFetchStatus({
|
|
19
|
-
fetchState: 'Error',
|
|
20
|
-
error: response.status,
|
|
21
|
-
}));
|
|
22
|
-
}), catchError((error) => of(updateCashManagementRecommendationFetchStatus({
|
|
23
|
-
fetchState: 'Error',
|
|
24
|
-
error: createZeniAPIStatus('Unexpected Error', 'Fetch cash management recommendation REST API call errored out: ' +
|
|
25
|
-
(error?.message ?? String(error))),
|
|
26
|
-
}))));
|
|
27
|
-
}));
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { of } from 'rxjs';
|
|
2
|
-
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
|
|
4
|
-
import { fetchRecentTransfer, updateRecentTransfer, updateRecentTransferFetchStatus, } from '../cashManagementOverviewReducer';
|
|
5
|
-
/**
|
|
6
|
-
* Hits `GET /cash-management/transfers` and stores the most recent actual
|
|
7
|
-
* cash-management transfer on `recentTransfer.data`. Used by the banner
|
|
8
|
-
* surface to render the "transfer scheduled / in-progress / complete"
|
|
9
|
-
* variant for existing users who have a settings id. The API returns the
|
|
10
|
-
* single most-relevant transfer under `transfer`; that field is optional
|
|
11
|
-
* (fresh users with no transfer history get `undefined`).
|
|
12
|
-
*/
|
|
13
|
-
export const fetchRecentTransferEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchRecentTransfer.match), switchMap(() => {
|
|
14
|
-
const endpoint = `${zeniAPI.apiEndPoints.cashManagementAgentBaseUrl}/1.0/cash-management/transfers/latest`;
|
|
15
|
-
return zeniAPI.getJSON(endpoint).pipe(mergeMap((response) => {
|
|
16
|
-
if (isSuccessResponse(response) && response.data != null) {
|
|
17
|
-
return of(updateRecentTransfer({ data: response.data.transfer }));
|
|
18
|
-
}
|
|
19
|
-
return of(updateRecentTransferFetchStatus({
|
|
20
|
-
fetchState: 'Error',
|
|
21
|
-
error: response.status,
|
|
22
|
-
}));
|
|
23
|
-
}), catchError((error) => of(updateRecentTransferFetchStatus({
|
|
24
|
-
fetchState: 'Error',
|
|
25
|
-
error: createZeniAPIStatus('Unexpected Error', 'Fetch recent cash-management transfer REST API call errored out: ' +
|
|
26
|
-
(error?.message ?? String(error))),
|
|
27
|
-
}))));
|
|
28
|
-
}));
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Amount } from '../../../../commonStateTypes/amount';
|
|
2
|
-
import { ID } from '../../../../commonStateTypes/common';
|
|
3
|
-
import { DepositAccountPayload } from '../../../../entity/depositAccount/depositAccountPayload';
|
|
4
|
-
import { ZeniAPIResponse } from '../../../../responsePayload';
|
|
5
|
-
import { ZeniDate } from '../../../../zeniDayJS';
|
|
6
|
-
import { AutoSweepFlowState, AutoSweepFrequency } from './autoSweepFlowState';
|
|
7
|
-
/**
|
|
8
|
-
* Body sent to `PUT /cash-management/settings`. Field names match the
|
|
9
|
-
* cash-management-agent contract; `minimum_buffer_usd` is a plain number
|
|
10
|
-
* (the slice tracks the canonical `Amount` value).
|
|
11
|
-
*/
|
|
12
|
-
export type SaveAutoSweepSettingsBody = {
|
|
13
|
-
frequency: string;
|
|
14
|
-
memo: string;
|
|
15
|
-
minimum_buffer_usd: number;
|
|
16
|
-
};
|
|
17
|
-
export type SaveAutoSweepSettingsResponse = ZeniAPIResponse<unknown>;
|
|
18
|
-
export declare const toSaveAutoSweepSettingsBody: (state: Pick<AutoSweepFlowState, "bufferAmount" | "frequency" | "memo">) => SaveAutoSweepSettingsBody;
|
|
19
|
-
/**
|
|
20
|
-
* `source_bank_account` on the cash-management settings response matches the
|
|
21
|
-
* shared `DepositAccountPayload` shape, so the fetch epic dispatches it into
|
|
22
|
-
* the deposit-account entity bucket and the auto-sweep slice only keeps the
|
|
23
|
-
* id. The selector hydrates the full `FundingAccount` on read.
|
|
24
|
-
*/
|
|
25
|
-
export interface CashManagementSettingsPayload {
|
|
26
|
-
cash_management_settings_id: string | null;
|
|
27
|
-
frequency: string;
|
|
28
|
-
minimum_buffer_usd: number;
|
|
29
|
-
next_transfer_date: string;
|
|
30
|
-
source_bank_account: DepositAccountPayload;
|
|
31
|
-
}
|
|
32
|
-
export type CashManagementSettingsResponse = ZeniAPIResponse<CashManagementSettingsPayload>;
|
|
33
|
-
/**
|
|
34
|
-
* Map a `GET /cash-management/settings` payload into the slice's writable
|
|
35
|
-
* fields. Defensive on the frequency (string-from-the-wire → union via
|
|
36
|
-
* `toAutoSweepFrequency`, falling back to `'weekly'` if the server returns
|
|
37
|
-
* something we don't model yet). Only the source account *id* is stored
|
|
38
|
-
* here — the full deposit-account payload is published to the entity bucket
|
|
39
|
-
* by the fetch epic.
|
|
40
|
-
*/
|
|
41
|
-
export declare const toAutoSweepFlowStatePatch: (payload: CashManagementSettingsPayload) => {
|
|
42
|
-
bufferAmount: Amount;
|
|
43
|
-
frequency: AutoSweepFrequency;
|
|
44
|
-
nextTransferDate?: ZeniDate;
|
|
45
|
-
primaryFundingAccountId?: ID;
|
|
46
|
-
settingsId?: ID;
|
|
47
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toAutoSweepFlowStatePatch = exports.toSaveAutoSweepSettingsBody = void 0;
|
|
4
|
-
const amount_1 = require("../../../../commonStateTypes/amount");
|
|
5
|
-
const zeniDayJS_1 = require("../../../../zeniDayJS");
|
|
6
|
-
const autoSweepFlowState_1 = require("./autoSweepFlowState");
|
|
7
|
-
const toSaveAutoSweepSettingsBody = (state) => ({
|
|
8
|
-
frequency: state.frequency,
|
|
9
|
-
memo: state.memo,
|
|
10
|
-
minimum_buffer_usd: state.bufferAmount.amount,
|
|
11
|
-
});
|
|
12
|
-
exports.toSaveAutoSweepSettingsBody = toSaveAutoSweepSettingsBody;
|
|
13
|
-
/**
|
|
14
|
-
* Map a `GET /cash-management/settings` payload into the slice's writable
|
|
15
|
-
* fields. Defensive on the frequency (string-from-the-wire → union via
|
|
16
|
-
* `toAutoSweepFrequency`, falling back to `'weekly'` if the server returns
|
|
17
|
-
* something we don't model yet). Only the source account *id* is stored
|
|
18
|
-
* here — the full deposit-account payload is published to the entity bucket
|
|
19
|
-
* by the fetch epic.
|
|
20
|
-
*/
|
|
21
|
-
const toAutoSweepFlowStatePatch = (payload) => {
|
|
22
|
-
const currencyCode = payload.source_bank_account.balances?.currency_code;
|
|
23
|
-
const currencySymbol = payload.source_bank_account.balances?.currency_symbol;
|
|
24
|
-
return {
|
|
25
|
-
bufferAmount: (0, amount_1.toAmount)(payload.minimum_buffer_usd, currencyCode ?? 'USD', currencySymbol ?? '$'),
|
|
26
|
-
frequency: (0, autoSweepFlowState_1.toAutoSweepFrequency)(payload.frequency) ?? 'weekly',
|
|
27
|
-
nextTransferDate: payload.next_transfer_date != null && payload.next_transfer_date !== ''
|
|
28
|
-
? (0, zeniDayJS_1.date)(payload.next_transfer_date)
|
|
29
|
-
: undefined,
|
|
30
|
-
primaryFundingAccountId: payload.source_bank_account.deposit_account_id ?? undefined,
|
|
31
|
-
settingsId: payload.cash_management_settings_id ?? undefined,
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
exports.toAutoSweepFlowStatePatch = toAutoSweepFlowStatePatch;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Amount } from '../../../../commonStateTypes/amount';
|
|
2
|
-
import { FetchState } from '../../../../commonStateTypes/common';
|
|
3
|
-
import { ZeniAPIStatus } from '../../../../responsePayload';
|
|
4
|
-
import { CashManagementSettingsPayload } from './autoSweepFlowPayload';
|
|
5
|
-
import { AutoSweepFlowState, AutoSweepFrequency } from './autoSweepFlowState';
|
|
6
|
-
export declare const initialState: AutoSweepFlowState;
|
|
7
|
-
export declare const fetchCashManagementSettings: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"autoSweepFlow/fetchCashManagementSettings">, updateCashManagementSettings: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
8
|
-
data: CashManagementSettingsPayload;
|
|
9
|
-
}, "autoSweepFlow/updateCashManagementSettings">, updateCashManagementSettingsFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
10
|
-
fetchState: FetchState;
|
|
11
|
-
error?: ZeniAPIStatus;
|
|
12
|
-
}, "autoSweepFlow/updateCashManagementSettingsFetchStatus">, updateAutoSweepRisk: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
13
|
-
bufferAmount: Amount;
|
|
14
|
-
}, "autoSweepFlow/updateAutoSweepRisk">, updateAutoSweepDraft: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
15
|
-
bufferAmount: Amount;
|
|
16
|
-
frequency: AutoSweepFrequency;
|
|
17
|
-
memo: string;
|
|
18
|
-
}, "autoSweepFlow/updateAutoSweepDraft">, saveAutoSweepSettings: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"autoSweepFlow/saveAutoSweepSettings">, updateAutoSweepSettingsFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
19
|
-
fetchState: FetchState;
|
|
20
|
-
error?: ZeniAPIStatus;
|
|
21
|
-
}, "autoSweepFlow/updateAutoSweepSettingsFetchStatus">, clearAutoSweepFlow: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"autoSweepFlow/clearAutoSweepFlow">;
|
|
22
|
-
declare const _default: import("redux").Reducer<AutoSweepFlowState>;
|
|
23
|
-
export default _default;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.clearAutoSweepFlow = exports.updateAutoSweepSettingsFetchStatus = exports.saveAutoSweepSettings = exports.updateAutoSweepDraft = exports.updateAutoSweepRisk = exports.updateCashManagementSettingsFetchStatus = exports.updateCashManagementSettings = exports.fetchCashManagementSettings = exports.initialState = void 0;
|
|
5
|
-
const toolkit_1 = require("@reduxjs/toolkit");
|
|
6
|
-
const autoSweepFlowPayload_1 = require("./autoSweepFlowPayload");
|
|
7
|
-
const autoSweepFlowState_1 = require("./autoSweepFlowState");
|
|
8
|
-
exports.initialState = autoSweepFlowState_1.initialAutoSweepFlowState;
|
|
9
|
-
const autoSweepFlow = (0, toolkit_1.createSlice)({
|
|
10
|
-
name: 'autoSweepFlow',
|
|
11
|
-
initialState: exports.initialState,
|
|
12
|
-
reducers: {
|
|
13
|
-
/**
|
|
14
|
-
* Kicks off `GET /cash-management/settings`. Flips the top-level
|
|
15
|
-
* fetchState to `In-Progress`; the fetch epic picks this up.
|
|
16
|
-
*/
|
|
17
|
-
fetchCashManagementSettings(draft) {
|
|
18
|
-
draft.fetchState = 'In-Progress';
|
|
19
|
-
draft.error = undefined;
|
|
20
|
-
},
|
|
21
|
-
/**
|
|
22
|
-
* Hydrates the form fields with the server-side settings (and stashes
|
|
23
|
-
* the settings id for subsequent saves). Marks the GET as `Completed`.
|
|
24
|
-
*/
|
|
25
|
-
updateCashManagementSettings(draft, action) {
|
|
26
|
-
const patch = (0, autoSweepFlowPayload_1.toAutoSweepFlowStatePatch)(action.payload.data);
|
|
27
|
-
draft.bufferAmount = patch.bufferAmount;
|
|
28
|
-
draft.frequency = patch.frequency;
|
|
29
|
-
draft.nextTransferDate = patch.nextTransferDate;
|
|
30
|
-
draft.primaryFundingAccountId = patch.primaryFundingAccountId;
|
|
31
|
-
draft.settingsId = patch.settingsId;
|
|
32
|
-
draft.fetchState = 'Completed';
|
|
33
|
-
draft.error = undefined;
|
|
34
|
-
},
|
|
35
|
-
updateCashManagementSettingsFetchStatus(draft, action) {
|
|
36
|
-
draft.fetchState = action.payload.fetchState;
|
|
37
|
-
draft.error = action.payload.error;
|
|
38
|
-
},
|
|
39
|
-
/**
|
|
40
|
-
* Live-update the buffer (risk band) as the user toggles the risk picker
|
|
41
|
-
* on the setup page, without staging frequency/memo. The selector derives
|
|
42
|
-
* the risk-adjusted sweep amount off `bufferAmount`, so dispatching this on
|
|
43
|
-
* every risk change keeps the setup and review screens in sync.
|
|
44
|
-
*/
|
|
45
|
-
updateAutoSweepRisk(draft, action) {
|
|
46
|
-
draft.bufferAmount = action.payload.bufferAmount;
|
|
47
|
-
},
|
|
48
|
-
/**
|
|
49
|
-
* Stage the in-flight form values without submitting them — fired from
|
|
50
|
-
* the setup→review transition so other selectors (and devtools) can see
|
|
51
|
-
* what the user is about to confirm. Leaves `saveStatus` untouched; the
|
|
52
|
-
* actual PUT only kicks off when the user clicks "Confirm Sweep" via
|
|
53
|
-
* `saveAutoSweepSettings`.
|
|
54
|
-
*/
|
|
55
|
-
updateAutoSweepDraft(draft, action) {
|
|
56
|
-
draft.bufferAmount = action.payload.bufferAmount;
|
|
57
|
-
draft.frequency = action.payload.frequency;
|
|
58
|
-
draft.memo = action.payload.memo;
|
|
59
|
-
},
|
|
60
|
-
/**
|
|
61
|
-
* Trigger the PUT for the auto-sweep settings already staged via
|
|
62
|
-
* `updateAutoSweepDraft`. Carries no payload — flips `saveStatus` to
|
|
63
|
-
* `In-Progress` and the save epic reads `bufferAmount` / `frequency` /
|
|
64
|
-
* `memo` straight from the slice. Callers must ensure those fields
|
|
65
|
-
* reflect the user's latest input before dispatching.
|
|
66
|
-
*/
|
|
67
|
-
saveAutoSweepSettings(draft) {
|
|
68
|
-
draft.saveStatus = { fetchState: 'In-Progress', error: undefined };
|
|
69
|
-
},
|
|
70
|
-
updateAutoSweepSettingsFetchStatus(draft, action) {
|
|
71
|
-
draft.saveStatus = {
|
|
72
|
-
fetchState: action.payload.fetchState,
|
|
73
|
-
error: action.payload.error,
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
clearAutoSweepFlow() {
|
|
77
|
-
return autoSweepFlowState_1.initialAutoSweepFlowState;
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
_a = autoSweepFlow.actions, exports.fetchCashManagementSettings = _a.fetchCashManagementSettings, exports.updateCashManagementSettings = _a.updateCashManagementSettings, exports.updateCashManagementSettingsFetchStatus = _a.updateCashManagementSettingsFetchStatus, exports.updateAutoSweepRisk = _a.updateAutoSweepRisk, exports.updateAutoSweepDraft = _a.updateAutoSweepDraft, exports.saveAutoSweepSettings = _a.saveAutoSweepSettings, exports.updateAutoSweepSettingsFetchStatus = _a.updateAutoSweepSettingsFetchStatus, exports.clearAutoSweepFlow = _a.clearAutoSweepFlow;
|
|
82
|
-
exports.default = autoSweepFlow.reducer;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Amount } from '../../../../commonStateTypes/amount';
|
|
2
|
-
import { FetchStateAndError, ID } from '../../../../commonStateTypes/common';
|
|
3
|
-
import { SelectorView } from '../../../../commonStateTypes/viewAndReport/viewAndReport';
|
|
4
|
-
import { RootState } from '../../../../reducer';
|
|
5
|
-
import { FundingAccount } from '../../commonSetup/setupViewSelector';
|
|
6
|
-
import { TreasurySummaryWithBalance } from '../../treasury/treasuryList/treasuryDetailState';
|
|
7
|
-
import { AutoSweepFrequency, RiskLevel } from './autoSweepFlowState';
|
|
8
|
-
/**
|
|
9
|
-
* The editable form state behind `<AutoSweepSetupPage>`. Kept as a nested
|
|
10
|
-
* object on the selector view so the screen can pass it through as a single
|
|
11
|
-
* unit and the rest of the view (server-derived data + statuses) stays
|
|
12
|
-
* separate from "what the user is currently editing".
|
|
13
|
-
*/
|
|
14
|
-
export interface AutoSweepFlowFormData {
|
|
15
|
-
bufferAmount: Amount;
|
|
16
|
-
frequency: AutoSweepFrequency;
|
|
17
|
-
memo: string;
|
|
18
|
-
/** Derived from `bufferAmount` — the matching preset risk level, falling
|
|
19
|
-
* back to `'moderate'` for custom server-side values. */
|
|
20
|
-
risk: RiskLevel;
|
|
21
|
-
}
|
|
22
|
-
export interface AutoSweepFlowSelectorView extends SelectorView {
|
|
23
|
-
formData: AutoSweepFlowFormData;
|
|
24
|
-
saveStatus: FetchStateAndError;
|
|
25
|
-
/**
|
|
26
|
-
* Recommended sweep amount. Sourced from the cash management banner
|
|
27
|
-
* (the first money_movements[0].movements[0].amount returned by the
|
|
28
|
-
* agent's `/recommend` endpoint). Defaults to zero when the agent
|
|
29
|
-
* hasn't returned a movement yet.
|
|
30
|
-
*/
|
|
31
|
-
sweepAmount: Amount;
|
|
32
|
-
/** Resolved from `primaryFundingAccountId` against the deposit-account
|
|
33
|
-
* entity bucket. `undefined` until the GET fetch publishes the account. */
|
|
34
|
-
primaryFundingAccount?: FundingAccount;
|
|
35
|
-
settingsId?: ID;
|
|
36
|
-
/** Treasury account summary used by the setup / review flow to render the
|
|
37
|
-
* destination column. Mirrors `getTreasuryDetail().accountSummary`. */
|
|
38
|
-
treasurySummary?: TreasurySummaryWithBalance;
|
|
39
|
-
}
|
|
40
|
-
export declare const getAutoSweepFlow: (state: RootState) => AutoSweepFlowSelectorView;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAutoSweepFlow = void 0;
|
|
4
|
-
const depositAccountSelector_1 = require("../../../../entity/depositAccount/depositAccountSelector");
|
|
5
|
-
const setupViewSelector_1 = require("../../commonSetup/setupViewSelector");
|
|
6
|
-
const treasuryDetailSelector_1 = require("../../treasury/treasuryList/treasuryDetailSelector");
|
|
7
|
-
const cashManagementOverviewSelector_1 = require("../cashManagementOverview/cashManagementOverviewSelector");
|
|
8
|
-
const autoSweepFlowState_1 = require("./autoSweepFlowState");
|
|
9
|
-
/**
|
|
10
|
-
* Risk band the agent's recommended sweep amount is computed against. The
|
|
11
|
-
* `sweepAmount` returned by the banner assumes this buffer, so the selector
|
|
12
|
-
* adjusts the displayed sweep by the delta between the user's selected band
|
|
13
|
-
* and this default.
|
|
14
|
-
*/
|
|
15
|
-
const DEFAULT_RISK_LEVEL = 'moderate';
|
|
16
|
-
const getAutoSweepFlow = (state) => {
|
|
17
|
-
const { bufferAmount, frequency, memo, saveStatus, settingsId, primaryFundingAccountId, fetchState, error, } = state.autoSweepFlowState;
|
|
18
|
-
const depositAccount = primaryFundingAccountId != null
|
|
19
|
-
? (0, depositAccountSelector_1.getDepositAccountByDepositAccountId)(state.depositAccountState, primaryFundingAccountId)
|
|
20
|
-
: undefined;
|
|
21
|
-
const risk = (0, autoSweepFlowState_1.bufferAmountToRisk)(bufferAmount.amount);
|
|
22
|
-
// The banner's recommended sweep assumes the default buffer band; shift it
|
|
23
|
-
// by the delta between the user's selected band and that default so a
|
|
24
|
-
// tighter buffer sweeps more and a looser buffer sweeps less.
|
|
25
|
-
const baseSweepAmount = (0, cashManagementOverviewSelector_1.getCashManagementOverviewBanner)(state).amount;
|
|
26
|
-
const sweepAmount = {
|
|
27
|
-
...baseSweepAmount,
|
|
28
|
-
amount: baseSweepAmount.amount +
|
|
29
|
-
autoSweepFlowState_1.RISK_BUFFER_AMOUNT[risk] -
|
|
30
|
-
autoSweepFlowState_1.RISK_BUFFER_AMOUNT[DEFAULT_RISK_LEVEL],
|
|
31
|
-
};
|
|
32
|
-
return {
|
|
33
|
-
fetchState,
|
|
34
|
-
error,
|
|
35
|
-
formData: {
|
|
36
|
-
bufferAmount,
|
|
37
|
-
frequency,
|
|
38
|
-
memo,
|
|
39
|
-
risk,
|
|
40
|
-
},
|
|
41
|
-
primaryFundingAccount: depositAccount != null
|
|
42
|
-
? (0, setupViewSelector_1.mapDepositAccToFundingAccount)(depositAccount)
|
|
43
|
-
: undefined,
|
|
44
|
-
saveStatus,
|
|
45
|
-
settingsId,
|
|
46
|
-
sweepAmount,
|
|
47
|
-
treasurySummary: (0, treasuryDetailSelector_1.getTreasuryDetail)(state).accountSummary,
|
|
48
|
-
version: 0,
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
exports.getAutoSweepFlow = getAutoSweepFlow;
|