@zeniai/client-epic-state 4.19.37-betaVR26 → 4.19.37-betaVR3

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 (39) hide show
  1. package/lib/epic.d.ts +1 -2
  2. package/lib/epic.js +1 -2
  3. package/lib/esm/epic.js +1 -2
  4. package/lib/esm/index.js +2 -2
  5. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +7 -3
  6. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +13 -22
  7. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -7
  8. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +3 -7
  9. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +23 -45
  10. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +24 -65
  11. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +32 -33
  12. package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +16 -63
  13. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +26 -153
  14. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -108
  15. package/lib/index.d.ts +2 -2
  16. package/lib/index.js +32 -36
  17. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  18. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.d.ts +5 -2
  19. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +6 -2
  20. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +11 -20
  21. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -7
  22. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +2 -6
  23. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +2 -3
  24. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +20 -43
  25. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +3 -11
  26. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +22 -63
  27. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +7 -5
  28. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +28 -29
  29. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +31 -30
  30. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +18 -69
  31. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +6 -25
  32. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +27 -155
  33. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +0 -6
  34. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -108
  35. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -16
  36. package/package.json +2 -2
  37. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -34
  38. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +0 -8
  39. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -38
@@ -1,9 +1,7 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
3
- export const getCompletedTransactionsCacheKey = (periodId, sortKey, sortOrder, subTab) => `completed-${subTab}-${sortKey}-${sortOrder === 'ascending' ? 'asc' : 'desc'}-${periodId}`;
4
3
  export const initialBulkUploadState = {
5
4
  batchDetailsById: {},
6
- batchDetailsPaginationState: { fetchState: 'Not-Started', error: undefined },
7
5
  batchListByPeriod: {},
8
6
  batchListFetchState: { fetchState: 'Not-Started', error: undefined },
9
7
  batchStatusById: {},
@@ -12,15 +10,10 @@ export const initialBulkUploadState = {
12
10
  confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
13
11
  currentBatchId: undefined,
14
12
  currentResultsTab: 'unmatched',
15
- failedBatchDetailIds: [],
16
13
  manualSearch: {
17
14
  fetchState: { fetchState: 'Not-Started', error: undefined },
18
- isLoadingMore: false,
19
- nextPageToken: null,
20
- pageSize: 25,
21
15
  results: [],
22
16
  searchQuery: '',
23
- totalCount: 0,
24
17
  },
25
18
  phase: 'idle',
26
19
  sortKey: 'date',
@@ -30,7 +23,6 @@ export const initialBulkUploadState = {
30
23
  };
31
24
  export const initialState = {
32
25
  bulkUpload: initialBulkUploadState,
33
- pendingMissingReceiptsTabNavigation: null,
34
26
  uploadReceiptStatusById: {},
35
27
  refreshStatus: {
36
28
  fetchState: 'Not-Started',
@@ -183,25 +175,13 @@ const expenseAutomationMissingReceiptsView = createSlice({
183
175
  };
184
176
  draft.bulkUpload.phase = 'idle';
185
177
  },
186
- pusherBatchStatusUpdate(draft, action) {
178
+ updateBulkUploadBatchStatus(draft, action) {
187
179
  const batchStatus = action.payload;
188
180
  draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
189
- /**
190
- * Auto-matching banner (`phase === 'matching'`) must clear when the server reports this
191
- * upload batch is done — otherwise the Missing tab keeps MatchingProgressBanner until
192
- * batch-details APIs run; EmailUploadBanner should show again for the next upload.
193
- */
194
- if (batchStatus.status === 'completed' &&
195
- draft.bulkUpload.phase === 'matching' &&
196
- draft.bulkUpload.currentBatchId === batchStatus.batchId) {
197
- draft.bulkUpload.phase = 'completed';
198
- }
199
- },
200
- requestMissingReceiptsTabNavigation(draft, action) {
201
- draft.pendingMissingReceiptsTabNavigation = action.payload.tab;
202
181
  },
203
- clearMissingReceiptsTabNavigation(draft) {
204
- draft.pendingMissingReceiptsTabNavigation = null;
182
+ pusherBatchStatusUpdate(draft, action) {
183
+ const batchStatus = action.payload;
184
+ draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
205
185
  },
206
186
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
207
187
  fetchBulkUploadBatchDetails(_draft) {
@@ -219,86 +199,17 @@ const expenseAutomationMissingReceiptsView = createSlice({
219
199
  storeBatchDetails(draft, action) {
220
200
  const details = action.payload;
221
201
  draft.bulkUpload.batchDetailsById[details.batchId] = details;
222
- /**
223
- * Multi-batch fetch paths use `storeBatchDetails` (not `fetchBulkUploadBatchDetailsSuccess`).
224
- * Without this, `phase` stays `matching` after upload forever and the Unmatched tab keeps
225
- * showing the skeleton (`bulkUploadPhase === 'matching'` in web-components).
226
- */
227
- if (draft.bulkUpload.phase === 'matching' &&
228
- draft.bulkUpload.currentBatchId === details.batchId) {
229
- draft.bulkUpload.phase = 'completed';
230
- }
231
- },
232
- batchDetailFetchFailed(draft, action) {
233
- const { batchId } = action.payload;
234
- if (!draft.bulkUpload.failedBatchDetailIds.includes(batchId)) {
235
- draft.bulkUpload.failedBatchDetailIds.push(batchId);
236
- }
237
- if (draft.bulkUpload.phase === 'matching' &&
238
- draft.bulkUpload.currentBatchId === batchId) {
239
- draft.bulkUpload.phase = 'completed';
240
- }
241
- },
242
- setInitialBatchDetailsLoading(draft) {
243
- draft.bulkUpload.batchDetailsPaginationState = {
244
- fetchState: 'In-Progress',
245
- error: undefined,
246
- };
247
- },
248
- fetchMoreBatchDetails(_draft) {
249
- _draft.bulkUpload.batchDetailsPaginationState = {
250
- fetchState: 'In-Progress',
251
- error: undefined,
252
- };
253
- },
254
- fetchMoreBatchDetailsComplete(draft) {
255
- draft.bulkUpload.batchDetailsPaginationState = {
256
- fetchState: 'Completed',
257
- error: undefined,
258
- };
259
- const currentId = draft.bulkUpload.currentBatchId;
260
- const currentDetails = currentId != null
261
- ? draft.bulkUpload.batchDetailsById[currentId]
262
- : undefined;
263
- if (draft.bulkUpload.phase === 'matching' &&
264
- currentId != null &&
265
- currentDetails?.status === 'completed') {
266
- draft.bulkUpload.phase = 'completed';
267
- }
268
- },
269
- fetchMoreBatchDetailsFailure(draft, action) {
270
- draft.bulkUpload.batchDetailsPaginationState = {
271
- fetchState: 'Error',
272
- error: action.payload.error,
273
- };
274
202
  },
275
203
  fetchBulkUploadBatches: {
276
- reducer(draft, action) {
277
- if (action.payload.invalidateBatchDetailsCache === true) {
278
- draft.bulkUpload.batchDetailsById = {};
279
- draft.bulkUpload.failedBatchDetailIds = [];
280
- }
204
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
205
+ reducer(draft, _action) {
281
206
  draft.bulkUpload.batchListFetchState = {
282
207
  fetchState: 'In-Progress',
283
208
  error: undefined,
284
209
  };
285
210
  },
286
- prepare(input) {
287
- if (input === true || input === false) {
288
- return {
289
- payload: {
290
- cacheOverride: input === true,
291
- invalidateBatchDetailsCache: false,
292
- },
293
- };
294
- }
295
- const o = input ?? {};
296
- return {
297
- payload: {
298
- cacheOverride: o.cacheOverride === true,
299
- invalidateBatchDetailsCache: o.invalidateBatchDetailsCache === true,
300
- },
301
- };
211
+ prepare(cacheOverride = false) {
212
+ return { payload: { cacheOverride } };
302
213
  },
303
214
  },
304
215
  fetchBulkUploadBatchesSuccess(draft, action) {
@@ -308,20 +219,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
308
219
  fetchState: 'Completed',
309
220
  error: undefined,
310
221
  };
311
- /**
312
- * When the multi-batch-details epic has nothing to fetch (e.g. list rows not `completed`
313
- * yet, or details already present), `phase` can stay `matching` even though we already
314
- * have completed details for `currentBatchId` (from polling / Pusher). Sync so the UI can
315
- * dismiss the Unmatched skeleton.
316
- */
317
- const currentId = draft.bulkUpload.currentBatchId;
318
- if (draft.bulkUpload.phase === 'matching' &&
319
- currentId != null) {
320
- const existing = draft.bulkUpload.batchDetailsById[currentId];
321
- if (existing?.status === 'completed') {
322
- draft.bulkUpload.phase = 'completed';
323
- }
324
- }
325
222
  },
326
223
  fetchBulkUploadBatchesFailure(draft, action) {
327
224
  draft.bulkUpload.batchListFetchState = {
@@ -376,6 +273,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
376
273
  },
377
274
  setBulkUploadCompletedSubTab(draft, action) {
378
275
  draft.bulkUpload.completedSubTab = action.payload;
276
+ draft.bulkUpload.completedTransactionsByPeriod = {};
379
277
  },
380
278
  setBulkUploadSortConfig(draft, action) {
381
279
  draft.bulkUpload.sortKey = action.payload.sortKey;
@@ -383,51 +281,28 @@ const expenseAutomationMissingReceiptsView = createSlice({
383
281
  },
384
282
  clearBulkUpload(draft) {
385
283
  Object.assign(draft.bulkUpload, initialBulkUploadState);
386
- draft.pendingMissingReceiptsTabNavigation = null;
387
284
  },
388
285
  searchTransactionsForManualMatch: {
389
286
  reducer(draft, action) {
390
- const { query, pageToken } = action.payload;
391
- const isLoadMore = pageToken != null;
392
- draft.bulkUpload.manualSearch.searchQuery = query;
393
- if (isLoadMore) {
394
- draft.bulkUpload.manualSearch.isLoadingMore = true;
395
- }
396
- else {
397
- draft.bulkUpload.manualSearch.isLoadingMore = false;
398
- draft.bulkUpload.manualSearch.results = [];
399
- draft.bulkUpload.manualSearch.nextPageToken = null;
400
- draft.bulkUpload.manualSearch.totalCount = 0;
401
- draft.bulkUpload.manualSearch.fetchState = {
402
- fetchState: 'In-Progress',
403
- error: undefined,
404
- };
405
- }
287
+ draft.bulkUpload.manualSearch.searchQuery = action.payload.query;
288
+ draft.bulkUpload.manualSearch.fetchState = {
289
+ fetchState: 'In-Progress',
290
+ error: undefined,
291
+ };
292
+ draft.bulkUpload.manualSearch.results = [];
406
293
  },
407
- prepare(query, pageToken) {
408
- return { payload: { query, pageToken: pageToken ?? undefined } };
294
+ prepare(query) {
295
+ return { payload: { query } };
409
296
  },
410
297
  },
411
298
  searchTransactionsForManualMatchSuccess(draft, action) {
412
- const { append, nextPageToken, results, totalCount } = action.payload;
413
- if (append) {
414
- const merged = [...draft.bulkUpload.manualSearch.results, ...results];
415
- const byId = new Map(merged.map((r) => [r.transactionId, r]));
416
- draft.bulkUpload.manualSearch.results = Array.from(byId.values());
417
- }
418
- else {
419
- draft.bulkUpload.manualSearch.results = results;
420
- }
421
- draft.bulkUpload.manualSearch.nextPageToken = nextPageToken;
422
- draft.bulkUpload.manualSearch.totalCount = totalCount;
423
- draft.bulkUpload.manualSearch.isLoadingMore = false;
299
+ draft.bulkUpload.manualSearch.results = action.payload;
424
300
  draft.bulkUpload.manualSearch.fetchState = {
425
301
  fetchState: 'Completed',
426
302
  error: undefined,
427
303
  };
428
304
  },
429
305
  searchTransactionsForManualMatchFailure(draft, action) {
430
- draft.bulkUpload.manualSearch.isLoadingMore = false;
431
306
  draft.bulkUpload.manualSearch.fetchState = {
432
307
  fetchState: 'Error',
433
308
  error: action.payload.error,
@@ -453,16 +328,15 @@ const expenseAutomationMissingReceiptsView = createSlice({
453
328
  }
454
329
  }
455
330
  },
456
- prepare(pageToken, cacheOverride) {
457
- return { payload: { pageToken, cacheOverride } };
331
+ prepare(pageToken) {
332
+ return { payload: { pageToken } };
458
333
  },
459
334
  },
460
335
  fetchCompletedTransactionsSuccess(draft, action) {
461
336
  const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
462
337
  const periodId = toMonthYearPeriodId(selectedPeriod);
463
- const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
464
338
  if (isInitialLoad) {
465
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
339
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
466
340
  transactionIds,
467
341
  nextPageToken,
468
342
  totalCount,
@@ -470,7 +344,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
470
344
  };
471
345
  }
472
346
  else {
473
- const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
347
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
474
348
  if (existing != null) {
475
349
  existing.transactionIds.push(...transactionIds);
476
350
  existing.nextPageToken = nextPageToken;
@@ -478,7 +352,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
478
352
  existing.fetchState = { fetchState: 'Completed', error: undefined };
479
353
  }
480
354
  else {
481
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
355
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
482
356
  transactionIds,
483
357
  nextPageToken,
484
358
  totalCount,
@@ -489,8 +363,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
489
363
  },
490
364
  fetchCompletedTransactionsFailure(draft, action) {
491
365
  const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
492
- const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
493
- const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
366
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
494
367
  if (existing != null) {
495
368
  existing.fetchState = {
496
369
  fetchState: 'Error',
@@ -498,7 +371,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
498
371
  };
499
372
  }
500
373
  else {
501
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
374
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
502
375
  fetchState: { fetchState: 'Error', error: action.payload.error },
503
376
  nextPageToken: null,
504
377
  totalCount: 0,
@@ -510,7 +383,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
510
383
  });
511
384
  export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView,
512
385
  // Bulk Upload
513
- bulkUploadReceipts, updateBulkUploadProgress, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, batchDetailFetchFailed, setInitialBatchDetailsLoading, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults,
386
+ bulkUploadReceipts, updateBulkUploadProgress, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadBatchStatus, pusherBatchStatusUpdate, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults,
514
387
  // Completed Transactions
515
388
  fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, } = expenseAutomationMissingReceiptsView.actions;
516
389
  export default expenseAutomationMissingReceiptsView.reducer;
@@ -3,8 +3,6 @@ import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
3
3
  import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
4
4
  import { getSupportedTransactionById, getSupportedTransactionsByIds, } from '../../../entity/transaction/transactionSelector';
5
5
  import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
6
- import { isBatchListStatusCompleted } from '../payload/missingReceiptsPayload';
7
- import { getCompletedTransactionsCacheKey } from '../reducers/missingReceiptsViewReducer';
8
6
  export function getExpenseAutomationMissingReceiptsView(state) {
9
7
  const { expenseAutomationMissingReceiptsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, } = state;
10
8
  const currentTenant = getCurrentTenant(state);
@@ -49,32 +47,14 @@ export function getExpenseAutomationMissingReceiptsView(state) {
49
47
  const completionStatus = missingReceiptsCompletionStatus != null
50
48
  ? missingReceiptsCompletionStatus
51
49
  : 'incomplete';
52
- const { bulkUpload, pendingMissingReceiptsTabNavigation, } = expenseAutomationMissingReceiptsViewState;
50
+ const { bulkUpload } = expenseAutomationMissingReceiptsViewState;
53
51
  const currentBatchStatus = bulkUpload.currentBatchId != null
54
52
  ? bulkUpload.batchStatusById[bulkUpload.currentBatchId]
55
53
  : undefined;
56
- const batchList = monthYearPeriodId != null
57
- ? bulkUpload.batchListByPeriod[monthYearPeriodId] ?? []
58
- : [];
59
- /**
60
- * Primary "Unmatched" batch = first completed batch in platform list order, preferring the
61
- * first batch that still has un_matched/no_match work when any completed batch has such work.
62
- * Batches without details yet: wait if the list row still reports unmatched work; otherwise skip
63
- * so we do not block the whole tab while other rows are not fetched yet.
64
- */
65
- const primaryBatchIdFromDetailsOrder = getPrimaryBatchIdFromBatchListOrder(batchList, bulkUpload.batchDetailsById, bulkUpload.failedBatchDetailIds);
66
- /** During upload/matching, the in-flight batch may not appear in batchList yet — prefer currentBatchId. */
67
- const unmatchedSectionBatchId = bulkUpload.phase === 'matching' || bulkUpload.phase === 'uploading'
68
- ? bulkUpload.currentBatchId ?? primaryBatchIdFromDetailsOrder
69
- : primaryBatchIdFromDetailsOrder;
70
- const completedBatchesInApiOrder = batchList.filter((b) => isBatchListStatusCompleted(b.status));
71
- const currentBatchDetails = unmatchedSectionBatchId != null
72
- ? bulkUpload.batchDetailsById[unmatchedSectionBatchId]
54
+ const currentBatchDetails = bulkUpload.currentBatchId != null
55
+ ? bulkUpload.batchDetailsById[bulkUpload.currentBatchId]
73
56
  : undefined;
74
- const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file, currentBatchDetails.batchId, transactionState));
75
- const failedIds = new Set(bulkUpload.failedBatchDetailIds);
76
- const hasMoreBatchDetails = completedBatchesInApiOrder.some((b) => bulkUpload.batchDetailsById[b.batchId] == null &&
77
- !failedIds.has(b.batchId));
57
+ const resolvedFiles = currentBatchDetails?.files.map((file) => resolveBatchFile(file, transactionState));
78
58
  const getSortValue = (file) => {
79
59
  const t = file.matchedTransaction;
80
60
  if (t == null) {
@@ -112,14 +92,11 @@ export function getExpenseAutomationMissingReceiptsView(state) {
112
92
  : 0,
113
93
  }
114
94
  : { total: 0, processed: 0, percentage: 0 };
95
+ const batchList = monthYearPeriodId != null
96
+ ? bulkUpload.batchListByPeriod[monthYearPeriodId] ?? []
97
+ : [];
115
98
  const batchListFetchState = bulkUpload.batchListFetchState;
116
- /**
117
- * When primary batch is not resolved yet, still aggregate unmatched files from every batch
118
- * that has details loaded (otherwise past is empty and receipts vanish from the UI).
119
- */
120
- const pastBatches = unmatchedSectionBatchId != null
121
- ? batchList.filter((b) => b.batchId !== unmatchedSectionBatchId)
122
- : batchList;
99
+ const pastBatches = batchList.filter((b) => b.batchId !== bulkUpload.currentBatchId);
123
100
  const pastUnmatchedFiles = pastBatches.flatMap((b) => {
124
101
  const details = bulkUpload.batchDetailsById[b.batchId];
125
102
  if (details == null) {
@@ -127,13 +104,10 @@ export function getExpenseAutomationMissingReceiptsView(state) {
127
104
  }
128
105
  return details.files
129
106
  .filter((f) => f.status === 'un_matched' || f.status === 'no_match')
130
- .map((f) => resolveBatchFile(f, b.batchId, transactionState));
107
+ .map((f) => resolveBatchFile(f, transactionState));
131
108
  });
132
- const completedTransactionsCacheKey = monthYearPeriodId != null
133
- ? getCompletedTransactionsCacheKey(monthYearPeriodId, bulkUpload.sortKey, bulkUpload.sortOrder, bulkUpload.completedSubTab)
134
- : undefined;
135
- const completedTransactionsForPeriod = completedTransactionsCacheKey != null
136
- ? bulkUpload.completedTransactionsByPeriod[completedTransactionsCacheKey]
109
+ const completedTransactionsForPeriod = monthYearPeriodId != null
110
+ ? bulkUpload.completedTransactionsByPeriod[monthYearPeriodId]
137
111
  : undefined;
138
112
  const completedTransactionIds = completedTransactionsForPeriod?.transactionIds ?? [];
139
113
  const resolvedCompletedTransactions = getSupportedTransactionsByIds(transactionState, completedTransactionIds);
@@ -146,13 +120,6 @@ export function getExpenseAutomationMissingReceiptsView(state) {
146
120
  summary: currentBatchDetails.summary,
147
121
  }
148
122
  : undefined;
149
- const manualSearchResults = bulkUpload.manualSearch.results.map((r) => {
150
- const t = getSupportedTransactionById(transactionState, r.transactionId);
151
- return {
152
- ...r,
153
- vendorLogo: r.vendorLogo ?? t?.logo?.href,
154
- };
155
- });
156
123
  return {
157
124
  fetchState,
158
125
  error,
@@ -161,7 +128,6 @@ export function getExpenseAutomationMissingReceiptsView(state) {
161
128
  refreshStatus,
162
129
  transactions: sortedTransactions,
163
130
  completionStatus,
164
- pendingMissingReceiptsTabNavigation: pendingMissingReceiptsTabNavigation ?? null,
165
131
  bulkUpload: {
166
132
  phase: bulkUpload.phase,
167
133
  uploadStatus: bulkUpload.uploadStatus,
@@ -188,71 +154,12 @@ export function getExpenseAutomationMissingReceiptsView(state) {
188
154
  pastBatches,
189
155
  pastUnmatchedFiles,
190
156
  confirmMatchStatus: bulkUpload.confirmMatchStatus,
191
- hasMoreBatchDetails,
192
- batchDetailsPaginationState: bulkUpload.batchDetailsPaginationState,
193
- manualSearch: {
194
- ...bulkUpload.manualSearch,
195
- results: manualSearchResults,
196
- },
157
+ manualSearch: bulkUpload.manualSearch,
197
158
  uploadProgress: bulkUpload.uploadProgress,
198
159
  },
199
160
  };
200
161
  }
201
- function batchDetailsHasUnmatchedWork(details) {
202
- return details.files.some((f) => f.status === 'un_matched' || f.status === 'no_match');
203
- }
204
- /** List row summary before batch details load — aligns with unmatched / possible-match work. */
205
- function batchListItemHasUnmatchedWork(batch) {
206
- return batch.noMatchCount > 0 || batch.possibleMatchesCount > 0;
207
- }
208
- /**
209
- * `batchList` must match platform order (same sequence as the bulk-upload batches API). Picks the
210
- * primary batch for the top "Unmatched" section. Skips failed detail fetches.
211
- *
212
- * If details are not loaded for an earlier list row but that row reports no unmatched work, we
213
- * skip it so later rows with loaded details can be primary (avoids an empty tab when the first
214
- * fetch page only loaded later batches). If the list reports unmatched work but details are still
215
- * loading, we wait (undefined) so primary order stays correct once details arrive.
216
- */
217
- function getPrimaryBatchIdFromBatchListOrder(batchListInPlatformOrder, batchDetailsById, failedBatchDetailIds) {
218
- const failedIds = new Set(failedBatchDetailIds);
219
- const anyCompletedBatchHasUnmatchedWork = batchListInPlatformOrder.some((b) => {
220
- if (failedIds.has(b.batchId)) {
221
- return false;
222
- }
223
- const d = batchDetailsById[b.batchId];
224
- if (d != null &&
225
- d.status === 'completed' &&
226
- batchDetailsHasUnmatchedWork(d)) {
227
- return true;
228
- }
229
- return d == null && batchListItemHasUnmatchedWork(b);
230
- });
231
- for (const batch of batchListInPlatformOrder) {
232
- if (failedIds.has(batch.batchId)) {
233
- continue;
234
- }
235
- const details = batchDetailsById[batch.batchId];
236
- if (details == null) {
237
- if (batchListItemHasUnmatchedWork(batch)) {
238
- return undefined;
239
- }
240
- continue;
241
- }
242
- if (details.status !== 'completed') {
243
- continue;
244
- }
245
- if (anyCompletedBatchHasUnmatchedWork) {
246
- if (batchDetailsHasUnmatchedWork(details)) {
247
- return batch.batchId;
248
- }
249
- continue;
250
- }
251
- return batch.batchId;
252
- }
253
- return undefined;
254
- }
255
- function resolveBatchFile(file, batchId, transactionState) {
162
+ function resolveBatchFile(file, transactionState) {
256
163
  const matchedTransaction = file.matchedTransactionId != null
257
164
  ? getSupportedTransactionById(transactionState, file.matchedTransactionId)
258
165
  : undefined;
@@ -266,8 +173,6 @@ function resolveBatchFile(file, batchId, transactionState) {
266
173
  .filter((c) => c != null);
267
174
  return {
268
175
  attachmentId: file.attachmentId,
269
- batchId,
270
- fileDownloadUrl: file.fileDownloadUrl,
271
176
  fileId: file.fileId,
272
177
  filename: file.filename,
273
178
  filePreviewUrl: file.filePreviewUrl,
package/lib/index.d.ts CHANGED
@@ -263,7 +263,7 @@ import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLine
263
263
  import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } from './view/expenseAutomationView/payload/reconciliationPayload';
264
264
  import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
265
265
  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, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
266
- import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
266
+ import { bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, updateBulkUploadBatchStatus, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
267
267
  import { deleteAccountStatement, fetchReconciliation as fetchReconciliationView, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
268
268
  import { clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState } from './view/expenseAutomationView/reducers/transactionsViewReducer';
269
269
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
@@ -615,7 +615,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
615
615
  export { ClassesViewSelectorReportV2 };
616
616
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
617
617
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
618
- export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
618
+ export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, updateBulkUploadBatchStatus, updateBulkUploadProgress, pusherBatchStatusUpdate, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
619
619
  export { JEScheduleLocalData };
620
620
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
621
621
  export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };