@zeniai/client-epic-state 5.1.68-betaDI2 → 5.1.68-betaNB1

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 (54) hide show
  1. package/lib/entity/accountRecon/accountReconReducer.js +4 -0
  2. package/lib/entity/accountRecon/accountReconState.d.ts +4 -1
  3. package/lib/entity/accountRecon/accountReconState.js +1 -0
  4. package/lib/epic.d.ts +2 -1
  5. package/lib/epic.js +2 -1
  6. package/lib/esm/entity/accountRecon/accountReconReducer.js +4 -0
  7. package/lib/esm/entity/accountRecon/accountReconState.js +1 -0
  8. package/lib/esm/epic.js +2 -1
  9. package/lib/esm/index.js +5 -5
  10. package/lib/esm/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +37 -0
  11. package/lib/esm/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +74 -5
  12. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  13. package/lib/esm/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +10 -2
  14. package/lib/esm/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +29 -5
  15. package/lib/esm/view/expenseAutomationView/payload/reconciliationPayload.js +106 -0
  16. package/lib/esm/view/expenseAutomationView/reducers/reconciliationViewReducer.js +86 -13
  17. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +29 -6
  18. package/lib/esm/view/expenseAutomationView/selectors/statementParseViewSelector.js +51 -10
  19. package/lib/esm/view/expenseAutomationView/types/reconciliationViewState.js +15 -1
  20. package/lib/esm/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +12 -9
  21. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewPayload.js +2 -7
  22. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewReducer.js +2 -47
  23. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewSelector.js +0 -9
  24. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewState.js +0 -1
  25. package/lib/index.d.ts +5 -5
  26. package/lib/index.js +54 -47
  27. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.d.ts +21 -0
  28. package/lib/view/expenseAutomationView/epics/accountRecon/confirmStatementMappingEpic.js +41 -0
  29. package/lib/view/expenseAutomationView/epics/accountRecon/updateStatementInfoEpic.js +73 -4
  30. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.d.ts +1 -1
  31. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementDocumentAIHelper.js +12 -4
  32. package/lib/view/expenseAutomationView/epics/accountRecon/uploadAccountStatementEpic.js +9 -1
  33. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.d.ts +2 -0
  34. package/lib/view/expenseAutomationView/helpers/mapStatementUpdateLocalDataToRequestBody.js +30 -4
  35. package/lib/view/expenseAutomationView/payload/reconciliationPayload.d.ts +98 -4
  36. package/lib/view/expenseAutomationView/payload/reconciliationPayload.js +113 -0
  37. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.d.ts +31 -4
  38. package/lib/view/expenseAutomationView/reducers/reconciliationViewReducer.js +87 -14
  39. package/lib/view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes.d.ts +4 -1
  40. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +29 -6
  41. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.d.ts +4 -2
  42. package/lib/view/expenseAutomationView/selectors/statementParseViewSelector.js +53 -10
  43. package/lib/view/expenseAutomationView/types/reconciliationViewState.d.ts +66 -0
  44. package/lib/view/expenseAutomationView/types/reconciliationViewState.js +19 -1
  45. package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.d.ts +8 -2
  46. package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +9 -6
  47. package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.d.ts +0 -1
  48. package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.js +2 -7
  49. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.d.ts +1 -6
  50. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.js +3 -48
  51. package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.js +0 -9
  52. package/lib/view/notificationPreferencesView/notificationPreferencesViewState.d.ts +0 -1
  53. package/lib/view/notificationPreferencesView/notificationPreferencesViewState.js +0 -1
  54. package/package.json +1 -1
@@ -429,7 +429,7 @@ const expenseAutomationReconciliationView = createSlice({
429
429
  }
430
430
  },
