@zeniai/client-epic-state 5.0.44-betaML3 → 5.0.44-betaRD1

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 (85) hide show
  1. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  2. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
  3. package/lib/entity/account/accountSelector.d.ts +0 -5
  4. package/lib/entity/account/accountSelector.js +1 -8
  5. package/lib/entity/account/accountState.d.ts +1 -1
  6. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  7. package/lib/entity/class/classReducer.d.ts +4 -4
  8. package/lib/entity/class/classState.d.ts +1 -1
  9. package/lib/entity/forecast/forecastState.d.ts +1 -1
  10. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  11. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  12. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  13. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +1 -1
  14. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +2 -2
  15. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  16. package/lib/entity/snackbar/snackbarTypes.js +0 -2
  17. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +0 -6
  18. package/lib/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  19. package/lib/entity/transaction/stateTypes/transaction.d.ts +0 -3
  20. package/lib/epic.d.ts +3 -3
  21. package/lib/epic.js +3 -3
  22. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +1 -1
  23. package/lib/esm/entity/account/accountSelector.js +0 -6
  24. package/lib/esm/entity/snackbar/snackbarTypes.js +0 -2
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  26. package/lib/esm/epic.js +3 -3
  27. package/lib/esm/index.js +8 -7
  28. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +1 -5
  29. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +1 -66
  30. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +0 -19
  31. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +0 -6
  32. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +1 -12
  33. package/lib/esm/view/transactionList/fetchTransactionListByProjectEpic.js +45 -0
  34. package/lib/esm/view/transactionList/parallelFetchProjectTransactionListEpic.js +32 -0
  35. package/lib/esm/view/transactionList/transactionListByProjectSelector.js +58 -0
  36. package/lib/esm/view/transactionList/transactionListReducer.js +83 -2
  37. package/lib/esm/view/transactionList/transactionListState.js +10 -0
  38. package/lib/index.d.ts +8 -7
  39. package/lib/index.js +38 -42
  40. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  41. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  42. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  43. package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -1
  44. package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -1
  45. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  46. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  47. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  48. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.d.ts +2 -2
  49. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +0 -4
  50. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  51. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +1 -15
  52. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +2 -67
  53. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +1 -3
  54. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +0 -2
  55. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +0 -20
  56. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +1 -13
  57. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  58. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  59. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  60. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  61. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  62. package/lib/view/topEx/topExSelector.d.ts +1 -1
  63. package/lib/view/transactionDetail/epics/transactionDetailEpic.d.ts +1 -2
  64. package/lib/view/transactionDetail/epics/transactionDetailEpic.js +0 -6
  65. package/lib/view/transactionDetail/transactionDetailPayload.d.ts +1 -1
  66. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +1 -4
  67. package/lib/view/transactionDetail/transactionDetailSelector.js +1 -12
  68. package/lib/view/transactionList/fetchTransactionListByProjectEpic.d.ts +8 -0
  69. package/lib/view/transactionList/fetchTransactionListByProjectEpic.js +52 -0
  70. package/lib/view/transactionList/parallelFetchProjectTransactionListEpic.d.ts +6 -0
  71. package/lib/view/transactionList/parallelFetchProjectTransactionListEpic.js +36 -0
  72. package/lib/view/transactionList/transactionListByProjectSelector.d.ts +22 -0
  73. package/lib/view/transactionList/transactionListByProjectSelector.js +66 -0
  74. package/lib/view/transactionList/transactionListPayload.d.ts +15 -0
  75. package/lib/view/transactionList/transactionListReducer.d.ts +25 -2
  76. package/lib/view/transactionList/transactionListReducer.js +83 -2
  77. package/lib/view/transactionList/transactionListState.d.ts +15 -0
  78. package/lib/view/transactionList/transactionListState.js +13 -1
  79. package/package.json +1 -1
  80. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +0 -81
  81. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +0 -25
  82. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.d.ts +0 -9
  83. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +0 -85
  84. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.d.ts +0 -8
  85. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +0 -29
