@zeniai/client-epic-state 5.2.35-beta0MM → 5.2.35-beta2MM

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 (34) hide show
  1. package/lib/entity/actualMatching/actualMatchingPayload.js +6 -4
  2. package/lib/esm/entity/actualMatching/actualMatchingPayload.js +6 -4
  3. package/lib/esm/index.js +2 -2
  4. package/lib/esm/view/expenseAutomationView/epics/actualMatching/fetchActualMatchingEpic.js +2 -4
  5. package/lib/esm/view/expenseAutomationView/epics/actualMatching/matchAndReverseAccrualsEpic.js +2 -3
  6. package/lib/esm/view/expenseAutomationView/epics/actualMatching/searchMatchAccrualsEpic.js +6 -2
  7. package/lib/esm/view/expenseAutomationView/epics/actualMatching/searchMatchTransactionsEpic.js +6 -2
  8. package/lib/esm/view/expenseAutomationView/epics/actualMatching/undoReversalAccrualsEpic.js +2 -3
  9. package/lib/esm/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
  10. package/lib/esm/view/expenseAutomationView/expenseAutomationViewState.js +4 -2
  11. package/lib/esm/view/expenseAutomationView/reducers/actualMatchingViewReducer.js +13 -6
  12. package/lib/esm/view/expenseAutomationView/selectors/actualMatchingViewSelector.js +83 -36
  13. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +1 -0
  14. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +3 -0
  15. package/lib/index.d.ts +2 -2
  16. package/lib/index.js +49 -48
  17. package/lib/view/expenseAutomationView/epics/actualMatching/fetchActualMatchingEpic.js +2 -4
  18. package/lib/view/expenseAutomationView/epics/actualMatching/matchAndReverseAccrualsEpic.js +2 -3
  19. package/lib/view/expenseAutomationView/epics/actualMatching/searchMatchAccrualsEpic.d.ts +2 -1
  20. package/lib/view/expenseAutomationView/epics/actualMatching/searchMatchAccrualsEpic.js +5 -1
  21. package/lib/view/expenseAutomationView/epics/actualMatching/searchMatchTransactionsEpic.js +5 -1
  22. package/lib/view/expenseAutomationView/epics/actualMatching/undoReversalAccrualsEpic.js +2 -3
  23. package/lib/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
  24. package/lib/view/expenseAutomationView/expenseAutomationViewState.d.ts +2 -1
  25. package/lib/view/expenseAutomationView/expenseAutomationViewState.js +6 -3
  26. package/lib/view/expenseAutomationView/reducers/actualMatchingViewReducer.d.ts +4 -2
  27. package/lib/view/expenseAutomationView/reducers/actualMatchingViewReducer.js +13 -6
  28. package/lib/view/expenseAutomationView/selectorTypes/actualMatchingViewSelectorTypes.d.ts +10 -8
  29. package/lib/view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes.d.ts +9 -0
  30. package/lib/view/expenseAutomationView/selectors/actualMatchingViewSelector.d.ts +4 -1
  31. package/lib/view/expenseAutomationView/selectors/actualMatchingViewSelector.js +84 -35
  32. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +1 -0
  33. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +3 -0
  34. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toActualMatchingMatch = toActualMatchingMatch;
4
4
  const amount_1 = require("../../commonStateTypes/amount");
5
+ const stringToUnion_1 = require("../../commonStateTypes/stringToUnion");
5
6
  const jeSchedulesPayload_1 = require("../jeSchedules/jeSchedulesPayload");
6
7
  const USD_CURRENCY_CODE = 'USD';
7
8
  const USD_CURRENCY_SYMBOL = '$';
@@ -11,11 +12,12 @@ const MATCH_KINDS = [
11
12
  'manually_reversed',
12
13
  ];