431
431
  uploadAccountStatement: (draft, action) => {
432
- const { accountId, selectedPeriod } = action.payload;
432
+ const { accountId, selectedPeriod, statementAccountScope } = action.payload;
433
433
  const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
434
434
  if (accountRecon != null) {
435
435
  accountRecon.statementUploadStatus = {
@@ -454,6 +454,12 @@ const expenseAutomationReconciliationView = createSlice({
454
454
  fetchState: 'Not-Started',
455
455
  error: undefined,
456
456
  };
457
+ if (statementAccountScope != null) {
458
+ accountRecon.localData = {
459
+ ...accountRecon.localData,
460
+ statementAccountScope,
461
+ };
462
+ }
457
463
  }
458
464
  },
459
465
  uploadAccountStatementSuccess: (draft, action) => {
@@ -518,6 +524,7 @@ const expenseAutomationReconciliationView = createSlice({
518
524
  };
519
525
  if (accountRecon.localData != null) {
520
526
  accountRecon.localData.statementUpdateLocalData = undefined;
527
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
521
528
  }
522
529
  }
523
530
  },
@@ -598,6 +605,7 @@ const expenseAutomationReconciliationView = createSlice({
598
605
  accountRecon.statementParseInProgress = true;
599
606
  if (accountRecon.localData != null) {
600
607
  accountRecon.localData.statementUpdateLocalData = undefined;
608
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
601
609
  }
602
610
  }
603
611
  },
@@ -642,20 +650,29 @@ const expenseAutomationReconciliationView = createSlice({
642
650
  draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)].reconciliationByAccountID[accountId].parsedStatementData =
643
651
  parsedStatementData;
644
652
  },
645
- updateStatementUpdateLocalData: (draft, action) => {
646
- const { accountId, selectedPeriod, statementUpdateLocalData } = action.payload;
647
- const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
648
- if (accountRecon != null) {
653
+ updateStatementUpdateLocalData: {
654
+ prepare(payload) {
655
+ return { payload };
656
+ },
657
+ reducer(draft, action) {
658
+ const { accountId, selectedPeriod, statementUpdateLocalData, statementUploadId, } = action.payload;
659
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
660
+ if (accountRecon == null) {
661
+ return;
662
+ }
649
663
  if (accountRecon.localData == null) {
650
- accountRecon.localData = {
651
- statementUpdateLocalData,
652
- };
664
+ accountRecon.localData = {};
653
665
  }
654
- else {
655
- accountRecon.localData.statementUpdateLocalData =
656
- statementUpdateLocalData;
666
+ if (statementUploadId != null && statementUploadId !== '') {
667
+ accountRecon.localData.statementUpdateLocalDataByUploadId = {
668
+ ...accountRecon.localData.statementUpdateLocalDataByUploadId,
669
+ [statementUploadId]: statementUpdateLocalData,
670
+ };
671
+ return;
657
672
  }
658
- }
673
+ accountRecon.localData.statementUpdateLocalData =
674
+ statementUpdateLocalData;
675
+ },
659
676
  },
660
677
  submitStatementUpdate: (draft, action) => {
661
678
  const { accountId, selectedPeriod } = action.payload;
@@ -684,6 +701,7 @@ const expenseAutomationReconciliationView = createSlice({
684
701
  accountRecon.statementProcessingTotalDurationSeconds = undefined;
685
702
  if (accountRecon.localData != null) {
686
703
  accountRecon.localData.statementUpdateLocalData = undefined;
704
+ accountRecon.localData.statementUpdateLocalDataByUploadId = undefined;
687
705
  }
688
706
  }
689
707
  },
@@ -705,6 +723,52 @@ const expenseAutomationReconciliationView = createSlice({
705
723
  accountRecon.statementDateConflict = null;
706
724
  }
707
725
  },
726
+ confirmStatementMapping: (draft, action) => {
727
+ const { accountId, selectedPeriod } = action.payload;
728
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
729
+ if (accountRecon != null) {
730
+ accountRecon.confirmStatementMappingStatus = {
731
+ fetchState: 'In-Progress',
732
+ error: undefined,
733
+ };
734
+ accountRecon.confirmStatementMappingConflict = null;
735
+ }
736
+ },
737
+ confirmStatementMappingSuccess: (draft, action) => {
738
+ const { accountId, selectedPeriod, statementUploads } = action.payload;
739
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
740
+ if (accountRecon != null) {
741
+ accountRecon.confirmStatementMappingStatus = {
742
+ fetchState: 'Completed',
743
+ error: undefined,
744
+ };
745
+ accountRecon.confirmStatementMappingConflict = null;
746
+ accountRecon.confirmedCombinedStatementUploads = statementUploads;
747
+ const combinedStatementDetails = accountRecon.parsedStatementData?.statementUpload
748
+ .combinedStatementDetails;
749
+ if (combinedStatementDetails != null) {
750
+ combinedStatementDetails.isMappingConfirmed = true;
751
+ }
752
+ }
753
+ },
754
+ confirmStatementMappingFailure: (draft, action) => {
755
+ const { accountId, selectedPeriod, mappingConflict } = action.payload;
756
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
757
+ if (accountRecon != null) {
758
+ accountRecon.confirmStatementMappingStatus = {
759
+ fetchState: 'Error',
760
+ error: action.payload.error,
761
+ };
762
+ accountRecon.confirmStatementMappingConflict = mappingConflict ?? null;
763
+ }
764
+ },
765
+ clearConfirmStatementMappingConflict: (draft, action) => {
766
+ const { accountId, selectedPeriod } = action.payload;
767
+ const accountRecon = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)]?.reconciliationByAccountID[accountId];
768
+ if (accountRecon != null) {
769
+ accountRecon.confirmStatementMappingConflict = null;
770
+ }
771
+ },
708
772
  updateAccountReconciliationLocalData: (draft, action) => {
709
773
  const { accountId, selectedPeriod, localData } = action.payload;
710
774
  const oldLocalData = draft.accountReconciliationRecordsBySelectedPeriod[toMonthYearPeriodId(selectedPeriod)].reconciliationByAccountID[accountId].localData;
@@ -810,7 +874,7 @@ const expenseAutomationReconciliationView = createSlice({
810
874
  },
811
875
  });
812
876
  // Export actions
813
- export const { fetchReconciliation, fetchReconciliationFailure, fetchReconciliationSuccess, saveReconciliationDetail, saveReconciliationDetailFailure, updateSelectedAccountId, setConnectionInProgressForAccount, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, updateReconcileTabLocalData, updateReconcileTabListSortState, updateReconcileTabListScrollState, saveReconciliationDetailSuccess, updateSelectedTab, updateBalancesLocalData, initialiseLocalDataForSelectedAccountId, clearExpenseAutomationReconciliationView, updateSelectedDrawerAccountId, updateStatementProcessingFailed, updateReviewTabSortState, initializeReconciliationReviewTabLocalData, updateReviewTabLocalData, saveReconciliationReview, updateSaveReconciliationReviewFetchStatus, updateReconListScrollPosition, updateAccountReconciliationLocalData, deleteAccountStatement, deleteAccountStatementSuccess, deleteAccountStatementFailure, excludeAccountFromReconciliation, excludeAccountFromReconciliationSuccess, excludeAccountFromReconciliationFailure, includeAccountInReconciliation, includeAccountInReconciliationSuccess, includeAccountInReconciliationFailure, uploadAccountStatement, uploadAccountStatementSuccess, uploadAccountStatementFailure, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateStatementUpdateLocalData, submitStatementUpdate, submitStatementUpdateSuccess, submitStatementUpdateFailure, clearStatementDateConflict, updateStatementUploadChosen, updateNodeCollapseState, } = expenseAutomationReconciliationView.actions;
877
+ export const { fetchReconciliation, fetchReconciliationFailure, fetchReconciliationSuccess, saveReconciliationDetail, saveReconciliationDetailFailure, updateSelectedAccountId, setConnectionInProgressForAccount, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, updateReconcileTabLocalData, updateReconcileTabListSortState, updateReconcileTabListScrollState, saveReconciliationDetailSuccess, updateSelectedTab, updateBalancesLocalData, initialiseLocalDataForSelectedAccountId, clearExpenseAutomationReconciliationView, updateSelectedDrawerAccountId, updateStatementProcessingFailed, updateReviewTabSortState, initializeReconciliationReviewTabLocalData, updateReviewTabLocalData, saveReconciliationReview, updateSaveReconciliationReviewFetchStatus, updateReconListScrollPosition, updateAccountReconciliationLocalData, deleteAccountStatement, deleteAccountStatementSuccess, deleteAccountStatementFailure, excludeAccountFromReconciliation, excludeAccountFromReconciliationSuccess, excludeAccountFromReconciliationFailure, includeAccountInReconciliation, includeAccountInReconciliationSuccess, includeAccountInReconciliationFailure, uploadAccountStatement, uploadAccountStatementSuccess, uploadAccountStatementFailure, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateStatementUpdateLocalData, submitStatementUpdate, submitStatementUpdateSuccess, submitStatementUpdateFailure, clearStatementDateConflict, confirmStatementMapping, confirmStatementMappingSuccess, confirmStatementMappingFailure, clearConfirmStatementMappingConflict, updateStatementUploadChosen, updateNodeCollapseState, } = expenseAutomationReconciliationView.actions;
814
878
  // Export reducer
815
879
  export default expenseAutomationReconciliationView.reducer;
816
880
  function isEntityStatementParsing(reconciliation) {
@@ -824,6 +888,7 @@ function isEntityStatementParseTerminal(reconciliation) {
824
888
  statusCode === 'parsing_failed' ||
825
889
  statusCode === 'validation_failed' ||
826
890
  statusCode === 'processing_failed' ||
891
+ statusCode === 'parsed_awaiting_mapping' ||
827
892
  statusCode === 'deleting' ||
828
893
  statusCode === 'deleted');
829
894
  }
@@ -959,6 +1024,12 @@ function updateAllReconciliation(draft, accounts, selectedPeriod, reconciliation
959
1024
  error: undefined,
960
1025
  },
961
1026
  statementDateConflict: oldRecord?.statementDateConflict ?? null,
1027
+ confirmStatementMappingStatus: oldRecord?.confirmStatementMappingStatus ?? {
1028
+ fetchState: 'Not-Started',
1029
+ error: undefined,
1030
+ },
1031
+ confirmStatementMappingConflict: oldRecord?.confirmStatementMappingConflict ?? null,
1032
+ confirmedCombinedStatementUploads: oldRecord?.confirmedCombinedStatementUploads,
962
1033
  localData: {
963
1034
  ...oldRecord?.localData,
964
1035
  accountSource: account?.reconciliation_source != null
@@ -1057,6 +1128,8 @@ const updateReconciliationByAccountIDOnIncludeAccount = (draft, accountId, recon
1057
1128
  statementParseStatus: { fetchState: 'Not-Started', error: undefined },
1058
1129
  reparseStatementStatus: { fetchState: 'Not-Started', error: undefined },
1059
1130
  statementDateConflict: null,
1131
+ confirmStatementMappingStatus: { fetchState: 'Not-Started', error: undefined },
1132
+ confirmStatementMappingConflict: null,
1060
1133
  localData: {},
1061
1134
  accountDetectionReason: undefined,
1062
1135
  };
@@ -246,7 +246,28 @@ export const getExpenseAutomationReconciliationView = createSelector((state) =>
246
246
  const accountReconState = accountReconForMonthYearPeriod.reconciliationByAccountID[accountID];
247
247
  const rawParsedStatementData = accountReconState.parsedStatementData;
248
248
  const statementUpdateLocalData = accountReconState.localData?.statementUpdateLocalData;
249
- const parsedStatementDataForView = getParsedStatementDataForView(rawParsedStatementData, statementUpdateLocalData);
249
+ const statementUpdateLocalDataByUploadId = accountReconState.localData?.statementUpdateLocalDataByUploadId;
250
+ const parsedStatementDataForView = getParsedStatementDataForView(rawParsedStatementData, statementUpdateLocalData, statementUpdateLocalDataByUploadId);
251
+ const rawStatementUploads = rawParsedStatementData?.statementUploads != null &&
252
+ rawParsedStatementData.statementUploads.length > 0
253
+ ? rawParsedStatementData.statementUploads
254
+ : rawParsedStatementData?.statementUpload != null
255
+ ? [rawParsedStatementData.statementUpload]
256
+ : [];
257
+ const allCitationTransactions = rawStatementUploads.flatMap((statementUpload) => statementUpload.statementTransactions);
258
+ const statementTransactionPeriodById = rawStatementUploads.length > 0
259
+ ? Object.assign({}, ...rawStatementUploads.map((statementUpload) => {
260
+ const uploadId = statementUpload.statementMeta.statementUploadId;
261
+ const localMeta = statementUpdateLocalDataByUploadId?.[uploadId]
262
+ ?.statementMeta ??
263
+ (uploadId ===
264
+ rawParsedStatementData?.statementUpload.statementMeta
265
+ .statementUploadId
266
+ ? statementUpdateLocalData?.statementMeta
267
+ : undefined);
268
+ return getStatementTransactionPeriodById(statementUpload.statementTransactions, statementUpload.statementMeta, localMeta);
269
+ }))
270
+ : undefined;
250
271
  reconList[accountID] = {
251
272
  accountConnectionStatus: accountConnectionStatus.status,
252
273
  paymentAccountId: accountConnectionStatus.paymentAccountId,
@@ -257,6 +278,9 @@ export const getExpenseAutomationReconciliationView = createSelector((state) =>
257
278
  statementParseStatus: accountReconState.statementParseStatus,
258
279
  reparseStatementStatus: accountReconState.reparseStatementStatus,
259
280
  statementDateConflict: accountReconState.statementDateConflict,
281
+ confirmStatementMappingStatus: accountReconState.confirmStatementMappingStatus,
282
+ confirmStatementMappingConflict: accountReconState.confirmStatementMappingConflict,
283
+ confirmedCombinedStatementUploads: accountReconState.confirmedCombinedStatementUploads,
260
284
  statementUpdateStatus: accountReconState.statementUpdateStatus,
261
285
  statementUploadStatus: accountReconState.statementUploadStatus,
262
286
  localData: accountReconState.localData,
@@ -267,11 +291,8 @@ export const getExpenseAutomationReconciliationView = createSelector((state) =>
267
291
  statementProcessingTotalDurationSeconds: accountReconState.statementProcessingTotalDurationSeconds,
268
292
  statementProcessingFailed: accountReconState.statementProcessingFailed,
269
293
  parsedStatementData: parsedStatementDataForView,
270
- allCitationTransactions: rawParsedStatementData?.statementUpload?.statementTransactions,
271
- statementTransactionPeriodById: rawParsedStatementData?.statementUpload != null
272
- ? getStatementTransactionPeriodById(rawParsedStatementData.statementUpload.statementTransactions, rawParsedStatementData.statementUpload.statementMeta, accountReconState.localData?.statementUpdateLocalData
273
- ?.statementMeta)
274
- : undefined,
294
+ allCitationTransactions,
295
+ statementTransactionPeriodById,
275
296
  transactionFetchState: reduceAnyFetchState([
276
297
  accountReconState.transactionFetchState,
277
298
  accountListState.byReportId.accountList,
@@ -341,6 +362,8 @@ export const getExpenseAutomationReconciliationView = createSelector((state) =>
341
362
  statementParseStatus: { fetchState: 'Not-Started' },
342
363
  reparseStatementStatus: { fetchState: 'Not-Started' },
343
364
  statementDateConflict: null,
365
+ confirmStatementMappingStatus: { fetchState: 'Not-Started' },
366
+ confirmStatementMappingConflict: null,
344
367
  localData: {},
345
368
  connectionInProgress: false,
346
369
  statementParseInProgress: false,
@@ -1,4 +1,21 @@
1
1
  import { date } from '../../../zeniDayJS';
2
+ export function getStatementUploadsFromParsedData(parsedStatementData) {
3
+ if (parsedStatementData == null) {
4
+ return [];
5
+ }
6
+ if (parsedStatementData.statementUploads != null &&
7
+ parsedStatementData.statementUploads.length > 0) {
8
+ return parsedStatementData.statementUploads;
9
+ }
10
+ if (parsedStatementData.statementUpload != null) {
11
+ return [parsedStatementData.statementUpload];
12
+ }
13
+ return [];
14
+ }
15
+ export function isCombinedParsedStatementData(parsedStatementData) {
16
+ return (parsedStatementData?.statementUploads != null &&
17
+ parsedStatementData.statementUploads.length > 1);
18
+ }
2
19
  export const getEffectiveStatementPeriod = (parsedMeta, localMeta) => ({
3
20
  statementStartDate: localMeta?.statementStartDate != null && localMeta.statementStartDate !== ''
4
21
  ? localMeta.statementStartDate
@@ -25,24 +42,48 @@ export const filterStatementTransactionsByPeriod = (transactions, statementPerio
25
42
  }
26
43
  return transactions.filter((transaction) => isStatementTransactionInPeriod(transaction.transactionDate, statementStartDate, statementEndDate));
27
44
  };
28
- export const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalData) => {
45
+ const getStatementUploadForView = (statementUpload, statementUpdateLocalData) => {
46
+ const parsedMeta = statementUpload.statementMeta;
47
+ const localMeta = statementUpdateLocalData?.statementMeta;
48
+ const effectiveMeta = localMeta ?? parsedMeta;
49
+ const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
50
+ return {
51
+ ...statementUpload,
52
+ statementMeta: effectiveMeta,
53
+ statementTransactions: filterStatementTransactionsByPeriod(statementUpload.statementTransactions, statementPeriod),
54
+ };
55
+ };
56
+ export const getParsedStatementDataForView = (parsedStatementData, statementUpdateLocalData, statementUpdateLocalDataByUploadId) => {
29
57
  if (parsedStatementData == null) {
30
58
  return undefined;
31
59
  }
60
+ const statementUploads = getStatementUploadsFromParsedData(parsedStatementData);
61
+ if (statementUploads.length === 0) {
62
+ return undefined;
63
+ }
64
+ if (isCombinedParsedStatementData(parsedStatementData) === true) {
65
+ const viewedUploads = statementUploads.map((statementUpload) => {
66
+ const uploadId = statementUpload.statementMeta.statementUploadId;
67
+ const localDataForUpload = statementUpdateLocalDataByUploadId?.[uploadId] ??
68
+ (uploadId ===
69
+ parsedStatementData.statementUpload.statementMeta.statementUploadId
70
+ ? statementUpdateLocalData
71
+ : undefined);
72
+ return getStatementUploadForView(statementUpload, localDataForUpload);
73
+ });
74
+ const anchorUploadId = parsedStatementData.statementUpload.statementMeta.statementUploadId;
75
+ const viewedAnchor = viewedUploads.find((upload) => upload.statementMeta.statementUploadId === anchorUploadId) ?? viewedUploads[0];
76
+ return {
77
+ statementUpload: viewedAnchor,
78
+ statementUploads: viewedUploads,
79
+ };
80
+ }
32
81
  const statementUpload = parsedStatementData.statementUpload;
33
82
  if (statementUpload == null) {
34
83
  return undefined;
35
84
  }
36
- const parsedMeta = statementUpload.statementMeta;
37
- const localMeta = statementUpdateLocalData?.statementMeta;
38
- const effectiveMeta = localMeta ?? parsedMeta;
39
- const statementPeriod = getEffectiveStatementPeriod(parsedMeta, localMeta);
40
85
  return {
41
- statementUpload: {
42
- ...statementUpload,
43
- statementMeta: effectiveMeta,
44
- statementTransactions: filterStatementTransactionsByPeriod(statementUpload.statementTransactions, statementPeriod),
45
- },
86
+ statementUpload: getStatementUploadForView(statementUpload, statementUpdateLocalData),
46
87
  };
47
88
  };
48
89
  export const getStatementTransactionPeriodById = (allParsedTransactions, parsedMeta, localMeta) => {
@@ -1,4 +1,11 @@
1
- import { stringToUnion } from '../../../commonStateTypes/stringToUnion';
1
+ import { stringToUnion, stringToUnionStrict, } from '../../../commonStateTypes/stringToUnion';
2
+ const ALL_STATEMENT_BALANCE_SOURCES = [
3
+ 'ocr',
4
+ 'prior_recon',
5
+ 'default_zero',
6
+ ];
7
+ export const toStatementBalanceSource = (v) => stringToUnion(v, ALL_STATEMENT_BALANCE_SOURCES);
8
+ export const toStatementBalanceSourceStrict = (v) => stringToUnionStrict(v ?? '', ALL_STATEMENT_BALANCE_SOURCES);
2
9
  export function toReconciliationViewSummary(payload) {
3
10
  return {
4
11
  accounts: {
@@ -59,3 +66,10 @@ const RECON_REVIEW_SORT_KEYS = [
59
66
  ];
60
67
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
61
68
  const toReconReviewSortKey = (v) => stringToUnion(v, RECON_REVIEW_SORT_KEYS);
69
+ const ALL_STATEMENT_ACCOUNT_SCOPES = [
70
+ 'single_account',
71
+ 'multi_account',
72
+ ];
73
+ export const toStatementAccountScope = (v) => stringToUnion(v, ALL_STATEMENT_ACCOUNT_SCOPES);
74
+ export const toStatementAccountScopeStrict = (v) => stringToUnionStrict(v ?? '', ALL_STATEMENT_ACCOUNT_SCOPES);
75
+ export const STATEMENT_ACCOUNT_SCOPES = ALL_STATEMENT_ACCOUNT_SCOPES;
@@ -1,12 +1,17 @@
1
- import { EMPTY, of } from 'rxjs';
2
- import { catchError, filter, finalize, mergeMap, switchMap, takeUntil, withLatestFrom, } from 'rxjs/operators';
1
+ import { EMPTY, concat, of } from 'rxjs';
2
+ import { catchError, debounceTime, filter, finalize, mergeMap, switchMap, takeUntil, withLatestFrom, } from 'rxjs/operators';
3
3
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
5
5
  import { notificationPreferencesUrl } from '../notificationPreferencesEndpoint';
6
6
  import { mapPreferencesToPayload, } from '../notificationPreferencesViewPayload';
7
- import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, } from '../notificationPreferencesViewReducer';
7
+ import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupFrequency, toggleEventChannel, } from '../notificationPreferencesViewReducer';
8
8
  import { getNotificationLocalOverrides } from '../notificationPreferencesViewSelector';
9
- export const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter((action) => saveNotificationPreferences.match(action)), withLatestFrom(state$),
9
+ const DEBOUNCE_MS = 300;
10
+ export const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter((action) => toggleEventChannel.match(action) || setGroupFrequency.match(action)),
11
+ // Coalesce bursts of toggles into a single PUT. Trade-off: rapid clickers
12
+ // defer saves until they pause. Consider a max-wait wrapper if this
13
+ // becomes a UX problem.
14
+ debounceTime(DEBOUNCE_MS), withLatestFrom(state$),
10
15
  // `switchMap` unsubscribes from any in-flight PUT observable when a new
11
16
  // debounced batch fires. The prior HTTP request has already left the
12
17
  // client — the network call is NOT cancelled — but its response is
@@ -105,9 +110,7 @@ switchMap(([, state]) => {
105
110
  // under patch-semantic LWW. Cursor Bugbot 3637969823 + 3641372002.
106
111
  takeUntil(actions$.pipe(filter((action) => clearNotificationPreferencesLocalOverrides.match(action) ||
107
112
  clearAllNotificationPreferencesView.match(action)))));
108
- // `saveNotificationPreferences` (the trigger) already flipped
109
- // savePreferencesState to In-Progress via its reducer case, so the PUT
110
- // observable is returned directly — re-emitting the trigger here would
111
- // loop the epic on itself.
112
- return request$;
113
+ // Flip savePreferencesState to In-Progress BEFORE the network call so
114
+ // any "saving…" UI can render.
115
+ return concat(of(saveNotificationPreferences()), request$);
113
116
  }));
@@ -1,5 +1,5 @@
1
1
  import { toNotificationChannel, toNotificationFrequency, } from '../../entity/notificationRegistry/notificationRegistryState';
2
- const mapChannelEnabledMap = (raw) => {
2
+ const mapEventEnabledByChannel = (raw) => {
3
3
  if (raw == null) {
4
4
  return {};
5
5
  }
@@ -20,8 +20,7 @@ export const mapPayloadToPreferences = (payload) => {
20
20
  toNotificationFrequency(frequency),
21
21
  ]));
22
22
  return {
23
- eventEnabledByChannel: mapChannelEnabledMap(payload?.event_enabled_by_channel),
24
- groupChannelEnabledByGroupId: mapChannelEnabledMap(payload?.group_channel_enabled_by_group_id),
23
+ eventEnabledByChannel: mapEventEnabledByChannel(payload?.event_enabled_by_channel),
25
24
  groupFrequencyByGroupId,
26
25
  };
27
26
  };
@@ -30,10 +29,6 @@ export const mapPreferencesToPayload = (preferences) => {
30
29
  if (Object.keys(preferences.eventEnabledByChannel).length > 0) {
31
30
  payload.event_enabled_by_channel = preferences.eventEnabledByChannel;
32
31
  }
33
- if (Object.keys(preferences.groupChannelEnabledByGroupId).length > 0) {
34
- payload.group_channel_enabled_by_group_id =
35
- preferences.groupChannelEnabledByGroupId;
36
- }
37
32
  if (Object.keys(preferences.groupFrequencyByGroupId).length > 0) {
38
33
  payload.group_frequency_by_group_id = preferences.groupFrequencyByGroupId;
39
34
  }
@@ -18,18 +18,8 @@ const mergePreferences = (base, patch) => {
18
18
  ...channels,
19
19
  };
20
20
  });
21
- const groupChannelEnabledByGroupId = {
22
- ...base.groupChannelEnabledByGroupId,
23
- };
24
- Object.entries(patch.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
25
- groupChannelEnabledByGroupId[groupId] = {
26
- ...(base.groupChannelEnabledByGroupId[groupId] ?? {}),
27
- ...channels,
28
- };
29
- });
30
21
  return {
31
22
  eventEnabledByChannel,
32
- groupChannelEnabledByGroupId,
33
23
  groupFrequencyByGroupId: {
34
24
  ...base.groupFrequencyByGroupId,
35
25
  ...patch.groupFrequencyByGroupId,
@@ -71,38 +61,13 @@ const subtractSavedOverrides = (current, saved) => {
71
61
  eventEnabledByChannel[eventId] = remainingChannels;
72
62
  }
73
63
  });
74
- // Same value-equality subtraction as eventEnabledByChannel above — a
75
- // group-channel master the user re-flipped while a PUT was in flight must
76
- // survive so the next debounce cycle re-sends it.
77
- const groupChannelEnabledByGroupId = {};
78
- Object.entries(current.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
79
- const savedChannels = saved.groupChannelEnabledByGroupId[groupId];
80
- if (savedChannels == null) {
81
- groupChannelEnabledByGroupId[groupId] = channels;
82
- return;
83
- }
84
- const remainingChannels = {};
85
- Object.keys(channels).forEach((channel) => {
86
- if (!(channel in savedChannels) ||
87
- channels[channel] !== savedChannels[channel]) {
88
- remainingChannels[channel] = channels[channel];
89
- }
90
- });
91
- if (Object.keys(remainingChannels).length > 0) {
92
- groupChannelEnabledByGroupId[groupId] = remainingChannels;
93
- }
94
- });
95
64
  const groupFrequencyByGroupId = {};
96
65
  Object.entries(current.groupFrequencyByGroupId).forEach(([groupId, frequency]) => {
97
66
  if (saved.groupFrequencyByGroupId[groupId] !== frequency) {
98
67
  groupFrequencyByGroupId[groupId] = frequency;
99
68
  }
100
69
  });
101
- return {
102
- eventEnabledByChannel,
103
- groupChannelEnabledByGroupId,
104
- groupFrequencyByGroupId,
105
- };
70
+ return { eventEnabledByChannel, groupFrequencyByGroupId };
106
71
  };
107
72
  const notificationPreferencesView = createSlice({
108
73
  name: 'notificationPreferencesView',
@@ -239,16 +204,6 @@ const notificationPreferencesView = createSlice({
239
204
  draft.preferences = mergePreferences(draft.preferences, patch);
240
205
  draft.localOverrides = subtractSavedOverrides(draft.localOverrides, action.payload.savedOverrides);
241
206
  },
242
- setGroupChannelMaster(draft, action) {
243
- // Mirror of `toggleEventChannel` but scoped to the group-channel master
244
- // held under `groupChannelEnabledByGroupId[groupId][channel]`.
245
- const { channel, enabled, groupId } = action.payload;
246
- const groupMap = {
247
- ...(draft.localOverrides.groupChannelEnabledByGroupId[groupId] ?? {}),
248
- };
249
- groupMap[channel] = enabled;
250
- draft.localOverrides.groupChannelEnabledByGroupId[groupId] = groupMap;
251
- },
252
207
  setGroupFrequency(draft, action) {
253
208
  draft.localOverrides.groupFrequencyByGroupId[action.payload.groupId] =
254
209
  action.payload.frequency;
@@ -263,5 +218,5 @@ const notificationPreferencesView = createSlice({
263
218
  },
264
219
  },
265
220
  });
266
- export const { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, fetchNotificationPreferencesSuccess, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, } = notificationPreferencesView.actions;
221
+ export const { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, fetchNotificationPreferencesSuccess, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupFrequency, toggleEventChannel, } = notificationPreferencesView.actions;
267
222
  export default notificationPreferencesView.reducer;
@@ -9,16 +9,8 @@ export const getEffectiveNotificationPreferences = (state) => {
9
9
  ...channels,
10
10
  };
11
11
  });
12
- const mergedGroupChannelEnabledByGroupId = { ...view.preferences.groupChannelEnabledByGroupId };
13
- Object.entries(view.localOverrides.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
14
- mergedGroupChannelEnabledByGroupId[groupId] = {
15
- ...(view.preferences.groupChannelEnabledByGroupId[groupId] ?? {}),
16
- ...channels,
17
- };
18
- });
19
12
  return {
20
13
  eventEnabledByChannel: mergedEventEnabledByChannel,
21
- groupChannelEnabledByGroupId: mergedGroupChannelEnabledByGroupId,
22
14
  groupFrequencyByGroupId: {
23
15
  ...view.preferences.groupFrequencyByGroupId,
24
16
  ...view.localOverrides.groupFrequencyByGroupId,
@@ -29,6 +21,5 @@ export const getNotificationLocalOverrides = (state) => getView(state).localOver
29
21
  export const hasUnsavedNotificationPreferences = (state) => {
30
22
  const overrides = getView(state).localOverrides;
31
23
  return (Object.keys(overrides.eventEnabledByChannel).length > 0 ||
32
- Object.keys(overrides.groupChannelEnabledByGroupId).length > 0 ||
33
24
  Object.keys(overrides.groupFrequencyByGroupId).length > 0);
34
25
  };
@@ -1,5 +1,4 @@
1
1
  export const emptyNotificationPreferences = () => ({
2
2
  eventEnabledByChannel: {},
3
- groupChannelEnabledByGroupId: {},
4
3
  groupFrequencyByGroupId: {},
5
4
  });
package/lib/index.d.ts CHANGED
@@ -281,7 +281,7 @@ import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } f
281
281
  import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
282
282
  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';
283
283
  import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearBulkUploadBatchDetailsForScopeChange, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markBatchDetailRefreshAttempted, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, refreshBatchDetailsForBatchId, 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';
284
- import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
284
+ import { clearConfirmStatementMappingConflict, clearStatementDateConflict, confirmStatementMapping, confirmStatementMappingFailure, confirmStatementMappingSuccess, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitStatementUpdate, 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, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
285
285
  import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markCategoryClassRecommendationsFailureForCategorization, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, updateTransactionFilters, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
286
286
  import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
287
287
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
@@ -301,7 +301,7 @@ import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey,
301
301
  import { AccountSettingsLocalData, JEScheduleMainTab as ExpenseAutomationJEScheduleMainTab, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEScheduleLocalData, toJEScheduleMainTab as toExpenseAutomationJEScheduleMainTab, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey } from './view/expenseAutomationView/types/jeSchedulesViewState';
302
302
  import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
303
303
  import { MissingReceiptsSortKey as ExpenseAutomationMissingReceiptsSortKey, MissingReceiptsViewState as ExpenseAutomationMissingReceiptsViewState, MissingReceiptsViewUIState as ExpenseAutomationMissingReceiptsViewUIState, toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey } from './view/expenseAutomationView/types/missingReceiptsViewState';
304
- import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
304
+ import { AccountReconciliationLocalData, CombinedStatementAccount, CombinedStatementAccountSuggestion, CombinedStatementDetails, ConfirmStatementMappingConflict, ConfirmedCombinedStatementUpload, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, STATEMENT_ACCOUNT_SCOPES, StatementAccountScope, StatementBalanceSource, StatementDateConflict, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType, toStatementAccountScope, toStatementAccountScopeStrict, toStatementBalanceSource, toStatementBalanceSourceStrict } from './view/expenseAutomationView/types/reconciliationViewState';
305
305
  import { TransactionsTab as ExpenseAutomationTransactionsTab, TransactionsViewState as ExpenseAutomationTransactionsViewState, TransactionsViewUIState as ExpenseAutomationTransactionsViewUIState, SupportedTransactionCategorization, TransactionCategorizationLineItemData, TransactionReviewLocalData, TransactionsSortKey, TransactionsTab, toTransactionsTabKey as toExpenseAutomationTransactionsTabKey, toTransactionsSortKey } from './view/expenseAutomationView/types/transactionsViewState';
306
306
  import { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature } from './view/featureNotificationView/featureNotificationViewReducer';
307
307
  import { getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered } from './view/featureNotificationView/featureNotificationViewSelector';
@@ -337,7 +337,7 @@ import { fetchNetBurnOrIncomeStoryCard, updateNetBurnOrIncomeStoryCardSettings }
337
337
  import { getNetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelector';
338
338
  import { AccountingMethod, NetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelectorTypes';
339
339
  import { AverageMonthsCount, NetBurnOrIncomeRunway, NetBurnOrIncomeStoryCardState, TimeSpanIdForAverage } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardState';
340
- import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
340
+ import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
341
341
  import { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
342
342
  import { NotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewState';
343
343
  import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState } from './view/notificationView/notificationViewReducer';
@@ -679,7 +679,7 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
679
679
  export { ClassesViewSelectorReportV2 };
680
680
  export { BalancesTimeseries, TrendTimeseries, BalanceKind };
681
681
  export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, MonthCloseCheckProgressJson, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
682
- export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, 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, getReparseStatementStatusByAccountId, 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, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
682
+ export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleMainTab, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, toExpenseAutomationJEScheduleMainTab, toExpenseAutomationJEScheduleSortKey, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, 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, getReparseStatementStatusByAccountId, 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, CombinedStatementAccountSuggestion, CombinedStatementDetails, ConfirmStatementMappingConflict, ConfirmedCombinedStatementUpload, STATEMENT_ACCOUNT_SCOPES, StatementAccountScope, StatementBalanceSource, toStatementAccountScope, toStatementAccountScopeStrict, toStatementBalanceSource, toStatementBalanceSourceStrict, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, confirmStatementMapping, confirmStatementMappingSuccess, confirmStatementMappingFailure, clearConfirmStatementMappingConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
683
683
  export { JEScheduleLocalData };
684
684
  export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
685
685
  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, };
@@ -908,7 +908,7 @@ export { ExternalNotificationData, NotificationGroup, NotificationActivityType,
908
908
  export { NotificationView, NotificationViewUIState, NotificationTabState, NotificationTabType, NotificationSubTabType, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
909
909
  export { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, FeatureInterest, FeatureNotificationViewState, };
910
910
  export { pushToastNotification, ToastNotification, ToastNotificationPayload, getLastNotificationTime, getNotifications, };
911
- export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
911
+ export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
912
912
  export { getReferralListView, getInviteFormView, ReferralListSelectorView, ReferralViewState, InviteCompanyLocalData, ReferralInvitation, ReferralListViewSortKey, ReferralViewUIState, toReferralListViewSortKeyType, ReferralStatus, ReferralAmountStatus, StatusTypes, AmountStatusTypes, DEFAULT_REFERRER_AMOUNT, fetchReferrals, sendReferralInvite, clearReferrals, saveReferralFormDataInLocalStore, updateReferralListSortUiState, resendReferralInvite, fetchRewardsPlan, RewardsPlanCardReport, getRewardsPlanCard, updateReferViewed, RewardsPlanData, };
913
913
  export { ALL_WEEK_DAYS, DayOfWeek, RecurringDatePickerOptions, RecurringFrequencyType, SEMI_WEEKLY_REQUIRED_DAYS_COUNT, getMinAllowedEndDate, getRecurringEndDateFromCount, toDayOfWeek, toRecurringFrequency, };
914
914
  export { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, CompanyTaskManagerSelectorView, CompanyTaskManagerViewUIState, TaskManagerMetrics, getCompanyTaskManagerView, TaskWithCompanyDetail, createTaskFromTaskGroupTemplate, TaskGroupTemplate, };