@zeniai/client-epic-state 4.19.37-betaVR27 → 4.19.37-betaVR4

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 (38) 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/confirmBulkUploadMatchEpic.js +2 -2
  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 -163
  14. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -109
  15. package/lib/index.d.ts +2 -2
  16. package/lib/index.js +32 -37
  17. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  18. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +1 -1
  19. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +11 -20
  20. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +1 -7
  21. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +2 -6
  22. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +2 -3
  23. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +20 -43
  24. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +3 -11
  25. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +22 -63
  26. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +7 -5
  27. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +28 -29
  28. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +31 -30
  29. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +18 -69
  30. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +6 -25
  31. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +27 -165
  32. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +0 -8
  33. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +13 -109
  34. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -21
  35. package/package.json +2 -2
  36. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -34
  37. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +0 -8
  38. 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,16 +10,10 @@ export const initialBulkUploadState = {
12
10
  confirmMatchStatus: { fetchState: 'Not-Started', error: undefined },
13
11
  currentBatchId: undefined,
14
12
  currentResultsTab: 'unmatched',
15
- failedBatchDetailIds: [],
16
- manualSearchUiResetKey: 0,
17
13
  manualSearch: {
18
14
  fetchState: { fetchState: 'Not-Started', error: undefined },
19
- isLoadingMore: false,
20
- nextPageToken: null,
21
- pageSize: 25,
22
15
  results: [],
23
16
  searchQuery: '',
24
- totalCount: 0,
25
17
  },
26
18
  phase: 'idle',
27
19
  sortKey: 'date',
@@ -31,7 +23,6 @@ export const initialBulkUploadState = {
31
23
  };
32
24
  export const initialState = {
33
25
  bulkUpload: initialBulkUploadState,
34
- pendingMissingReceiptsTabNavigation: null,
35
26
  uploadReceiptStatusById: {},
36
27
  refreshStatus: {
37
28
  fetchState: 'Not-Started',
@@ -184,25 +175,13 @@ const expenseAutomationMissingReceiptsView = createSlice({
184
175
  };
185
176
  draft.bulkUpload.phase = 'idle';
186
177
  },
187
- pusherBatchStatusUpdate(draft, action) {
178
+ updateBulkUploadBatchStatus(draft, action) {
188
179
  const batchStatus = action.payload;
189
180
  draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
190
- /**
191
- * Auto-matching banner (`phase === 'matching'`) must clear when the server reports this
192
- * upload batch is done — otherwise the Missing tab keeps MatchingProgressBanner until
193
- * batch-details APIs run; EmailUploadBanner should show again for the next upload.
194
- */
195
- if (batchStatus.status === 'completed' &&
196
- draft.bulkUpload.phase === 'matching' &&
197
- draft.bulkUpload.currentBatchId === batchStatus.batchId) {
198
- draft.bulkUpload.phase = 'completed';
199
- }
200
181
  },
201
- requestMissingReceiptsTabNavigation(draft, action) {
202
- draft.pendingMissingReceiptsTabNavigation = action.payload.tab;
203
- },
204
- clearMissingReceiptsTabNavigation(draft) {
205
- draft.pendingMissingReceiptsTabNavigation = null;
182
+ pusherBatchStatusUpdate(draft, action) {
183
+ const batchStatus = action.payload;
184
+ draft.bulkUpload.batchStatusById[batchStatus.batchId] = batchStatus;
206
185
  },
207
186
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
208
187
  fetchBulkUploadBatchDetails(_draft) {
@@ -220,86 +199,17 @@ const expenseAutomationMissingReceiptsView = createSlice({
220
199
  storeBatchDetails(draft, action) {
221
200
  const details = action.payload;
222
201
  draft.bulkUpload.batchDetailsById[details.batchId] = details;
223
- /**
224
- * Multi-batch fetch paths use `storeBatchDetails` (not `fetchBulkUploadBatchDetailsSuccess`).
225
- * Without this, `phase` stays `matching` after upload forever and the Unmatched tab keeps
226
- * showing the skeleton (`bulkUploadPhase === 'matching'` in web-components).
227
- */
228
- if (draft.bulkUpload.phase === 'matching' &&
229
- draft.bulkUpload.currentBatchId === details.batchId) {
230
- draft.bulkUpload.phase = 'completed';
231
- }
232
- },
233
- batchDetailFetchFailed(draft, action) {
234
- const { batchId } = action.payload;
235
- if (!draft.bulkUpload.failedBatchDetailIds.includes(batchId)) {
236
- draft.bulkUpload.failedBatchDetailIds.push(batchId);
237
- }
238
- if (draft.bulkUpload.phase === 'matching' &&
239
- draft.bulkUpload.currentBatchId === batchId) {
240
- draft.bulkUpload.phase = 'completed';
241
- }
242
- },
243
- setInitialBatchDetailsLoading(draft) {
244
- draft.bulkUpload.batchDetailsPaginationState = {
245
- fetchState: 'In-Progress',
246
- error: undefined,
247
- };
248
- },
249
- fetchMoreBatchDetails(_draft) {
250
- _draft.bulkUpload.batchDetailsPaginationState = {
251
- fetchState: 'In-Progress',
252
- error: undefined,
253
- };
254
- },
255
- fetchMoreBatchDetailsComplete(draft) {
256
- draft.bulkUpload.batchDetailsPaginationState = {
257
- fetchState: 'Completed',
258
- error: undefined,
259
- };
260
- const currentId = draft.bulkUpload.currentBatchId;
261
- const currentDetails = currentId != null
262
- ? draft.bulkUpload.batchDetailsById[currentId]
263
- : undefined;
264
- if (draft.bulkUpload.phase === 'matching' &&
265
- currentId != null &&
266
- currentDetails?.status === 'completed') {
267
- draft.bulkUpload.phase = 'completed';
268
- }
269
- },
270
- fetchMoreBatchDetailsFailure(draft, action) {
271
- draft.bulkUpload.batchDetailsPaginationState = {
272
- fetchState: 'Error',
273
- error: action.payload.error,
274
- };
275
202
  },
276
203
  fetchBulkUploadBatches: {
277
- reducer(draft, action) {
278
- if (action.payload.invalidateBatchDetailsCache === true) {
279
- draft.bulkUpload.batchDetailsById = {};
280
- draft.bulkUpload.failedBatchDetailIds = [];
281
- }
204
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
205
+ reducer(draft, _action) {
282
206
  draft.bulkUpload.batchListFetchState = {
283
207
  fetchState: 'In-Progress',
284
208
  error: undefined,
285
209
  };
286
210
  },
287
- prepare(input) {
288
- if (input === true || input === false) {
289
- return {
290
- payload: {
291
- cacheOverride: input === true,
292
- invalidateBatchDetailsCache: false,
293
- },
294
- };
295
- }
296
- const o = input ?? {};
297
- return {
298
- payload: {
299
- cacheOverride: o.cacheOverride === true,
300
- invalidateBatchDetailsCache: o.invalidateBatchDetailsCache === true,
301
- },
302
- };
211
+ prepare(cacheOverride = false) {
212
+ return { payload: { cacheOverride } };
303
213
  },
304
214
  },
305
215
  fetchBulkUploadBatchesSuccess(draft, action) {
@@ -309,20 +219,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
309
219
  fetchState: 'Completed',
310
220
  error: undefined,
311
221
  };
312
- /**
313
- * When the multi-batch-details epic has nothing to fetch (e.g. list rows not `completed`
314
- * yet, or details already present), `phase` can stay `matching` even though we already
315
- * have completed details for `currentBatchId` (from polling / Pusher). Sync so the UI can
316
- * dismiss the Unmatched skeleton.
317
- */
318
- const currentId = draft.bulkUpload.currentBatchId;
319
- if (draft.bulkUpload.phase === 'matching' &&
320
- currentId != null) {
321
- const existing = draft.bulkUpload.batchDetailsById[currentId];
322
- if (existing?.status === 'completed') {
323
- draft.bulkUpload.phase = 'completed';
324
- }
325
- }
326
222
  },
327
223
  fetchBulkUploadBatchesFailure(draft, action) {
328
224
  draft.bulkUpload.batchListFetchState = {
@@ -365,8 +261,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
365
261
  }
366
262
  }
367
263
  }
368
- draft.bulkUpload.manualSearch = initialBulkUploadState.manualSearch;
369
- draft.bulkUpload.manualSearchUiResetKey += 1;
370
264
  },
371
265
  confirmBulkUploadMatchFailure(draft, action) {
372
266
  draft.bulkUpload.confirmMatchStatus = {
@@ -379,6 +273,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
379
273
  },
380
274
  setBulkUploadCompletedSubTab(draft, action) {
381
275
  draft.bulkUpload.completedSubTab = action.payload;
276
+ draft.bulkUpload.completedTransactionsByPeriod = {};
382
277
  },
383
278
  setBulkUploadSortConfig(draft, action) {
384
279
  draft.bulkUpload.sortKey = action.payload.sortKey;
@@ -386,51 +281,28 @@ const expenseAutomationMissingReceiptsView = createSlice({
386
281
  },
387
282
  clearBulkUpload(draft) {
388
283
  Object.assign(draft.bulkUpload, initialBulkUploadState);
389
- draft.pendingMissingReceiptsTabNavigation = null;
390
284
  },
391
285
  searchTransactionsForManualMatch: {
392
286
  reducer(draft, action) {
393
- const { query, pageToken } = action.payload;
394
- const isLoadMore = pageToken != null;
395
- draft.bulkUpload.manualSearch.searchQuery = query;
396
- if (isLoadMore) {
397
- draft.bulkUpload.manualSearch.isLoadingMore = true;
398
- }
399
- else {
400
- draft.bulkUpload.manualSearch.isLoadingMore = false;
401
- draft.bulkUpload.manualSearch.results = [];
402
- draft.bulkUpload.manualSearch.nextPageToken = null;
403
- draft.bulkUpload.manualSearch.totalCount = 0;
404
- draft.bulkUpload.manualSearch.fetchState = {
405
- fetchState: 'In-Progress',
406
- error: undefined,
407
- };
408
- }
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 = [];
409
293
  },
410
- prepare(query, pageToken) {
411
- return { payload: { query, pageToken: pageToken ?? undefined } };
294
+ prepare(query) {
295
+ return { payload: { query } };
412
296
  },
413
297
  },
414
298
  searchTransactionsForManualMatchSuccess(draft, action) {
415
- const { append, nextPageToken, results, totalCount } = action.payload;
416
- if (append) {
417
- const merged = [...draft.bulkUpload.manualSearch.results, ...results];
418
- const byId = new Map(merged.map((r) => [r.transactionId, r]));
419
- draft.bulkUpload.manualSearch.results = Array.from(byId.values());
420
- }
421
- else {
422
- draft.bulkUpload.manualSearch.results = results;
423
- }
424
- draft.bulkUpload.manualSearch.nextPageToken = nextPageToken;
425
- draft.bulkUpload.manualSearch.totalCount = totalCount;
426
- draft.bulkUpload.manualSearch.isLoadingMore = false;
299
+ draft.bulkUpload.manualSearch.results = action.payload;
427
300
  draft.bulkUpload.manualSearch.fetchState = {
428
301
  fetchState: 'Completed',
429
302
  error: undefined,
430
303
  };
431
304
  },
432
305
  searchTransactionsForManualMatchFailure(draft, action) {
433
- draft.bulkUpload.manualSearch.isLoadingMore = false;
434
306
  draft.bulkUpload.manualSearch.fetchState = {
435
307
  fetchState: 'Error',
436
308
  error: action.payload.error,
@@ -438,13 +310,6 @@ const expenseAutomationMissingReceiptsView = createSlice({
438
310
  },
439
311
  clearManualSearchResults(draft) {
440
312
  draft.bulkUpload.manualSearch = initialBulkUploadState.manualSearch;
441
- draft.bulkUpload.manualSearchUiResetKey += 1;
442
- },
443
- acknowledgeBulkUploadConfirmMatchComplete(draft) {
444
- draft.bulkUpload.confirmMatchStatus = {
445
- fetchState: 'Not-Started',
446
- error: undefined,
447
- };
448
313
  },
449
314
  // -- Completed Transactions Actions --
450
315
  fetchCompletedTransactions: {
@@ -463,16 +328,15 @@ const expenseAutomationMissingReceiptsView = createSlice({
463
328
  }
464
329
  }
465
330
  },
466
- prepare(pageToken, cacheOverride) {
467
- return { payload: { pageToken, cacheOverride } };
331
+ prepare(pageToken) {
332
+ return { payload: { pageToken } };
468
333
  },
469
334
  },
470
335
  fetchCompletedTransactionsSuccess(draft, action) {
471
336
  const { transactionIds, nextPageToken, totalCount, selectedPeriod, isInitialLoad } = action.payload;
472
337
  const periodId = toMonthYearPeriodId(selectedPeriod);
473
- const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
474
338
  if (isInitialLoad) {
475
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
339
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
476
340
  transactionIds,
477
341
  nextPageToken,
478
342
  totalCount,
@@ -480,7 +344,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
480
344
  };
481
345
  }
482
346
  else {
483
- const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
347
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
484
348
  if (existing != null) {
485
349
  existing.transactionIds.push(...transactionIds);
486
350
  existing.nextPageToken = nextPageToken;
@@ -488,7 +352,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
488
352
  existing.fetchState = { fetchState: 'Completed', error: undefined };
489
353
  }
490
354
  else {
491
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
355
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
492
356
  transactionIds,
493
357
  nextPageToken,
494
358
  totalCount,
@@ -499,8 +363,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
499
363
  },
500
364
  fetchCompletedTransactionsFailure(draft, action) {
501
365
  const periodId = toMonthYearPeriodId(action.payload.selectedPeriod);
502
- const cacheKey = getCompletedTransactionsCacheKey(periodId, draft.bulkUpload.sortKey, draft.bulkUpload.sortOrder, draft.bulkUpload.completedSubTab);
503
- const existing = draft.bulkUpload.completedTransactionsByPeriod[cacheKey];
366
+ const existing = draft.bulkUpload.completedTransactionsByPeriod[periodId];
504
367
  if (existing != null) {
505
368
  existing.fetchState = {
506
369
  fetchState: 'Error',
@@ -508,7 +371,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
508
371
  };
509
372
  }
510
373
  else {
511
- draft.bulkUpload.completedTransactionsByPeriod[cacheKey] = {
374
+ draft.bulkUpload.completedTransactionsByPeriod[periodId] = {
512
375
  fetchState: { fetchState: 'Error', error: action.payload.error },
513
376
  nextPageToken: null,
514
377
  totalCount: 0,
@@ -520,7 +383,7 @@ const expenseAutomationMissingReceiptsView = createSlice({
520
383
  });
521
384
  export const { fetchMissingReceipts, fetchMissingReceiptsSuccess, fetchMissingReceiptsFailure, uploadMissingReceiptSuccess, updateMissingReceiptUploadState, updateMissingReceiptsUIState, markMissingReceiptAsDone, clearExpenseAutomationMissingReceiptsView,
522
385
  // Bulk Upload
523
- 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, acknowledgeBulkUploadConfirmMatchComplete,
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,
524
387
  // Completed Transactions
525
388
  fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, } = expenseAutomationMissingReceiptsView.actions;
526
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,72 +154,12 @@ export function getExpenseAutomationMissingReceiptsView(state) {
188
154
  pastBatches,
189
155
  pastUnmatchedFiles,
190
156
  confirmMatchStatus: bulkUpload.confirmMatchStatus,
191
- manualSearchUiResetKey: bulkUpload.manualSearchUiResetKey,
192
- hasMoreBatchDetails,
193
- batchDetailsPaginationState: bulkUpload.batchDetailsPaginationState,
194
- manualSearch: {
195
- ...bulkUpload.manualSearch,
196
- results: manualSearchResults,
197
- },
157
+ manualSearch: bulkUpload.manualSearch,
198
158
  uploadProgress: bulkUpload.uploadProgress,
199
159
  },
200
160
  };
201
161
  }
202
- function batchDetailsHasUnmatchedWork(details) {
203
- return details.files.some((f) => f.status === 'un_matched' || f.status === 'no_match');
204
- }
205
- /** List row summary before batch details load — aligns with unmatched / possible-match work. */
206
- function batchListItemHasUnmatchedWork(batch) {
207
- return batch.noMatchCount > 0 || batch.possibleMatchesCount > 0;
208
- }
209
- /**
210
- * `batchList` must match platform order (same sequence as the bulk-upload batches API). Picks the
211
- * primary batch for the top "Unmatched" section. Skips failed detail fetches.
212
- *
213
- * If details are not loaded for an earlier list row but that row reports no unmatched work, we
214
- * skip it so later rows with loaded details can be primary (avoids an empty tab when the first
215
- * fetch page only loaded later batches). If the list reports unmatched work but details are still
216
- * loading, we wait (undefined) so primary order stays correct once details arrive.
217
- */
218
- function getPrimaryBatchIdFromBatchListOrder(batchListInPlatformOrder, batchDetailsById, failedBatchDetailIds) {
219
- const failedIds = new Set(failedBatchDetailIds);
220
- const anyCompletedBatchHasUnmatchedWork = batchListInPlatformOrder.some((b) => {
221
- if (failedIds.has(b.batchId)) {
222
- return false;
223
- }
224
- const d = batchDetailsById[b.batchId];
225
- if (d != null &&
226
- d.status === 'completed' &&
227
- batchDetailsHasUnmatchedWork(d)) {
228
- return true;
229
- }
230
- return d == null && batchListItemHasUnmatchedWork(b);
231
- });
232
- for (const batch of batchListInPlatformOrder) {
233
- if (failedIds.has(batch.batchId)) {
234
- continue;
235
- }
236
- const details = batchDetailsById[batch.batchId];
237
- if (details == null) {
238
- if (batchListItemHasUnmatchedWork(batch)) {
239
- return undefined;
240
- }
241
- continue;
242
- }
243
- if (details.status !== 'completed') {
244
- continue;
245
- }
246
- if (anyCompletedBatchHasUnmatchedWork) {
247
- if (batchDetailsHasUnmatchedWork(details)) {
248
- return batch.batchId;
249
- }
250
- continue;
251
- }
252
- return batch.batchId;
253
- }
254
- return undefined;
255
- }
256
- function resolveBatchFile(file, batchId, transactionState) {
162
+ function resolveBatchFile(file, transactionState) {
257
163
  const matchedTransaction = file.matchedTransactionId != null
258
164
  ? getSupportedTransactionById(transactionState, file.matchedTransactionId)
259
165
  : undefined;
@@ -267,8 +173,6 @@ function resolveBatchFile(file, batchId, transactionState) {
267
173
  .filter((c) => c != null);
268
174
  return {
269
175
  attachmentId: file.attachmentId,
270
- batchId,
271
- fileDownloadUrl: file.fileDownloadUrl,
272
176
  fileId: file.fileId,
273
177
  filename: file.filename,
274
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, acknowledgeBulkUploadConfirmMatchComplete, 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, acknowledgeBulkUploadConfirmMatchComplete, 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, };