13
14
  function toMatchKind(raw) {
14
- if (MATCH_KINDS.includes(raw)) {
15
- return raw;
15
+ const kind = (0, stringToUnion_1.stringToUnionStrict)(raw, MATCH_KINDS);
16
+ if (kind == null) {
17
+ console.error(`Unknown ActualMatchingMatchKind: ${raw}`);
18
+ return 'auto_reversed';
16
19
  }
17
- console.error(`Unknown ActualMatchingMatchKind: ${raw}`);
18
- return 'auto_reversed';
20
+ return kind;
19
21
  }
20
22
  function toActualMatchingMatch(payload) {
21
23
  const currencyCode = payload.currency_code != null && payload.currency_code !== ''
@@ -1,4 +1,5 @@
1
1
  import { toAmount } from '../../commonStateTypes/amount';
2
+ import { stringToUnionStrict } from '../../commonStateTypes/stringToUnion';
2
3
  import { toJEOneTimeAccrual, } from '../jeSchedules/jeSchedulesPayload';
3
4
  const USD_CURRENCY_CODE = 'USD';
4
5
  const USD_CURRENCY_SYMBOL = '$';
@@ -8,11 +9,12 @@ const MATCH_KINDS = [
8
9
  'manually_reversed',
9
10
  ];
10
11
  function toMatchKind(raw) {
11
- if (MATCH_KINDS.includes(raw)) {
12
- return raw;
12
+ const kind = stringToUnionStrict(raw, MATCH_KINDS);
13
+ if (kind == null) {
14
+ console.error(`Unknown ActualMatchingMatchKind: ${raw}`);
15
+ return 'auto_reversed';
13
16
  }
14
- console.error(`Unknown ActualMatchingMatchKind: ${raw}`);
15
- return 'auto_reversed';
17
+ return kind;
16
18
  }
17
19
  export function toActualMatchingMatch(payload) {
18
20
  const currencyCode = payload.currency_code != null && payload.currency_code !== ''
package/lib/esm/index.js CHANGED
@@ -184,7 +184,7 @@ import { updateDashboardLayout } from './view/dashboardLayout/dashboardLayoutRed
184
184
  import uploadAccountStatementIntoDocumentAI from './view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper';
185
185
  import { fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedPeriod, updateCurrentSelectedView, } from './view/expenseAutomationView/expenseAutomationViewReducer';
186
186
  import { getExpenseAutomationView } from './view/expenseAutomationView/expenseAutomationViewSelector';
187
- import { toExpenseAutomationViewType, } from './view/expenseAutomationView/expenseAutomationViewState';
187
+ import { toExpenseAutomationViewType, toExpenseAutomationViewTypeStrict, } from './view/expenseAutomationView/expenseAutomationViewState';
188
188
  import { computeNewScheduleJeDetails } from './view/expenseAutomationView/helpers/newScheduleLocalDataHelper';
189
189
  import { isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardCreditType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, } from './view/expenseAutomationView/helpers/reconciliationHelpers';
190
190
  import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, } from './view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';
@@ -491,7 +491,7 @@ export { stringToUnion, stringToUnionStrict };
491
491
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, getMonthEndCloseChecksViewByTenantId, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, };
492
492
  export {
493
493
  // Bulk Upload Types
494
- BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, DEFAULT_COMPLETED_SUB_TAB, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ALL_JE_PAGE_TABS, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, toExpenseAutomationJEScheduleSortKey, toExpenseAutomationActualMatchingSortKey, toJEPageTab, toMatchAndReverseResultStatus, toUndoReversalResultStatus, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts,
494
+ BATCH_FILE_STATUSES, isUnmatchedTabFileStatus, DEFAULT_COMPLETED_SUB_TAB, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, toTransactionGroup, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ALL_JE_PAGE_TABS, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, toExpenseAutomationJEScheduleSortKey, toExpenseAutomationActualMatchingSortKey, toJEPageTab, toMatchAndReverseResultStatus, toUndoReversalResultStatus, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, toExpenseAutomationViewTypeStrict, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts,
495
495
  // Bulk Upload Actions
496
496
  bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, getExpenseAutomationFluxAnalysisView, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, updateFluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, getAccountReconByAccountIdAndSelectedPeriod, toReconciliationTabsType, isAccountReconReport, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, toReconciliationAccountSource, deleteAccountStatement, deleteCombinedStatement, uploadAccountStatement, parseCombinedStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, updateStatementUploadChosen, submitCombinedStatementUpdate, submitStatementUpdate, clearStatementDateConflict, confirmStatementMapping, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, };
497
497
  export { computeNewScheduleJeDetails, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchOneTimeAccrual, getJeNewAccrualAccountsView, ignoreOneTimeAccrual, promoteOneTimeAccrual, revertJeSchedule, revertOneTimeAccrual, getJeNewScheduleSearchTransactionsView, getJeNewScheduleView, };
@@ -1,17 +1,15 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap, takeUntil, } from 'rxjs/operators';
3
3
  import { updateActualMatchingMatches } from '../../../../entity/actualMatching/actualMatchingReducer';
4
- import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
5
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
5
  import { clearAll } from '../../../../rootActions';
7
6
  import { toServiceMonthFromPeriod, } from '../../payload/actualMatchingPayload';
8
7
  import { fetchActualMatching, fetchActualMatchingFailure, fetchActualMatchingSuccess, } from '../../reducers/actualMatchingViewReducer';
8
+ import { getSelectedMonthYearForCurrentTenant } from '../../selectors/actualMatchingViewSelector';
9
9
  export const fetchActualMatchingEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchActualMatching.match), switchMap((action) => {
10
10
  const state = state$.value;
11
11
  const { period, refreshViewInBackground } = action.payload;
12
- const currentTenant = getCurrentTenant(state);
13
- const selectedPeriod = state.expenseAutomationViewState
14
- .selectedPeriodByTenantId[currentTenant?.tenantId ?? ''] ?? {
12
+ const selectedPeriod = getSelectedMonthYearForCurrentTenant(state) ?? {
15
13
  month: period.start.month,
16
14
  year: period.start.year,
17
15
  };
@@ -1,14 +1,13 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, takeUntil } from 'rxjs/operators';
3
3
  import { convertToPeriod, toAbsoluteDay, } from '../../../../commonStateTypes/timePeriod';
4
- import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
5
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
5
  import { clearAll } from '../../../../rootActions';
7
6
  import { toMatchAndReverseResult, } from '../../payload/actualMatchingPayload';
8
7
  import { clearMatchNewModal, fetchActualMatching, matchAndReverseAccruals, matchAndReverseAccrualsFailure, matchAndReverseAccrualsSuccess, } from '../../reducers/actualMatchingViewReducer';
8
+ import { getSelectedMonthYearForCurrentTenant } from '../../selectors/actualMatchingViewSelector';
9
9
  function refreshActualMatchingList(state) {
10
- const currentTenant = getCurrentTenant(state);
11
- const selectedMonthYear = state.expenseAutomationViewState.selectedPeriodByTenantId[currentTenant?.tenantId ?? ''];
10
+ const selectedMonthYear = getSelectedMonthYearForCurrentTenant(state);
12
11
  if (selectedMonthYear == null) {
13
12
  return [];
14
13
  }
@@ -1,7 +1,8 @@
1
1
  import { from, merge, of } from 'rxjs';
2
- import { catchError, debounceTime, filter, mergeMap, switchMap, } from 'rxjs/operators';
2
+ import { catchError, debounceTime, filter, mergeMap, switchMap, takeUntil, } from 'rxjs/operators';
3
3
  import { updateJEOneTimeAccruals } from '../../../../entity/jeSchedules/jeSchedulesReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { clearAll } from '../../../../rootActions';
5
6
  import { searchMatchAccruals, searchMatchAccrualsFailure, searchMatchAccrualsSuccess, } from '../../reducers/actualMatchingViewReducer';
6
7
  import { MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, } from '../../types/actualMatchingViewState';
7
8
  export const searchMatchAccrualsEpic = (actions$, _state$, zeniAPI) => {
@@ -39,6 +40,9 @@ export const searchMatchAccrualsEpic = (actions$, _state$, zeniAPI) => {
39
40
  }), catchError((error) => of(searchMatchAccrualsFailure({
40
41
  error: createZeniAPIStatus('Unexpected Error', 'Search match accruals REST API call errored out' +
41
42
  JSON.stringify(error)),
42
- }))));
43
+ }))),
44
+ // On the HTTP stream only. Wrapping the outer merge would complete
45
+ // the epic on the first `clearAll` and drop later searches.
46
+ takeUntil(actions$.pipe(filter(clearAll.match))));
43
47
  }));
