@zeniai/client-epic-state 4.20.2-betaJK1 → 4.20.2-betaJK3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/lib/commonStateTypes/animations.d.ts +1 -1
  2. package/lib/commonStateTypes/animations.js +3 -0
  3. package/lib/entity/account/accountSelector.d.ts +0 -1
  4. package/lib/entity/account/accountSelector.js +1 -8
  5. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  6. package/lib/entity/snackbar/snackbarTypes.js +5 -0
  7. package/lib/epic.d.ts +7 -1
  8. package/lib/epic.js +7 -1
  9. package/lib/esm/commonStateTypes/animations.js +3 -0
  10. package/lib/esm/entity/account/accountSelector.js +0 -6
  11. package/lib/esm/entity/snackbar/snackbarTypes.js +5 -0
  12. package/lib/esm/epic.js +7 -1
  13. package/lib/esm/index.js +2 -0
  14. package/lib/esm/reducer.js +3 -0
  15. package/lib/esm/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +1 -1
  16. package/lib/esm/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +2 -2
  17. package/lib/esm/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +1 -1
  18. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +4 -1
  19. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +4 -2
  20. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesPayload.js +26 -0
  21. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesReducer.js +199 -0
  22. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +52 -0
  23. package/lib/esm/view/spendManagement/autotransferRules/autoTransferRulesState.js +1 -0
  24. package/lib/esm/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.js +99 -0
  25. package/lib/esm/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.js +48 -0
  26. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.js +36 -0
  27. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.js +45 -0
  28. package/lib/esm/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.js +50 -0
  29. package/lib/esm/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.js +69 -0
  30. package/lib/esm/view/spendManagement/treasury/treasuryList/epics/fetchTreasuryDetailEpic.js +2 -2
  31. package/lib/esm/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.js +2 -1
  32. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +9 -2
  33. package/lib/index.d.ts +6 -2
  34. package/lib/index.js +13 -1
  35. package/lib/reducer.d.ts +3 -0
  36. package/lib/reducer.js +3 -0
  37. package/lib/view/expenseAutomationView/epics/accountRecon/excludeAccountFromReconciliationEpic.js +1 -1
  38. package/lib/view/expenseAutomationView/epics/accountRecon/fetchReconciliationViewEpic.js +2 -2
  39. package/lib/view/expenseAutomationView/epics/accountRecon/includeAccountInReconciliationEpic.js +1 -1
  40. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  41. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +4 -1
  42. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +3 -1
  43. package/lib/view/spendManagement/autotransferRules/autoTransferRulesPayload.d.ts +75 -0
  44. package/lib/view/spendManagement/autotransferRules/autoTransferRulesPayload.js +30 -0
  45. package/lib/view/spendManagement/autotransferRules/autoTransferRulesReducer.d.ts +50 -0
  46. package/lib/view/spendManagement/autotransferRules/autoTransferRulesReducer.js +206 -0
  47. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.d.ts +24 -0
  48. package/lib/view/spendManagement/autotransferRules/autoTransferRulesSelector.js +61 -0
  49. package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.d.ts +38 -0
  50. package/lib/view/spendManagement/autotransferRules/autoTransferRulesState.js +2 -0
  51. package/lib/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.d.ts +12 -0
  52. package/lib/view/spendManagement/autotransferRules/epics/createAutoTransferRuleEpic.js +105 -0
  53. package/lib/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.d.ts +8 -0
  54. package/lib/view/spendManagement/autotransferRules/epics/deleteAutoTransferRuleEpic.js +52 -0
  55. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.d.ts +7 -0
  56. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferReviewDetailEpic.js +40 -0
  57. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.d.ts +7 -0
  58. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRuleHistory.js +52 -0
  59. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.d.ts +10 -0
  60. package/lib/view/spendManagement/autotransferRules/epics/fetchAutoTransferRulesEpic.js +54 -0
  61. package/lib/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.d.ts +8 -0
  62. package/lib/view/spendManagement/autotransferRules/epics/updateAutoTransferRuleEpic.js +73 -0
  63. package/lib/view/spendManagement/treasury/treasuryList/epics/fetchTreasuryDetailEpic.js +2 -2
  64. package/lib/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.d.ts +2 -1
  65. package/lib/view/spendManagement/treasury/treasuryList/treasuryDetailReducer.js +2 -1
  66. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +1 -0
  67. package/lib/view/transactionDetail/transactionDetailSelector.js +9 -2
  68. package/package.json +1 -1
