@zeniai/client-epic-state 5.2.52-betaRD1 → 5.2.53-beta0ND

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 (116) hide show
  1. package/lib/entity/jeSchedules/jeSchedulesReducer.d.ts +1 -4
  2. package/lib/entity/jeSchedules/jeSchedulesReducer.js +5 -47
  3. package/lib/entity/notificationRegistry/notificationRegistryReducer.d.ts +2 -1
  4. package/lib/entity/notificationRegistry/notificationRegistryReducer.js +20 -9
  5. package/lib/entity/notificationRegistry/notificationRegistrySelector.d.ts +2 -1
  6. package/lib/entity/notificationRegistry/notificationRegistrySelector.js +7 -1
  7. package/lib/entity/notificationRegistry/notificationRegistryState.d.ts +5 -0
  8. package/lib/entity/notificationRegistry/notificationRegistryState.js +7 -1
  9. package/lib/entity/sectionProjectView/sectionProjectViewReducer.js +3 -1
  10. package/lib/epic.d.ts +1 -2
  11. package/lib/epic.js +0 -2
  12. package/lib/esm/entity/jeSchedules/jeSchedulesReducer.js +4 -46
  13. package/lib/esm/entity/notificationRegistry/notificationRegistryReducer.js +20 -9
  14. package/lib/esm/entity/notificationRegistry/notificationRegistrySelector.js +5 -0
  15. package/lib/esm/entity/notificationRegistry/notificationRegistryState.js +5 -0
  16. package/lib/esm/entity/sectionProjectView/sectionProjectViewReducer.js +3 -1
  17. package/lib/esm/epic.js +0 -2
  18. package/lib/esm/index.js +7 -7
  19. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +4 -2
  20. package/lib/esm/view/aiCfoView/epics/fetchRoutineRunsEpic.js +3 -1
  21. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +1 -9
  22. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +13 -10
  23. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/initializeJeScheduleLocalDataEpic.js +15 -34
  24. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/retryJeSchedulesEpic.js +1 -12
  25. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +15 -4
  26. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +1 -60
  27. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +10 -0
  28. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +12 -20
  29. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +28 -11
  30. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +45 -21
  31. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer.js +4 -1
  32. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +19 -3
  33. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +16 -3
  34. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/seedInvoicingCatalogItemFormDraftEpic.js +6 -2
  35. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer.js +4 -1
  36. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector.js +21 -21
  37. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/seedInvoicingCouponFormDraftEpic.js +6 -2
  38. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.js +10 -2
  39. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewSelector.js +33 -0
  40. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/initializeInvoicingCustomerAddressEpic.js +43 -17
  41. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/seedInvoicingCustomerFormDraftEpic.js +6 -2
  42. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer.js +10 -2
  43. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.js +34 -0
  44. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/initializeInvoicingSubscriptionAddressEpic.js +44 -18
  45. package/lib/esm/view/invoicing/invoicingFormDraft.js +13 -0
  46. package/lib/esm/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +57 -9
  47. package/lib/esm/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +20 -7
  48. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewReducer.js +43 -17
  49. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewSelector.js +24 -4
  50. package/lib/esm/view/settingsView/epic/fetchNotificationSettingsEpic.js +12 -2
  51. package/lib/index.d.ts +7 -7
  52. package/lib/index.js +56 -50
  53. package/lib/view/aiCfoView/aiCfoViewReducer.js +4 -2
  54. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +1 -1
  55. package/lib/view/aiCfoView/epics/fetchRoutineRunsEpic.js +3 -1
  56. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.d.ts +2 -2
  57. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulePageEpic.js +0 -8
  58. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +11 -8
  59. package/lib/view/expenseAutomationView/epics/jeSchedule/initializeJeScheduleLocalDataEpic.js +15 -34
  60. package/lib/view/expenseAutomationView/epics/jeSchedule/retryJeSchedulesEpic.d.ts +2 -2
  61. package/lib/view/expenseAutomationView/epics/jeSchedule/retryJeSchedulesEpic.js +1 -12
  62. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationEpic.js +15 -4
  63. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +0 -18
  64. package/lib/view/expenseAutomationView/payload/transactionCategorizationPayload.d.ts +18 -7
  65. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +2 -8
  66. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +3 -62
  67. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +10 -0
  68. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +0 -2
  69. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +8 -4
  70. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +12 -20
  71. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +27 -10
  72. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +0 -15
  73. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +8 -5
  74. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.d.ts +22 -6
  75. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +47 -22
  76. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer.js +3 -0
  77. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.d.ts +7 -0
  78. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +18 -2
  79. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +14 -1
  80. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/seedInvoicingCatalogItemFormDraftEpic.js +6 -2
  81. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewReducer.js +3 -0
  82. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector.d.ts +3 -2
  83. package/lib/view/invoicing/editInvoicingCouponDetailView/editInvoicingCouponDetailViewSelector.js +19 -19
  84. package/lib/view/invoicing/editInvoicingCouponDetailView/seedInvoicingCouponFormDraftEpic.js +6 -2
  85. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.d.ts +3 -1
  86. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.js +10 -2
  87. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewSelector.d.ts +7 -7
  88. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewSelector.js +33 -0
  89. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewState.d.ts +6 -0
  90. package/lib/view/invoicing/editInvoicingCustomerDetailView/initializeInvoicingCustomerAddressEpic.d.ts +15 -10
  91. package/lib/view/invoicing/editInvoicingCustomerDetailView/initializeInvoicingCustomerAddressEpic.js +42 -16
  92. package/lib/view/invoicing/editInvoicingCustomerDetailView/seedInvoicingCustomerFormDraftEpic.js +6 -2
  93. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer.d.ts +3 -1
  94. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer.js +10 -2
  95. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.d.ts +7 -0
  96. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.js +34 -0
  97. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewState.d.ts +6 -0
  98. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/initializeInvoicingSubscriptionAddressEpic.d.ts +15 -11
  99. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/initializeInvoicingSubscriptionAddressEpic.js +42 -16
  100. package/lib/view/invoicing/invoicingFormDraft.d.ts +10 -1
  101. package/lib/view/invoicing/invoicingFormDraft.js +14 -0
  102. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.d.ts +49 -0
  103. package/lib/view/invoicing/invoicingQboView/invoicingQboViewSelector.js +59 -10
  104. package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +19 -6
  105. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.d.ts +8 -5
  106. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.js +43 -17
  107. package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.d.ts +4 -0
  108. package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.js +30 -5
  109. package/lib/view/notificationPreferencesView/notificationPreferencesViewState.d.ts +4 -3
  110. package/lib/view/settingsView/epic/fetchNotificationSettingsEpic.js +12 -2
  111. package/lib/view/settingsView/settingsViewPayload.d.ts +2 -0
  112. package/package.json +1 -1
  113. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchFailedJePostingsEpic.js +0 -40
  114. package/lib/tsconfig.mocks.tsbuildinfo +0 -1
  115. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchFailedJePostingsEpic.d.ts +0 -20
  116. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchFailedJePostingsEpic.js +0 -44