44
48
  };
@@ -1,7 +1,8 @@
1
1
  import { from, merge, of } from 'rxjs';
2
- import { catchError, debounceTime, filter, mergeMap, switchMap, } from 'rxjs/operators';
2
+ import { catchError, debounceTime, filter, mergeMap, switchMap, takeUntil, } from 'rxjs/operators';
3
3
  import { getActualMatchingMatchById } from '../../../../entity/actualMatching/actualMatchingSelector';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { clearAll } from '../../../../rootActions';
5
6
  import { toActualMatchingTransactionSearchResult, } from '../../payload/actualMatchingPayload';
6
7
  import { openMatchNewModal, searchMatchAccruals, searchMatchTransactions, searchMatchTransactionsFailure, searchMatchTransactionsSuccess, } from '../../reducers/actualMatchingViewReducer';
7
8
  import { parseActualMatchingMatchId } from '../../selectors/actualMatchingViewSelector';
@@ -67,7 +68,10 @@ export const searchMatchTransactionsEpic = (actions$, state$, zeniAPI) => {
67
68
  }), catchError((error) => of(searchMatchTransactionsFailure({
68
69
  error: createZeniAPIStatus('Unexpected Error', 'Search match transactions REST API call errored out' +
69
70
  JSON.stringify(error)),
70
- }))));
71
+ }))),
72
+ // On the HTTP stream only. Wrapping `merge(openModal$, search$)`
73
+ // would complete the epic on the first `clearAll` and drop later searches.
74
+ takeUntil(actions$.pipe(filter(clearAll.match))));
71
75
  }));
