@zeniai/client-epic-state 5.0.64-betaML1 → 5.0.64-betaSS1

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 (89) hide show
  1. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  2. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +0 -2
  3. package/lib/entity/account/accountSelector.d.ts +0 -9
  4. package/lib/entity/account/accountSelector.js +1 -14
  5. package/lib/entity/account/accountState.d.ts +1 -1
  6. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  7. package/lib/entity/class/classReducer.d.ts +4 -4
  8. package/lib/entity/class/classState.d.ts +1 -1
  9. package/lib/entity/forecast/forecastState.d.ts +1 -1
  10. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  11. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  12. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  13. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +1 -1
  14. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +2 -2
  15. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  16. package/lib/entity/snackbar/snackbarTypes.js +0 -2
  17. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +0 -4
  18. package/lib/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  19. package/lib/entity/transaction/stateTypes/transaction.d.ts +0 -3
  20. package/lib/epic.d.ts +1 -3
  21. package/lib/epic.js +1 -3
  22. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +0 -2
  23. package/lib/esm/entity/account/accountSelector.js +0 -11
  24. package/lib/esm/entity/snackbar/snackbarTypes.js +0 -2
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  26. package/lib/esm/epic.js +1 -3
  27. package/lib/esm/index.js +7 -6
  28. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +2 -1
  29. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +6 -0
  30. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +11 -1
  31. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +1 -8
  32. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +2 -1
  33. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +113 -78
  34. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +20 -31
  35. package/lib/esm/view/expenseAutomationView/types/completedSubTab.js +17 -0
  36. package/lib/esm/view/expenseAutomationView/types/missingReceiptsViewState.js +0 -2
  37. package/lib/esm/view/expenseAutomationView/types/transactionsViewState.js +0 -5
  38. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +0 -10
  39. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +2 -24
  40. package/lib/index.d.ts +6 -5
  41. package/lib/index.js +39 -45
  42. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  43. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  44. package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -1
  45. package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -1
  46. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  47. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  48. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  49. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +2 -1
  50. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +6 -0
  51. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.d.ts +2 -2
  52. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +10 -0
  53. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.d.ts +2 -2
  54. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +0 -7
  55. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  56. package/lib/view/expenseAutomationView/payload/transactionCategorizationPayload.d.ts +21 -0
  57. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +2 -1
  58. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +2 -1
  59. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +10 -23
  60. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +114 -79
  61. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +2 -1
  62. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +15 -4
  63. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +0 -2
  64. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +20 -32
  65. package/lib/view/expenseAutomationView/types/completedSubTab.d.ts +10 -0
  66. package/lib/view/expenseAutomationView/types/completedSubTab.js +21 -0
  67. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +1 -2
  68. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.js +1 -4
  69. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +32 -15
  70. package/lib/view/expenseAutomationView/types/transactionsViewState.js +1 -6
  71. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  72. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  73. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  74. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  75. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  76. package/lib/view/topEx/topExSelector.d.ts +1 -1
  77. package/lib/view/transactionDetail/epics/transactionDetailEpic.d.ts +1 -2
  78. package/lib/view/transactionDetail/epics/transactionDetailEpic.js +0 -10
  79. package/lib/view/transactionDetail/transactionDetailPayload.d.ts +1 -1
  80. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +1 -6
  81. package/lib/view/transactionDetail/transactionDetailSelector.js +1 -23
  82. package/package.json +1 -1
  83. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +0 -81
  84. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +0 -30
  85. package/lib/tsconfig.typecheck.tsbuildinfo +0 -1
  86. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.d.ts +0 -9
  87. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +0 -85
  88. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.d.ts +0 -8
  89. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +0 -34
@@ -4,7 +4,7 @@ import uniq from 'lodash/uniq';
4
4
  import { toMonthYearPeriodId, } from '../../../commonStateTypes/timePeriod';
5
5
  import { isVendorTransaction } from '../../../entity/transaction/stateTypes/vendorTransaction';
6
6
  import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, filterAutoTabLineItems, mergeTabSpecificLineItems, removeTransactionFromTabView, setEntityRecommendationForLineIdInLocalData, toSetAllLineItemsToCategoryClass, toTransactionDetailLocalData, } from '../helpers/transactionCategorizationLocalDataHelper';