@@ -1,36 +1,62 @@
1
- import { EMPTY, of } from 'rxjs';
1
+ import { EMPTY, from } from 'rxjs';
2
2
  import { filter, mergeMap } from 'rxjs/operators';
3
3
  import { getAddressByAddressId } from '../../../entity/address/addressSelector';
4
4
  import { getInvoicingSubscriptionById } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionSelector';
5
- import { newAddressInLocalStore } from '../../addressView/addressViewReducer';
6
- import { updateInvoicingSubscriptionDetail } from './editInvoicingSubscriptionDetailViewReducer';
7
- import { initializeInvoicingSubscriptionAddress } from './editInvoicingSubscriptionDetailViewReducer';
5
+ import { newAddressInLocalStore, removeNewAddressDataInLocalStore, } from '../../addressView/addressViewReducer';
6
+ import { claimInvoicingSubscriptionShippingAddress, fetchInvoicingSubscriptionDetail, fetchInvoicingSubscriptionDetailPage, initializeInvoicingSubscriptionAddress, updateInvoicingSubscriptionDetail, } from './editInvoicingSubscriptionDetailViewReducer';
8
7
  import { INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE } from './invoicingSubscriptionFormConfig';
9
8
  /**
10
- * Seed the shared Address screen with an existing subscription's saved shipping
11
- * address (looked up in the shared address store by `shippingAddressId`, same as
12
- * the customer billing-address flow).
13
- * Runs both when the subscription detail loads and on an explicit initialize
14
- * trigger. Skips when an in-progress draft already exists, so an address the
15
- * user just entered survives navigating between the form and the Address screen.
16
- * Mirrors `initializeInvoicingCustomerAddressEpic`.
9
+ * Seed the shared Address screen with the subscription's saved shipping address, and
10
+ * record that the slot is this subscription's. Runs when a detail request is issued
11
+ * (every path that loads a record issues one — the detail page when not cached,
12
+ * the create/edit form always), when the page opens, when the detail load
13
+ * lands, and on an explicit initialize trigger.
14
+ *
15
+ * The address store slot is keyed by address type alone, so it can still hold
16
+ * another subscription's draft. Only a draft this subscription owns is left alone —
17
+ * that is what lets an address the user just entered survive a trip to the
18
+ * Address screen. Anything else is replaced by this subscription's saved address,
19
+ * or cleared when it has none. Opening the page counts as a trigger because a
20
+ * record already loaded this session issues no detail request at all.
17
21
  */