72
76
  return merge(openModal$, search$);
73
77
  };
@@ -1,14 +1,13 @@
1
1
  import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, takeUntil } from 'rxjs/operators';
3
3
  import { convertToPeriod, toAbsoluteDay, } from '../../../../commonStateTypes/timePeriod';
4
- import { getCurrentTenant } from '../../../../entity/tenant/tenantSelector';
5
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
5
  import { clearAll } from '../../../../rootActions';
7
6
  import { toUndoReversalResult, } from '../../payload/actualMatchingPayload';
8
7
  import { fetchActualMatching, fetchActualMatchingMatch, undoReversalAccruals, undoReversalAccrualsFailure, undoReversalAccrualsSuccess, } from '../../reducers/actualMatchingViewReducer';
8
+ import { getSelectedMonthYearForCurrentTenant } from '../../selectors/actualMatchingViewSelector';
9
9
  function refreshActualMatchingList(state) {
10
- const currentTenant = getCurrentTenant(state);
11
- const selectedMonthYear = state.expenseAutomationViewState.selectedPeriodByTenantId[currentTenant?.tenantId ?? ''];
10
+ const selectedMonthYear = getSelectedMonthYearForCurrentTenant(state);
12
11
  if (selectedMonthYear == null) {
13
12
  return [];
14
13
  }
@@ -43,6 +43,7 @@ export function getExpenseAutomationView(state) {
43
43
  const reconciliation = getExpenseAutomationReconciliationView(state);
44
44
  const expenseAutomationTransactionsView = getExpenseAutomationTransactionView(state);
45
45
  const jeSchedules = getExpenseAutomationJESchedulesView(state);
46
+ // Top-level sibling of `jeSchedules`: see ExpenseAutomationViewSelector.
46
47
  const actualMatching = getExpenseAutomationActualMatchingView(state);
47
48
  switch (currentSelectedView) {
48
49
  case 'reconciliation':
@@ -1,5 +1,5 @@
1
- import { stringToUnion } from '../../commonStateTypes/stringToUnion';
2
- export const EXPENSE_AUTOMATION_VIEW_TYPES = [
1
+ import { stringToUnion, stringToUnionStrict, } from '../../commonStateTypes/stringToUnion';
2
+ const EXPENSE_AUTOMATION_VIEW_TYPES = [
3
3
  'transaction_categorization',
4
4
  'je_schedules',
5
5
  'reconciliation',
@@ -8,3 +8,5 @@ export const EXPENSE_AUTOMATION_VIEW_TYPES = [
8
8
  'month_end_insights',
9
9
  ];
10
10
  export const toExpenseAutomationViewType = (v) => stringToUnion(v, EXPENSE_AUTOMATION_VIEW_TYPES);
11
+ /** Unlike `toExpenseAutomationViewType`, unknown strings return `undefined`. */
12
+ export const toExpenseAutomationViewTypeStrict = (v) => stringToUnionStrict(v, EXPENSE_AUTOMATION_VIEW_TYPES);
@@ -197,10 +197,13 @@ const expenseAutomationActualMatchingView = createSlice({
197
197
  }
198
198
  },
199
199
  },
200
+ // Dismiss (Cancel / overlay). Store reset matches `clearMatchNewModal`;
201
+ // the actions stay distinct so confirm-success vs user-dismiss stay observable.
200
202
  closeMatchNewModal(draft) {
201
203
  draft.matchModal.isOpen = false;
202
204
  resetMatchModalSearches(draft);
203
205
  },
206
+ // Confirm-success / host reset. Same slice write as close; different action type.
204
207
  clearMatchNewModal(draft) {
205
208
  draft.matchModal.isOpen = false;
206
209
  resetMatchModalSearches(draft);
@@ -337,12 +340,16 @@ const expenseAutomationActualMatchingView = createSlice({
337
340
  return { payload: params };
338
341
  },
339
342
  },
340
- undoReversalAccrualsSuccess(draft, action) {
341
- draft.undoReversalStatus = {
342
- fetchState: 'Completed',
343
- error: undefined,
344
- };
345
- void action;
343
+ undoReversalAccrualsSuccess: {
344
+ reducer(draft) {
345
+ draft.undoReversalStatus = {
346
+ fetchState: 'Completed',
347
+ error: undefined,
348
+ };
349
+ },
350
+ prepare(payload) {
351
+ return { payload };
352
+ },
346
353
  },
347
354
  undoReversalAccrualsFailure(draft, action) {
348
355
  draft.undoReversalStatus = {
@@ -1,9 +1,16 @@
1
1
  import orderBy from 'lodash/orderBy';
2
- import { toMonthYearPeriodId } from '../../../commonStateTypes/timePeriod';
2
+ import { toMonthYearPeriodId, } from '../../../commonStateTypes/timePeriod';
3
3
  import { getActualMatchingMatchById } from '../../../entity/actualMatching/actualMatchingSelector';
4
4
  import { generateJEOneTimeAccrualKey } from '../../../entity/jeSchedules/jeScheduleHelper';
5
5
  import { getJEOneTimeAccrualByKey, } from '../../../entity/jeSchedules/jeSchedulesSelector';
6
6
  import { getCurrentTenant } from '../../../entity/tenant/tenantSelector';
7
+ export function getSelectedMonthYearForCurrentTenant(state) {
8
+ const tenantId = getCurrentTenant(state)?.tenantId;
9
+ if (tenantId == null) {
10
+ return undefined;
11
+ }
12
+ return state.expenseAutomationViewState.selectedPeriodByTenantId[tenantId];
13
+ }
7
14
  function toMatchModalAccrual(member) {
8
15
  if ('jeOneTimeAccrualKey' in member && member.jeOneTimeAccrualKey != null) {
9
16
  return member;
@@ -164,18 +171,82 @@ function sortActualMatchingRows(rows, uiState) {
164
171
  const lodashOrder = uiState.sortOrder === 'ascending' ? 'asc' : 'desc';
165
172
  return orderBy(rows, [(row) => getActualMatchingSortValue(row, uiState.sortKey)], [lodashOrder]);
166
173
  }
174
+ const ESTIMATED_MINUTES_PER_PENDING_MATCH = 4;
167
175
  function emptyKpiSummary() {
168
176
  return {
169
- autoReversed: { count: 0, amount: 0 },
170
- pendingReview: { count: 0, amount: 0 },
171
- totalThisClose: { count: 0, amount: 0 },
172
- ai: { count: 0 },
173
- manual: { count: 0 },
177
+ actualsReceived: { count: 0, expectedCount: 0, vendorsPending: 0 },
178
+ autoReversed: { count: 0, percent: 0, clearedAmount: 0 },
179
+ pendingReview: { count: 0, amount: 0, estimatedMinutesToClear: 0 },
180
+ variance: { percent: 0, averagePercentPerMatch: 0, netAmount: 0 },
174
181
  };
175
182
  }
176
183
  function sumRowAmounts(rows) {
177
184
  return rows.reduce((sum, row) => sum + getActualMatchingAmount(row), 0);
178
185
  }
186
+ function uniqueVendorCount(rows) {
187
+ const ids = new Set();
188
+ rows.forEach((row) => {
189
+ if (row.vendorId != null && row.vendorId !== '') {
190
+ ids.add(row.vendorId);
191
+ return;
192
+ }
193
+ if (row.vendorName !== '') {
194
+ ids.add(row.vendorName);
195
+ }
196
+ });
197
+ return ids.size;
198
+ }
199
+ function rowVariancePercent(row) {
200
+ const accrued = row.accruedAmount?.amount ?? row.estimatedAmount.amount;
201
+ const actual = row.actualAmount?.amount;
202
+ if (actual == null || accrued === 0) {
203
+ return undefined;
204
+ }
205
+ return ((actual - accrued) / accrued) * 100;
206
+ }
207
+ export function buildActualMatchingKpiSummary(rows) {
208
+ if (rows.length === 0) {
209
+ return emptyKpiSummary();
210
+ }
211
+ const autoReversed = rows.filter((row) => row.kind === 'auto_reversed');
212
+ const pendingReview = rows.filter((row) => row.kind === 'pending_review');
213
+ const receivedCount = rows.length;
214
+ const rowsWithActual = rows.filter((row) => row.actualAmount?.amount != null);
215
+ const accruedTotal = rowsWithActual.reduce((sum, row) => sum + (row.accruedAmount?.amount ?? row.estimatedAmount.amount), 0);
216
+ const actualTotal = rowsWithActual.reduce((sum, row) => sum + (row.actualAmount?.amount ?? 0), 0);
217
+ const variancePercents = rows
218
+ .map(rowVariancePercent)
219
+ .filter((percent) => percent != null);
220
+ return {
221
+ actualsReceived: {
222
+ count: receivedCount,
223
+ // List API does not return still-expected accruals; hide "of N expected"
224
+ // in the strip until expectedCount is greater than received.
225
+ expectedCount: receivedCount,
226
+ vendorsPending: uniqueVendorCount(pendingReview),
227
+ },
228
+ autoReversed: {
229
+ count: autoReversed.length,
230
+ percent: Math.round((autoReversed.length / receivedCount) * 100),
231
+ clearedAmount: sumRowAmounts(autoReversed),
232
+ },
233
+ pendingReview: {
234
+ count: pendingReview.length,
235
+ amount: sumRowAmounts(pendingReview),
236
+ estimatedMinutesToClear: pendingReview.length * ESTIMATED_MINUTES_PER_PENDING_MATCH,
237
+ },
238
+ variance: {
239
+ percent: accruedTotal === 0
240
+ ? 0
241
+ : ((actualTotal - accruedTotal) / accruedTotal) * 100,
242
+ averagePercentPerMatch: variancePercents.length === 0
243
+ ? 0
244
+ : variancePercents.reduce((sum, percent) => sum + percent, 0) /
245
+ variancePercents.length,
246
+ netAmount: actualTotal - accruedTotal,
247
+ },
248
+ };
249
+ }
179
250
  export function getExpenseAutomationActualMatchingMatchView(state, matchId) {
180
251
  const view = state.expenseAutomationActualMatchingViewState;
181
252
  return {
@@ -186,44 +257,20 @@ export function getExpenseAutomationActualMatchingMatchView(state, matchId) {
186
257
  };
187
258
  }
188
259
  export function getExpenseAutomationActualMatchingView(state) {
189
- const { expenseAutomationActualMatchingViewState, expenseAutomationViewState } = state;
260
+ const { expenseAutomationActualMatchingViewState } = state;
190
261
  const { matchIdsByPeriod, fetchState, error, refreshStatus, uiState, matchModal, undoReversalStatus, } = expenseAutomationActualMatchingViewState;
191
- const currentTenant = getCurrentTenant(state);
192
- const selectedPeriod = expenseAutomationViewState.selectedPeriodByTenantId[currentTenant?.tenantId ?? ''];
262
+ const selectedPeriod = getSelectedMonthYearForCurrentTenant(state);
193
263
  const monthYearPeriodId = selectedPeriod != null ? toMonthYearPeriodId(selectedPeriod) : undefined;
194
264
  const matchIds = monthYearPeriodId != null ? matchIdsByPeriod[monthYearPeriodId] : undefined;
195
- const rows = (matchIds ?? [])
265
+ const allRows = (matchIds ?? [])
196
266
  .map((matchId) => getActualMatchingMatchById(state.actualMatchingState, matchId))
197
267
  .filter((match) => match != null)
198
268
  .filter((match) => match.members.length > 0)
199
- .map(toActualMatchingRow)
200
- .filter((row) => matchesSearch(row, uiState.searchString));
269
+ .map(toActualMatchingRow);
270
+ const rows = allRows.filter((row) => matchesSearch(row, uiState.searchString));
201
271
  const reversed = sortActualMatchingRows(rows.filter((row) => isReversedMatchKind(row.kind)), uiState);
202
272
  const pendingReview = sortActualMatchingRows(rows.filter((row) => row.kind === 'pending_review'), uiState);
203
- const autoReversedForKpi = reversed.filter((row) => row.kind === 'auto_reversed');
204
- const listedRows = [...reversed, ...pendingReview];
205
- const kpiSummary = listedRows.length === 0
206
- ? emptyKpiSummary()
207
- : {
208
- autoReversed: {
209
- count: autoReversedForKpi.length,
210
- amount: sumRowAmounts(autoReversedForKpi),
211
- },
212
- pendingReview: {
213
- count: pendingReview.length,
214
- amount: sumRowAmounts(pendingReview),
215
- },
216
- totalThisClose: {
217
- count: listedRows.length,
218
- amount: sumRowAmounts(listedRows),
219
- },
220
- ai: {
221
- count: listedRows.filter((row) => row.origin === 'agent').length,
222
- },
223
- manual: {
224
- count: listedRows.filter((row) => row.origin === 'human').length,
225
- },
226
- };
273
+ const kpiSummary = buildActualMatchingKpiSummary(allRows);
227
274
  const searchedAccruals = matchModal.accrualSearch.results
228
275
  .map((key) => getJEOneTimeAccrualByKey(key, state.jeSchedulesState))
229
276
  .filter((accrual) => accrual != null);
@@ -366,6 +366,7 @@ export function getExpenseAutomationJESchedulesView(state) {
366
366
  // reports undefined rather than 0, so the UI can hide the badge instead of asserting "none".
367
367
  const scheduleCountsByTab = {};
368
368
  ALL_JE_PAGE_TABS.forEach((pageTab) => {
369
+ // AM's badge is `actualMatching.kpiSummary`, not schedule row keys.
369
370
  if (pageTab === 'actual_matching') {
370
371
  return;
371
372
  }
@@ -16,6 +16,9 @@ const JE_SCHEDULE_SORT_KEYS = [
16
16
  'memo',
17
17
  ];
18
18
  export const toJEScheduleSortKey = (v) => stringToUnion(v, JE_SCHEDULE_SORT_KEYS);
19
+ // `actual_matching` is chrome only: the JE tab bar includes it, but AM data is
20
+ // `expenseAutomationActualMatchingViewState`, not the schedules period-tab
21
+ // cache below. Walks of ALL_JE_PAGE_TABS that read schedule keys must skip it.
19
22
  const JE_PAGE_TABS = [
20
23
  'schedules',
21
24
  'actual_matching',
package/lib/index.d.ts CHANGED
@@ -305,7 +305,7 @@ import { updateDashboardLayout } from './view/dashboardLayout/dashboardLayoutRed
305
305
  import uploadAccountStatementIntoDocumentAI from './view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper';
306
306
  import { fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedPeriod, updateCurrentSelectedView } from './view/expenseAutomationView/expenseAutomationViewReducer';
307
307
  import { getExpenseAutomationView } from './view/expenseAutomationView/expenseAutomationViewSelector';
308
- import { ExpenseAutomationViewState, ExpenseAutomationViewType, toExpenseAutomationViewType } from './view/expenseAutomationView/expenseAutomationViewState';
308
+ import { ExpenseAutomationViewState, ExpenseAutomationViewType, toExpenseAutomationViewType, toExpenseAutomationViewTypeStrict } from './view/expenseAutomationView/expenseAutomationViewState';
309
309
  import { computeNewScheduleJeDetails } from './view/expenseAutomationView/helpers/newScheduleLocalDataHelper';
310
310
  import { isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardCreditType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType } from './view/expenseAutomationView/helpers/reconciliationHelpers';
311
311
  import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount } from './view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';
@@ -735,7 +735,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
735
735
  export { ClassesViewSelectorReportV2 };
736
736
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
737
737
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, MonthCloseCheckProgressJson, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
738
- 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, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, TransactionGroup, toTransactionGroup, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationActualMatchingViewSelector, ActualMatchingKpiSummary, ActualMatchingMatchModalView, ActualMatchingRow, ActualMatchingRowKind, ExpenseAutomationActualMatchingSortKey, ExpenseAutomationActualMatchingViewUIState, ActualMatchingTransactionSearchResult, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, JEKpiSummary, ALL_JE_PAGE_TABS, JEPageTab, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, toExpenseAutomationJEScheduleSortKey, toExpenseAutomationActualMatchingSortKey, toJEPageTab, toMatchAndReverseResultStatus, toUndoReversalResultStatus, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, CombinedStatementAccount, StatementAccountScope, StatementDataStatusCodeType, deleteAccountStatement, deleteCombinedStatement, uploadAccountStatement, parseCombinedStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitCombinedStatementUpdate, submitStatementUpdate, clearStatementDateConflict, confirmStatementMapping, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
738
+ 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, DEFAULT_TRANSACTION_GROUP, TRANSACTION_GROUPS, TransactionGroup, toTransactionGroup, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationActualMatchingViewSelector, ActualMatchingKpiSummary, ActualMatchingMatchModalView, ActualMatchingRow, ActualMatchingRowKind, ExpenseAutomationActualMatchingSortKey, ExpenseAutomationActualMatchingViewUIState, ActualMatchingTransactionSearchResult, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, JEKpiSummary, ALL_JE_PAGE_TABS, JEPageTab, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, toExpenseAutomationJEScheduleSortKey, toExpenseAutomationActualMatchingSortKey, toJEPageTab, toMatchAndReverseResultStatus, toUndoReversalResultStatus, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, toExpenseAutomationViewTypeStrict, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, updateTransactionGroup, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, CombinedStatementAccount, StatementAccountScope, StatementDataStatusCodeType, deleteAccountStatement, deleteCombinedStatement, uploadAccountStatement, parseCombinedStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitCombinedStatementUpdate, submitStatementUpdate, clearStatementDateConflict, confirmStatementMapping, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
739
739
  export { JEScheduleLocalData };
740
740
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, ExpenseAutomationJEOneTimeAccrualDetailView, JEScheduleRow, JEScheduledTransactionWithFailedEntries, NewJeDetailLocalData, NewJeScheduleState, NewOneTimeAccrualLocalData, NewAccrualAccountsView, NewScheduleLocalData, NewScheduleLocalDataFixedAssets, NewScheduleSearchTransactionsView, NewScheduleView, SearchTransactionsState, computeNewScheduleJeDetails, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchOneTimeAccrual, getJeNewAccrualAccountsView, ignoreOneTimeAccrual, promoteOneTimeAccrual, revertJeSchedule, revertOneTimeAccrual, getJeNewScheduleSearchTransactionsView, getJeNewScheduleView, };
741
741
  export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateTransactionFilters, updateSelectedCheckboxTransactionIds, markCategoryClassRecommendationsFailureForCategorization, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, clearTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };