@zeniai/client-epic-state 5.0.34 → 5.0.36-betaML1

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 (78) hide show
  1. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  2. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +1 -0
  3. package/lib/entity/account/accountSelector.d.ts +5 -0
  4. package/lib/entity/account/accountSelector.js +8 -1
  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 +2 -0
  17. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +6 -0
  18. package/lib/entity/transaction/payloadTypes/transactionPayload.js +10 -0
  19. package/lib/entity/transaction/stateTypes/transaction.d.ts +3 -0
  20. package/lib/epic.d.ts +3 -1
  21. package/lib/epic.js +3 -1
  22. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +1 -0
  23. package/lib/esm/entity/account/accountSelector.js +6 -0
  24. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +10 -0
  26. package/lib/esm/epic.js +3 -1
  27. package/lib/esm/index.js +4 -4
  28. package/lib/esm/view/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +2 -0
  29. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +81 -0
  30. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +5 -1
  31. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +25 -0
  32. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +11 -8
  33. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +79 -12
  34. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +19 -0
  35. package/lib/esm/view/recommendation/fetchEntityRecommendationsByTransactionIdEpic.js +2 -1
  36. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +6 -0
  37. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +12 -1
  38. package/lib/esm/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +6 -5
  39. package/lib/index.d.ts +4 -4
  40. package/lib/index.js +42 -33
  41. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  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/commonVendorView/transactionVendorView/epics/saveTransactionVendorEpic.js +2 -0
  49. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  50. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.d.ts +9 -0
  51. package/lib/view/expenseAutomationView/epics/transactionCategorization/createTransferEntryEpic.js +85 -0
  52. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.d.ts +2 -2
  53. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +4 -0
  54. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.d.ts +8 -0
  55. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransferAccountsEpic.js +29 -0
  56. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +4 -4
  57. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +11 -8
  58. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +21 -3
  59. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +80 -13
  60. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +3 -1
  61. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +2 -0
  62. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +20 -0
  63. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +13 -1
  64. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  65. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  66. package/lib/view/recommendation/fetchEntityRecommendationsByTransactionIdEpic.js +2 -1
  67. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  68. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  69. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  70. package/lib/view/topEx/topExSelector.d.ts +1 -1
  71. package/lib/view/transactionDetail/epics/transactionDetailEpic.d.ts +2 -1
  72. package/lib/view/transactionDetail/epics/transactionDetailEpic.js +6 -0
  73. package/lib/view/transactionDetail/transactionDetailPayload.d.ts +1 -1
  74. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +4 -1
  75. package/lib/view/transactionDetail/transactionDetailSelector.js +12 -1
  76. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.d.ts +1 -1
  77. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +5 -4
  78. package/package.json +1 -1