18
22
  export const initializeInvoicingSubscriptionAddressEpic = (actions$, state$) => actions$.pipe(filter((action) => initializeInvoicingSubscriptionAddress.match(action) ||
19
- updateInvoicingSubscriptionDetail.match(action)), mergeMap((action) => {
23
+ updateInvoicingSubscriptionDetail.match(action) ||
24
+ fetchInvoicingSubscriptionDetailPage.match(action) ||
25
+ fetchInvoicingSubscriptionDetail.match(action)), mergeMap((action) => {
20
26
  const { id } = action.payload;
27
+ if (id == null) {
28
+ return EMPTY;
29
+ }
21
30
  const rootState = state$.value;
22
- const existingDraft = rootState.addressViewState.newAddressState?.[INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE]?.addressToCreate;
23
- if (existingDraft != null || id == null) {
31
+ const pending = rootState.addressViewState.newAddressState?.[INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE]?.addressToCreate;
32
+ const ownerId = rootState.editInvoicingSubscriptionDetailViewState
33
+ .shippingAddressOwnerId;
34
+ // A detail response speaks for the record it loaded, which may no longer
35
+ // be the one on screen: its request keeps running when the user moves on
36
+ // to a cached record, which issues no request of its own to cancel it.
37
+ // Only the page-open and explicit triggers define the current record.
38
+ if (updateInvoicingSubscriptionDetail.match(action) &&
39
+ ownerId != null &&
40
+ ownerId !== id) {
41
+ return EMPTY;
42
+ }
43
+ if (pending != null && ownerId === id) {
24
44
  return EMPTY;
25
45
  }
26
46
  const subscription = getInvoicingSubscriptionById(rootState.invoicingSubscriptionState, id);
27
47
  const address = subscription?.shippingAddressId != null
28
48
  ? getAddressByAddressId(rootState.addressState, subscription.shippingAddressId)
29
49
  : undefined;
30
- return address != null
31
- ? of(newAddressInLocalStore({
50
+ const actions = [];
51
+ if (address != null) {
52
+ actions.push(newAddressInLocalStore({
32
53
  addressType: INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE,
33
54
  addressToCreate: address,
34
- }))
35
- : EMPTY;
55
+ }));
56
+ }
57
+ else if (pending != null) {
58
+ actions.push(removeNewAddressDataInLocalStore(INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE));
59
+ }
60
+ actions.push(claimInvoicingSubscriptionShippingAddress({ id }));
61
+ return from(actions);
36
62
  }));
@@ -41,6 +41,19 @@ export function applyInvoicingFormDraftFailure(draftById, id, blankLocalData) {
41
41
  }
42
42
  existing.fetchState = 'Error';
43
43
  }
44
+ /**
45
+ * The record behind this draft was just saved and is about to be refetched.
46
+ * Keep the values on screen — dropping them would blank the form for the round
47
+ * trip, and the form remounts on the response anyway — but stop counting them
48
+ * as the loaded record's, so that response is allowed to replace them.
49
+ */
50
+ export function applyInvoicingFormDraftSaved(draftById, id) {
51
+ const existing = draftById[id];
52
+ if (existing == null) {
53
+ return;
54
+ }
55
+ existing.fetchState = 'Not-Started';
56
+ }
44
57
  /** The draft's values, or the blank form when nothing is drafted yet. */
45
58
  export function getInvoicingFormDraftLocalData(draftById, id, blankLocalData) {
46
59
  if (id == null) {
@@ -1,3 +1,5 @@
1
+ import { createSelector } from '@reduxjs/toolkit';
2
+ import { toInvoicingQboAccountMappingSlot, } from '../../../entity/invoicing/invoicingCommonPayload';
1
3
  import { getAccountList, getNestedAccountListHierarchy, } from '../../accountList/accountListSelector';
2
4
  import { getClassList, getNestedClassListHierarchy, } from '../../classList/classListSelector';
3
5
  // The shared bucket, fetched with the same arguments as the other consumers so
@@ -82,14 +84,20 @@ export const getInvoicingCatalogAccountingLookup = (state) => ({
82
84
  classByQboId: (qboId) => invoicingQboClassByQboId(state, qboId),
83
85
  });
84
86
  /**
85
- * Accounts and classes as the invoicing pickers need them. Both come from the
86
- * shared accounting-service lists, so whatever another screen already loaded
87
- * is reused. `qboId` is the submitted value because that is what the invoicing
88
- * API stores; an account without one cannot be posted, so it is dropped rather
89
- * than offered.
87
+ * Accounts as the invoicing pickers need them, from the shared
88
+ * accounting-service list, so whatever another screen already loaded is reused.
89
+ * `qboId` is the submitted value because that is what the invoicing API stores;
90
+ * an account without one cannot be posted, so it is dropped rather than offered.
91
+ *
92
+ * Memoized on the two slices it reads: the pickers and the lists derived from
93
+ * them are handed straight to forms, and a fresh array on every store change
94
+ * re-seeds a form the user is editing.
90
95
  */
91
- const invoicingAccountingOptions = (state) => {
92
- const { accounts } = getAccountList(state.accountState, state.accountListState, INVOICING_ACCOUNT_LIST_KEY);
96
+ export const getInvoicingQboAccountOptions = createSelector([
97
+ (state) => state.accountState,
98
+ (state) => state.accountListState,
99
+ ], (accountState, accountListState) => {
100
+ const { accounts } = getAccountList(accountState, accountListState, INVOICING_ACCOUNT_LIST_KEY);
93
101
  return accounts.flatMap((account) => {
94
102
  if (account.qboId == null || account.isDeleted === true) {
95
103
  return [];
@@ -102,7 +110,7 @@ const invoicingAccountingOptions = (state) => {
102
110
  },
103
111
  ];
104
112
  });
105
- };
113
+ });
106
114
  /**
107
115
  * Normalises an account-type name for comparison. The config's mapping kinds
108
116
  * name QuickBooks types the way QuickBooks displays them ("Other Current
@@ -138,6 +146,46 @@ export const invoicingAccountsForQboAccountTypes = (accounts, accountTypes) => {
138
146
  return accounts.filter((account) => account.accountType != null &&
139
147
  wanted.has(normalizeAccountTypeName(account.accountType)));
140
148
  };
149
+ /**
150
+ * The account-mapping slot a catalog price point's income account shares with
151
+ * the settings page, and the one a discount's account shares with it.
152
+ */
153
+ export const INVOICING_INCOME_ACCOUNT_MAPPING_SLOT = 'default_income_account';
154
+ export const INVOICING_DISCOUNTS_ACCOUNT_MAPPING_SLOT = 'discounts_account';
155
+ /**
156
+ * The account types a slot falls back to when the config carries no kind for
157
+ * it. QuickBooks posts a product, a price and a discount line to an income
158
+ * account; offering every account instead would let a save be rejected.
159
+ */
160
+ export const INVOICING_DEFAULT_INCOME_ACCOUNT_TYPES = 'Income';
161
+ /**
162
+ * The QuickBooks ids a mapping slot's picker may offer, from the account types
163
+ * the config gives that slot — so every picker filling the same slot offers the
164
+ * same accounts, and widening one stays a config change.
165
+ *
166
+ * Ids rather than a filtered tree: the pickers flatten the tree into options by
167
+ * walking each node's children, so dropping a parent that is not itself of the
168
+ * wanted type would drop its matching descendants with it.
169
+ *
170
+ * Matched on the slot rather than the code as written, since a config naming
171
+ * the kind `discounts_account_id` means the same slot. A slot the config does
172
+ * not carry falls back to `defaultAccountTypes` rather than to every account.
173
+ */
174
+ export const invoicingQboAccountIdsForMappingSlot = (accounts, accountMappingKindOptions, mappingSlot, defaultAccountTypes) => {
175
+ const accountTypes = accountMappingKindOptions.find((kindOption) => toInvoicingQboAccountMappingSlot(kindOption.code) === mappingSlot)?.accountTypes ?? defaultAccountTypes;
176
+ return invoicingAccountsForQboAccountTypes(accounts, accountTypes).map((account) => account.id);
177
+ };
178
+ /**
179
+ * Stable empties for a tenant with no QBO connection.
180
+ *
181
+ * `?? []` builds a fresh array per call, and the invoicing forms re-seed their
182
+ * fields whenever their option lists change identity — so a form open against a
183
+ * disconnected tenant would reset itself on every unrelated store change, until
184
+ * the first edit disarms the re-seed.
185
+ */
186
+ export const NO_INVOICING_ACCOUNT_HIERARCHY = [];
187
+ export const NO_INVOICING_CLASS_HIERARCHY = [];
188
+ export const NO_INVOICING_ACCOUNT_IDS = [];
141
189
  /** Classes as the invoicing pickers need them, from the shared class list. */
142
190
  const invoicingAccountingClassOptions = (state) => {
143
191
  const { classes } = getClassList(state.classState, state.classListState);
@@ -159,7 +207,7 @@ export const getInvoicingQboView = (state) => {
159
207
  const qboState = state.invoicingQboViewState;
160
208
  const accountList = state.accountListState.byReportId[INVOICING_ACCOUNT_LIST_KEY];
161
209
  return {
162
- accounts: invoicingAccountingOptions(state),
210
+ accounts: getInvoicingQboAccountOptions(state),
163
211
  accountsFetchState: {
164
212
  fetchState: accountList.fetchState,
165
213
  error: accountList.error,
@@ -1,11 +1,12 @@
1
1
  import { EMPTY, of } from 'rxjs';
2
2
  import { catchError, filter, finalize, mergeMap, switchMap, takeUntil, withLatestFrom, } from 'rxjs/operators';
3
+ import { NOTIFICATION_DOMAINS } from '../../../entity/notificationRegistry/notificationRegistryState';
3
4
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
5
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
5
6
  import { notificationPreferencesUrl } from '../notificationPreferencesEndpoint';
6
7
  import { mapPreferencesToPayload, } from '../notificationPreferencesViewPayload';
7
8
  import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, } from '../notificationPreferencesViewReducer';
8
- import { getNotificationLocalOverrides } from '../notificationPreferencesViewSelector';
9
+ import { getNotificationLocalOverridesForDomain } from '../notificationPreferencesViewSelector';
9
10
  export const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter((action) => saveNotificationPreferences.match(action)), withLatestFrom(state$),
10
11
  // `switchMap` unsubscribes from any in-flight PUT observable when a newer
11
12
  // Save fires. The prior HTTP request has already left the
@@ -13,9 +14,19 @@ export const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => ac
13
14
  // ignored, so stale success/failure actions cannot clobber the newer
14
15
  // batch's state. Server-side ordering is arrival-order LWW.
15
16
  switchMap(([, state]) => {
16
- const overrides = getNotificationLocalOverrides(state);
17
- const preferencesPatch = mapPreferencesToPayload(overrides);
18
- if (Object.keys(preferencesPatch).length === 0) {
17
+ // A clean domain is omitted entirely: an empty patch is still a write against it.
18
+ const overridesByDomain = {};
19
+ const body = {};
20
+ NOTIFICATION_DOMAINS.forEach((domain) => {
21
+ const overrides = getNotificationLocalOverridesForDomain(state, domain);
22
+ const preferencesPatch = mapPreferencesToPayload(overrides);
23
+ if (Object.keys(preferencesPatch).length === 0) {
24
+ return;
25
+ }
26
+ overridesByDomain[domain] = overrides;
27
+ body[`${domain}_preferences`] = preferencesPatch;
28
+ });
29
+ if (Object.keys(body).length === 0) {
19
30
  // No diff → do not dispatch a synthetic success (that would wipe
20
31
  // stored preferences via the reducer). Simply no-op.
21
32
  return EMPTY;
@@ -28,7 +39,6 @@ switchMap(([, state]) => {
28
39
  // in-flight save's response (Success/Failure never dispatched, so
29
40
  // the counter never drained and future saves got their merge dropped).
30
41
  const cancelEpochAtDispatch = state.notificationPreferencesViewState.cancelEpoch;
31
- const body = { task_checklist_preferences: preferencesPatch };
32
42
  // Suppress the error snackbar when the response lands AFTER the user
33
43
  // pressed Cancel — the Failure reducer already swallows the state
34
44
  // update, so the toast would be a stale error for a save the user
@@ -57,8 +67,11 @@ switchMap(([, state]) => {
57
67
  if (isSuccessResponse(response)) {
58
68
  return of(saveNotificationPreferencesSuccess({
59
69
  cancelEpochAtDispatch,
60
- savedOverrides: overrides,
61
- serverEcho: response.data?.task_checklist_preferences,
70
+ savedOverridesByDomain: overridesByDomain,
71
+ serverEchoByDomain: {
72
+ task_checklist: response.data?.task_checklist_preferences,
73
+ commenting: response.data?.commenting_preferences,
74
+ },
62
75
  }));
63
76
  }
64
77
  const actions = [
@@ -1,14 +1,25 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
+ import { DEFAULT_NOTIFICATION_DOMAIN, } from '../../entity/notificationRegistry/notificationRegistryState';
2
3
  import { clearAll } from '../../rootActions';
3
4
  import { mapPayloadToPreferences, } from './notificationPreferencesViewPayload';
4
5
  import { emptyNotificationPreferences, } from './notificationPreferencesViewState';
5
6
  export const initialState = {
6
7
  cancelEpoch: 0,
7
- localOverrides: emptyNotificationPreferences(),
8
- preferences: emptyNotificationPreferences(),
8
+ localOverridesByDomain: {},
9
+ preferencesByDomain: {},
9
10
  saveEpoch: 0,
10
11
  savePreferencesState: { fetchState: 'Not-Started' },
11
12
  };
13
+ // Lazy: a gate-off tenant never receives that domain's key at all.
14
+ const overridesFor = (byDomain, domain) => {
15
+ const existing = byDomain[domain];
16
+ if (existing != null) {
17
+ return existing;
18
+ }
19
+ const created = emptyNotificationPreferences();
20
+ byDomain[domain] = created;
21
+ return created;
22
+ };
12
23
  const mergePreferences = (base, patch) => {
13
24
  const eventEnabledByChannel = {
14
25
  ...base.eventEnabledByChannel,
@@ -146,7 +157,8 @@ const notificationPreferencesView = createSlice({
146
157
  // Success/Failure never dispatches, subsequent legitimate saves
147
158
  // still work because their captured epoch matches the current one.
148
159
  draft.cancelEpoch += 1;
149
- draft.localOverrides = emptyNotificationPreferences();
160
+ // One shared Save/Cancel footer, so Cancel discards every domain.
161
+ draft.localOverridesByDomain = {};
150
162
  // Also drop `savePreferencesState` back to Not-Started so any
151
163
  // "Saving…" affordance bound to `getNotificationPreferencesSaveState`
152
164
  // clears on Cancel. Without this, a Cancel-during-save whose stale
@@ -163,9 +175,6 @@ const notificationPreferencesView = createSlice({
163
175
  // them; the save-success path is the only clearer.
164
176
  // A `null`/`undefined` payload isn't a snapshot at all (e.g. the
165
177
  // envelope key was omitted); no-op instead of wiping preferences.
166
- if (action.payload.preferences == null) {
167
- return;
168
- }
169
178
  // Stale-GET guard (Cursor Bugbot 3632510237): if the fetch epic
170
179
  // captured a `saveEpoch` lower than the current one, a save has
171
180
  // succeeded since this GET dispatched — the response is carrying
@@ -175,7 +184,13 @@ const notificationPreferencesView = createSlice({
175
184
  if (action.payload.saveEpochAtDispatch < draft.saveEpoch) {
176
185
  return;
177
186
  }
178
- draft.preferences = mapPayloadToPreferences(action.payload.preferences);
187
+ Object.entries(action.payload.preferencesByDomain).forEach(([domain, payload]) => {
188
+ if (payload == null) {
189
+ return;
190
+ }
191
+ draft.preferencesByDomain[domain] =
192
+ mapPayloadToPreferences(payload);
193
+ });
179
194
  },
180
195
  saveNotificationPreferences(draft) {
181
196
  draft.savePreferencesState = { fetchState: 'In-Progress' };
@@ -234,33 +249,44 @@ const notificationPreferencesView = createSlice({
234
249
  // skip the `preferences` replace. Cursor Bugbot 3632510237.
235
250
  draft.saveEpoch += 1;
236
251
  draft.savePreferencesState = { fetchState: 'Completed' };
237
- const patch = action.payload.serverEcho == null
238
- ? action.payload.savedOverrides
239
- : mapPayloadToPreferences(action.payload.serverEcho);
240
- draft.preferences = mergePreferences(draft.preferences, patch);
241
- draft.localOverrides = subtractSavedOverrides(draft.localOverrides, action.payload.savedOverrides);
252
+ Object.entries(action.payload.savedOverridesByDomain).forEach(([rawDomain, savedOverrides]) => {
253
+ if (savedOverrides == null) {
254
+ return;
255
+ }
256
+ const domain = rawDomain;
257
+ const serverEcho = action.payload.serverEchoByDomain[domain];
258
+ const patch = serverEcho == null
259
+ ? savedOverrides
260
+ : mapPayloadToPreferences(serverEcho);
261
+ draft.preferencesByDomain[domain] = mergePreferences(draft.preferencesByDomain[domain] ?? emptyNotificationPreferences(), patch);
262
+ draft.localOverridesByDomain[domain] = subtractSavedOverrides(draft.localOverridesByDomain[domain] ??
263
+ emptyNotificationPreferences(), savedOverrides);
264
+ });
242
265
  },
243
266
  setGroupChannelMaster(draft, action) {
244
267
  // Mirror of `toggleEventChannel` but scoped to the group-channel master
245
268
  // held under `groupChannelEnabledByGroupId[groupId][channel]`.
246
269
  const { channel, enabled, groupId } = action.payload;
270
+ const overrides = overridesFor(draft.localOverridesByDomain, action.payload.domain ?? DEFAULT_NOTIFICATION_DOMAIN);
247
271
  const groupMap = {
248
- ...(draft.localOverrides.groupChannelEnabledByGroupId[groupId] ?? {}),
272
+ ...(overrides.groupChannelEnabledByGroupId[groupId] ?? {}),
249
273
  };
250
274
  groupMap[channel] = enabled;
251
- draft.localOverrides.groupChannelEnabledByGroupId[groupId] = groupMap;
275
+ overrides.groupChannelEnabledByGroupId[groupId] = groupMap;
252
276
  },
253
277
  setGroupFrequency(draft, action) {
254
- draft.localOverrides.groupFrequencyByGroupId[action.payload.groupId] =
278
+ const overrides = overridesFor(draft.localOverridesByDomain, action.payload.domain ?? DEFAULT_NOTIFICATION_DOMAIN);
279
+ overrides.groupFrequencyByGroupId[action.payload.groupId] =
255
280
  action.payload.frequency;
256
281
  },
257
282
  toggleEventChannel(draft, action) {
258
283
  const { channel, enabled, eventId } = action.payload;
284
+ const overrides = overridesFor(draft.localOverridesByDomain, action.payload.domain ?? DEFAULT_NOTIFICATION_DOMAIN);
259
285
  const eventMap = {
260
- ...(draft.localOverrides.eventEnabledByChannel[eventId] ?? {}),
286
+ ...(overrides.eventEnabledByChannel[eventId] ?? {}),
261
287
  };
262
288
  eventMap[channel] = enabled;
263
- draft.localOverrides.eventEnabledByChannel[eventId] = eventMap;
289
+ overrides.eventEnabledByChannel[eventId] = eventMap;
264
290
  },
265
291
  },
266
292
  extraReducers: (builder) => {
@@ -1,11 +1,18 @@
1
1
  import { createSelector } from '@reduxjs/toolkit';
2
+ import { DEFAULT_NOTIFICATION_DOMAIN, } from '../../entity/notificationRegistry/notificationRegistryState';
3
+ import { emptyNotificationPreferences, } from './notificationPreferencesViewState';
2
4
  const getView = (state) => state.notificationPreferencesViewState;
3
5
  export const getNotificationPreferencesSaveState = (state) => getView(state).savePreferencesState;
4
6
  // Memoised on `preferences` + `localOverrides` so the merged shape keeps a
5
7
  // stable reference while neither input changes — a plain function would
6
8
  // allocate a fresh object on every call and re-render every `useSelector`
7
9
  // consumer on any unrelated dispatch.
8
- export const getEffectiveNotificationPreferences = createSelector((state) => getView(state).preferences, (state) => getView(state).localOverrides, (preferences, localOverrides) => {
10
+ const EMPTY_PREFERENCES = emptyNotificationPreferences();
11
+ // One per domain: a shared createSelector has a cache of one and would thrash across two.
12
+ const effectivePreferencesSelectorByDomain = new Map();
13
+ const createEffectivePreferencesSelector = (domain) => createSelector((state) => getView(state).preferencesByDomain[domain], (state) => getView(state).localOverridesByDomain[domain], (storedPreferences, storedOverrides) => {
14
+ const preferences = storedPreferences ?? EMPTY_PREFERENCES;
15
+ const localOverrides = storedOverrides ?? EMPTY_PREFERENCES;
9
16
  const mergedEventEnabledByChannel = { ...preferences.eventEnabledByChannel };
10
17
  Object.entries(localOverrides.eventEnabledByChannel).forEach(([eventId, channels]) => {
11
18
  mergedEventEnabledByChannel[eventId] = {
@@ -29,7 +36,20 @@ export const getEffectiveNotificationPreferences = createSelector((state) => get
29
36
  },
30
37
  };
31
38
  });
32
- export const getNotificationLocalOverrides = (state) => getView(state).localOverrides;
33
- export const hasUnsavedNotificationPreferences = createSelector((state) => getView(state).localOverrides, (localOverrides) => Object.keys(localOverrides.eventEnabledByChannel).length > 0 ||
39
+ export const getEffectiveNotificationPreferencesForDomain = (state, domain) => {
40
+ let selector = effectivePreferencesSelectorByDomain.get(domain);
41
+ if (selector == null) {
42
+ selector = createEffectivePreferencesSelector(domain);
43
+ effectivePreferencesSelectorByDomain.set(domain, selector);
44
+ }
45
+ return selector(state);
46
+ };
47
+ export const getEffectiveNotificationPreferences = (state) => getEffectiveNotificationPreferencesForDomain(state, DEFAULT_NOTIFICATION_DOMAIN);
48
+ export const getNotificationLocalOverridesForDomain = (state, domain) => getView(state).localOverridesByDomain[domain] ?? EMPTY_PREFERENCES;
49
+ export const getNotificationLocalOverrides = (state) => getNotificationLocalOverridesForDomain(state, DEFAULT_NOTIFICATION_DOMAIN);
50
+ const isDirty = (localOverrides) => Object.keys(localOverrides.eventEnabledByChannel).length > 0 ||
34
51
  Object.keys(localOverrides.groupChannelEnabledByGroupId).length > 0 ||
35
- Object.keys(localOverrides.groupFrequencyByGroupId).length > 0);
52
+ Object.keys(localOverrides.groupFrequencyByGroupId).length > 0;
53
+ export const hasUnsavedNotificationPreferencesForDomain = (state, domain) => isDirty(getNotificationLocalOverridesForDomain(state, domain));
54
+ // Drives the shared page-level Save/Cancel footer.
55
+ export const hasUnsavedNotificationPreferences = (state) => Object.values(getView(state).localOverridesByDomain).some((localOverrides) => localOverrides != null && isDirty(localOverrides));
@@ -38,11 +38,21 @@ export const fetchNotificationSettingsEpic = (actions$, state$, zeniAPI) => acti
38
38
  // 67d6918e.
39
39
  updateActions.push(updateNotificationRegistry({
40
40
  registry: response.data.task_checklist_registry ?? undefined,
41
+ // An absent `<domain>_registry` means that domain's gate is off.
42
+ registriesByDomain: {
43
+ task_checklist: response.data.task_checklist_registry ?? undefined,
44
+ commenting: response.data.commenting_registry ?? undefined,
45
+ },
41
46
  registryEpochAtDispatch,
42
47
  }));
43
- if (response.data.task_checklist_preferences != null) {
48
+ // One action so the domains cannot land on different store epochs.
49
+ const preferencesByDomain = {
50
+ task_checklist: response.data.task_checklist_preferences ?? undefined,
51
+ commenting: response.data.commenting_preferences ?? undefined,
52
+ };
53
+ if (Object.values(preferencesByDomain).some((preferences) => preferences != null)) {
44
54
  updateActions.push(fetchNotificationPreferencesSuccess({
45
- preferences: response.data.task_checklist_preferences,
55
+ preferencesByDomain,
46
56
  saveEpochAtDispatch,
47
57
  }));
48
58
  }
package/lib/index.d.ts CHANGED
@@ -116,8 +116,8 @@ import { updateCommentsNotifications, updateCommentsNotificationsStatuses } from
116
116
  import { NotificationWithAuthors } from './entity/notification/types/notificationSelectorTypes';
117
117
  import { Notification, NotificationActivity, NotificationEventData, NotificationMetaData, NotificationUpdates, NotificationValueFormat } from './entity/notification/types/notificationStateTypes';
118
118
  import { ExternalNotificationData, NotificationActivityType, NotificationGroup, NotificationIdentifierType, NotificationMode, NotificationStatus, NotificationUpdateValue, toNotificationModeStrict } from './entity/notification/types/notificationTypes';
119
- import { getNotificationRegistry } from './entity/notificationRegistry/notificationRegistrySelector';
120
- import { NotificationChannel, NotificationFrequency, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, toNotificationChannel, toNotificationFrequency } from './entity/notificationRegistry/notificationRegistryState';
119
+ import { getNotificationRegistry, getNotificationRegistryForDomain } from './entity/notificationRegistry/notificationRegistrySelector';
120
+ import { DEFAULT_NOTIFICATION_DOMAIN, NOTIFICATION_DOMAINS, NotificationChannel, NotificationDomain, NotificationFrequency, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, toNotificationChannel, toNotificationDomain, toNotificationFrequency } from './entity/notificationRegistry/notificationRegistryState';
121
121
  import { getPlaidPaymentAccounts } from './entity/paymentAccount/paymentAccountSelector';
122
122
  import { Logo, PaymentAccount, VERIFIED_PAYMENT_ACCOUNT_PROVIDER_VERIFICATION_STATUS } from './entity/paymentAccount/paymentAccountState';
123
123
  import { PaymentInstrument } from './entity/paymentInstrument/paymentInstrument';
@@ -310,9 +310,9 @@ import { computeNewScheduleJeDetails } from './view/expenseAutomationView/helper
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';
312
312
  import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } from './view/expenseAutomationView/payload/reconciliationPayload';
313
- import { ackCloseMatchAfterUndo, clearActualMatchingView as clearExpenseAutomationActualMatchingView, clearMatchNewModal, closeMatchNewModal, fetchActualMatchingMatch, fetchActualMatching as fetchExpenseAutomationActualMatching, fetchActualMatchingPage as fetchExpenseAutomationActualMatchingPage, matchAndReverseAccruals, openMatchNewModal, searchMatchAccruals, searchMatchTransactions, undoReversalAccruals, updateActualMatchingUIState as updateExpenseAutomationActualMatchingUIState } from './view/expenseAutomationView/reducers/actualMatchingViewReducer';
313
+ import { ackCloseMatchAfterUndo, clearActualMatchingView as clearExpenseAutomationActualMatchingView, clearMatchNewModal, closeMatchNewModal, fetchActualMatching as fetchExpenseAutomationActualMatching, fetchActualMatchingMatch, fetchActualMatchingPage as fetchExpenseAutomationActualMatchingPage, matchAndReverseAccruals, openMatchNewModal, searchMatchAccruals, searchMatchTransactions, undoReversalAccruals, updateActualMatchingUIState as updateExpenseAutomationActualMatchingUIState } from './view/expenseAutomationView/reducers/actualMatchingViewReducer';
314
314
  import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
315
- import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearSearchTransactionsForNewSchedule as clearJeSearchTransactionsForNewSchedule, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, fetchOneTimeAccrual, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, ignoreOneTimeAccrual, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeNewSchedule as initializeJeNewSchedule, initializeJeScheduleLocalData, promoteOneTimeAccrual, removeJeOneTimeAccrualLocalData, removeJeScheduleTransactionKey, resetNewScheduleLocalData as resetJeNewScheduleLocalData, retryJeSchedule as retryExpenseAutomationJESchedule, revertJeSchedule, revertOneTimeAccrual, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, saveNewSchedule as saveJeNewSchedule, saveNewScheduleFailure as saveJeNewScheduleFailure, saveNewScheduleSuccess as saveJeNewScheduleSuccess, searchTransactionsForNewSchedule as searchJeTransactionsForNewSchedule, searchTransactionsForNewScheduleFailure as searchJeTransactionsForNewScheduleFailure, searchTransactionsForNewScheduleSuccess as searchJeTransactionsForNewScheduleSuccess, toggleJECreatedGroupCollapsed, toggleJEFailedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJEScheduleTypeFilter, updateNewScheduleLocalData as updateJeNewScheduleLocalData, updateJeOneTimeAccrualLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
315
+ import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearSearchTransactionsForNewSchedule as clearJeSearchTransactionsForNewSchedule, createOneTimeAccrual, createOneTimeAccrualFailure, createOneTimeAccrualSuccess, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, fetchOneTimeAccrual, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, ignoreOneTimeAccrual, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeNewSchedule as initializeJeNewSchedule, initializeJeScheduleLocalData, promoteOneTimeAccrual, removeJeOneTimeAccrualLocalData, removeJeScheduleTransactionKey, resetNewScheduleLocalData as resetJeNewScheduleLocalData, retryJeSchedule as retryExpenseAutomationJESchedule, revertJeSchedule, revertOneTimeAccrual, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, saveNewSchedule as saveJeNewSchedule, saveNewScheduleFailure as saveJeNewScheduleFailure, saveNewScheduleSuccess as saveJeNewScheduleSuccess, searchTransactionsForNewSchedule as searchJeTransactionsForNewSchedule, searchTransactionsForNewScheduleFailure as searchJeTransactionsForNewScheduleFailure, searchTransactionsForNewScheduleSuccess as searchJeTransactionsForNewScheduleSuccess, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJEScheduleTypeFilter, updateNewScheduleLocalData as updateJeNewScheduleLocalData, updateJeOneTimeAccrualLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
316
316
  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';
317
317
  import { clearStatementDateConflict, confirmStatementMapping, deleteAccountStatement, deleteCombinedStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseCombinedStatement, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitCombinedStatementUpdate, 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';
318
318
  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, updateTransactionGroup, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
@@ -382,7 +382,7 @@ import { getNetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCa
382
382
  import { AccountingMethod, NetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelectorTypes';
383
383
  import { AverageMonthsCount, NetBurnOrIncomeRunway, NetBurnOrIncomeStoryCardState, TimeSpanIdForAverage } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardState';
384
384
  import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
385
- import { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
385
+ import { getEffectiveNotificationPreferences, getEffectiveNotificationPreferencesForDomain, getNotificationLocalOverrides, getNotificationLocalOverridesForDomain, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences, hasUnsavedNotificationPreferencesForDomain } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
386
386
  import { NotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewState';
387
387
  import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState } from './view/notificationView/notificationViewReducer';
388
388
  import { NotificationView, getExternalNotificationsForSelectedSubTab, getNotificationView, getNotificationsForSelectedSubTab } from './view/notificationView/notificationViewSelector';
@@ -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, actualMatchingTransactionLineKey, 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, toggleJEFailedGroupCollapsed, 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, };
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, actualMatchingTransactionLineKey, 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, };
@@ -970,7 +970,7 @@ export { ExternalNotificationData, NotificationGroup, NotificationActivityType,
970
970
  export { NotificationView, NotificationViewUIState, NotificationTabState, NotificationTabType, NotificationSubTabType, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
971
971
  export { fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, FeatureInterest, FeatureNotificationViewState, };
972
972
  export { pushToastNotification, ToastNotification, ToastNotificationPayload, getLastNotificationTime, getNotifications, };
973
- export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
973
+ export { getEffectiveNotificationPreferences, getEffectiveNotificationPreferencesForDomain, getNotificationLocalOverrides, getNotificationLocalOverridesForDomain, getNotificationPreferencesSaveState, getNotificationRegistry, getNotificationRegistryForDomain, hasUnsavedNotificationPreferences, hasUnsavedNotificationPreferencesForDomain, NOTIFICATION_DOMAINS, NotificationChannel, DEFAULT_NOTIFICATION_DOMAIN, NotificationDomain, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationDomain, toNotificationFrequency, };
974
974
  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, };
975
975
  export { ALL_WEEK_DAYS, DayOfWeek, RecurringDatePickerOptions, RecurringFrequencyType, SEMI_WEEKLY_REQUIRED_DAYS_COUNT, getMinAllowedEndDate, getRecurringEndDateFromCount, toDayOfWeek, toRecurringFrequency, };
976
976
  export { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, CompanyTaskManagerSelectorView, CompanyTaskManagerViewUIState, TaskManagerMetrics, getCompanyTaskManagerView, TaskWithCompanyDetail, createTaskFromTaskGroupTemplate, TaskGroupTemplate, };