@zeniai/client-epic-state 5.1.37 → 5.1.38

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 (25) hide show
  1. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  2. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  3. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  4. package/lib/esm/index.js +3 -2
  5. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +5 -3
  6. package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +32 -0
  7. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
  8. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +163 -21
  9. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
  10. package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +295 -0
  11. package/lib/index.d.ts +4 -3
  12. package/lib/index.js +44 -38
  13. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +4 -2
  14. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +2 -0
  15. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +36 -0
  16. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  17. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
  18. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +14 -1
  19. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +165 -23
  20. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +10 -2
  21. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
  22. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +25 -0
  23. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +313 -0
  24. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +52 -2
  25. package/package.json +1 -1
@@ -0,0 +1,295 @@
1
+ import { date } from '../../../zeniDayJS';
2
+ export const getEffectiveStatementPeriod = (parsedMeta, localMeta) => ({
3
+ statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
4
+ ? localMeta.statementStartDate
5
+ : parsedMeta.statementStartDate,
6
+ statementEndDate: localMeta?.statementEndDate != null && localMeta.statementEndDate !== ''
7
+ ? localMeta.statementEndDate
8
+ : parsedMeta.statementEndDate,
9
+ });
10
+ export const isStatementTransactionInPeriod = (transactionDate, statementStartDate, statementEndDate) => {
11
+ if (statementStartDate === '' ||
12
+ statementEndDate === '' ||
13
+ transactionDate === '') {
14
+ return true;
15
+ }
16
+ const txn = date(transactionDate).startOf('day');
17
+ const start = date(statementStartDate).startOf('day');
18
+ const end = date(statementEndDate).startOf('day');
19
+ return txn.isSameOrAfter(start, 'day') && txn.isSameOrBefore(end, 'day');
20
+ };
21
+ export const filterStatementTransactionsByPeriod = (transactions, statementPeriod) => {
22
+ const { statementStartDate, statementEndDate } = statementPeriod;
23
+ if (statementStartDate === '' || statementEndDate === '') {
24
+ return transactions;
25
+ }
26
+ return transactions.filter((transaction) => isStatementTransactionInPeriod(transaction.transactionDate, statementStartDate, statementEndDate));
27
+ };
28
+ export const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalData) => {
29
+ if (parsedStatementData == null) {
30
+ return undefined;
31
+ }
32
+ const statementUpload = parsedStatementData.statementUpload;
33
+ if (statementUpload == null) {
34
+ return undefined;
35
+ }
36
+ const parsedMeta = statementUpload.statementMeta;
37
+ const localMeta = statementUpdateLocalData?.statementMeta;
38
+ const effectiveMeta = localMeta ?? parsedMeta;
39
+ const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
40
+ return {
41
+ statementUpload: {
42
+ ...statementUpload,
43
+ statementMeta: effectiveMeta,
44
+ statementTransactions: filterStatementTransactionsByPeriod(statementUpload.statementTransactions, statementPeriod),
45
+ },
46
+ };
47
+ };
48
+ export const getStatementTransactionPeriodById = (allParsedTransactions, parsedMeta, localMeta) => {
49
+ const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
50
+ return Object.fromEntries(allParsedTransactions
51
+ .filter((transaction) => transaction.statementTransactionId !== '')
52
+ .map((transaction) => [
53
+ transaction.statementTransactionId,
54
+ isStatementTransactionInPeriod(transaction.transactionDate, statementPeriod.statementStartDate, statementPeriod.statementEndDate),
55
+ ]));
56
+ };
57
+ export const getDateFilteredDeletedTransactionIds = (allParsedTransactions, statementPeriod) => {
58
+ if (statementPeriod.statementStartDate === '' ||
59
+ statementPeriod.statementEndDate === '') {
60
+ return [];
61
+ }
62
+ return allParsedTransactions
63
+ .filter((transaction) => transaction.statementTransactionId !== '' &&
64
+ !isStatementTransactionInPeriod(transaction.transactionDate, statementPeriod.statementStartDate, statementPeriod.statementEndDate))
65
+ .map((transaction) => transaction.statementTransactionId);
66
+ };
67
+ const roundCurrency = (value) => Math.round(value * 100) / 100;
68
+ const toApiDateString = (value) => {
69
+ if (value == null || value === '') {
70
+ return '';
71
+ }
72
+ return date(value).format('YYYY-MM-DD');
73
+ };
74
+ const computeStatementTransactionTotals = (transactions) => {
75
+ const totalDeposits = roundCurrency(transactions
76
+ .filter((txn) => txn.transactionDirection === 'credit')
77
+ .reduce((sum, txn) => sum + Math.abs(txn.amount ?? 0), 0));
78
+ const totalPayments = roundCurrency(transactions
79
+ .filter((txn) => txn.transactionDirection === 'debit')
80
+ .reduce((sum, txn) => sum + Math.abs(txn.amount ?? 0), 0));
81
+ return { totalDeposits, totalPayments };
82
+ };
83
+ const computeStatementClosingBalance = (openingBalance, totalDeposits, totalPayments) => roundCurrency(openingBalance + totalDeposits - totalPayments);
84
+ const filterFormTransactionsInPeriod = (transactions, statementStartDate, statementEndDate) => {
85
+ if (statementStartDate === '' || statementEndDate === '') {
86
+ return transactions;
87
+ }
88
+ const periodStart = date(statementStartDate).startOf('day');
89
+ const periodEnd = date(statementEndDate).startOf('day');
90
+ return transactions.filter((txn) => {
91
+ if (txn.transactionDate === '') {
92
+ return true;
93
+ }
94
+ const txnDate = date(txn.transactionDate).startOf('day');
95
+ return (txnDate.isSameOrAfter(periodStart, 'day') &&
96
+ txnDate.isSameOrBefore(periodEnd, 'day'));
97
+ });
98
+ };
99
+ export const isStatementParseTransactionFieldChange = (changedField) => changedField === 'transactions' ||
100
+ changedField?.startsWith('transactions.') === true;
101
+ const isStatementParseBalanceAffectingTransactionFieldChange = (changedField) => {
102
+ if (changedField === 'transactions') {
103
+ return true;
104
+ }
105
+ if (changedField?.startsWith('transactions.') !== true) {
106
+ return false;
107
+ }
108
+ return !changedField.endsWith('.transactionMemo');
109
+ };
110
+ export const isStatementParseManualBalanceField = (field) => field === 'totalDeposits' ||
111
+ field === 'totalPayments' ||
112
+ field === 'closingBalance';
113
+ export const shouldRecalculateStatementParseBalances = (changedField) => isStatementParseBalanceAffectingTransactionFieldChange(changedField) ||
114
+ changedField === 'statementStartDate' ||
115
+ changedField === 'statementEndDate';
116
+ export const resolveStatementParseBalanceFields = (formView, changedField) => {
117
+ const inPeriodTransactions = filterFormTransactionsInPeriod(formView.transactions, formView.statementStartDate, formView.statementEndDate);
118
+ const { totalDeposits, totalPayments } = computeStatementTransactionTotals(inPeriodTransactions);
119
+ if (!shouldRecalculateStatementParseBalances(changedField)) {
120
+ return {
121
+ openingBalance: formView.openingBalance,
122
+ closingBalance: formView.closingBalance,
123
+ totalDeposits: formView.totalDeposits,
124
+ totalPayments: formView.totalPayments,
125
+ };
126
+ }
127
+ return {
128
+ openingBalance: formView.openingBalance,
129
+ totalDeposits,
130
+ totalPayments,
131
+ closingBalance: computeStatementClosingBalance(formView.openingBalance, totalDeposits, totalPayments),
132
+ };
133
+ };
134
+ export const areStatementParseBalancesConsistent = (formView) => {
135
+ const { totalDeposits, totalPayments } = computeStatementTransactionTotals(filterFormTransactionsInPeriod(formView.transactions, formView.statementStartDate, formView.statementEndDate));
136
+ return (roundCurrency(formView.closingBalance) ===
137
+ computeStatementClosingBalance(formView.openingBalance, totalDeposits, totalPayments));
138
+ };
139
+ const mapParsedTransactionToFormRow = (transaction, index) => ({
140
+ id: transaction.statementTransactionId || `parsed-${index}`,
141
+ transactionDate: toApiDateString(transaction.transactionDate),
142
+ transactionMemo: transaction.transactionMemo,
143
+ amount: transaction.amount,
144
+ transactionDirection: transaction.transactionDirection,
145
+ statementTransactionId: transaction.statementTransactionId,
146
+ });
147
+ const mapLocalTransactionToFormRow = (transaction, id) => ({
148
+ id,
149
+ transactionDate: toApiDateString(transaction.transactionDate),
150
+ transactionMemo: transaction.transactionMemo,
151
+ amount: transaction.amount,
152
+ transactionDirection: transaction.transactionDirection,
153
+ statementTransactionId: transaction.statementTransactionId,
154
+ });
155
+ const buildStatementParseFormTransactions = (originalTransactions, localData) => {
156
+ const deletedIdSet = new Set(localData.statementTransactions?.deletedIds ?? []);
157
+ const updatedById = new Map((localData.statementTransactions?.updated ?? [])
158
+ .filter((transaction) => transaction.statementTransactionId != null)
159
+ .map((transaction) => [
160
+ transaction.statementTransactionId,
161
+ transaction,
162
+ ]));
163
+ const persistedTransactions = originalTransactions
164
+ .filter((transaction) => !deletedIdSet.has(transaction.statementTransactionId))
165
+ .map((transaction, index) => {
166
+ const updated = updatedById.get(transaction.statementTransactionId);
167
+ return updated != null
168
+ ? mapLocalTransactionToFormRow(updated, transaction.statementTransactionId)
169
+ : mapParsedTransactionToFormRow(transaction, index);
170
+ });
171
+ const addedTransactions = (localData.statementTransactions?.added ?? []).map((transaction, index) => mapLocalTransactionToFormRow(transaction, `added-${index}`));
172
+ return [...persistedTransactions, ...addedTransactions];
173
+ };
174
+ export const mergeStatementParseDeletedTransactionIds = (originalTransactions, statementPeriod, currentTransactionIds) => {
175
+ const dateFilteredDeletedIds = getDateFilteredDeletedTransactionIds(originalTransactions, statementPeriod);
176
+ const dateFilteredDeletedIdSet = new Set(dateFilteredDeletedIds);
177
+ const userDeletedIds = originalTransactions
178
+ .filter((transaction) => transaction.statementTransactionId !== '' &&
179
+ !currentTransactionIds.has(transaction.statementTransactionId) &&
180
+ !dateFilteredDeletedIdSet.has(transaction.statementTransactionId))
181
+ .map((transaction) => transaction.statementTransactionId);
182
+ return [...new Set([...userDeletedIds, ...dateFilteredDeletedIds])];
183
+ };
184
+ const resolveStatementMetaDates = (parsedStatementMeta, localMeta) => ({
185
+ statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
186
+ ? localMeta.statementStartDate
187
+ : (parsedStatementMeta?.statementStartDate ?? ''),
188
+ statementEndDate: localMeta?.statementEndDate != null && localMeta.statementEndDate !== ''
189
+ ? localMeta.statementEndDate
190
+ : (parsedStatementMeta?.statementEndDate ?? ''),
191
+ });
192
+ export const getStatementParseFormView = ({ parsedStatementMeta, originalTransactions, statementUpdateLocalData, }) => {
193
+ const transactions = statementUpdateLocalData != null
194
+ ? buildStatementParseFormTransactions(originalTransactions, statementUpdateLocalData)
195
+ : originalTransactions.map(mapParsedTransactionToFormRow);
196
+ const localMeta = statementUpdateLocalData?.statementMeta;
197
+ const { statementStartDate, statementEndDate } = resolveStatementMetaDates(parsedStatementMeta, localMeta);
198
+ const { totalDeposits, totalPayments } = computeStatementTransactionTotals(filterFormTransactionsInPeriod(transactions, statementStartDate, statementEndDate));
199
+ const openingBalance = localMeta?.openingBalance ?? parsedStatementMeta?.openingBalance ?? 0;
200
+ const computedClosingBalance = computeStatementClosingBalance(openingBalance, totalDeposits, totalPayments);
201
+ return {
202
+ statementStartDate,
203
+ statementEndDate,
204
+ openingBalance,
205
+ closingBalance: localMeta?.closingBalance ?? computedClosingBalance,
206
+ totalDeposits: localMeta?.totalDeposits ?? totalDeposits,
207
+ totalPayments: localMeta?.totalPayments ?? totalPayments,
208
+ transactions: filterFormTransactionsInPeriod(transactions, statementStartDate, statementEndDate),
209
+ };
210
+ };
211
+ export const toStatementUpdateLocalDataFromFormView = ({ formView, parsedStatementMeta, originalTransactions, changedField, }) => {
212
+ const balanceFields = resolveStatementParseBalanceFields(formView, changedField);
213
+ const currentTransactionIds = new Set(formView.transactions
214
+ .map((transaction) => transaction.statementTransactionId)
215
+ .filter((id) => id != null && id !== ''));
216
+ const added = [];
217
+ const updated = [];
218
+ formView.transactions.forEach((transaction) => {
219
+ const transactionDate = toApiDateString(transaction.transactionDate);
220
+ if (transaction.statementTransactionId == null) {
221
+ if (transaction.transactionDirection != null) {
222
+ added.push({
223
+ amount: transaction.amount,
224
+ transactionDate,
225
+ transactionDirection: transaction.transactionDirection,
226
+ transactionMemo: transaction.transactionMemo,
227
+ });
228
+ }
229
+ return;
230
+ }
231
+ const original = originalTransactions.find((candidate) => candidate.statementTransactionId === transaction.statementTransactionId);
232
+ if (original != null &&
233
+ (original.amount !== transaction.amount ||
234
+ toApiDateString(original.transactionDate) !== transactionDate ||
235
+ original.transactionMemo !== transaction.transactionMemo)) {
236
+ updated.push({
237
+ amount: transaction.amount,
238
+ transactionDate,
239
+ transactionDirection: transaction.transactionDirection,
240
+ transactionMemo: transaction.transactionMemo,
241
+ statementTransactionId: transaction.statementTransactionId,
242
+ });
243
+ }
244
+ });
245
+ const statementPeriod = {
246
+ statementStartDate: toApiDateString(formView.statementStartDate),
247
+ statementEndDate: toApiDateString(formView.statementEndDate),
248
+ };
249
+ const deletedIds = mergeStatementParseDeletedTransactionIds(originalTransactions, statementPeriod, currentTransactionIds);
250
+ const deletedIdSet = new Set(deletedIds);
251
+ const inPeriodAdded = filterFormTransactionsInPeriod(added, statementPeriod.statementStartDate, statementPeriod.statementEndDate);
252
+ const inPeriodUpdated = updated.filter((transaction) => transaction.statementTransactionId != null &&
253
+ !deletedIdSet.has(transaction.statementTransactionId));
254
+ return {
255
+ statementMeta: {
256
+ closingBalance: balanceFields.closingBalance,
257
+ openingBalance: balanceFields.openingBalance,
258
+ statementDataStatus: parsedStatementMeta?.statementDataStatus ?? {
259
+ code: '',
260
+ label: '',
261
+ },
262
+ statementEndDate: statementPeriod.statementEndDate,
263
+ statementStartDate: statementPeriod.statementStartDate,
264
+ statementStatus: parsedStatementMeta?.statementStatus ?? {
265
+ code: '',
266
+ label: '',
267
+ },
268
+ statementUploadId: parsedStatementMeta?.statementUploadId ?? '',
269
+ totalDeposits: balanceFields.totalDeposits,
270
+ totalPayments: balanceFields.totalPayments,
271
+ },
272
+ statementTransactions: {
273
+ added: inPeriodAdded,
274
+ deletedIds,
275
+ updated: inPeriodUpdated,
276
+ },
277
+ };
278
+ };
279
+ export const applyStatementParseFormChange = ({ formView, changedField, parsedStatementMeta, originalTransactions, }) => {
280
+ const balanceFields = resolveStatementParseBalanceFields(formView, changedField);
281
+ const shouldRecalculate = shouldRecalculateStatementParseBalances(changedField);
282
+ const mergedFormView = shouldRecalculate
283
+ ? { ...formView, ...balanceFields }
284
+ : formView;
285
+ return {
286
+ didRecalculateBalances: shouldRecalculate,
287
+ formView: mergedFormView,
288
+ localData: toStatementUpdateLocalDataFromFormView({
289
+ formView: mergedFormView,
290
+ parsedStatementMeta,
291
+ originalTransactions,
292
+ changedField,
293
+ }),
294
+ };
295
+ };
package/lib/index.d.ts CHANGED
@@ -279,7 +279,7 @@ import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } f
279
279
  import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