@@ -134,6 +134,7 @@ import scheduleAccruedDetailView, { initialState as initialScheduleAccruedDetail
134
134
  import scheduleDetailView, { initialState as initialScheduleDetailViewState, } from './view/scheduleView/scheduleDetailView/scheduleDetailReducer';
135
135
  import scheduleListView, { initialState as initialScheduleListViewState, } from './view/scheduleView/scheduleListView/scheduleListReducer';
136
136
  import settings, { initialState as initialSettingsViewState, } from './view/settingsView/settingsViewReducer';
137
+ import autotransferRules, { initialState as initialAutotransferRulesState, } from './view/spendManagement/autotransferRules/autoTransferRulesReducer';
137
138
  import billDetailView, { initialState as initialBillDetailViewState, } from './view/spendManagement/billPay/billDetailView/billDetailViewReducer';
138
139
  import billList, { initialState as initialBillListState, } from './view/spendManagement/billPay/billList/billListReducer';
139
140
  import billPayConfig, { initialState as initialBillPayConfigState, } from './view/spendManagement/billPay/billPayConfig/billPayConfigReducer';
@@ -292,6 +293,7 @@ const initialViewsState = {
292
293
  arAgingState: initialArAgingState,
293
294
  auditReportViewState: initialAuditReportViewState,
294
295
  authenticationViewState: initialAuthenticationViewState,
296
+ autotransferRulesState: initialAutotransferRulesState,
295
297
  balanceSheetState: initialBalanceSheetState,
296
298
  bankAccountViewState: initialBankAccountView,
297
299
  billDetailViewState: initialBillDetailViewState,
@@ -516,6 +518,7 @@ const viewReducers = {
516
518
  arAgingState: arAging,
517
519
  auditReportViewState: auditReportView,
518
520
  authenticationViewState: authentication,
521
+ autotransferRulesState: autotransferRules,
519
522
  balanceSheetState: balanceSheet,
520
523
  bankAccountViewState: bankAccountView,
521
524
  billDetailViewState: billDetailView,
@@ -18,7 +18,7 @@ export const excludeAccountFromReconciliationEpic = (actions$, state$, zeniAPI)
18
18
  cleared_balance: reconciliationData?.clearedBalance?.amount ?? null,
19
19
  variance: reconciliationData?.variance?.amount ?? null,
20
20
  };
21
- const apiUrl = `https://dev.api.zeni.ai/version/reconciliation/himanshu/1.0/reconciliation/excluded-accounts`;
21
+ const apiUrl = `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation/excluded-accounts`;
22
22
  return zeniAPI
23
23
  .postAndGetJSON(apiUrl, payload)
24
24
  .pipe(mergeMap((response) => {
@@ -48,8 +48,8 @@ export const fetchReconciliationViewEpic = (actions$, state$, zeniAPI) => action
48
48
  queryParam.is_force_refresh = true;
49
49
  }
50
50
  const apiUrl = reconciliationId != null
51
- ? `https://dev.api.zeni.ai/version/reconciliation/himanshu/1.0/reconciliation?query=${encodeURIComponent(JSON.stringify(queryParam))}`
52
- : `https://dev.api.zeni.ai/version/reconciliation/himanshu/1.0/reconciliation?query=${encodeURIComponent(JSON.stringify(queryParam))}`;
51
+ ? `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation/${reconciliationId}?query=${encodeURIComponent(JSON.stringify(queryParam))}`
52
+ : `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation?query=${encodeURIComponent(JSON.stringify(queryParam))}`;
53
53
  return zeniAPI.getJSON(apiUrl).pipe(mergeMap((response) => {
54
54
  if (isSuccessResponse(response) && response.data != null) {
55
55
  const updateActions = [];
@@ -17,7 +17,7 @@ export const includeAccountInReconciliationEpic = (actions$, state$, zeniAPI) =>
17
17
  start_date: period.start,
18
18
  end_date: period.end,
19
19
  });
20
- const apiUrl = `https://dev.api.zeni.ai/version/reconciliation/himanshu/1.0/reconciliation/excluded-accounts/${accountId}?query=${encodeURIComponent(query)}`;
20
+ const apiUrl = `${zeniAPI.apiEndPoints.reconciliationMicroServiceBaseUrl}/1.0/reconciliation/excluded-accounts/${accountId}?query=${encodeURIComponent(query)}`;
21
21
  return zeniAPI
22
22
  .deleteAndGetJSON(apiUrl)
23
23
  .pipe(mergeMap((response) => {
@@ -476,7 +476,10 @@ const expenseAutomationReconciliationView = createSlice({
476
476
  : undefined,
477
477
  };
478
478
  const monthYearPeriodId = toMonthYearPeriodId(selectedPeriod);
479
- draft.accountReconciliationRecordsBySelectedPeriod[monthYearPeriodId].accountIDs = draft.accountReconciliationRecordsBySelectedPeriod[monthYearPeriodId].accountIDs.filter((id) => id !== account.account_id);
479
+ if (draft.accountReconciliationRecordsBySelectedPeriod[monthYearPeriodId]
480
+ ?.accountIDs != null) {
481
+ draft.accountReconciliationRecordsBySelectedPeriod[monthYearPeriodId].accountIDs = draft.accountReconciliationRecordsBySelectedPeriod[monthYearPeriodId].accountIDs.filter((id) => id !== account.account_id);
482
+ }
480
483
  }
481
484
  },
482
485
  excludeAccountFromReconciliationFailure: (draft, action) => {
@@ -5,7 +5,7 @@ import omit from 'lodash/omit';
5
5
  import orderBy from 'lodash/orderBy';
6
6
  import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
7
7
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
8
- import { getAccountByAccountId, getAccountsByType, } from '../../../entity/account/accountSelector';
8
+ import { getAccountsByType } from '../../../entity/account/accountSelector';
9
9
  import { getAccountReconByAccountIdAndSelectedPeriod } from '../../../entity/accountRecon/accountReconSelector';
10
10
  import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
11
11
  import { getVendorByVendorId } from '../../../entity/vendor/vendorSelector';
@@ -301,8 +301,10 @@ export const getExpenseAutomationReconciliationView = createSelector((state) =>
301
301
  },
302
302
  };
303
303
  const excludedAccountReconciliationByAccountID = {};
304
+ const accountsInState = Object.values(accountState.accountsByKey);
305
+ const accountsInStateMap = new Map(accountsInState.map((a) => [a.accountId, a]));
304
306
  reconciliationViewState.excludedAccountIDs.forEach((excludedAccountID) => {
305
- const account = getAccountByAccountId(accountState, excludedAccountID);
307
+ const account = accountsInStateMap.get(excludedAccountID);
306
308
  const exclusionInfo = reconciliationViewState.excludedAccountExclusionInfo[excludedAccountID];
307
309
  if (account != null) {
308
310
  excludedAccountReconciliationByAccountID[excludedAccountID] = {
@@ -0,0 +1,26 @@
1
+ import { date } from '../../../zeniDayJS';
2
+ export const mapPayloadToAutoTransferRule = (payload) => ({
3
+ amount: payload.amount,
4
+ autoTransferRuleId: payload.auto_transfer_rule_id,
5
+ createTime: payload.create_time != null ? date(payload.create_time) : undefined,
6
+ currencyCode: payload.currency_code,
7
+ currencySymbol: payload.currency_symbol ?? '$',
8
+ destinationBankAccountId: payload.destination_bank_account_id,
9
+ destinationBankAccountMetadata: payload.destination_bank_account_metadata?.map((m) => ({
10
+ accountId: m.account_id,
11
+ accountType: m.account_type,
12
+ percentage: m.percentage,
13
+ })) ?? undefined,
14
+ destinationBankAccountType: payload.destination_bank_account_type ?? undefined,
15
+ frequency: payload.frequency,
16
+ isActive: payload.is_active,
17
+ isDeleted: payload.is_deleted,
18
+ lastRunTime: payload.last_run_time,
19
+ nextTransferDate: payload.next_transfer_date != null
20
+ ? date(payload.next_transfer_date)
21
+ : undefined,
22
+ ruleType: payload.rule_type,
23
+ sourceBankAccountId: payload.source_bank_account_id,
24
+ sourceBankAccountType: payload.source_bank_account_type,
25
+ updateTime: payload.update_time != null ? date(payload.update_time) : undefined,
26
+ });
@@ -0,0 +1,199 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ import recordGet from 'lodash/get';
3
+ import { initialCommonHistory } from '../commonHistoryView/commonHistory';
4
+ import { toHistoricEvent, } from '../commonHistoryView/commonHistoryPayload';
5
+ import { mapReviewTransferMoneyPayloadToReviewTransferMoney, } from '../zeniAccounts/transferDetail/transferDetailPayload';
6
+ export const initialState = {
7
+ autoTransferReviewDetail: {
8
+ reviewTransferMoney: {
9
+ isShowDailyAchLimitWarning: false,
10
+ dailyAchDebitLimit: {
11
+ amount: 0,
12
+ currencyCode: 'USD',
13
+ currencySymbol: '$',
14
+ },
15
+ transferSchedules: [],
16
+ },
17
+ fetchState: 'Not-Started',
18
+ error: undefined,
19
+ },
20
+ historyByRuleId: {},
21
+ ruleDeleteStatusById: {},
22
+ ruleUpdateLocalData: {},
23
+ ruleUpdateStatusById: {},
24
+ rules: [],
25
+ fetchState: 'Not-Started',
26
+ error: undefined,
27
+ createRuleFetchState: {
28
+ fetchState: 'Not-Started',
29
+ error: undefined,
30
+ },
31
+ hasValidState() {
32
+ return this.fetchState === 'Completed';
33
+ },
34
+ };
35
+ const autotransferRules = createSlice({
36
+ name: 'autotransferRules',
37
+ initialState,
38
+ reducers: {
39
+ fetchAutoTransferRules: {
40
+ reducer(draft) {
41
+ draft.fetchState = 'In-Progress';
42
+ },
43
+ prepare(cacheOverride = false) {
44
+ return {
45
+ payload: {
46
+ cacheOverride,
47
+ },
48
+ };
49
+ },
50
+ },
51
+ updateAutoTransferRules(draft, action) {
52
+ draft.rules = action.payload.rules;
53
+ draft.fetchState = 'Completed';
54
+ draft.error = undefined;
55
+ },
56
+ updateAutoTransferRulesFailure(draft, action) {
57
+ draft.fetchState = action.payload.fetchState;
58
+ draft.error = action.payload.error;
59
+ },
60
+ updateRuleLocalData(draft, action) {
61
+ draft.ruleUpdateLocalData = {
62
+ ...draft.ruleUpdateLocalData,
63
+ ...action.payload,
64
+ };
65
+ },
66
+ clearRuleUpdateLocalData(draft) {
67
+ draft.ruleUpdateLocalData = {};
68
+ },
69
+ fetchAutoTransferReviewDetail(draft) {
70
+ draft.autoTransferReviewDetail.fetchState = 'In-Progress';
71
+ draft.autoTransferReviewDetail.error = undefined;
72
+ },
73
+ updateAutoTransferReviewDetail(draft, action) {
74
+ draft.autoTransferReviewDetail.fetchState = 'Completed';
75
+ draft.autoTransferReviewDetail.error = undefined;
76
+ draft.autoTransferReviewDetail.reviewTransferMoney =
77
+ mapReviewTransferMoneyPayloadToReviewTransferMoney(action.payload);
78
+ },
79
+ updateAutoTransferReviewDetailFailure(draft, action) {
80
+ draft.autoTransferReviewDetail.fetchState = 'Error';
81
+ draft.autoTransferReviewDetail.error = action.payload;
82
+ },
83
+ clearAutoTransferReviewDetail(draft) {
84
+ draft.autoTransferReviewDetail = initialState.autoTransferReviewDetail;
85
+ },
86
+ createAutoTransferRule(draft) {
87
+ draft.createRuleFetchState = {
88
+ fetchState: 'In-Progress',
89
+ error: undefined,
90
+ };
91
+ },
92
+ createAutoTransferRuleSuccess(draft, action) {
93
+ draft.rules = [...draft.rules, action.payload.rule];
94
+ draft.createRuleFetchState = {
95
+ fetchState: 'Completed',
96
+ error: undefined,
97
+ };
98
+ },
99
+ createAutoTransferRuleFailure(draft, action) {
100
+ draft.createRuleFetchState = {
101
+ fetchState: action.payload.fetchState,
102
+ error: action.payload.error,
103
+ };
104
+ },
105
+ updateAutoTransferRule: {
106
+ reducer(draft, action) {
107
+ draft.ruleUpdateStatusById[action.payload.ruleId] = {
108
+ fetchState: 'In-Progress',
109
+ error: undefined,
110
+ };
111
+ },
112
+ prepare(ruleId, pauseRule, resumeRule) {
113
+ return { payload: { ruleId, pauseRule, resumeRule } };
114
+ },
115
+ },
116
+ updateAutoTransferRuleSuccess(draft, action) {
117
+ const updatedRule = action.payload.rule;
118
+ draft.rules = draft.rules.map((rule) => rule.autoTransferRuleId === updatedRule.autoTransferRuleId
119
+ ? updatedRule
120
+ : rule);
121
+ draft.ruleUpdateStatusById[updatedRule.autoTransferRuleId] = {
122
+ fetchState: 'Completed',
123
+ error: undefined,
124
+ };
125
+ },
126
+ updateAutoTransferRuleFailure(draft, action) {
127
+ draft.ruleUpdateStatusById[action.payload.ruleId] = {
128
+ fetchState: action.payload.fetchState,
129
+ error: action.payload.error,
130
+ };
131
+ },
132
+ deleteAutoTransferRule: {
133
+ reducer(draft, action) {
134
+ draft.ruleDeleteStatusById[action.payload.ruleId] = {
135
+ fetchState: 'In-Progress',
136
+ error: undefined,
137
+ };
138
+ },
139
+ prepare(ruleId) {
140
+ return { payload: { ruleId } };
141
+ },
142
+ },
143
+ deleteAutoTransferRuleSuccess(draft, action) {
144
+ const { ruleId } = action.payload;
145
+ draft.rules = draft.rules.filter((rule) => rule.autoTransferRuleId !== ruleId);
146
+ draft.ruleDeleteStatusById[ruleId] = {
147
+ fetchState: 'Completed',
148
+ error: undefined,
149
+ };
150
+ },
151
+ deleteAutoTransferRuleFailure(draft, action) {
152
+ draft.ruleDeleteStatusById[action.payload.ruleId] = {
153
+ fetchState: action.payload.fetchState,
154
+ error: action.payload.error,
155
+ };
156
+ },
157
+ fetchAutoTransferRuleHistory: {
158
+ reducer(draft, action) {
159
+ const { ruleId, cacheOverride } = action.payload;
160
+ const detail = recordGet(draft.historyByRuleId, ruleId, undefined);
161
+ if (cacheOverride === true ||
162
+ detail == null ||
163
+ detail.fetchState !== 'In-Progress') {
164
+ draft.historyByRuleId[ruleId] = {
165
+ ...initialCommonHistory,
166
+ };
167
+ }
168
+ },
169
+ prepare(ruleId, cacheOverride = true) {
170
+ return {
171
+ payload: { ruleId, cacheOverride },
172
+ };
173
+ },
174
+ },
175
+ updateAutoTransferRuleHistory(draft, action) {
176
+ const { ruleId, historicEventsPayload } = action.payload;
177
+ const historicEvents = historicEventsPayload.map((historicEventPayload) => toHistoricEvent(historicEventPayload));
178
+ draft.historyByRuleId[ruleId] = {
179
+ ...initialCommonHistory,
180
+ fetchState: 'Completed',
181
+ error: undefined,
182
+ historicEvents,
183
+ };
184
+ },
185
+ updateAutoTransferRuleHistoryFetchStatus(draft, action) {
186
+ const { ruleId, fetchState, error } = action.payload;
187
+ const detail = recordGet(draft.historyByRuleId, ruleId, undefined);
188
+ if (detail != null) {
189
+ detail.fetchState = fetchState;
190
+ detail.error = error;
191
+ }
192
+ },
193
+ clearAutoTransferRules(draft) {
194
+ Object.assign(draft, initialState);
195
+ },
196
+ },
197
+ });
198
+ export const { fetchAutoTransferRules, updateAutoTransferRules, updateAutoTransferRulesFailure, fetchAutoTransferReviewDetail, updateAutoTransferReviewDetail, updateAutoTransferReviewDetailFailure, clearAutoTransferReviewDetail, createAutoTransferRule, createAutoTransferRuleSuccess, createAutoTransferRuleFailure, updateAutoTransferRule, updateAutoTransferRuleSuccess, updateAutoTransferRuleFailure, deleteAutoTransferRule, deleteAutoTransferRuleSuccess, deleteAutoTransferRuleFailure, fetchAutoTransferRuleHistory, updateAutoTransferRuleHistory, updateAutoTransferRuleHistoryFetchStatus, updateRuleLocalData, clearRuleUpdateLocalData, clearAutoTransferRules, } = autotransferRules.actions;
199
+ export default autotransferRules.reducer;
@@ -0,0 +1,52 @@
1
+ import recordGet from 'lodash/get';
2
+ import { reduceAllFetchState } from '../../../commonStateTypes/reduceFetchState';
3
+ import { getAllFundingAccounts, } from '../commonSetup/setupViewSelector';
4
+ import { getAllDepositAccounts } from '../zeniAccounts/depositAccountList/depositAccountListSelector';
5
+ import { getAllPaymentAccounts } from '../zeniAccounts/paymentAccountList/paymentAccountListSelector';
6
+ export const getAutoTransferRules = (state) => {
7
+ const { autotransferRulesState, depositAccountState, paymentAccountState, depositAccountListState, paymentAccountListState, treasuryDetailState, } = state;
8
+ const { rules, error, historyByRuleId, ruleUpdateLocalData, ruleUpdateStatusById, ruleDeleteStatusById, createRuleFetchState, autoTransferReviewDetail, } = autotransferRulesState;
9
+ const depositAccountsView = getAllDepositAccounts(depositAccountState, depositAccountListState);
10
+ const paymentAccountsView = getAllPaymentAccounts(paymentAccountState, paymentAccountListState);
11
+ let transferMoneyParties = [];
12
+ const transferMoneyPartiesFetchState = reduceAllFetchState([
13
+ depositAccountsView,
14
+ paymentAccountsView,
15
+ ]).fetchState;
16
+ const fetchState = reduceAllFetchState([
17
+ autotransferRulesState,
18
+ depositAccountsView,
19
+ paymentAccountsView,
20
+ ]).fetchState;
21
+ if (depositAccountsView.fetchState === 'Completed' &&
22
+ paymentAccountsView.fetchState === 'Completed') {
23
+ transferMoneyParties = getAllFundingAccounts(depositAccountsView.depositAccounts, paymentAccountsView.paymentAccounts, paymentAccountListState.paymentAccountBalanceFetchStatus);
24
+ }
25
+ const treasuryAccount = {
26
+ accType: 'treasuryAccount',
27
+ label: 'Treasury',
28
+ id: 'treasury',
29
+ balance: treasuryDetailState.accountSummary?.availableBalance,
30
+ };
31
+ return {
32
+ autoTransferReviewDetail,
33
+ rules,
34
+ ruleUpdateLocalData,
35
+ ruleUpdateStatusById,
36
+ ruleDeleteStatusById,
37
+ ruleHistory: historyByRuleId,
38
+ treasuryAccount,
39
+ transferMoneyParties,
40
+ transferMoneyPartiesFetchState,
41
+ createRuleFetchState,
42
+ fetchState,
43
+ error,
44
+ version: 0,
45
+ };
46
+ };
47
+ export const getAutoTransferRuleById = (state, ruleId) => {
48
+ return state.autotransferRulesState.rules.find((rule) => rule.autoTransferRuleId === ruleId);
49
+ };
50
+ export const getAutoTransferRuleHistory = (state, ruleId) => {
51
+ return recordGet(state.autotransferRulesState.historyByRuleId, ruleId, undefined);
52
+ };
@@ -0,0 +1,99 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { mapPayloadToAutoTransferRule, } from '../autoTransferRulesPayload';
6
+ import { createAutoTransferRule, createAutoTransferRuleFailure, createAutoTransferRuleSuccess, } from '../autoTransferRulesReducer';
7
+ export const createAutoTransferRuleEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(createAutoTransferRule.match), switchMap(() => {
8
+ const requestBody = mapAutoTransferRuleLocalDataToPayload(state$.value.autotransferRulesState.ruleUpdateLocalData);
9
+ return zeniAPI
10
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.bankingMicroServiceBaseUrl}/1.0/rules/transfer/auto`, requestBody)
11
+ .pipe(mergeMap((response) => {
12
+ if (isSuccessResponse(response) && response.data != null) {
13
+ const rule = mapPayloadToAutoTransferRule(response.data.auto_transfer_rule);
14
+ const actions = [
15
+ createAutoTransferRuleSuccess({ rule }),
16
+ openSnackbar({
17
+ messageSection: 'auto_transfer_rule_create',
18
+ messageText: 'success',
19
+ type: 'success',
20
+ }),
21
+ ];
22
+ return from(actions);
23
+ }
24
+ else {
25
+ return from([
26
+ createAutoTransferRuleFailure({
27
+ fetchState: 'Error',
28
+ error: response.status,
29
+ }),
30
+ openSnackbar({
31
+ messageSection: 'auto_transfer_rule_create',
32
+ messageText: 'failed',
33
+ type: 'error',
34
+ variables: [
35
+ {
36
+ variableName: '_api-error_',
37
+ variableValue: response.status.message,
38
+ },
39
+ ],
40
+ }),
41
+ ]);
42
+ }
43
+ }), catchError((error) => of(createAutoTransferRuleFailure({
44
+ fetchState: 'Error',
45
+ error: createZeniAPIStatus('Unexpected Error', 'Create auto transfer rule REST API call errored out ' +
46
+ JSON.stringify(error)),
47
+ }))));
48
+ }));
49
+ export function mapAutoTransferRuleLocalDataToPayload(localData, pauseRule, resumeRule) {
50
+ if (pauseRule === true) {
51
+ return {
52
+ is_active: false,
53
+ };
54
+ }
55
+ if (resumeRule === true) {
56
+ return {
57
+ is_active: true,
58
+ };
59
+ }
60
+ const payload = {
61
+ ...(localData.amount != null && {
62
+ amount: localData.amount.amount,
63
+ currency_code: localData.amount.currencyCode,
64
+ }),
65
+ ...(localData.destinationAccount != null && {
66
+ destination_bank_account_id: localData.destinationAccount.id,
67
+ destination_bank_account_type: accountTypeSubConfigCodeToAccType(localData.destinationAccount.accType),
68
+ }),
69
+ ...(localData.destinationAccountWithPercentAllocation != null && {
70
+ destination_bank_account_metadata: localData.destinationAccountWithPercentAllocation.map((allocation) => ({
71
+ account_id: allocation.account.id,
72
+ account_type: accountTypeSubConfigCodeToAccType(allocation.account.accType),
73
+ percentage: allocation.percentage,
74
+ })),
75
+ }),
76
+ frequency: localData.frequency,
77
+ rule_type: localData.ruleType,
78
+ ...(localData.sourceAccount != null && {
79
+ source_bank_account_id: localData.sourceAccount.id,
80
+ source_bank_account_type: accountTypeSubConfigCodeToAccType(localData.sourceAccount.accType),
81
+ }),
82
+ ...(localData.firstTransferDate != null && {
83
+ first_transfer_date: localData.firstTransferDate.format('YYYY-MM-DD'),
84
+ }),
85
+ };
86
+ return payload;
87
+ }
88
+ export const accountTypeSubConfigCodeToAccType = (code) => {
89
+ switch (code) {
90
+ case 'depositAccount':
91
+ return 'deposit_account';
92
+ case 'paymentAccount':
93
+ return 'payment_account';
94
+ case 'treasuryAccount':
95
+ return 'treasury_account';
96
+ default:
97
+ return undefined;
98
+ }
99
+ };
@@ -0,0 +1,48 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { deleteAutoTransferRule, deleteAutoTransferRuleFailure, deleteAutoTransferRuleSuccess, } from '../autoTransferRulesReducer';
6
+ export const deleteAutoTransferRuleEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(deleteAutoTransferRule.match), switchMap((action) => {
7
+ const { ruleId } = action.payload;
8
+ return zeniAPI
9
+ .deleteAndGetJSON(`${zeniAPI.apiEndPoints.bankingMicroServiceBaseUrl}/1.0/rules/transfer/auto/${ruleId}`)
10
+ .pipe(mergeMap((response) => {
11
+ if (isSuccessResponse(response)) {
12
+ const actions = [
13
+ deleteAutoTransferRuleSuccess({ ruleId }),
14
+ openSnackbar({
15
+ messageSection: 'auto_transfer_rule_delete',
16
+ messageText: 'success',
17
+ type: 'success',
18
+ }),
19
+ ];
20
+ return from(actions);
21
+ }
22
+ else {
23
+ return from([
24
+ deleteAutoTransferRuleFailure({
25
+ ruleId,
26
+ fetchState: 'Error',
27
+ error: response.status,
28
+ }),
29
+ openSnackbar({
30
+ messageSection: 'auto_transfer_rule_delete',
31
+ messageText: 'failed',
32
+ type: 'error',
33
+ variables: [
34
+ {
35
+ variableName: '_api-error_',
36
+ variableValue: response.status.message,
37
+ },
38
+ ],
39
+ }),
40
+ ]);
41
+ }
42
+ }), catchError((error) => of(deleteAutoTransferRuleFailure({
43
+ ruleId,
44
+ fetchState: 'Error',
45
+ error: createZeniAPIStatus('Unexpected Error', 'Delete auto transfer rule REST API call errored out ' +
46
+ JSON.stringify(error)),
47
+ }))));
48
+ }));
@@ -0,0 +1,36 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { fetchAutoTransferReviewDetail, updateAutoTransferReviewDetail, updateAutoTransferReviewDetailFailure, } from '../autoTransferRulesReducer';
5
+ import { accountTypeSubConfigCodeToAccType } from './createAutoTransferRuleEpic';
6
+ export const fetchAutoTransferReviewDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchAutoTransferReviewDetail.match), switchMap(() => {
7
+ const localData = state$.value.autotransferRulesState.ruleUpdateLocalData;
8
+ const payload = {
9
+ ...(localData.sourceAccount != null && {
10
+ from_account: {
11
+ account_id: localData.sourceAccount.id,
12
+ account_type: accountTypeSubConfigCodeToAccType(localData.sourceAccount.accType) ?? '',
13
+ },
14
+ }),
15
+ ...(localData.destinationAccount != null && {
16
+ to_account: {
17
+ account_id: localData.destinationAccount.id,
18
+ account_type: accountTypeSubConfigCodeToAccType(localData.destinationAccount.accType) ?? '',
19
+ },
20
+ }),
21
+ ...(localData.amount != null && {
22
+ amount: localData.amount.amount,
23
+ currency_code: localData.amount.currencyCode,
24
+ currency_symbol: localData.amount.currencySymbol,
25
+ }),
26
+ };
27
+ return zeniAPI
28
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.bankingMicroServiceBaseUrl}/1.0/rules/transfer/auto/review`, payload)
29
+ .pipe(mergeMap((response) => {
30
+ if (isSuccessResponse(response) && response.data != null) {
31
+ return of(updateAutoTransferReviewDetail(response.data));
32
+ }
33
+ return of(updateAutoTransferReviewDetailFailure(response.status));
34
+ }), catchError((error) => of(updateAutoTransferReviewDetailFailure(createZeniAPIStatus('Unexpected Error', 'Fetch auto transfer review detail REST API call errored out ' +
35
+ JSON.stringify(error))))));
36
+ }));
@@ -0,0 +1,45 @@
1
+ import recordGet from 'lodash/get';
2
+ import { concat, from, of } from 'rxjs';
3
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
4
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { fetchAutoTransferRuleHistory, updateAutoTransferRuleHistory, updateAutoTransferRuleHistoryFetchStatus, } from '../autoTransferRulesReducer';
6
+ export const fetchAutoTransferRuleHistoryEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchAutoTransferRuleHistory.match), mergeMap((action) => {
7
+ const { ruleId, cacheOverride } = action.payload;
8
+ const historyActions = [];
9
+ const state = state$.value;
10
+ const historyDetail = recordGet(state.autotransferRulesState.historyByRuleId, ruleId, undefined);
11
+ if (cacheOverride === true ||
12
+ historyDetail == null ||
13
+ historyDetail.fetchState !== 'In-Progress') {
14
+ historyActions.push(updateAutoTransferRuleHistoryFetchStatus({
15
+ ruleId,
16
+ fetchState: 'In-Progress',
17
+ }));
18
+ const getHistoryDetail$ = zeniAPI
19
+ .getJSON(`${zeniAPI.apiEndPoints.bankingMicroServiceBaseUrl}/1.0/rules/transfer/auto/${ruleId}/history`)
20
+ .pipe(mergeMap((response) => {
21
+ if (isSuccessResponse(response) && response.data != null) {
22
+ return of(updateAutoTransferRuleHistory({
23
+ ruleId,
24
+ historicEventsPayload: response.data.activities,
25
+ }));
26
+ }
27
+ else {
28
+ return of(updateAutoTransferRuleHistoryFetchStatus({
29
+ ruleId,
30
+ fetchState: 'Error',
31
+ error: response.status,
32
+ }));
33
+ }
34
+ }), catchError((error) => of(updateAutoTransferRuleHistoryFetchStatus({
35
+ ruleId,
36
+ fetchState: 'Error',
37
+ error: createZeniAPIStatus('Unexpected Error', 'Fetch auto transfer rule history REST API call errored out ' +
38
+ JSON.stringify(error)),
39
+ }))));
40
+ return concat(from(historyActions), getHistoryDetail$);
41
+ }
42
+ else {
43
+ return from(historyActions);
44
+ }
45
+ }));
@@ -0,0 +1,50 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
4
+ import { fetchTreasuryOverviewDetail } from '../../treasury/treasuryList/treasuryDetailReducer';
5
+ import { fetchDepositAccountList } from '../../zeniAccounts/depositAccountList/depositAccountListReducer';
6
+ import { fetchPaymentAccountList } from '../../zeniAccounts/paymentAccountList/paymentAccountListReducer';
7
+ import { mapPayloadToAutoTransferRule, } from '../autoTransferRulesPayload';
8
+ import { fetchAutoTransferRules, updateAutoTransferRules, updateAutoTransferRulesFailure, } from '../autoTransferRulesReducer';
9
+ export const fetchAutoTransferRulesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchAutoTransferRules.match), switchMap((action) => {
10
+ const state = state$.value;
11
+ const { cacheOverride } = action.payload;
12
+ const { autotransferRulesState, depositAccountListState, paymentAccountListState, } = state;
13
+ if (cacheOverride === true ||
14
+ (autotransferRulesState.hasValidState() === false &&
15
+ autotransferRulesState.fetchState !== 'In-Progress')) {
16
+ return zeniAPI
17
+ .getJSON(`${zeniAPI.apiEndPoints.bankingMicroServiceBaseUrl}/1.0/rules/transfer/auto/list`)
18
+ .pipe(mergeMap((response) => {
19
+ if (isSuccessResponse(response) && response.data != null) {
20
+ const rules = response.data.auto_transfer_rules.map(mapPayloadToAutoTransferRule);
21
+ const actions = [
22
+ updateAutoTransferRules({ rules }),
23
+ ];
24
+ if (depositAccountListState.fetchState !== 'In-Progress' &&
25
+ depositAccountListState.fetchState !== 'Completed') {
26
+ actions.push(fetchDepositAccountList());
27
+ }
28
+ if (paymentAccountListState.fetchState !== 'In-Progress' &&
29
+ paymentAccountListState.fetchState !== 'Completed') {
30
+ actions.push(fetchPaymentAccountList());
31
+ }
32
+ actions.push(fetchTreasuryOverviewDetail(false, true));
33
+ return from(actions);
34
+ }
35
+ else {
36
+ return of(updateAutoTransferRulesFailure({
37
+ fetchState: 'Error',
38
+ error: response.status,
39
+ }));
40
+ }
41
+ }), catchError((error) => of(updateAutoTransferRulesFailure({
42
+ fetchState: 'Error',
43
+ error: createZeniAPIStatus('Unexpected Error', 'Fetch auto transfer rules REST API call errored out ' +
44
+ JSON.stringify(error)),
45
+ }))));
46
+ }
47
+ else {
48
+ return from([]);
49
+ }
50
+ }));