@@ -4,6 +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
8
  export const initialTransactionTabViewState = {
8
9
  saveStatus: {
9
10
  fetchState: 'Not-Started',
@@ -41,11 +42,17 @@ export const initialTransactionTabViewState = {
41
42
  selectedTransactionLineId: undefined,
42
43
  };
43
44
  export const initialState = {
45
+ createTransferEntryStatus: 'Not-Started',
46
+ lastTransferEntryReplacement: undefined,
44
47
  selectedTransactionCategorizationTab: 'review',
45
48
  transactionCategorizationView: {
46
49
  review: { ...initialTransactionTabViewState },
47
50
  autoCategorized: { ...initialTransactionTabViewState },
48
51
  },
52
+ transferAccounts: {
53
+ fetchState: 'Not-Started',
54
+ accountIds: [],
55
+ },
49
56
  };
50
57
  const expenseAutomationTransactionsView = createSlice({
51
58
  name: 'expenseAutomationTransactionsView',
@@ -282,7 +289,7 @@ const expenseAutomationTransactionsView = createSlice({
282
289
  },
283
290
  setAllItemsToCategoryClassInLocalDataForCategorization: {
284
291
  reducer(draft, action) {
285
- const { vendorId, customerId, selectedAccount, selectedClassBase, transactions, transactionId, lineId, selectedTab, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, } = action.payload;
292
+ const { vendorId, customerId, selectedAccount, selectedClassBase, transactions, transactionId, lineId, selectedTab, uncategorizedAccounts, isAccountingClassesEnabled, isUncategorizedExpenseCategoryEnabled, } = action.payload;
286
293
  const transactionLocalData = recordGet(draft.transactionCategorizationView[selectedTab]
287
294
  .transactionReviewLocalDataById, transactionId, undefined);
288
295
  const existingAccount = transactionLocalData?.transactionReviewLocalData.lineItemById[lineId]
@@ -307,7 +314,7 @@ const expenseAutomationTransactionsView = createSlice({
307
314
  const selectedCheckBoxTransactionIds = draft.transactionCategorizationView[selectedTab]
308
315
  .selectedCheckBoxTransactionIds;
309
316
  if (selectedTransaction != null &&
310
- checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled) === true && // check if all line items are filled
317
+ checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled) === true && // check if all line items are filled
311
318
  selectedCheckBoxTransactionIds.length < MAX_SELECTION_LIMIT &&
312
319
  selectedCheckBoxTransactionIds.includes(transactionId) === false) {
313
320
  draft.transactionCategorizationView[selectedTab].selectedCheckBoxTransactionIds = [
@@ -326,7 +333,7 @@ const expenseAutomationTransactionsView = createSlice({
326
333
  if (transactionLocalData != null) {
327
334
  const { localData, similarTransactionUpdated } = toSetAllLineItemsToCategoryClass(draft.transactionCategorizationView[selectedTab], transaction, transactionId, lineId, transactionLocalData.transactionReviewLocalData, existingAccount?.accountId !== selectedAccount?.accountId
328
335
  ? 'category'
329
- : 'class', uncategorizedAccounts, selectedTab, vendorId, customerId, selectedAccount, selectedClassBase, isUncategorizedExpenseCategoryEnabled);
336
+ : 'class', uncategorizedAccounts, selectedTab, vendorId, customerId, selectedAccount, selectedClassBase, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled);
330
337
  draft.transactionCategorizationView[selectedTab].transactionReviewLocalDataById[transaction.id] = {
331
338
  transactionId: transaction.id,
332
339
  transactionReviewLocalData: localData,
@@ -345,7 +352,7 @@ const expenseAutomationTransactionsView = createSlice({
345
352
  ...dirtyIds,
346
353
  ]);
347
354
  },
348
- prepare(selectedTab, transactionId, lineId, transactions, uncategorizedAccounts, vendorId, customerId, selectedAccount, selectedClassBase, lineEntity, recommendations, isUncategorizedExpenseCategoryEnabled) {
355
+ prepare(selectedTab, transactionId, lineId, transactions, uncategorizedAccounts, vendorId, customerId, selectedAccount, selectedClassBase, lineEntity, recommendations, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled) {
349
356
  return {
350
357
  payload: {
351
358
  selectedTab,
@@ -359,13 +366,14 @@ const expenseAutomationTransactionsView = createSlice({
359
366
  selectedClassBase,
360
367
  recommendations,
361
368
  uncategorizedAccounts,
369
+ isAccountingClassesEnabled,
362
370
  isUncategorizedExpenseCategoryEnabled,
363
371
  },
364
372
  };
365
373
  },
366
374
  },
367
375
  setEntityRecommendationForLineIdsForCategorization: {
368
- prepare(selectedTab, transactionId, transaction, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled) {
376
+ prepare(selectedTab, transactionId, transaction, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled) {
369
377
  return {
370
378
  payload: {
371
379
  selectedTab,
@@ -376,18 +384,19 @@ const expenseAutomationTransactionsView = createSlice({
376
384
  amount,
377
385
  recommendationWithCOTByLineId,
378
386
  uncategorizedAccounts,
387
+ isAccountingClassesEnabled,
379
388
  isUncategorizedExpenseCategoryEnabled,
380
389
  },
381
390
  };
382
391
  },
383
392
  reducer(draft, action) {
384
- const { entity, transaction, transactionId, selectedTab, lineIds, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, } = action.payload;
393
+ const { entity, transaction, transactionId, selectedTab, lineIds, uncategorizedAccounts, isAccountingClassesEnabled, isUncategorizedExpenseCategoryEnabled, } = action.payload;
385
394
  const transactionLocalData = recordGet(draft.transactionCategorizationView[selectedTab]
386
395
  .transactionReviewLocalDataById, transactionId.id, undefined);
387
396
  if (transactionLocalData != null) {
388
397
  draft.transactionCategorizationView[selectedTab].transactionReviewLocalDataById[transaction.id] = {
389
398
  transactionId: transaction.id,
390
- transactionReviewLocalData: setEntityRecommendationForLineIdInLocalData(draft.transactionCategorizationView[selectedTab], transaction, transactionLocalData.transactionReviewLocalData, entity, lineIds, uncategorizedAccounts, action.payload.recommendationWithCOTByLineId, isUncategorizedExpenseCategoryEnabled),
399
+ transactionReviewLocalData: setEntityRecommendationForLineIdInLocalData(draft.transactionCategorizationView[selectedTab], transaction, transactionLocalData.transactionReviewLocalData, entity, lineIds, uncategorizedAccounts, action.payload.recommendationWithCOTByLineId, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled),
391
400
  };
392
401
  // Mark transaction as dirty (autofill happened)
393
402
  if (!draft.transactionCategorizationView[selectedTab].transactionIdsWithUnsavedData.includes(transaction.id)) {
@@ -442,7 +451,7 @@ const expenseAutomationTransactionsView = createSlice({
442
451
  action.payload.status;
443
452
  },
444
453
  updateSelectedCustomerForTransaction(draft, action) {
445
- const { transactionId, lineId, updatedCustomer, selectedTransaction, selectedTab, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, } = action.payload;
454
+ const { transactionId, lineId, updatedCustomer, selectedTransaction, selectedTab, uncategorizedAccounts, isAccountingClassesEnabled, isUncategorizedExpenseCategoryEnabled, } = action.payload;
446
455
  const transactionLocalData = recordGet(draft.transactionCategorizationView[selectedTab]
447
456
  .transactionReviewLocalDataById, transactionId, undefined);
448
457
  if (transactionLocalData != null) {
@@ -495,7 +504,7 @@ const expenseAutomationTransactionsView = createSlice({
495
504
  .selectedCheckBoxTransactionIds;
496
505
  if (newTransactionLocalData.customer != null &&
497
506
  newTransactionLocalData.customer.id != null &&
498
- checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled) === true && // check if all line items are filled
507
+ checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled) === true && // check if all line items are filled
499
508
  selectedCheckBoxTransactionIds.length < MAX_SELECTION_LIMIT &&
500
509
  selectedCheckBoxTransactionIds.includes(transactionId) === false) {
501
510
  draft.transactionCategorizationView[selectedTab].selectedCheckBoxTransactionIds = [
@@ -514,7 +523,7 @@ const expenseAutomationTransactionsView = createSlice({
514
523
  }
515
524
  },
516
525
  updateSelectedVendorForTransaction(draft, action) {
517
- const { transactionId, lineId, updatedVendor, selectedTransaction, selectedTab, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, } = action.payload;
526
+ const { transactionId, lineId, updatedVendor, selectedTransaction, selectedTab, uncategorizedAccounts, isAccountingClassesEnabled, isUncategorizedExpenseCategoryEnabled, } = action.payload;
518
527
  const transactionLocalData = recordGet(draft.transactionCategorizationView[selectedTab]
519
528
  .transactionReviewLocalDataById, transactionId, undefined);
520
529
  if (transactionLocalData != null) {
@@ -571,7 +580,7 @@ const expenseAutomationTransactionsView = createSlice({
571
580
  .selectedCheckBoxTransactionIds;
572
581
  if (newTransactionLocalData.vendor != null &&
573
582
  newTransactionLocalData.vendor.id != null &&
574
- checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled) === true && // check if all line items are filled
583
+ checkIfAllLineItemsAreCategoryClassFilled(selectedTransaction, newTransactionLocalData, uncategorizedAccounts, isUncategorizedExpenseCategoryEnabled, isAccountingClassesEnabled) === true && // check if all line items are filled
575
584
  selectedCheckBoxTransactionIds.length < MAX_SELECTION_LIMIT &&
576
585
  selectedCheckBoxTransactionIds.includes(transactionId) === false) {
577
586
  draft.transactionCategorizationView[selectedTab].selectedCheckBoxTransactionIds = [
@@ -790,7 +799,65 @@ const expenseAutomationTransactionsView = createSlice({
790
799
  };
791
800
  },
792
801
  },
802
+ fetchTransferAccounts(draft) {
803
+ draft.transferAccounts.fetchState = 'In-Progress';
804
+ },
805
+ updateTransferAccounts(draft, action) {
806
+ draft.transferAccounts.fetchState = 'Completed';
807
+ draft.transferAccounts.accountIds = action.payload.accountIds;
808
+ },
809
+ updateTransferAccountsFailure(draft) {
810
+ draft.transferAccounts.fetchState = 'Error';
811
+ },
812
+ createTransferEntry: {
813
+ prepare(transactionId, creditAccountIntegrationId, debitAccountIntegrationId, memo, transactionType, sourceTransactionType) {
814
+ return {
815
+ payload: {
816
+ transactionId,
817
+ creditAccountIntegrationId,
818
+ debitAccountIntegrationId,
819
+ memo,
820
+ transactionType,
821
+ sourceTransactionType,
822
+ },
823
+ };
824
+ },
825
+ reducer(draft) {
826
+ draft.createTransferEntryStatus = 'In-Progress';
827
+ },
828
+ },
829
+ createTransferEntrySuccess(draft) {
830
+ draft.createTransferEntryStatus = 'Completed';
831
+ },
832
+ createTransferEntryFailure(draft) {
833
+ draft.createTransferEntryStatus = 'Error';
834
+ },
835
+ resetCreateTransferEntryStatus(draft) {
836
+ draft.createTransferEntryStatus = 'Not-Started';
837
+ },
838
+ createTransferEntryReplacedTransaction: {
839
+ prepare(previousTransactionId, newTransactionId) {
840
+ return { payload: { newTransactionId, previousTransactionId } };
841
+ },
842
+ reducer(draft, action) {
843
+ draft.lastTransferEntryReplacement = action.payload;
844
+ },
845
+ },
846
+ acknowledgeTransferEntryRouteReplacement(draft) {
847
+ draft.lastTransferEntryReplacement = undefined;
848
+ },
849
+ removeTransactionFromAllTabs: {
850
+ prepare(transactionId) {
851
+ return { payload: { transactionId } };
852
+ },
853
+ reducer(draft, action) {
854
+ const { transactionId } = action.payload;
855
+ for (const tab of TRANSACTIONS_TABS) {
856
+ removeTransactionFromTabView(draft.transactionCategorizationView[tab], transactionId);
857
+ }
858
+ },
859
+ },
793
860
  },
794
861
  });
795
- 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, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
862
+ 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, fetchTransferAccounts, updateTransferAccounts, updateTransferAccountsFailure, createTransferEntry, createTransferEntrySuccess, createTransferEntryFailure, resetCreateTransferEntryStatus, createTransferEntryReplacedTransaction, acknowledgeTransferEntryRouteReplacement, removeTransactionFromAllTabs, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, } = expenseAutomationTransactionsView.actions;
796
863
  export default expenseAutomationTransactionsView.reducer;
@@ -1,12 +1,16 @@
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, getAccountBaseForTransferAccounts, } from '../../../entity/account/accountSelector';
4
5
  import { getIsAccountingClassesEnabled, getCurrentTenant, } from '../../../entity/tenant/tenantSelector';
5
6
  import { getTransactionWithCOT } from '../../../entity/transaction/transactionHelper';
6
7
  import { getSupportedTransactionsByIds } from '../../../entity/transaction/transactionSelector';
7
8
  import { getAccountList, getNestedAccountListHierarchy, getUncategorizedAccounts, } from '../../accountList/accountListSelector';
8
9
  import { getClassList, getNestedClassListHierarchy, } from '../../classList/classListSelector';
9
10
  import { getAllSteps } from '../selectorTypes/expenseAutomationViewSelectorTypes';
11
+ export function getLastTransferEntryReplacement(state) {
12
+ return state.expenseAutomationTransactionsViewState.lastTransferEntryReplacement;
13
+ }
10
14
  export function getExpenseAutomationTransactionView(state) {
11
15
  const { accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, expenseAutomationViewState, transactionState, monthEndCloseChecksState, monthEndCloseChecksViewState, } = state;
12
16
  const { selectedTransactionCategorizationTab } = expenseAutomationTransactionsViewState;
@@ -83,6 +87,19 @@ export function getExpenseAutomationTransactionView(state) {
83
87
  : [];
84
88
  const transactionCompletionStatus = allSteps.find((step) => step.step === 'transaction_categorization')?.completionStatus;
85
89
  const completionStatus = transactionCompletionStatus ?? 'incomplete';
90
+ const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
91
+ .map((id) => getAccountBaseForTransferAccounts(accountState, id))
92
+ .filter((account) => account != null);
93
+ /**
94
+ * Credit transfer picker uses transfer-account ids from a dedicated fetch. If that list
95
+ * resolves to nothing while the COA list is loaded, fall back to the full COA list so the
96
+ * credit dropdown is not empty.
97
+ */
98
+ const transferAccountsList = transferAccountsFromApi.length > 0
99
+ ? transferAccountsFromApi
100
+ : accountList.accounts
101
+ .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
102
+ .filter((account) => account != null);
86
103
  return {
87
104
  version: 0,
88
105
  fetchState: fetchStatus.fetchState,
@@ -101,11 +118,13 @@ export function getExpenseAutomationTransactionView(state) {
101
118
  refreshStatus,
102
119
  saveStatus,
103
120
  markAsNotMiscategorizedStatus,
121
+ createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
104
122
  completionStatus,
105
123
  totalCountByTab,
106
124
  fetchStateByTransactionTabs: fetchStateByTab,
107
125
  uploadReceiptStatusById,
108
126
  selectedTransactionId,
109
127
  selectedTransactionLineId,
128
+ transferAccounts: transferAccountsList,
110
129
  };
111
130
  }
@@ -1,5 +1,6 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { getIsAccountingClassesEnabled } from '../../entity/tenant/tenantSelector';
3
4
  import { getTransactionWithCOT, getTransactionWithCOTFromRecommendations, } from '../../entity/transaction/transactionHelper';
4
5
  import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
5
6
  import { setEntityRecommendationForLineIdsForCategorization } from '../../view/expenseAutomationView/reducers/transactionsViewReducer';
@@ -51,7 +52,7 @@ export const fetchEntityRecommendationsByTransactionIdEpic = (actions$, state$,
51
52
  if (recommendationWithCOTByLineId != null) {
52
53
  const uncategorizedIncomeExpense = getUncategorizedAccounts(state$.value.accountState, state$.value.accountListState, 'accountList');
53
54
  if (isTransactionCategorizationFlow === true) {
54
- actions.push(setEntityRecommendationForLineIdsForCategorization(selectedTransactionCategorizationTab, transactionId, transactionWithCOT, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled));
55
+ actions.push(setEntityRecommendationForLineIdsForCategorization(selectedTransactionCategorizationTab, transactionId, transactionWithCOT, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedIncomeExpense, isUncategorizedExpenseCategoryEnabled, getIsAccountingClassesEnabled(state$.value)));
55
56
  }
56
57
  else {
57
58
  actions.push(setEntityRecommendationForLineIdsForTransactionDetail(transactionId, transactionWithCOT, lineIds, entity, amount, recommendationWithCOTByLineId, uncategorizedIncomeExpense));
@@ -13,6 +13,7 @@ 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 { fetchTransferAccounts } from '../../expenseAutomationView/reducers/transactionsViewReducer';
16
17
  import { fetchOwnerList } from '../../ownerList/ownerListReducer';
17
18
  import { fetchTransactionDetail, initializeTransactionDetailLocalData, removeTransactionDetail, updateTransactionDetailFetchState, } from '../transactionDetailReducer';
18
19
  import { getAllLinkedTransactions, getTransactionDetailKey, } from '../transactionDetailState';
@@ -34,6 +35,11 @@ export const fetchTransactionDetailEpic = (actions$, state$, zeniAPI) => actions
34
35
  accountList.fetchState !== 'In-Progress') {
35
36
  transactionActions.push(fetchAccountList('accountList'));
36
37
  }
38
+ const { transferAccounts } = state$.value.expenseAutomationTransactionsViewState;
39
+ if (transferAccounts.fetchState !== 'In-Progress' &&
40
+ transferAccounts.fetchState !== 'Completed') {
41
+ transactionActions.push(fetchTransferAccounts());
42
+ }
37
43
  const classList = state$.value.classListState;
38
44
  if (classList.hasValidState() === false &&
39
45
  classList.fetchState !== 'In-Progress') {
@@ -1,5 +1,6 @@
1
1
  import recordGet from 'lodash/get';
2
2
  import { reduceFetchState } from '../../commonStateTypes/reduceFetchState';
3
+ import { getAccountBase, getAccountBaseForTransferAccounts, } from '../../entity/account/accountSelector';
3
4
  import { getIsAccountingClassesEnabled } from '../../entity/tenant/tenantSelector';
4
5
  import { toTransactionTypeStrict } from '../../entity/transaction/stateTypes/transactionType';
5
6
  import { getTransactionWithCOT } from '../../entity/transaction/transactionHelper';
@@ -10,7 +11,7 @@ import { getAccountList, getNestedAccountListHierarchy, } from '../accountList/a
10
11
  import { getClassList, getNestedClassListHierarchy, } from '../classList/classListSelector';
11
12
  import { getAllLinkedTransactions, getTransactionDetailKey, initialSupportedTransactionDetail, } from './transactionDetailState';
12
13
  export const getTransactionDetail = (state, transactionId, fetchLinkedTransactions = true) => {
13
- const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, } = state;
14
+ const { transactionDetailState, transactionState, vendorState, vendorListState, accountState, classState, classListState, accountListState, expenseAutomationTransactionsViewState, } = state;
14
15
  const detailKey = getTransactionDetailKey(transactionId);
15
16
  const transactionDetail = recordGet(transactionDetailState.transactionDetailById, detailKey);
16
17
  let fetchState = {
@@ -62,6 +63,14 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
62
63
  : [];
63
64
  const transactionDetailAnyUpdateStatus = reduceUpdateFetchStates(transactionDetail);
64
65
  const vendors = getVendorsByVendorIds(vendorState, vendorListState.vendorIds);
66
+ const transferAccountsFromApi = expenseAutomationTransactionsViewState.transferAccounts.accountIds
67
+ .map((id) => getAccountBaseForTransferAccounts(accountState, id))
68
+ .filter((account) => account != null);
69
+ const transferAccountsList = transferAccountsFromApi.length > 0
70
+ ? transferAccountsFromApi
71
+ : accountsList.accounts
72
+ .map((a) => getAccountBase(accountState, a.accountId, 'account_list'))
73
+ .filter((account) => account != null);
65
74
  return {
66
75
  reportId: 'transaction_detail',
67
76
  reportTitle: 'Transaction Detail',
@@ -78,6 +87,8 @@ export const getTransactionDetail = (state, transactionId, fetchLinkedTransactio
78
87
  accountsHierarchyList,
79
88
  classList: classList,
80
89
  isAccountingClassesEnabled,
90
+ createTransferEntryStatus: expenseAutomationTransactionsViewState.createTransferEntryStatus,
91
+ transferAccounts: transferAccountsList,
81
92
  isUpdateNotAllowed: transactionDetail?.isUpdateNotAllowed,
82
93
  transactionDetailLocalData: transactionDetail?.transactionDetailLocalData ??
83
94
  initialSupportedTransactionDetail.transactionDetailLocalData,
@@ -1,5 +1,5 @@
1
1
  import { from, of } from 'rxjs';
2
- import { catchError, concatMap, filter, mergeMap, switchMap, } from 'rxjs/operators';
2
+ import { catchError, concatMap, exhaustMap, filter, mergeMap, } from 'rxjs/operators';
3
3
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
4
  import { createZeniAPIStatus } from '../../../responsePayload';
5
5
  import { approveOAuthConsent, approveOAuthConsentFailure, approveOAuthConsentSuccess, } from '../zeniOAuthReducer';
@@ -9,10 +9,11 @@ const failureSnackbar = (reason) => openSnackbar({
9
9
  type: 'error',
10
10
  variables: [{ variableName: '__reason__', variableValue: reason }],
11
11
  });
12
- export const approveOAuthConsentEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(approveOAuthConsent.match), switchMap((action) => {
13
- if (state$.value.zeniOAuthViewState.fetchState === 'In-Progress') {
14
- return from([]);
15
- }
12
+ export const approveOAuthConsentEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(approveOAuthConsent.match),
13
+ // `approveOAuthConsent` reducer sets fetchState to In-Progress before epics
14
+ // run, so a guard on In-Progress would block every legitimate request.
15
+ // exhaustMap drops duplicate approve clicks while the HTTP call is in flight.
16
+ exhaustMap((action) => {
16
17
  const { userId, zeniSessionId, tenantId, clientId, redirectUri, codeChallenge, codeChallengeMethod, state, responseType, } = action.payload;
17
18
  const authHeaders = {
18
19
  'zeni-user-id': userId,
package/lib/index.d.ts CHANGED
@@ -269,7 +269,7 @@ import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFl
269
269
  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';
270
270
  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';
271
271
  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';
272
- import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
272
+ import { acknowledgeTransferEntryRouteReplacement, backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, fetchTransferAccounts, initializeTransactionCategorizationViewLocalData, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, resetCreateTransferEntryStatus, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
273
273
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
274
274
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
275
275
  import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
@@ -281,7 +281,7 @@ import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSel
281
281
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
282
282
  import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
283
283
  import { getExpenseAutomationReconciliationView, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
284
- import { getExpenseAutomationTransactionView } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
284
+ import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
285
285
  import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
286
286
  import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
287
287
  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';
@@ -641,10 +641,10 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
641
641
  export { ClassesViewSelectorReportV2 };
642
642
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
643
643
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
644
- 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, 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, };
644
+ 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, };
645
645
  export { JEScheduleLocalData };
646
646
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
647
- 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, };
647
+ 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, fetchTransferAccounts, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
648
648
  export { TopExpense, TopExTimePeriod, TOP_EX_TIME_PERIODS };
649
649
  export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, MonthYearPeriod, };
650
650
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';