@zeniai/client-epic-state 5.1.37-betaRD3 → 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 (29) 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/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +2 -3
  7. package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +32 -0
  8. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
  9. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +163 -21
  10. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
  11. package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +295 -0
  12. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -24
  13. package/lib/index.d.ts +4 -3
  14. package/lib/index.js +44 -38
  15. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +4 -2
  16. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +2 -3
  17. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +2 -0
  18. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +36 -0
  19. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  20. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +1 -0
  21. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +14 -1
  22. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +165 -23
  23. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +10 -2
  24. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +30 -26
  25. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +25 -0
  26. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +313 -0
  27. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -24
  28. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +52 -2
  29. 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
+ };
@@ -188,28 +188,15 @@ export function getExpenseAutomationTransactionView(state) {
188
188
  };
189
189
  // Parent-tab badge counts. Sourced from `parent_tab_total_count` in the
190
190
  // listing response and used exclusively by the navbar / tab strip badges.
191
- // When a search or filter is active the badge switches to the filtered count
192
- // so the number tracks what the user is looking at.
193
- const autoCatTabView = expenseAutomationTransactionsViewState.transactionCategorizationView
194
- .autoCategorized;
195
- const reviewTabView = expenseAutomationTransactionsViewState.transactionCategorizationView.review;
196
- const autoCatSubTabCache = expenseAutomationTransactionsViewState.autoCategorizedSubTabCache;
197
- const autoCatFilterActive = autoCatTabView.uiState.searchString !== '' ||
198
- autoCatTabView.filters.categories.length > 0;
199
- const reviewFilterActive = reviewTabView.uiState.searchString !== '' ||
200
- reviewTabView.filters.categories.length > 0;
191
+ // Independent of which Completed sub-tab is active so the badge stays
192
+ // stable across sub-tab switches.
201
193
  const parentTotalCountByTab = expenseAutomationTransactionsViewState.parentTotalCountByTab;
202
194
  const parentTabTotalCountByTab = {
203
195
  review: monthYearPeriodId != null
204
- ? reviewFilterActive
205
- ? totalCountByReview[monthYearPeriodId]
206
- : (parentTotalCountByTab.review[monthYearPeriodId] ?? 0)
196
+ ? (parentTotalCountByTab.review[monthYearPeriodId] ?? 0)
207
197
  : 0,
208
198
  autoCategorized: monthYearPeriodId != null
209
- ? autoCatFilterActive
210
- ? (autoCatSubTabCache['all']?.totalCount[monthYearPeriodId] ??
211
- totalCountByAutoCat[monthYearPeriodId])
212
- : (parentTotalCountByTab.autoCategorized[monthYearPeriodId] ?? 0)
199
+ ? (parentTotalCountByTab.autoCategorized[monthYearPeriodId] ?? 0)
213
200
  : 0,
214
201
  };
215
202
  const fetchStateByTab = {
@@ -252,13 +239,7 @@ export function getExpenseAutomationTransactionView(state) {
252
239
  isAccountingProjectsEnabled,
253
240
  projectList,
254
241
  transactionLocalData: filteredTransactionLocalData,
255
- // When a client-side category filter is active the server pageToken is
256
- // misleading — the server has more pages but the filter already reduces
257
- // what's visible. Masking pageToken here prevents the skeleton "loading"
258
- // row from appearing when the user is looking at a filtered result set.
259
- uiState: filters.categories.length > 0
260
- ? { ...uiState, pageToken: null }
261
- : uiState,
242
+ uiState,
262
243
  refreshStatus,
263
244
  saveStatus,
264
245
  markAsNotMiscategorizedStatus,
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, };