7
- import { TRANSACTIONS_TABS, } from '../types/transactionsViewState';
7
+ import { DEFAULT_COMPLETED_SUB_TAB, } from '../types/completedSubTab';
8
8
  export const initialTransactionTabViewState = {
9
9
  saveStatus: {
10
10
  fetchState: 'Not-Started',
@@ -42,22 +42,68 @@ export const initialTransactionTabViewState = {
42
42
  selectedTransactionLineId: undefined,
43
43
  };
44
44
  export const initialState = {
45
- createTransferEntryStatus: 'Not-Started',
46
- creditCardAccountsForTransfer: {
47
- accountIds: [],
48
- fetchState: 'Not-Started',
45
+ autoCategorizedSubTabCache: {},
46
+ parentTotalCountByTab: {
47
+ review: {},
48
+ autoCategorized: {},
49
49
  },
50
- lastTransferEntryReplacement: undefined,
51
50
  selectedTransactionCategorizationTab: 'review',
51
+ selectedTransactionCategorizationCompletedSubTab: DEFAULT_COMPLETED_SUB_TAB,
52
52
  transactionCategorizationView: {
53
53
  review: { ...initialTransactionTabViewState },
54
54
  autoCategorized: { ...initialTransactionTabViewState },
55
55
  },
56
- transferAccounts: {
57
- accountIds: [],
58
- fetchState: 'Not-Started',
59
- },
60
56
  };
57
+ /**
58
+ * Capture the autoCategorized tab's current paginated dataset for a sub-tab.
59
+ * The mid-flight `'In-Progress'` state is normalised to `'Completed'` because
60
+ * the in-flight request is cancelled by `switchMap` in the fetch epic when the
61
+ * sub-tab changes — restoring `'In-Progress'` later would leave the UI stuck
62
+ * showing a phantom loading state with no fetch actually running. Length-zero
63
+ * datasets degrade to `'Not-Started'` so the next visit triggers a fresh
64
+ * fetch from page 1 instead of short-circuiting on stale empty caches.
65
+ *
66
+ * Snapshot scope (deliberately narrow):
67
+ * - Captured: `pageToken`, `totalCount`, `transactionIdsBySelectedPeriod`,
68
+ * `fetchState`, `error`. These are the keys the fetch epic's cache check
69
+ * reads to decide whether to short-circuit a sub-tab revisit.
70
+ * - Intentionally NOT captured (left in place on `autoCat` and inherited by
71
+ * the incoming sub-tab):
72
+ * - `uiState.searchString`, `uiState.sortKey`, `uiState.sortOrder`,
73
+ * `uiState.scrollPosition`, `uiState.nodeCollapseState`,
74
+ * `uiState.limit` — search and sort are user-applied preferences that
75
+ * persist across sub-tabs by design (a search query stays active when
76
+ * the user toggles between Manual / AI Accountant).
77
+ * - `selectedCheckBoxTransactionIds` — selection state is intentionally
78
+ * cleared at the action source (the fetch epic / save flow), not
79
+ * by the snapshot path. Carrying selection across sub-tabs is safe
80
+ * because every sub-tab change goes through a fetch round-trip that
81
+ * reconciles selection against the new row IDs.
82
+ * - `transactionReviewLocalDataById`, `transactionIdsWithUnsavedData`,
83
+ * `uploadReceiptStatusById`, `saveStatus`, `refreshStatus`,
84
+ * `markAsNotMiscategorizedStatus` — these are per-row / per-flight
85
+ * caches that are write-through global state, not sub-tab-scoped.
86
+ *
87
+ * If the contract changes (e.g. selection should reset on every sub-tab
88
+ * switch), update both this comment and the snapshot return shape together.
89
+ */
90
+ function snapshotAutoCategorizedTab(autoCat) {
91
+ const transactionIdsBySelectedPeriod = {
92
+ ...autoCat.transactionIdsBySelectedPeriod,
93
+ };
94
+ const hasAnyLoadedRows = Object.values(transactionIdsBySelectedPeriod).some((ids) => ids.length > 0);
95
+ let normalisedFetchState = autoCat.fetchState;
96
+ if (normalisedFetchState === 'In-Progress') {
97
+ normalisedFetchState = hasAnyLoadedRows ? 'Completed' : 'Not-Started';
98
+ }
99
+ return {
100
+ error: autoCat.error,
101
+ fetchState: normalisedFetchState,
102
+ pageToken: autoCat.uiState.pageToken,
103
+ totalCount: { ...autoCat.uiState.totalCount },
104
+ transactionIdsBySelectedPeriod,
105
+ };
106
+ }
61
107
  const expenseAutomationTransactionsView = createSlice({
62
108
  name: 'expenseAutomationTransactionsView',
63
109
  initialState,
@@ -271,6 +317,48 @@ const expenseAutomationTransactionsView = createSlice({
271
317
  return { payload: { newSelectedTab } };
272
318
  },
273
319
  },
320
+ updateTransactionCategorizationCompletedSubTab: {
321
+ reducer(draft, action) {
322
+ const { newSubTab } = action.payload;
323
+ const previousSubTab = draft.selectedTransactionCategorizationCompletedSubTab;
324
+ if (previousSubTab === newSubTab) {
325
+ return;
326
+ }
327
+ const autoCat = draft.transactionCategorizationView.autoCategorized;
328
+ // Snapshot the outgoing sub-tab so a future revisit can short-circuit
329
+ // the fetch epic (mirrors the parent-tab "don't refetch what's
330
+ // already cached" behaviour). Period-scoped data is preserved as-is
331
+ // because the snapshot itself is keyed only by sub-tab; the active
332
+ // tab's per-period maps remain the source of truth while live.
333
+ draft.autoCategorizedSubTabCache[previousSubTab] =
334
+ snapshotAutoCategorizedTab(autoCat);
335
+ const cached = draft.autoCategorizedSubTabCache[newSubTab];
336
+ if (cached != null) {
337
+ autoCat.uiState.pageToken = cached.pageToken;
338
+ autoCat.uiState.totalCount = { ...cached.totalCount };
339
+ autoCat.transactionIdsBySelectedPeriod = {
340
+ ...cached.transactionIdsBySelectedPeriod,
341
+ };
342
+ autoCat.fetchState = cached.fetchState;
343
+ autoCat.error = cached.error;
344
+ }
345
+ else {
346
+ // Sub-tab has never been visited — clear the active slot so the
347
+ // view-epic's `fetchState === 'Not-Started' || transactionIds.length
348
+ // === 0` cache check falls through and triggers a fresh page-1
349
+ // fetch for the new dataset.
350
+ autoCat.uiState.pageToken = null;
351
+ autoCat.uiState.totalCount = {};
352
+ autoCat.transactionIdsBySelectedPeriod = {};
353
+ autoCat.fetchState = 'Not-Started';
354
+ autoCat.error = undefined;
355
+ }
356
+ draft.selectedTransactionCategorizationCompletedSubTab = newSubTab;
357
+ },
358
+ prepare(newSubTab) {
359
+ return { payload: { newSubTab } };
360
+ },
361
+ },
274
362
  updateTransactionCategorization: {
275
363
  reducer(draft, action) {
276
364
  const selectedTab = action.payload.selectedTab;
@@ -708,6 +796,10 @@ const expenseAutomationTransactionsView = createSlice({
708
796
  const { selectedTab, selectedPeriod, totalCount } = action.payload;
709
797
  draft.transactionCategorizationView[selectedTab].uiState.totalCount[toMonthYearPeriodId(selectedPeriod)] = totalCount;
710
798
  },
799
+ updateParentTotalCountForTab(draft, action) {
800
+ const { selectedTab, selectedPeriod, parentTotalCount } = action.payload;
801
+ draft.parentTotalCountByTab[selectedTab][toMonthYearPeriodId(selectedPeriod)] = parentTotalCount;
802
+ },
711
803
  updateSelectedCheckboxTransactionIds(draft, action) {
712
804
  const selectedTab = action.payload.selectedTab;
713
805
  const transactionIds = action.payload.transactionIds;
@@ -718,6 +810,16 @@ const expenseAutomationTransactionsView = createSlice({
718
810
  draft.transactionCategorizationView[selectedTab] = {
719
811
  ...initialTransactionTabViewState,
720
812
  };
813
+ draft.parentTotalCountByTab[selectedTab] = {};
814
+ // The per-sub-tab snapshot cache lives at the slice root and is
815
+ // exclusively populated by the autoCategorized tab's sub-tab switching
816
+ // (see updateTransactionCategorizationCompletedSubTab). When that tab
817
+ // is reset, leaving stale snapshots behind would short-circuit the
818
+ // next sub-tab visit with phantom row IDs / page tokens that no longer
819
+ // correspond to anything in state — drop them in lockstep.
820
+ if (selectedTab === 'autoCategorized') {
821
+ draft.autoCategorizedSubTabCache = {};
822
+ }
721
823
  },
722
824
  clearExpenseAutomationTransactionsView(draft) {
723
825
  Object.assign(draft, initialState);
@@ -812,74 +914,7 @@ const expenseAutomationTransactionsView = createSlice({
812
914
  };
813
915
  },
814
916
  },
815
- fetchAccountsForTransferFlow(draft, action) {
816
- const slice = action.payload.kind === 'credit_card_only'
817
- ? draft.creditCardAccountsForTransfer
818
- : draft.transferAccounts;
819
- slice.fetchState = 'In-Progress';
820
- },
821
- updateAccountsForTransferFlow(draft, action) {
822
- const slice = action.payload.kind === 'credit_card_only'
823
- ? draft.creditCardAccountsForTransfer
824
- : draft.transferAccounts;
825
- slice.fetchState = 'Completed';
826
- slice.accountIds = action.payload.accountIds;
827
- },
828
- updateAccountsForTransferFlowFailure(draft, action) {
829
- const slice = action.payload.kind === 'credit_card_only'
830
- ? draft.creditCardAccountsForTransfer
831
- : draft.transferAccounts;
832
- slice.fetchState = 'Error';
833
- },
834
- createTransferEntry: {
835
- prepare(transactionId, creditAccountIntegrationId, debitAccountIntegrationId, memo, transactionType, sourceTransactionType) {
836
- return {
837
- payload: {
838
- transactionId,
839
- creditAccountIntegrationId,
840
- debitAccountIntegrationId,
841
- memo,
842
- transactionType,
843
- sourceTransactionType,
844
- },
845
- };
846
- },
847
- reducer(draft) {
848
- draft.createTransferEntryStatus = 'In-Progress';
849
- },
850
- },
851
- createTransferEntrySuccess(draft) {
852
- draft.createTransferEntryStatus = 'Completed';
853
- },
854
- createTransferEntryFailure(draft) {
855
- draft.createTransferEntryStatus = 'Error';
856
- },
857
- resetCreateTransferEntryStatus(draft) {
858
- draft.createTransferEntryStatus = 'Not-Started';
859
- },
860
- createTransferEntryReplacedTransaction: {
861
- prepare(previousTransactionId, newTransactionId) {
862
- return { payload: { newTransactionId, previousTransactionId } };
863
- },
864
- reducer(draft, action) {
865
- draft.lastTransferEntryReplacement = action.payload;
866
- },
867
- },
868
- acknowledgeTransferEntryRouteReplacement(draft) {
869
- draft.lastTransferEntryReplacement = undefined;
870
- },
871
- removeTransactionFromAllTabs: {
872
- prepare(transactionId) {
873
- return { payload: { transactionId } };
874
- },
875
- reducer(draft, action) {
876
- const { transactionId } = action.payload;
877
- for (const tab of TRANSACTIONS_TABS) {
878
- removeTransactionFromTabView(draft.transactionCategorizationView[tab], transactionId);
879
- }
880
- },
881
- },
882
917
  },
883
918
  });
884
- export const { fetchTransactionCategorization, updateTransactionCategorizationUIState, initializeTransactionCategorizationViewLocalData, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateStatusForTransactionNotMiscategorizedUpdateForCategorization, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, setAllItemsToCategoryClassInLocalDataForCategorization, updateTotalCountForTransactionCategorization, fetchTransactionCategorizationSuccess, resetOtherTabsFetchState, fetchTransactionCategorizationView, updateSelectedCheckboxTransactionIds, clearExpenseAutomationTransactionsViewPerTabView, clearExpenseAutomationTransactionsView, setEntityRecommendationForLineIdsForCategorization, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, fetchAccountsForTransferFlow, updateAccountsForTransferFlow, updateAccountsForTransferFlowFailure, createTransferEntry, createTransferEntrySuccess, createTransferEntryFailure, resetCreateTransferEntryStatus, createTransferEntryReplacedTransaction, acknowledgeTransferEntryRouteReplacement, removeTransactionFromAllTabs, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
919
+ export const { fetchTransactionCategorization, updateTransactionCategorizationUIState, initializeTransactionCategorizationViewLocalData, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateStatusForTransactionNotMiscategorizedUpdateForCategorization, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, setAllItemsToCategoryClassInLocalDataForCategorization, updateTotalCountForTransactionCategorization, updateParentTotalCountForTab, fetchTransactionCategorizationSuccess, resetOtherTabsFetchState, fetchTransactionCategorizationView, updateSelectedCheckboxTransactionIds, clearExpenseAutomationTransactionsViewPerTabView, clearExpenseAutomationTransactionsView, setEntityRecommendationForLineIdsForCategorization, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
885
920
  export default expenseAutomationTransactionsView.reducer;
@@ -1,7 +1,6 @@
1
1
  import omit from 'lodash/omit';
2
2
  import { reduceAllFetchState, reduceAnyFetchState, } from '../../../commonStateTypes/reduceFetchState';
3
3
  import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
4
- import { getAccountBase, getAccountBaseForCreditCardTransferAccounts, getAccountBaseForTransferAccounts, } from '../../../entity/account/accountSelector';
5
4
  import { getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, } from '../../../entity/tenant/tenantSelector';
6
5
  import { getTransactionWithCOT } from '../../../entity/transaction/transactionHelper';
7
6
  import { getSupportedTransactionsByIds } from '../../../entity/transaction/transactionSelector';
@@ -9,12 +8,9 @@ import { getAccountList, getNestedAccountListHierarchy, getUncategorizedAccounts
9
8
  import { getClassList, getNestedClassListHierarchy, } from '../../classList/classListSelector';
10
9
  import { getProjectList } from '../../projectList/projectListSelector';
11
10
  import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
12
- export function getLastTransferEntryReplacement(state) {
13
- return state.expenseAutomationTransactionsViewState.lastTransferEntryReplacement;
14
- }
15
11
  export function getExpenseAutomationTransactionView(state) {
16
12
  const { accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, expenseAutomationViewState, projectState, projectListState, transactionState, monthEndCloseChecksState, monthEndCloseChecksViewState, } = state;
17
- const { selectedTransactionCategorizationTab } = expenseAutomationTransactionsViewState;
13
+ const { selectedTransactionCategorizationCompletedSubTab, selectedTransactionCategorizationTab, } = expenseAutomationTransactionsViewState;
18
14
  const { uiState, refreshStatus, saveStatus, markAsNotMiscategorizedStatus, transactionIdsBySelectedPeriod, transactionReviewLocalDataById, selectedCheckBoxTransactionIds, transactionIdsWithUnsavedData, uploadReceiptStatusById, selectedTransactionId, selectedTransactionLineId, } = expenseAutomationTransactionsViewState.transactionCategorizationView[selectedTransactionCategorizationTab];
19
15
  const uncategorizedIncomeExpense = getUncategorizedAccounts(accountState, accountListState, 'accountList');
20
16
  const accountList = getAccountList(accountState, accountListState, 'accountList');
@@ -67,10 +63,27 @@ export function getExpenseAutomationTransactionView(state) {
67
63
  .uiState.totalCount;
68
64
  const totalCountByAutoCat = expenseAutomationTransactionsViewState.transactionCategorizationView
69
65
  .autoCategorized.uiState.totalCount;
66
+ // Per-(sub-)tab counts powering pagination, in-list "showing X of Y", and
67
+ // any save/refresh round-trips. Sourced from `uiState.totalCount` which
68
+ // mirrors the response's `total_count` for whatever tab/sub-tab the user is
69
+ // viewing (e.g. only the Manual sub-tab rows for Completed → Manual).
70
70
  const totalCountByTab = {
71
71
  review: monthYearPeriodId != null ? totalCountByReview[monthYearPeriodId] : 0,
72
72
  autoCategorized: monthYearPeriodId != null ? totalCountByAutoCat[monthYearPeriodId] : 0,
73
73
  };
74
+ // Parent-tab badge counts. Sourced from `parent_tab_total_count` in the
75
+ // listing response and used exclusively by the navbar / tab strip badges.
76
+ // Independent of which Completed sub-tab is active so the badge stays
77
+ // stable across sub-tab switches.
78
+ const parentTotalCountByTab = expenseAutomationTransactionsViewState.parentTotalCountByTab;
79
+ const parentTabTotalCountByTab = {
80
+ review: monthYearPeriodId != null
81
+ ? (parentTotalCountByTab.review[monthYearPeriodId] ?? 0)
82
+ : 0,
83
+ autoCategorized: monthYearPeriodId != null
84
+ ? (parentTotalCountByTab.autoCategorized[monthYearPeriodId] ?? 0)
85
+ : 0,
86
+ };
74
87
  const fetchStateByTab = {
75
88
  review: {
76
89
  fetchState: expenseAutomationTransactionsViewState.transactionCategorizationView
@@ -90,29 +103,6 @@ export function getExpenseAutomationTransactionView(state) {
90
103
  : [];
91
104
  const transactionCompletionStatus = allSteps.find((step) => step.step === 'transaction_categorization')?.completionStatus;
92
105
  const completionStatus = transactionCompletionStatus ?? 'incomplete';
93
- const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
94
- .map((id) => getAccountBaseForTransferAccounts(accountState, id))
95
- .filter((account) => account != null);
96
- /**
97
- * Credit transfer picker uses transfer-account ids from a dedicated fetch. If that list
98
- * resolves to nothing while the COA list is loaded, fall back to the full COA list so the
99
- * credit dropdown is not empty.
100
- */
101
- const transferAccountsList = transferAccountsFromApi.length > 0
102
- ? transferAccountsFromApi
103
- : accountList.accounts
104
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
105
- .filter((account) => account != null);
106
- const creditCardAccountsFromApi = expenseAutomationTransactionsViewState.creditCardAccountsForTransfer.accountIds
107
- .map((id) => getAccountBaseForCreditCardTransferAccounts(accountState, id))
108
- .filter((account) => account != null);
109
- const coaCreditCardsFallback = accountList.accounts
110
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
111
- .filter((account) => account != null)
112
- .filter((a) => a.accountType === 'credit_card');
113
- const creditCardAccountsForTransferList = creditCardAccountsFromApi.length > 0
114
- ? creditCardAccountsFromApi
115
- : coaCreditCardsFallback;
116
106
  return {
117
107
  version: 0,
118
108
  fetchState: fetchStatus.fetchState,
@@ -133,14 +123,13 @@ export function getExpenseAutomationTransactionView(state) {
133
123
  refreshStatus,
134
124
  saveStatus,
135
125
  markAsNotMiscategorizedStatus,
136
- createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
137
126
  completionStatus,
138
127
  totalCountByTab,
128
+ parentTabTotalCountByTab,
139
129
  fetchStateByTransactionTabs: fetchStateByTab,
140
130
  uploadReceiptStatusById,
141
131
  selectedTransactionId,
142
132
  selectedTransactionLineId,
143
- creditCardAccountsForTransferList,
144
- transferAccounts: transferAccountsList,
133
+ selectedTransactionCategorizationCompletedSubTab,
145
134
  };
146
135
  }
@@ -0,0 +1,17 @@
1
+ import { stringToUnion } from '../../../commonStateTypes/stringToUnion';
2
+ /**
3
+ * Sub-tabs that can appear under any "Completed" tab in the Expense Automation
4
+ * surface (Transaction Categorization Completed and Missing Receipts Completed
5
+ * both use this exact union). Forwarded verbatim to listing APIs as `sub_tab`
6
+ * / `match_type`. `'all'` preserves parent-tab semantics on the backend.
7
+ */
8
+ const COMPLETED_SUB_TABS = ['all', 'ai_accountant', 'manual'];
9
+ export const toCompletedSubTab = (v) => stringToUnion(v.trim().toLowerCase(), COMPLETED_SUB_TABS);
10
+ /**
11
+ * "No sub-tab filter" sentinel — single source of truth for the default
12
+ * value of {@link CompletedSubTab}. Use this constant in initial slice
13
+ * state and at any call site that needs to fall back to the parent-tab
14
+ * listing semantics (review tab requests, manual-search overrides, etc.)
15
+ * so a future rename of the union doesn't require chasing literals.
16
+ */
17
+ export const DEFAULT_COMPLETED_SUB_TAB = 'all';
@@ -39,8 +39,6 @@ const BULK_UPLOAD_RESULTS_TABS = ['completed', 'unmatched'];
39
39
  export const toBulkUploadResultsTab = (v) => stringToUnion(v.trim().toLowerCase(), BULK_UPLOAD_RESULTS_TABS);
40
40
  const MISSING_RECEIPTS_TABS = ['missing', 'completed', 'unmatched'];
41
41
  export const toMissingReceiptsTab = (v) => stringToUnion(v.trim().toLowerCase(), MISSING_RECEIPTS_TABS);
42
- const COMPLETED_SUB_TABS = ['all', 'ai_accountant', 'manual'];
43
- export const toCompletedSubTab = (v) => stringToUnion(v.trim().toLowerCase(), COMPLETED_SUB_TABS);
44
42
  const MATCH_SOURCES = ['ai', 'manual'];
45
43
  export const toMatchSource = (v) => stringToUnion(v.trim().toLowerCase(), MATCH_SOURCES);
46
44
  const BULK_UPLOAD_SORT_KEYS = [
@@ -25,8 +25,3 @@ export const initialSupportedTransactionCategorization = {
25
25
  tabSpecificLineItems: {},
26
26
  },
27
27
  };
28
- /** Which pool `fetchAccountsForTransferFlow` / transfer-flow epic should load. */
29
- export const TRANSFER_ACCOUNTS_FETCH_KIND = [
30
- 'transfer_eligible',
31
- 'credit_card_only',
32
- ];
@@ -13,7 +13,6 @@ import { fetchAccountList } from '../../accountList/accountListReducer';
13
13
  import { fetchClassList } from '../../classList/classListReducer';
14
14
  import { getInitializedTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorLocalDataHelper';
15
15
  import { updateTransactionVendorLocalData } from '../../commonVendorView/transactionVendorView/transactionVendorViewReducer';
16
- import { fetchAccountsForTransferFlow } from '../../expenseAutomationView/reducers/transactionsViewReducer';
17
16
  import { fetchOwnerList } from '../../ownerList/ownerListReducer';
18
17
  import { fetchProjectList } from '../../projectList/projectListReducer';
19
18
  import { fetchTransactionDetail, initializeTransactionDetailLocalData, removeTransactionDetail, updateTransactionDetailFetchState, } from '../transactionDetailReducer';
@@ -36,15 +35,6 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
36
35
  accountList.fetchState !== 'In-Progress') {
37
36
  transactionActions.push(fetchAccountList('accountList'));
38
37
  }
39
- const { transferAccounts, creditCardAccountsForTransfer, } = state$.value.expenseAutomationTransactionsViewState;
40
- if (transferAccounts.fetchState !== 'In-Progress' &&
41
- transferAccounts.fetchState !== 'Completed') {
42
- transactionActions.push(fetchAccountsForTransferFlow({ kind: 'transfer_eligible' }));
43
- }
44
- if (creditCardAccountsForTransfer.fetchState !== 'In-Progress' &&
45
- creditCardAccountsForTransfer.fetchState !== 'Completed') {
46
- transactionActions.push(fetchAccountsForTransferFlow({ kind: 'credit_card_only' }));
47
- }
48
38
  const classList = state$.value.classListState;
49
39
  if (classList.hasValidState() === false &&
50
40
  classList.fetchState !== 'In-Progress') {
@@ -1,7 +1,6 @@
1
1
  import recordGet from 'lodash/get';
2
2
  import { reduceFetchState } from '../../commonStateTypes/reduceFetchState';
3
- import { getAccountBase, getAccountBaseForCreditCardTransferAccounts, getAccountBaseForTransferAccounts, } from '../../entity/account/accountSelector';
4
- import { getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled } from '../../entity/tenant/tenantSelector';
3
+ import { getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, } from '../../entity/tenant/tenantSelector';
5
4
  import { toTransactionTypeStrict } from '../../entity/transaction/stateTypes/transactionType';
6
5
  import { getTransactionWithCOT } from '../../entity/transaction/transactionHelper';
7
6
  import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
@@ -12,7 +11,7 @@ import { getClassList, getNestedClassListHierarchy, } from '../classList/classLi
12
11
  import { getProjectList, } from '../projectList/projectListSelector';
13
12
  import { getAllLinkedTransactions, getTransactionDetailKey, initialSupportedTransactionDetail, } from './transactionDetailState';
14
13
  export const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
15
- const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, projectState, projectListState, } = state;
14
+ const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, projectState, projectListState, } = state;
16
15
  const detailKey = getTransactionDetailKey(transactionId);
17
16
  const transactionDetail = recordGet(transactionDetailState.transactionDetailById, detailKey);
18
17
  let fetchState = {
@@ -73,24 +72,6 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
73
72
  : [];
74
73
  const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
75
74
  const vendors = getVendorsByVendorIds(vendorState, vendorListState.vendorIds);
76
- const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
77
- .map((id) => getAccountBaseForTransferAccounts(accountState, id))
78
- .filter((account) => account != null);
79
- const transferAccountsList = transferAccountsFromApi.length > 0
80
- ? transferAccountsFromApi
81
- : accountsList.accounts
82
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
83
- .filter((account) => account != null);
84
- const creditCardAccountsFromApi = expenseAutomationTransactionsViewState.creditCardAccountsForTransfer.accountIds
85
- .map((id) => getAccountBaseForCreditCardTransferAccounts(accountState, id))
86
- .filter((account) => account != null);
87
- const coaCreditCardsFallback = accountsList.accounts
88
- .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
89
- .filter((account) => account != null)
90
- .filter((a) => a.accountType === 'credit_card');
91
- const creditCardAccountsForTransferList = creditCardAccountsFromApi.length > 0
92
- ? creditCardAccountsFromApi
93
- : coaCreditCardsFallback;
94
75
  return {
95
76
  reportId: 'transaction_detail',
96
77
  reportTitle: 'Transaction Detail',
@@ -107,9 +88,6 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
107
88
  accountsHierarchyList,
108
89
  classList: classList,
109
90
  isAccountingClassesEnabled,
110
- createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
111
- creditCardAccountsForTransferList,
112
- transferAccounts: transferAccountsList,
113
91
  isAccountingProjectsEnabled,
114
92
  projectList,
115
93
  isUpdateNotAllowed: transactionDetail?.isUpdateNotAllowed,
package/lib/index.d.ts CHANGED
@@ -273,7 +273,7 @@ import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFl
273
273
  import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
274
274
  import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, setBulkUploadCompletedSubTab, setBulkUploadResultsTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, storeBatchDetails, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
275
275
  import { deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateNodeCollapseState, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
276
- import { acknowledgeTransferEntryRouteReplacement, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, fetchAccountsForTransferFlow, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, resetCreateTransferEntryStatus, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
276
+ import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
277
277
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
278
278
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
279
279
  import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
@@ -285,10 +285,11 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
285
285
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
286
286
  import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
287
287
  import { getExpenseAutomationReconciliationView, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
288
- import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
288
+ import { getExpenseAutomationTransactionView } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
289
289
  import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
290
290
  import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
291
- import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
291
+ import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
292
+ import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
292
293
  import { MissingReceiptsSortKey as ExpenseAutomationMissingReceiptsSortKey, MissingReceiptsViewState as ExpenseAutomationMissingReceiptsViewState, MissingReceiptsViewUIState as ExpenseAutomationMissingReceiptsViewUIState, toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey } from './view/expenseAutomationView/types/missingReceiptsViewState';
293
294
  import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
294
295
  import { TransactionsTab as ExpenseAutomationTransactionsTab, TransactionsViewState as ExpenseAutomationTransactionsViewState, TransactionsViewUIState as ExpenseAutomationTransactionsViewUIState, SupportedTransactionCategorization, TransactionCategorizationLineItemData, TransactionReviewLocalData, TransactionsSortKey, TransactionsTab, toTransactionsTabKey as toExpenseAutomationTransactionsTabKey, toTransactionsSortKey } from './view/expenseAutomationView/types/transactionsViewState';
@@ -656,10 +657,10 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
656
657
  export { ClassesViewSelectorReportV2 };
657
658
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
658
659
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
659
- export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
660
+ export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, };
660
661
  export { JEScheduleLocalData };
661
662
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
662
- export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, acknowledgeTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
663
+ export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateSelectedCheckboxTransactionIds, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
663
664
  export { TopExpense, TopExTimePeriod, TOP_EX_TIME_PERIODS };
664
665
  export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, MonthYearPeriod, };
665
666
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';