@@ -1,16 +1,12 @@
1
1
  import omit from 'lodash/omit';
2
2
  import { reduceAllFetchState, reduceAnyFetchState, } from '../../../commonStateTypes/reduceFetchState';
3
3
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
4
- import { getAccountBase, getAccountBaseForTransferAccounts, } from '../../../entity/account/accountSelector';
5
4
  import { getIsAccountingClassesEnabled, getCurrentTenant, } from '../../../entity/tenant/tenantSelector';
6
5
  import { getTransactionWithCOT } from '../../../entity/transaction/transactionHelper';
7
6
  import { getSupportedTransactionsByIds } from '../../../entity/transaction/transactionSelector';
8
7
  import { getAccountList, getNestedAccountListHierarchy, getUncategorizedAccounts, } from '../../accountList/accountListSelector';
9
8
  import { getClassList, getNestedClassListHierarchy, } from '../../classList/classListSelector';
10
9
  import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
11
- export function getLastTransferEntryReplacement(state) {
12
- return state.expenseAutomationTransactionsViewState.lastTransferEntryReplacement;
13
- }
14
10
  export function getExpenseAutomationTransactionView(state) {
15
11
  const { accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, monthEndCloseChecksViewState, } = state;
16
12
  const { selectedTransactionCategorizationTab } = expenseAutomationTransactionsViewState;
@@ -87,19 +83,6 @@ export function getExpenseAutomationTransactionView(state) {
87
83
  : [];
88
84
  const transactionCompletionStatus = allSteps.find((step) => step.step === 'transaction_categorization')?.completionStatus;
89
85
  const completionStatus = transactionCompletionStatus ?? 'incomplete';
90
- const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
91
- .map((id) => getAccountBaseForTransferAccounts(accountState, id))
92
- .filter((account) => account != null);
93
- /**
94
- * Credit transfer picker uses transfer-account ids from a dedicated fetch. If that list
95
- * resolves to nothing while the COA list is loaded, fall back to the full COA list so the
96
- * credit dropdown is not empty.
97
- */
98
- const transferAccountsList = transferAccountsFromApi.length > 0
99
- ? transferAccountsFromApi
100
- : accountList.accounts
101
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
102
- .filter((account) => account != null);
103
86
  return {
104
87
  version: 0,
105
88
  fetchState: fetchStatus.fetchState,
@@ -118,13 +101,11 @@ export function getExpenseAutomationTransactionView(state) {
118
101
  refreshStatus,
119
102
  saveStatus,
120
103
  markAsNotMiscategorizedStatus,
121
- createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
122
104
  completionStatus,
123
105
  totalCountByTab,
124
106
  fetchStateByTransactionTabs: fetchStateByTab,
125
107
  uploadReceiptStatusById,
126
108
  selectedTransactionId,
127
109
  selectedTransactionLineId,
128
- transferAccounts: transferAccountsList,
129
110
  };
130
111
  }
@@ -13,7 +13,6 @@ import { fetchAccountList } from '../../accountList/accountListReducer';
13
13
  import { fetchClassList } from '../../classList/classListReducer';
14
14
  import { getInitializedTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';
15
15
  import { updateTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';
16
- import { fetchTransferAccounts } from '../../expenseAutomationView/reducers/transactionsViewReducer';
17
16
  import { fetchOwnerList } from '../../ownerList/ownerListReducer';
18
17
  import { fetchTransactionDetail, initializeTransactionDetailLocalData, removeTransactionDetail, updateTransactionDetailFetchState, } from '../transactionDetailReducer';
19
18
  import { getAllLinkedTransactions, getTransactionDetailKey, } from '../transactionDetailState';
@@ -35,11 +34,6 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
35
34
  accountList.fetchState !== 'In-Progress') {
36
35
  transactionActions.push(fetchAccountList('accountList'));
37
36
  }
38
- const { transferAccounts } = state$.value.expenseAutomationTransactionsViewState;
39
- if (transferAccounts.fetchState !== 'In-Progress' &&
40
- transferAccounts.fetchState !== 'Completed') {
41
- transactionActions.push(fetchTransferAccounts());
42
- }
43
37
  const classList = state$.value.classListState;
44
38
  if (classList.hasValidState() === false &&
45
39
  classList.fetchState !== 'In-Progress') {
@@ -1,6 +1,5 @@
1
1
  import recordGet from 'lodash/get';
2
2
  import { reduceFetchState } from '../../commonStateTypes/reduceFetchState';
3
- import { getAccountBase, getAccountBaseForTransferAccounts, } from '../../entity/account/accountSelector';
4
3
  import { getIsAccountingClassesEnabled } from '../../entity/tenant/tenantSelector';
5
4
  import { toTransactionTypeStrict } from '../../entity/transaction/stateTypes/transactionType';
6
5
  import { getTransactionWithCOT } from '../../entity/transaction/transactionHelper';
@@ -11,7 +10,7 @@ import { getAccountList, getNestedAccountListHierarchy, } from '../accountList/a
11
10
  import { getClassList, getNestedClassListHierarchy, } from '../classList/classListSelector';
12
11
  import { getAllLinkedTransactions, getTransactionDetailKey, initialSupportedTransactionDetail, } from './transactionDetailState';
13
12
  export const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
14
- const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, } = state;
13
+ const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, } = state;
15
14
  const detailKey = getTransactionDetailKey(transactionId);
16
15
  const transactionDetail = recordGet(transactionDetailState.transactionDetailById, detailKey);
17
16
  let fetchState = {
@@ -63,14 +62,6 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
63
62
  : [];
64
63
  const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
65
64
  const vendors = getVendorsByVendorIds(vendorState, vendorListState.vendorIds);
66
- const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
67
- .map((id) => getAccountBaseForTransferAccounts(accountState, id))
68
- .filter((account) => account != null);
69
- const transferAccountsList = transferAccountsFromApi.length > 0
70
- ? transferAccountsFromApi
71
- : accountsList.accounts
72
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
73
- .filter((account) => account != null);
74
65
  return {
75
66
  reportId: 'transaction_detail',
76
67
  reportTitle: 'Transaction Detail',
@@ -87,8 +78,6 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
87
78
  accountsHierarchyList,
88
79
  classList: classList,
89
80
  isAccountingClassesEnabled,
90
- createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
91
- transferAccounts: transferAccountsList,
92
81
  isUpdateNotAllowed: transactionDetail?.isUpdateNotAllowed,
93
82
  transactionDetailLocalData: transactionDetail?.transactionDetailLocalData ??
94
83
  initialSupportedTransactionDetail.transactionDetailLocalData,
@@ -0,0 +1,45 @@
1
+ import { toBase64 } from 'js-base64';
2
+ import lodashGet from 'lodash/get';
3
+ import { from, of } from 'rxjs';
4
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
5
+ import { toString } from '../../commonStateTypes/timePeriod';
6
+ import { updateTransactions } from '../../entity/transaction/transactionReducer';
7
+ import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
8
+ import { fetchProjectTransactionList, updateTransactionListByProject, updateTransactionListByProjectFailure, } from './transactionListReducer';
9
+ import { getProjectAcTranKey } from './transactionListState';
10
+ export const fetchTransactionListByProjectEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchProjectTransactionList.match), mergeMap((action) => {
11
+ const state = state$.value;
12
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
13
+ const projectTransactions = lodashGet(state.transactionListState.byProject.transactionListByProjectKey, key, undefined);
14
+ if (action.payload.cacheOverride === true ||
15
+ projectTransactions == null ||
16
+ projectTransactions.hasValidState() === false) {
17
+ const queryParam = {
18
+ start_date: toString(action.payload.period.start),
19
+ end_date: toString(action.payload.period.end),
20
+ sort_by: 'create_time',
21
+ sort_order: 'desc',
22
+ account_id: action.payload.accountId,
23
+ account_type: action.payload.accountType,
24
+ zeni_project_id: action.payload.projectId,
25
+ };
26
+ const base64AccountId = toBase64(action.payload.accountId);
27
+ return zeniAPI
28
+ .getJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/accounts/${base64AccountId}/transactions?query=${encodeURIComponent(JSON.stringify(queryParam))}`)
29
+ .pipe(mergeMap((response) => {
30
+ if (isSuccessResponse(response) && response.data != null) {
31
+ const updateActions = [];
32
+ updateActions.push(updateTransactions(response.data.account.transactions, (value) => value.transaction_id));
33
+ updateActions.push(updateTransactionListByProject(response.data));
34
+ return from(updateActions);
35
+ }
36
+ else {
37
+ return of(updateTransactionListByProjectFailure(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period, response.status));
38
+ }
39
+ }), catchError((error) => of(updateTransactionListByProjectFailure(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period, createZeniAPIStatus('Unexpected Error', 'fetch transaction list REST API call errored out' +
40
+ JSON.stringify(error))))));
41
+ }
42
+ else {
43
+ return from([]);
44
+ }
45
+ }));
@@ -0,0 +1,32 @@
1
+ import { from } from 'rxjs';
2
+ import { filter, mergeMap } from 'rxjs/operators';
3
+ import { splitPeriod } from './parallelFetchClassTransactionListEpic';
4
+ import { fetchProjectTransactionList, parallelFetchProjectTransactionList, } from './transactionListReducer';
5
+ import { getProjectAcTranKey, } from './transactionListState';
6
+ export const parallelFetchProjectTransactionListEpic = (actions$, state$) => actions$.pipe(filter(parallelFetchProjectTransactionList.match), mergeMap((action) => {
7
+ const state = state$.value.transactionListState;
8
+ const timePeriods = splitPeriod(action.payload.period);
9
+ const filteredTimePeriods = timePeriods.filter((value) => {
10
+ if (action.payload.cacheOverride === false) {
11
+ return (isDataAvailableOrFetching(state.byProject, action.payload.accountId, action.payload.accountType, action.payload.projectId, value) === false);
12
+ }
13
+ else {
14
+ return true;
15
+ }
16
+ });
17
+ if (filteredTimePeriods.length > 12) {
18
+ console.error('Only maximum 12 parallel fetch are allowed!');
19
+ return from([]);
20
+ }
21
+ else {
22
+ const fetchActions = filteredTimePeriods.map((period) => fetchProjectTransactionList(action.payload.accountId, action.payload.accountType, action.payload.projectId, period, true));
23
+ return from(fetchActions);
24
+ }
25
+ }));
26
+ function isDataAvailableOrFetching(state, accountId, accountType, projectId, period) {
27
+ const key = getProjectAcTranKey(accountId, accountType, projectId, period);
28
+ const projectTransactions = state.transactionListByProjectKey[key];
29
+ return (projectTransactions != null &&
30
+ (projectTransactions.fetchState === 'In-Progress' ||
31
+ projectTransactions.hasValidState()));
32
+ }
@@ -0,0 +1,58 @@
1
+ import flatMap from 'lodash/flatMap';
2
+ import recordGet from 'lodash/get';
3
+ import orderBy from 'lodash/orderBy';
4
+ import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
+ import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
+ import { getProjectAcKey, getProjectAcTranKey, } from './transactionListState';
8
+ export const getTransactionListByProject = (transactionState, transactionListState, accountId, accountType, projectId, timeframe, filterByTimePeriod) => {
9
+ const timePeriods = splitPeriod(filterByTimePeriod); // Note: Split by months.
10
+ const accountTransactions = timePeriods
11
+ .map((thisTimePeriod) => {
12
+ const key = getProjectAcTranKey(accountId, accountType, projectId, thisTimePeriod);
13
+ return recordGet(transactionListState.byProject.transactionListByProjectKey, key, undefined);
14
+ })
15
+ .filter((acTransaction) => acTransaction != null);
16
+ let account = undefined;
17
+ if (accountTransactions.length > 0) {
18
+ account = accountTransactions[0].account;
19
+ }
20
+ const fetchState = reduceFetchState(accountTransactions);
21
+ let transactions = [];
22
+ if (isAnyFetchCompleted(accountTransactions)) {
23
+ const allTransactionIDs = flatMap(accountTransactions, (value) => value.transactionIDs);
24
+ const transactionsUnsorted = allTransactionIDs
25
+ .map((transactionId) => getSupportedTransactionById(transactionState, transactionId))
26
+ .filter((value) => {
27
+ if (value == null) {
28
+ console.error("Can't have null transaction at this stage!");
29
+ }
30
+ return value != null;
31
+ });
32
+ transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
33
+ }
34
+ const key = getProjectAcKey(accountId, accountType, projectId);
35
+ const uiState = recordGet(transactionListState.byProject.transactionListUIStateByProjectKey, key, {});
36
+ return {
37
+ reportId: 'transaction_list_of_account_by_project',
38
+ reportTitle: 'Transaction List of Account By Project',
39
+ version: 1,
40
+ status: undefined,
41
+ fetchState: fetchState.fetchState,
42
+ error: fetchState.error,
43
+ timeframe,
44
+ filterByTimePeriod,
45
+ accountId,
46
+ accountType,
47
+ projectId,
48
+ account,
49
+ transactionOrder: 'descending_transaction_date',
50
+ transactions,
51
+ uiState,
52
+ latestTransactionId: transactionListState.latestTransactionId,
53
+ };
54
+ };
55
+ export const getTransactionListUIStateByProjectKey = (transactionListState, accountId, accountType, projectId) => {
56
+ const key = getProjectAcKey(accountId, accountType, projectId);
57
+ return recordGet(transactionListState.byProject.transactionListUIStateByProjectKey, key, undefined);
58
+ };
@@ -2,7 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  import { toAbsoluteDay } from '../../commonStateTypes/timePeriod';
3
3
  import { mapAccountBasePayloadToAccountBase } from '../../entity/account/accountPayload';
4
4
  import { toEntityType } from '../../entity/genericEntity/entity';
5
- import { accountTransactionsInitialState, getAcKey, getAcTranKey, getCategoryTypeTranKey, getClassAcKey, getClassAcTranKey, getEntityTranKey, initialClassTransactionState, initialEntityTransactionState, initialTransactionsStateByCategoryType, } from './transactionListState';
5
+ import { accountTransactionsInitialState, getAcKey, getAcTranKey, getCategoryTypeTranKey, getClassAcKey, getClassAcTranKey, getEntityTranKey, getProjectAcKey, getProjectAcTranKey, initialClassTransactionState, initialEntityTransactionState, initialProjectTransactionState, initialTransactionsStateByCategoryType, } from './transactionListState';
6
6
  export const initialState = {
7
7
  byAccount: {
8
8
  transactionListByAccountKey: {},
@@ -37,6 +37,10 @@ export const initialState = {
37
37
  transactionListByClassKey: {},
38
38
  transactionListUIStateByClassKey: {},
39
39
  },
40
+ byProject: {
41
+ transactionListByProjectKey: {},
42
+ transactionListUIStateByProjectKey: {},
43
+ },
40
44
  };
41
45
  const transactionList = createSlice({
42
46
  name: 'transactionList',
@@ -246,6 +250,64 @@ const transactionList = createSlice({
246
250
  return { payload: { accountId, accountType, classId, period, error } };
247
251
  },
248
252
  },
253
+ // Transaction list by project related reducers
254
+ //
255
+ // Mirrors the by-class set; the only behavioural difference is that the
256
+ // server query param is `zeni_project_id` (post-Ayon's accounting #3984
257
+ // rename) and there's no equivalent of `include_sub_class_transactions`
258
+ // — projects don't have a sub-project hierarchy in this layout yet.
259
+ parallelFetchProjectTransactionList: {
260
+ reducer() {
261
+ // Do nothing..
262
+ },
263
+ prepare(accountId, accountType, projectId, period, cacheOverride = false) {
264
+ return {
265
+ payload: { accountId, accountType, projectId, period, cacheOverride },
266
+ };
267
+ },
268
+ },
269
+ fetchProjectTransactionList: {
270
+ reducer(draft, action) {
271
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
272
+ if (action.payload.cacheOverride === true ||
273
+ draft.byProject.transactionListByProjectKey[key] == null ||
274
+ (draft.byProject.transactionListByProjectKey[key]?.hasValidState() ===
275
+ false &&
276
+ draft.byProject.transactionListByProjectKey[key]?.fetchState !=
277
+ 'In-Progress')) {
278
+ draft.byProject.transactionListByProjectKey[key] = {
279
+ ...initialProjectTransactionState,
280
+ fetchState: 'In-Progress',
281
+ error: undefined,
282
+ };
283
+ }
284
+ },
285
+ prepare(accountId, accountType, projectId, period, cacheOverride = false) {
286
+ return {
287
+ payload: { accountId, accountType, projectId, period, cacheOverride },
288
+ };
289
+ },
290
+ },
291
+ updateTransactionListByProject(draft, action) {
292
+ doUpdateTransactionListByProject(draft.byProject.transactionListByProjectKey, action.payload);
293
+ },
294
+ updateTransactionListByProjectUIState(draft, action) {
295
+ const key = getProjectAcKey(action.payload.accountId, action.payload.accountType, action.payload.projectId);
296
+ draft.byProject.transactionListUIStateByProjectKey[key] = Object.assign({}, draft.byProject.transactionListUIStateByProjectKey[key], action.payload.uiState);
297
+ },
298
+ updateTransactionListByProjectFailure: {
299
+ reducer(draft, action) {
300
+ const key = getProjectAcTranKey(action.payload.accountId, action.payload.accountType, action.payload.projectId, action.payload.period);
301
+ draft.byProject.transactionListByProjectKey[key] = {
302
+ ...initialProjectTransactionState,
303
+ fetchState: 'Error',
304
+ error: action.payload.error,
305
+ };
306
+ },
307
+ prepare(accountId, accountType, projectId, period, error) {
308
+ return { payload: { accountId, accountType, projectId, period, error } };
309
+ },
310
+ },
249
311
  parallelFetchTransactionListByCategoryType: {
250
312
  reducer() {
251
313
  // Do nothing..
@@ -340,7 +402,7 @@ const transactionList = createSlice({
340
402
  },
341
403
  },
342
404
  });
343
- export const { parallelFetchAccountTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, parallelFetchEntityTransactionList, fetchEntityTransactionList, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, fetchClassTransactionList, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByClassFailure, parallelFetchTransactionListByCategoryType, fetchTransactionsListByCategoryType, updateTransactionListByCategoryType, updateTransactionsListByCategoryTypeFailure, updateTransactionListUIStateByCategoryType, clearTransactionList, updateLatestTransactionId, } = transactionList.actions;
405
+ export const { parallelFetchAccountTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, parallelFetchEntityTransactionList, fetchEntityTransactionList, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, fetchClassTransactionList, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByClassFailure, parallelFetchProjectTransactionList, fetchProjectTransactionList, updateTransactionListByProject, updateTransactionListByProjectUIState, updateTransactionListByProjectFailure, parallelFetchTransactionListByCategoryType, fetchTransactionsListByCategoryType, updateTransactionListByCategoryType, updateTransactionsListByCategoryTypeFailure, updateTransactionListUIStateByCategoryType, clearTransactionList, updateLatestTransactionId, } = transactionList.actions;
344
406
  export default transactionList.reducer;
345
407
  /**
346
408
  * Helper functions
@@ -390,3 +452,22 @@ function doUpdateTransactionListByClass(draft, payload) {
390
452
  transactionIDs,
391
453
  };
392
454
  }
455
+ function doUpdateTransactionListByProject(draft, payload) {
456
+ const transactionIDs = payload.account.transactions.map((transactionPaylod) => transactionPaylod.transaction_id);
457
+ const account = mapAccountBasePayloadToAccountBase(payload.account);
458
+ const projectId = payload.query.zeni_project_id;
459
+ const start = toAbsoluteDay(payload.query.start_date);
460
+ const end = toAbsoluteDay(payload.query.end_date);
461
+ const key = getProjectAcTranKey(account.accountId, account.accountType, projectId, {
462
+ start,
463
+ end,
464
+ });
465
+ draft[key] = {
466
+ ...initialProjectTransactionState,
467
+ fetchState: 'Completed',
468
+ error: undefined,
469
+ account: account,
470
+ projectId: projectId,
471
+ transactionIDs,
472
+ };
473
+ }
@@ -30,6 +30,16 @@ export const initialClassTransactionState = {
30
30
  return this.fetchState == 'Completed';
31
31
  },
32
32
  };
33
+ export const getProjectAcTranKey = (accountId, accountType, projectId, period) => `${accountId}-${accountType}-${projectId}-${period.start.day}_${period.start.month}_${period.start.year}_${period.end.day}_${period.end.month}_${period.end.year}`;
34
+ export const getProjectAcKey = (accountId, accountType, projectId) => `${accountId}-${accountType}-${projectId}`;
35
+ export const initialProjectTransactionState = {
36
+ transactionIDs: [],
37
+ fetchState: 'Not-Started',
38
+ error: undefined,
39
+ hasValidState() {
40
+ return this.fetchState == 'Completed';
41
+ },
42
+ };
33
43
  export const getCategoryTypeTranKey = (categoryType, period) => `${categoryType}_${period.start.day}_${period.start.month}_${period.start.year}_${period.end.day}_${period.end.month}_${period.end.year}`;
34
44
  export const initialTransactionsStateByCategoryType = {
35
45
  transactionIDs: [],
package/lib/index.d.ts CHANGED
@@ -271,7 +271,7 @@ import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFl
271
271
  import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
272
272
  import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, setBulkUploadCompletedSubTab, setBulkUploadResultsTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, storeBatchDetails, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
273
273
  import { deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateNodeCollapseState, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
274
- import { acknowledgeTransferEntryRouteReplacement, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, fetchTransferAccounts, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, resetCreateTransferEntryStatus, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
274
+ import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
275
275
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
276
276
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
277
277
  import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
@@ -283,7 +283,7 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
283
283
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
284
284
  import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
285
285
  import { getExpenseAutomationReconciliationView, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
286
- import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
286
+ import { getExpenseAutomationTransactionView } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
287
287
  import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
288
288
  import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
289
289
  import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
@@ -569,8 +569,9 @@ import { TransactionDetailLineItemData, TransactionDetailLocalData, TransactionV
569
569
  import { TransactionListByAccountReport, getTransactionListByAccount, getTransactionListUIStateByAccountKey } from './view/transactionList/transactionListByAccountSelector';
570
570
  import { TransactionListByCategoryType, getTransactionListUIStateByCategoryType, getTransactionsListByCategoryType } from './view/transactionList/transactionListByCategoryTypeSelector';
571
571
  import { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey } from './view/transactionList/transactionListByClassSelector';
572
+ import { TransactionListByProjectReport, getTransactionListByProject, getTransactionListUIStateByProjectKey } from './view/transactionList/transactionListByProjectSelector';
572
573
  import { TransactionListByEntityView, getTransactionListByEntity, getTransactionListByEntityForSinglePeriod } from './view/transactionList/transactionListByEntitySelector';
573
- import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType } from './view/transactionList/transactionListReducer';
574
+ import { clearTransactionList, fetchAccountTransactionList, fetchEntityTransactionList, parallelFetchAccountTransactionList, parallelFetchClassTransactionList, parallelFetchProjectTransactionList, parallelFetchEntityTransactionList, parallelFetchTransactionListByCategoryType, updateLatestTransactionId, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, updateTransactionListByClass, updateTransactionListByClassUIState, updateTransactionListByProject, updateTransactionListByProjectUIState, updateTransactionListByEntity, updateTransactionListByEntityFailure, updateTransactionListUIStateByCategoryType } from './view/transactionList/transactionListReducer';
574
575
  import { TransactionCategoryType } from './view/transactionList/transactionListState';
575
576
  import { clearTrendData, fetchExpenseTrend, fetchIncomeTrend } from './view/trend/trendReducer';
576
577
  import { TrendView, getCurrentFiscalQuarterDateRange, getTrendForEntity } from './view/trend/trendSelector';
@@ -652,10 +653,10 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
652
653
  export { ClassesViewSelectorReportV2 };
653
654
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
654
655
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
655
- export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
656
+ export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
656
657
  export { JEScheduleLocalData };
657
658
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
658
- export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, acknowledgeTransferEntryRouteReplacement, fetchTransferAccounts, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
659
+ export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
659
660
  export { TopExpense, TopExTimePeriod, TOP_EX_TIME_PERIODS };
660
661
  export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, MonthYearPeriod, };
661
662
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';
@@ -717,12 +718,12 @@ export { VendorTransaction, VendorTransactionWithCOT, isVendorTransaction, Vendo
717
718
  export { TransferTransaction, isTransferTransaction };
718
719
  export { MatchedTransaction };
719
720
  export { SupportedTransaction, SupportedTransactionWithCOT, SupportedTransactionPayload, getSupportedTransactionById, };
720
- export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
721
+ export { clearTransactionList, updateLatestTransactionId, parallelFetchAccountTransactionList, parallelFetchEntityTransactionList, fetchAccountTransactionList, updateTransactionListByAccount, updateTransactionListByAccountFailure, updateTransactionListByAccountUIState, parallelFetchClassTransactionList, updateTransactionListByClassUIState, updateTransactionListByClass, parallelFetchProjectTransactionList, updateTransactionListByProjectUIState, updateTransactionListByProject, updateTransactionListUIStateByCategoryType, parallelFetchTransactionListByCategoryType, };
721
722
  export { TransactionListByAccountReport, getTransactionListByAccount, getTransactionListUIStateByAccountKey, };
722
723
  export { fetchEntityTransactionList, updateTransactionListByEntity, saveTransactionDetailLocalData, clearTransactionDetailSaveStatus, updateTransactionListByEntityFailure, resetLineItemsCategoryClassInLocalData, setAllLineItemsToCategoryClassInLocalData, saveTransactionDetail, setAllLineItemsLocalDataIsUpdateAllChecked, initializeTransactionDetailLocalData, removeEntityRecommendationForLineIdForTransactionDetail, updateSelectedVendor, updateSelectedCustomer, resetSelectedCustomer, resetVendor, updateLocalDataWithTransactionsUpdateWithVendorCheckbox, updateVendorToAllLineItems, resetAllLineItemsToVendor, updateLatestSelectedEntity, updateVendorBulkRecommendationsFetchStatus, setIsVendorUpdateAllChecked, };
723
724
  export { TransactionUpdates, downloadAccountingProviderAttachment, downloadAccountingProviderAttachmentSuccess, downloadAccountingProviderAttachmentFailure, fetchTransactionDetail, updateTransactionDetail, uploadMissingAttachmentSuccess, deleteTransactionAttachment, getThirdPartyIdFromTransactionId, };
724
725
  export { TransactionListByEntityView, getTransactionListByEntity };
725
- export { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey, getTransactionListByEntityForSinglePeriod, };
726
+ export { TransactionListByClassReport, getTransactionListByClass, getTransactionListUIStateByClassKey, TransactionListByProjectReport, getTransactionListByProject, getTransactionListUIStateByProjectKey, getTransactionListByEntityForSinglePeriod, };
726
727
  export { TransactionDetailReport, getTransactionDetail, getTransactionDetailForTransaction, VendorDetailsView, getInitialUpdatablePeriodsForTransactionRecommendations as getUpdatablePeriodsForTransactionRecommendations, };
727
728
  export { getInsights, fetchInsightsCard, updateSelectedInsightIndex, InsightsView, };
728
729
  export { fetchForecastList } from './view/forecastList/forecastListReducer';