280
280
  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';
281
281
  import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearBulkUploadBatchDetailsForScopeChange, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markBatchDetailRefreshAttempted, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, refreshBatchDetailsForBatchId, 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';
282
- import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
282
+ import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
283
283
  import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markCategoryClassRecommendationsFailureForCategorization, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, updateTransactionFilters, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
284
284
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
285
285
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
@@ -292,6 +292,7 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
292
292
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
293
293
  import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
294
294
  import { getExpenseAutomationReconciliationView, getReparseStatementStatusByAccountId, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
295
+ import { applyStatementParseFormChange, areStatementParseBalancesConsistent, getStatementParseFormView } from './view/expenseAutomationView/selectors/statementParseViewSelector';
295
296
  import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
296
297
  import { TRANSACTION_FILTER_CATEGORIES, TransactionFilterAmountMatchingOperator, TransactionFilterCategory, TransactionFilterCategoryDropdownOption, TransactionFilterCategoryField, TransactionFilterEntityType, TransactionFilters, applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
297
298
  import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
@@ -299,7 +300,7 @@ import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey,
299
300
  import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
300
301
  import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
301
302
  import { MissingReceiptsSortKey as ExpenseAutomationMissingReceiptsSortKey, MissingReceiptsViewState as ExpenseAutomationMissingReceiptsViewState, MissingReceiptsViewUIState as ExpenseAutomationMissingReceiptsViewUIState, toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey } from './view/expenseAutomationView/types/missingReceiptsViewState';
302
- import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
303
+ import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementParseFormView, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
303
304
  import { TransactionsTab as ExpenseAutomationTransactionsTab, TransactionsViewState as ExpenseAutomationTransactionsViewState, TransactionsViewUIState as ExpenseAutomationTransactionsViewUIState, SupportedTransactionCategorization, TransactionCategorizationLineItemData, TransactionReviewLocalData, TransactionsSortKey, TransactionsTab, toTransactionsTabKey as toExpenseAutomationTransactionsTabKey, toTransactionsSortKey } from './view/expenseAutomationView/types/transactionsViewState';
304
305
  import { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature } from './view/featureNotificationView/featureNotificationViewReducer';
305
306
  import { getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered } from './view/featureNotificationView/featureNotificationViewSelector';
@@ -674,7 +675,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
674
675
  export { ClassesViewSelectorReportV2 };
675
676
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
676
677
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, MonthCloseCheckProgressJson, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
677
- 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, DEFAULT_COMPLETED_SUB_TAB, 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, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, 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, getReparseStatementStatusByAccountId, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
678
+ 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, DEFAULT_COMPLETED_SUB_TAB, 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, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, 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, getReparseStatementStatusByAccountId, applyStatementParseFormChange, areStatementParseBalancesConsistent, getStatementParseFormView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementParseFormView, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
678
679
  export { JEScheduleLocalData };
679
680
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
680
681
  export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateTransactionFilters, updateSelectedCheckboxTransactionIds, markCategoryClassRecommendationsFailureForCategorization, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, clearTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };