@zeniai/client-epic-state 5.3.19 → 5.3.21-beta0KB

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 (99) hide show
  1. package/lib/commonStateTypes/coaBalance/coaBalance.d.ts +9 -0
  2. package/lib/commonStateTypes/coaBalance/coaBalance.js +11 -0
  3. package/lib/entity/genericEntity/customerWithSubCustomersId.d.ts +7 -0
  4. package/lib/entity/genericEntity/customerWithSubCustomersId.js +17 -0
  5. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  6. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  7. package/lib/entity/tenant/epic/fetchAllTenantsEpic.js +6 -4
  8. package/lib/entity/tenant/tenantPayload.d.ts +6 -0
  9. package/lib/entity/tenant/tenantPayload.js +5 -0
  10. package/lib/entity/tenant/tenantReducer.d.ts +6 -2
  11. package/lib/entity/tenant/tenantReducer.js +32 -5
  12. package/lib/entity/tenant/tenantSelector.d.ts +2 -1
  13. package/lib/entity/tenant/tenantSelector.js +4 -1
  14. package/lib/entity/tenant/tenantState.d.ts +10 -0
  15. package/lib/entity/tenant/tenantState.js +5 -0
  16. package/lib/epic.d.ts +2 -1
  17. package/lib/epic.js +3 -0
  18. package/lib/esm/commonStateTypes/coaBalance/coaBalance.js +10 -0
  19. package/lib/esm/entity/genericEntity/customerWithSubCustomersId.js +12 -0
  20. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  21. package/lib/esm/entity/tenant/epic/fetchAllTenantsEpic.js +6 -4
  22. package/lib/esm/entity/tenant/tenantPayload.js +4 -1
  23. package/lib/esm/entity/tenant/tenantReducer.js +31 -4
  24. package/lib/esm/entity/tenant/tenantSelector.js +2 -0
  25. package/lib/esm/entity/tenant/tenantState.js +4 -1
  26. package/lib/esm/epic.js +4 -1
  27. package/lib/esm/index.js +7 -6
  28. package/lib/esm/view/balanceSheet/balanceSheetForTimeframeEpic.js +9 -4
  29. package/lib/esm/view/balanceSheet/balanceSheetReducer.js +2 -0
  30. package/lib/esm/view/cashFlow/cashFlowForTimeframeEpic.js +11 -5
  31. package/lib/esm/view/cashFlow/cashFlowReducer.js +2 -0
  32. package/lib/esm/view/companyView/companyViewReducer.js +26 -1
  33. package/lib/esm/view/companyView/epic/companyPassport/updateCustomersTabSettingEpic.js +47 -0
  34. package/lib/esm/view/companyView/selector/companyPassportViewSelector.js +2 -0
  35. package/lib/esm/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  36. package/lib/esm/view/customerSummaryView/customerSummaryViewReducer.js +39 -6
  37. package/lib/esm/view/customerSummaryView/customerSummaryViewSelector.js +41 -11
  38. package/lib/esm/view/customerSummaryView/epic/fetchCustomerSummaryListEpic.js +6 -1
  39. package/lib/esm/view/financeStatement/financeStatementSelector.js +18 -0
  40. package/lib/esm/view/profitAndLoss/profitAndLossForTimeframeEpic.js +9 -4
  41. package/lib/esm/view/profitAndLoss/profitAndLossReducer.js +5 -1
  42. package/lib/esm/view/spendManagement/reimbursement/editRemiView/editRemiViewReducer.js +23 -3
  43. package/lib/esm/view/spendManagement/reimbursement/editRemiView/epics/fetchRemiAndInitializeLocalStoreEpic.js +17 -4
  44. package/lib/esm/view/spendManagement/reimbursement/remiDetailView/epics/fetchRemiDetailEpic.js +1 -1
  45. package/lib/esm/view/transactionDetail/createTransaction/epics/createTransactionEpic.js +1 -5
  46. package/lib/esm/view/transactionList/fetchTransactionListByEntityEpic.js +11 -2
  47. package/lib/esm/view/transactionList/filterTransactionsByTimePeriod.js +18 -0
  48. package/lib/esm/view/transactionList/transactionListByAccountSelector.js +2 -1
  49. package/lib/esm/view/transactionList/transactionListByCategoryTypeSelector.js +2 -1
  50. package/lib/esm/view/transactionList/transactionListByClassSelector.js +2 -1
  51. package/lib/esm/view/transactionList/transactionListByProjectSelector.js +2 -1
  52. package/lib/esm/view/transactionList/transactionListReducer.js +24 -15
  53. package/lib/esm/view/trend/fetchIncomeTrendEpic.js +6 -2
  54. package/lib/index.d.ts +9 -8
  55. package/lib/index.js +53 -46
  56. package/lib/view/balanceSheet/balanceSheetForTimeframeEpic.js +8 -3
  57. package/lib/view/balanceSheet/balanceSheetReducer.js +2 -0
  58. package/lib/view/balanceSheet/balanceSheetState.d.ts +2 -0
  59. package/lib/view/cashFlow/cashFlowForTimeframeEpic.js +10 -4
  60. package/lib/view/cashFlow/cashFlowReducer.js +2 -0
  61. package/lib/view/cashFlow/cashFlowState.d.ts +2 -0
  62. package/lib/view/companyView/companyViewReducer.d.ts +8 -1
  63. package/lib/view/companyView/companyViewReducer.js +28 -3
  64. package/lib/view/companyView/epic/companyPassport/updateCustomersTabSettingEpic.d.ts +11 -0
  65. package/lib/view/companyView/epic/companyPassport/updateCustomersTabSettingEpic.js +51 -0
  66. package/lib/view/companyView/selector/companyPassportViewSelector.d.ts +1 -0
  67. package/lib/view/companyView/selector/companyPassportViewSelector.js +4 -1
  68. package/lib/view/companyView/types/companyPassport/companyPassportViewState.d.ts +1 -0
  69. package/lib/view/companyView/types/companyPassport/companyPassportViewState.js +4 -0
  70. package/lib/view/customerSummaryView/customerSummaryViewPayload.d.ts +20 -1
  71. package/lib/view/customerSummaryView/customerSummaryViewReducer.d.ts +3 -1
  72. package/lib/view/customerSummaryView/customerSummaryViewReducer.js +42 -6
  73. package/lib/view/customerSummaryView/customerSummaryViewSelector.d.ts +13 -1
  74. package/lib/view/customerSummaryView/customerSummaryViewSelector.js +45 -12
  75. package/lib/view/customerSummaryView/customerSummaryViewState.d.ts +24 -10
  76. package/lib/view/customerSummaryView/epic/fetchCustomerSummaryListEpic.js +6 -1
  77. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  78. package/lib/view/financeStatement/financeStatementSelector.d.ts +8 -0
  79. package/lib/view/financeStatement/financeStatementSelector.js +18 -0
  80. package/lib/view/profitAndLoss/profitAndLossForTimeframeEpic.js +8 -3
  81. package/lib/view/profitAndLoss/profitAndLossReducer.js +5 -1
  82. package/lib/view/profitAndLoss/profitAndLossState.d.ts +2 -1
  83. package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewReducer.d.ts +7 -2
  84. package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewReducer.js +24 -4
  85. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchRemiAndInitializeLocalStoreEpic.d.ts +7 -4
  86. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchRemiAndInitializeLocalStoreEpic.js +15 -1
  87. package/lib/view/spendManagement/reimbursement/remiDetailView/epics/fetchRemiDetailEpic.js +1 -1
  88. package/lib/view/transactionDetail/createTransaction/epics/createTransactionEpic.js +1 -5
  89. package/lib/view/transactionList/fetchTransactionListByEntityEpic.js +11 -2
  90. package/lib/view/transactionList/filterTransactionsByTimePeriod.d.ts +15 -0
  91. package/lib/view/transactionList/filterTransactionsByTimePeriod.js +22 -0
  92. package/lib/view/transactionList/transactionListByAccountSelector.js +2 -1
  93. package/lib/view/transactionList/transactionListByCategoryTypeSelector.js +2 -1
  94. package/lib/view/transactionList/transactionListByClassSelector.js +2 -1
  95. package/lib/view/transactionList/transactionListByProjectSelector.js +2 -1
  96. package/lib/view/transactionList/transactionListReducer.d.ts +3 -1
  97. package/lib/view/transactionList/transactionListReducer.js +24 -15
  98. package/lib/view/trend/fetchIncomeTrendEpic.js +6 -2
  99. package/package.json +1 -1
@@ -161,6 +161,23 @@ export const getFinanceStatement = createSelector((state) => state.accountState,
161
161
  default:
162
162
  break;
163
163
  }
164
+ let customDateRangeByTimeframe;
165
+ switch (financeStatementState.selectedReportId) {
166
+ case 'profit_and_loss':
167
+ customDateRangeByTimeframe =
168
+ profitAndLossState.pandL.customDateRangeByTimeframe;
169
+ break;
170
+ case 'balance_sheet':
171
+ customDateRangeByTimeframe =
172
+ balanceSheetState.customDateRangeByTimeframe;
173
+ break;
174
+ case 'cash_flow':
175
+ customDateRangeByTimeframe = cashFlowState.customDateRangeByTimeframe;
176
+ break;
177
+ default:
178
+ break;
179
+ }
180
+ const selectedReportCustomDateRange = customDateRangeByTimeframe?.[financeStatementState.timeframe];
164
181
  return {
165
182
  reportId: 'finance_statement',
166
183
  reportTitle: '',
@@ -170,6 +187,7 @@ export const getFinanceStatement = createSelector((state) => state.accountState,
170
187
  allTimeframeTicks,
171
188
  balancesInTimeframe,
172
189
  selectedReportAndTimeframeFetchState,
190
+ selectedReportCustomDateRange,
173
191
  displayOrder: financeStatementState.displayOrder,
174
192
  reportFormat: financeStatementState.reportFormat,
175
193
  firstMonthOfFY,
@@ -1,12 +1,16 @@
1
1
  import { from, of } from 'rxjs';
2
- import { catchError, filter, mergeMap } from 'rxjs/operators';
2
+ import { catchError, filter, groupBy, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { updateCalculatedSectionAccountsView, updateSectionAccountsView, } from '../../entity/sectionAccountsView/sectionAccountsViewReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
5
5
  import { fetchProfitAndLossForTimeframe, updateProfitAndLossForTimeframe, updateProfitAndLossForTimeframeFailure, } from './profitAndLossReducer';
6
6
  export const reportIdUniqueKey = (forecastId) => forecastId != null
7
7
  ? `profit_and_loss+${forecastId}`
8
8
  : 'profit_and_loss';
9
- export const fetchProfitAndLossForTimeframeEpic = (actions$, _, zeniAPI) => actions$.pipe(filter(fetchProfitAndLossForTimeframe.match), mergeMap((action) => {
9
+ export const fetchProfitAndLossForTimeframeEpic = (actions$, _, zeniAPI) => actions$.pipe(filter(fetchProfitAndLossForTimeframe.match),
10
+ // One stream per timeframe: a newer request for the same timeframe (e.g. a
11
+ // custom-date-range change, or a dated fetch right after a default one)
12
+ // cancels the older in-flight request so a stale response can't land last.
13
+ groupBy((action) => `${action.payload.forecastId ?? ''}_${action.payload.timeframe}`), mergeMap((group$) => group$.pipe(switchMap((action) => {
10
14
  const getTimeSeriesGroup = (timeframe) => {
11
15
  switch (timeframe) {
12
16
  case 'month':
@@ -25,7 +29,8 @@ export const fetchProfitAndLossForTimeframeEpic = (actions$, _, zeniAPI) => acti
25
29
  queryValue.forecast_id = action.payload.forecastId;
26
30
  queryValue.is_forecast_vs_actual = true;
27
31
  }
28
- if (action.payload.startDate != null && action.payload.endDate != null) {
32
+ if (action.payload.startDate != null &&
33
+ action.payload.endDate != null) {
29
34
  queryValue.custom_start_date = action.payload.startDate;
30
35
  queryValue.custom_end_date = action.payload.endDate;
31
36
  }
@@ -55,4 +60,4 @@ export const fetchProfitAndLossForTimeframeEpic = (actions$, _, zeniAPI) => acti
55
60
  return of(updateProfitAndLossForTimeframeFailure(response.status, action.payload.forecastId, action.payload.timeframe));
56
61
  }
57
62
  }), catchError((error) => of(updateProfitAndLossForTimeframeFailure(createZeniAPIStatus('Unexpected Error', 'P&L REST API call errored out' + JSON.stringify(error)), action.payload.forecastId, action.payload.timeframe))));
58
- }));
63
+ }))));
@@ -1,5 +1,6 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
2
  import { mapReportPayloadV2ToReportV2 } from '../../commonPayloadTypes/v2/viewAndReportPayloadv2';
3
+ import { withFetchedCustomDateRange } from '../../commonStateTypes/coaBalance/coaBalance';
3
4
  import { clearAll } from '../../rootActions';
4
5
  export const initialPandLState = {
5
6
  bookCloseDate: undefined,
@@ -71,7 +72,10 @@ const profitAndLoss = createSlice({
71
72
  fetchState: 'In-Progress',
72
73
  error: undefined,
73
74
  };
74
- updateState(draft, action.payload.forecastId, { fetchState });
75
+ updateState(draft, action.payload.forecastId, {
76
+ fetchState,
77
+ customDateRangeByTimeframe: withFetchedCustomDateRange(pAndLState.customDateRangeByTimeframe, timeframe, action.payload.startDate, action.payload.endDate),
78
+ });
75
79
  },
76
80
  },
77
81
  updateProfitAndLossForTimeframe(draft, action) {
@@ -30,8 +30,13 @@ const editRemiView = createSlice({
30
30
  };
31
31
  },
32
32
  },
33
- indicateReadyToInitializeRemiLocalStore() {
34
- // do nothing
33
+ indicateReadyToInitializeRemiLocalStore: {
34
+ reducer() {
35
+ // do nothing
36
+ },
37
+ prepare(reimbursementId) {
38
+ return { payload: { reimbursementId } };
39
+ },
35
40
  },
36
41
  fetchRecommendationsAndUpdateMerchantRecommendations: {
37
42
  reducer() {
@@ -137,6 +142,21 @@ const editRemiView = createSlice({
137
142
  return { payload: { reimbursementId } };
138
143
  },
139
144
  },
145
+ initializeRemiToLocalStoreFailure: {
146
+ reducer(draft, action) {
147
+ const { reimbursementId, error } = action.payload;
148
+ draft.editRemiStateById[reimbursementId] = {
149
+ ...draft.editRemiStateById[reimbursementId],
150
+ fetchStatus: {
151
+ fetchState: 'Error',
152
+ error,
153
+ },
154
+ };
155
+ },
156
+ prepare(reimbursementId, error) {
157
+ return { payload: { reimbursementId, error } };
158
+ },
159
+ },
140
160
  saveRemiUpdatesToLocalStore(draft, action) {
141
161
  if (action.payload.reimbursementId != null) {
142
162
  const reimbursementId = action.payload.reimbursementId;
@@ -387,7 +407,7 @@ const editRemiView = createSlice({
387
407
  });
388
408
  },
389
409
  });
390
- export const { fetchEditRemiDetailPage, fetchRemiAndInitializeLocalStore, initializeRemiToLocalStore, fetchRecommendationsAndUpdateMerchantRecommendations, saveRemiUpdatesToLocalStore, updatesPaymentToInLocalStore, discardRemiUpdatesInLocalStore, removeFileFromRemiUpdatesInLocalStore, saveRemiDetail, saveRemiSuccessOrFailure, parseReceiptsToRemi, fetchCurrencyConversionValue, updateReimbursementType, updateHomeCurrencyConversion, currencyConversionValueSuccessOrFailure, waitForRemiDetailThenInitializeLocalStore, waitForMerchantRecommendationFetchThenUpdateRecommendationInMerchant, updateAddRemiAutoFields, indicateReadyToInitializeRemiLocalStore, updateUploadFetchState, updateRecommendationInMerchant, updateTentativeMerchantNames, clearTentativeMerchantName, clearAddRemiAutoFields, } = editRemiView.actions;
410
+ export const { fetchEditRemiDetailPage, fetchRemiAndInitializeLocalStore, initializeRemiToLocalStore, fetchRecommendationsAndUpdateMerchantRecommendations, saveRemiUpdatesToLocalStore, updatesPaymentToInLocalStore, discardRemiUpdatesInLocalStore, removeFileFromRemiUpdatesInLocalStore, saveRemiDetail, saveRemiSuccessOrFailure, parseReceiptsToRemi, fetchCurrencyConversionValue, updateReimbursementType, updateHomeCurrencyConversion, currencyConversionValueSuccessOrFailure, waitForRemiDetailThenInitializeLocalStore, initializeRemiToLocalStoreFailure, waitForMerchantRecommendationFetchThenUpdateRecommendationInMerchant, updateAddRemiAutoFields, indicateReadyToInitializeRemiLocalStore, updateUploadFetchState, updateRecommendationInMerchant, updateTentativeMerchantNames, clearTentativeMerchantName, clearAddRemiAutoFields, } = editRemiView.actions;
391
411
  export default editRemiView.reducer;
392
412
  const doUpdateRecommendationForEntity = (draft, lineId, recommendations, shouldAutofill, reimbursementId, reimbursementStageCode) => {
393
413
  if (reimbursementId != null) {
@@ -1,8 +1,9 @@
1
1
  import recordGet from 'lodash/get';
2
- import { from } from 'rxjs';
3
- import { filter, mergeMap } from 'rxjs/operators';
4
- import { fetchRemiDetail, } from '../../remiDetailView/remiDetailViewReducer';
5
- import { fetchRemiAndInitializeLocalStore, initializeRemiToLocalStore, waitForRemiDetailThenInitializeLocalStore, } from '../editRemiViewReducer';
2
+ import { from, merge } from 'rxjs';
3
+ import { filter, map, mergeMap, take, takeUntil, takeWhile, } from 'rxjs/operators';
4
+ import { clearAll } from '../../../../../rootActions';
5
+ import { fetchRemiDetail, updateRemiDetailFetchState, } from '../../remiDetailView/remiDetailViewReducer';
6
+ import { fetchRemiAndInitializeLocalStore, indicateReadyToInitializeRemiLocalStore, initializeRemiToLocalStore, initializeRemiToLocalStoreFailure, waitForRemiDetailThenInitializeLocalStore, } from '../editRemiViewReducer';
6
7
  export const fetchRemiAndInitializeLocalStoreEpic = (actions$, state$) => actions$.pipe(filter(fetchRemiAndInitializeLocalStore.match), mergeMap((action) => {
7
8
  const { reimbursementId, cacheOverride, isShowDeletedReimbursementEnabled, } = action.payload;
8
9
  const state = state$.value;
@@ -35,3 +36,15 @@ export const fetchRemiAndInitializeLocalStoreEpic = (actions$, state$) => action
35
36
  }
36
37
  return from(remiDetailActions);
37
38
  }));
39
+ export const waitForRemiDetailThenInitializeLocalStoreEpic = (actions$) => actions$.pipe(filter(waitForRemiDetailThenInitializeLocalStore.match), mergeMap((action) => {
40
+ const { reimbursementId } = action.payload;
41
+ const ready$ = actions$.pipe(filter(indicateReadyToInitializeRemiLocalStore.match), filter((readyAction) => readyAction.payload.reimbursementId === reimbursementId), take(1), map(() => initializeRemiToLocalStore(reimbursementId)));
42
+ const failed$ = actions$.pipe(filter(updateRemiDetailFetchState.match), filter((fetchStateAction) => fetchStateAction.payload.reimbursementId === reimbursementId &&
43
+ fetchStateAction.payload.fetchState === 'Error'), map((fetchStateAction) => initializeRemiToLocalStoreFailure(reimbursementId, fetchStateAction.payload.error)));
44
+ const supersededOrCleared$ = actions$.pipe(filter((nextAction) => clearAll.match(nextAction) ||
45
+ (waitForRemiDetailThenInitializeLocalStore.match(nextAction) &&
46
+ nextAction.payload.reimbursementId === reimbursementId)));
47
+ // An Error does not end the wait: a newer request for the same id may still succeed.
48
+ // After an Error, supersededOrCleared$ is what ends it.
49
+ return merge(ready$, failed$).pipe(takeWhile((resultAction) => !initializeRemiToLocalStore.match(resultAction), true), takeUntil(supersededOrCleared$));
50
+ }));
@@ -75,7 +75,7 @@ export const fetchRemiDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
75
75
  }));
76
76
  }
77
77
  });
78
- actions.push(indicateReadyToInitializeRemiLocalStore()); // add dummy action
78
+ actions.push(indicateReadyToInitializeRemiLocalStore(reimbursementId));
79
79
  if (response.data.transaction?.lines != null &&
80
80
  response.data.transaction.lines.length > 0) {
81
81
  actions.push(fetchDuplicateReimbursement(response.data.transaction.created_by_user_id, false, response.data.transaction.transaction_id));
@@ -52,15 +52,11 @@ exhaustMap((action) => {
52
52
  // the working copy on unmount instead.
53
53
  // Before the local-data init: it seeds the detail entry that init writes into.
54
54
  createTransactionSuccessOrFailure('Completed', newTransactionId),
55
+ // No success snackbar here: the screen raises it once pending attachments upload.
55
56
  initializeTransactionDetailLocalData({
56
57
  transactionId: newTransactionId,
57
58
  vendorId: created.vendor_id ?? undefined,
58
59
  }),
59
- openSnackbar({
60
- messageSection: 'create_transaction',
61
- messageText: 'success',
62
- type: 'success',
63
- }),
64
60
  ]);
65
61
  }), catchError((error) => {
66
62
  const message = error instanceof UnresolvedCreateTransactionIdError
@@ -2,6 +2,7 @@ import lodashGet from 'lodash/get';
2
2
  import { from, of } from 'rxjs';
3
3
  import { catchError, filter, mergeMap } from 'rxjs/operators';
4
4
  import { toString } from '../../commonStateTypes/timePeriod';
5
+ import { fromCustomerEntityId } from '../../entity/genericEntity/customerWithSubCustomersId';
5
6
  import { updateTransactions } from '../../entity/transaction/transactionReducer';
6
7
  import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
7
8
  import { fetchEntityTransactionList, updateTransactionListByEntity, updateTransactionListByEntityFailure, } from './transactionListReducer';
@@ -13,12 +14,20 @@ export const fetchTransactionListByEntityEpic = (actions$, state$, zeniAPI) => a
13
14
  if (action.payload.cacheOverride === true ||
14
15
  entityTransactions == null ||
15
16
  entityTransactions.hasValidState() === false) {
17
+ // Customers tab rolled-up view: cached under its own id, sent as the customer id plus the flag
18
+ const { customerId: entityId, includeSubCustomers } = action.payload.entity.type === 'customer'
19
+ ? fromCustomerEntityId(action.payload.entity.id)
20
+ : {
21
+ customerId: action.payload.entity.id,
22
+ includeSubCustomers: false,
23
+ };
16
24
  const queryParam = {
17
25
  start_date: toString(action.payload.period.start),
18
26
  end_date: toString(action.payload.period.end),
19
27
  sort_by: 'create_time',
20
28
  sort_order: 'desc',
21
- entity_id: action.payload.entity.id,
29
+ entity_id: entityId,
30
+ ...(includeSubCustomers ? { include_sub_customers: true } : {}),
22
31
  entity_name: action.payload.entity.name,
23
32
  entity_type: action.payload.entity.type,
24
33
  is_fetch_all_transactions: action.payload.isFetchAllTransactions === true
@@ -31,7 +40,7 @@ export const fetchTransactionListByEntityEpic = (actions$, state$, zeniAPI) => a
31
40
  if (isSuccessResponse(response) && response.data != null) {
32
41
  const updateActions = [];
33
42
  updateActions.push(updateTransactions(response.data.transactions, (value) => value.transaction_id));
34
- updateActions.push(updateTransactionListByEntity(response.data));
43
+ updateActions.push(updateTransactionListByEntity(response.data, action.payload.entity.id));
35
44
  return from(updateActions);
36
45
  }
37
46
  else {
@@ -0,0 +1,18 @@
1
+ import { DEFAULT_DATE_FORMAT, toString, } from '../../commonStateTypes/timePeriod';
2
+ /**
3
+ * Transaction lists are fetched and cached in month buckets: `splitPeriod`
4
+ * snaps the first bucket back to the 1st of the month, while the last bucket
5
+ * is fetched with the real end date. So a period that starts mid-month (e.g. a
6
+ * drill-down from the custom-date-range column "Jun 17-30 2026") pulls in the
7
+ * days before its start. Drop those so the list reconciles to the clicked
8
+ * figure. Periods starting on the 1st (every pre-existing caller) are returned
9
+ * untouched. Compares calendar days as `YYYY-MM-DD` strings so the viewer's
10
+ * timezone can't shift the boundary.
11
+ */
12
+ export const filterTransactionsByTimePeriod = (transactions, period) => {
13
+ if (period.start.day === 1) {
14
+ return transactions;
15
+ }
16
+ const start = toString(period.start);
17
+ return transactions.filter((transaction) => transaction.date.format(DEFAULT_DATE_FORMAT) >= start);
18
+ };
@@ -2,6 +2,7 @@ import flatMap from 'lodash/flatMap';
2
2
  import recordGet from 'lodash/get';
3
3
  import orderBy from 'lodash/orderBy';
4
4
  import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { filterTransactionsByTimePeriod } from './filterTransactionsByTimePeriod';
5
6
  import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
7
  import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
8
  import { getAcKey, getAcTranKey, } from './transactionListState';
@@ -29,7 +30,7 @@ export const getTransactionListByAccount = (transactionState, transactionListSta
29
30
  }
30
31
  return value != null;
31
32
  });
32
- transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
33
+ transactions = orderBy(filterTransactionsByTimePeriod(transactionsUnsorted, filterByTimePeriod), (value) => value.date.valueOf(), 'desc');
33
34
  }
34
35
  const key = getAcKey(accountId, accountType);
35
36
  const uiState = recordGet(transactionListState.byAccount.transactionListUIStateByAccountKey, key, {});
@@ -2,6 +2,7 @@ import flatMap from 'lodash/flatMap';
2
2
  import recordGet from 'lodash/get';
3
3
  import orderBy from 'lodash/orderBy';
4
4
  import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { filterTransactionsByTimePeriod } from './filterTransactionsByTimePeriod';
5
6
  import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
7
  import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
8
  import { getCategoryTypeTranKey, } from './transactionListState';
@@ -26,7 +27,7 @@ export const getTransactionsListByCategoryType = (transactionState, transactionL
26
27
  }
27
28
  return value != null;
28
29
  });
29
- transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
30
+ transactions = orderBy(filterTransactionsByTimePeriod(transactionsUnsorted, filterByTimePeriod), (value) => value.date.valueOf(), 'desc');
30
31
  }
31
32
  const uiState = transactionListState.byType[transactionCategoryType].transactionListUIState;
32
33
  return {
@@ -2,6 +2,7 @@ import flatMap from 'lodash/flatMap';
2
2
  import recordGet from 'lodash/get';
3
3
  import orderBy from 'lodash/orderBy';
4
4
  import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { filterTransactionsByTimePeriod } from './filterTransactionsByTimePeriod';
5
6
  import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
7
  import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
8
  import { getClassAcKey, getClassAcTranKey, } from './transactionListState';
@@ -29,7 +30,7 @@ export const getTransactionListByClass = (transactionState, transactionListState
29
30
  }
30
31
  return value != null;
31
32
  });
32
- transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
33
+ transactions = orderBy(filterTransactionsByTimePeriod(transactionsUnsorted, filterByTimePeriod), (value) => value.date.valueOf(), 'desc');
33
34
  }
34
35
  const key = getClassAcKey(accountId, accountType, classId);
35
36
  const uiState = recordGet(transactionListState.byClass.transactionListUIStateByClassKey, key, {});
@@ -2,6 +2,7 @@ import flatMap from 'lodash/flatMap';
2
2
  import recordGet from 'lodash/get';
3
3
  import orderBy from 'lodash/orderBy';
4
4
  import { getSupportedTransactionById } from '../../entity/transaction/transactionSelector';
5
+ import { filterTransactionsByTimePeriod } from './filterTransactionsByTimePeriod';
5
6
  import { splitPeriod } from './parallelFetchAccountTransactionListEpic';
6
7
  import { isAnyFetchCompleted, reduceFetchState, } from './reduceTransactionListFetchState';
7
8
  import { getProjectAcKey, getProjectAcTranKey, } from './transactionListState';
@@ -29,7 +30,7 @@ export const getTransactionListByProject = (transactionState, transactionListSta
29
30
  }
30
31
  return value != null;
31
32
  });
32
- transactions = orderBy(transactionsUnsorted, (value) => value.date.valueOf(), 'desc');
33
+ transactions = orderBy(filterTransactionsByTimePeriod(transactionsUnsorted, filterByTimePeriod), (value) => value.date.valueOf(), 'desc');
33
34
  }
34
35
  const key = getProjectAcKey(accountId, accountType, projectId);
35
36
  const uiState = recordGet(transactionListState.byProject.transactionListUIStateByProjectKey, key, {});
@@ -164,21 +164,30 @@ const transactionList = createSlice({
164
164
  };
165
165
  },
166
166
  },
167
- updateTransactionListByEntity(draft, action) {
168
- const transactionIDs = action.payload.transactions.map((transactionPayload) => transactionPayload.transaction_id);
169
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
170
- const entity = mapTransactionQueryMetaDataToEntity(action.payload.query);
171
- const key = getEntityTranKey(entity, {
172
- start: toAbsoluteDay(action.payload.query.start_date),
173
- end: toAbsoluteDay(action.payload.query.end_date),
174
- });
175
- draft.byEntity.transactionListByEntityKey[key] = {
176
- ...initialEntityTransactionState,
177
- fetchState: 'Completed',
178
- error: undefined,
179
- entity: entity,
180
- transactionIDs,
181
- };
167
+ updateTransactionListByEntity: {
168
+ // `entityId`: the requested entity's id when it differs from the query's (a rolled-up customer)
169
+ prepare(payload, entityId) {
170
+ return { payload, meta: { entityId } };
171
+ },
172
+ reducer(draft, action) {
173
+ const transactionIDs = action.payload.transactions.map((transactionPayload) => transactionPayload.transaction_id);
174
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
175
+ const entity = {
176
+ ...mapTransactionQueryMetaDataToEntity(action.payload.query),
177
+ ...(action.meta.entityId != null && { id: action.meta.entityId }),
178
+ };
179
+ const key = getEntityTranKey(entity, {
180
+ start: toAbsoluteDay(action.payload.query.start_date),
181
+ end: toAbsoluteDay(action.payload.query.end_date),
182
+ });
183
+ draft.byEntity.transactionListByEntityKey[key] = {
184
+ ...initialEntityTransactionState,
185
+ fetchState: 'Completed',
186
+ error: undefined,
187
+ entity: entity,
188
+ transactionIDs,
189
+ };
190
+ },
182
191
  },
183
192
  updateTransactionListByEntityFailure: {
184
193
  reducer(draft, action) {
@@ -3,6 +3,7 @@ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { toTimePeriod, } from '../../commonStateTypes/timeframeTick';
4
4
  import { getCustomerIncomeTrendKey } from '../../entity/customerIncome/customerIncomeTrendKey';
5
5
  import { updateCustomerIncomeTrend } from '../../entity/customerIncome/customerIncomeTrendReducer';
6
+ import { fromCustomerEntityId } from '../../entity/genericEntity/customerWithSubCustomersId';
6
7
  import { createZeniAPIStatus, isSuccessResponse } from '../../responsePayload';
7
8
  import { date as zeniDate } from '../../zeniDayJS';
8
9
  import { fetchIncomeTrend, updateTrendFailure, updateTrendSuccess, } from './trendReducer';
@@ -25,11 +26,14 @@ switchMap((action) => {
25
26
  return of(updateTrendSuccess(requestedPeriod));
26
27
  }
27
28
  }
29
+ // The rolled-up view is cached under its own id; the API takes the customer id plus the flag
30
+ const { customerId: apiCustomerId, includeSubCustomers } = fromCustomerEntityId(customerId);
28
31
  const query = {
29
- entity_id: customerId,
32
+ entity_id: apiCustomerId,
30
33
  entity_type: 'customer',
31
- customer_id: customerId,
34
+ customer_id: apiCustomerId,
32
35
  customer_name: customerName,
36
+ ...(includeSubCustomers ? { include_sub_customers: true } : {}),
33
37
  ...(dateRange != null
34
38
  ? { start_date: dateRange.startDate, end_date: dateRange.endDate }
35
39
  : {}),
package/lib/index.d.ts CHANGED
@@ -147,8 +147,8 @@ import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
147
147
  import { TaskGroupState } from './entity/taskGroup/taskGroupState';
148
148
  import { TaskGroupTemplate } from './entity/taskGroupTemplate/taskGroupTemplateState';
149
149
  import { DoSignInPayload, deleteConnection, doMagicLinkSignIn, doSignIn, doSignOut, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, initEmailConnectOAuth, resendVerifyDeviceOTP, resetSignInState, saveAPIKeyConnection, saveConnectorCredentials, saveExternalConnection as saveExternalConnectionForTenant, saveOAuthConnection, seedTenantSummary, sendEmailMagicLinkToUser, sendSessionHeartbeat, toExternalIntegrationType, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
150
- import { CurrentTenant, CurrentTenantIds, DEFAULT_RECEIPTS_EMAIL, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, getCurrentTenant, getCurrentTenantId, getCurrentTenantIds, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isCurrentTenantLoaded, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantLoaded, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
151
- import { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Connection, LoggedInUser, RoleResource, Tenant, TenantProductSettings } from './entity/tenant/tenantState';
150
+ import { CurrentTenant, CurrentTenantIds, DEFAULT_RECEIPTS_EMAIL, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, getCurrentTenant, getCurrentTenantId, getCurrentTenantIds, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantCustomersTabSettings, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isCurrentTenantLoaded, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantLoaded, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
151
+ import { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Connection, CustomersTabSettingKey, CustomersTabSettings, LoggedInUser, RoleResource, Tenant, TenantProductSettings } from './entity/tenant/tenantState';
152
152
  import { toExternalSupportedTool } from './entity/tenant/tenantTypes';
153
153
  import { ToastNotificationPayload } from './entity/toastNotification/toastNotificationPayload';
154
154
  import { pushToastNotification } from './entity/toastNotification/toastNotificationReducer';
@@ -284,11 +284,11 @@ import { AuditSummaryData, CompanyMonthEndReportData, CompanyMonthReportTemplate
284
284
  import { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, updateCompanyTaskManagerViewFilters } from './view/companyTaskManagerView/companyTaskManagerViewReducer';
285
285
  import { CompanyTaskManagerSelectorView, TaskWithCompanyDetail, getCompanyTaskManagerView } from './view/companyTaskManagerView/companyTaskManagerViewSelector';
286
286
  import { CompanyTaskManagerViewUIState, TaskManagerMetrics } from './view/companyTaskManagerView/companyTaskManagerViewState';
287
- import { CompanyProductServicesInput, clearQboProjectsReconnectRequest, companyManagementSaveUpdates, companyPassportClearDataInLocalStore, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, disableAccountingProjects, dismissCapitalizationOnboarding, enableAccountingProjects, fetchAllCockpitViews, fetchCompanyManagementView, fetchCompanyPassportView, fetchCompanyPortfolioView, fetchManagementView, fetchOnboardingView, fetchParentSubsidiaryManagementView, fetchPortfolioView, fetchSubscriptionView, fetchZeniUsers, resumeEnableAccountingProjects, saveCompanyPassportDetails, saveIndustryAndIncDateInCompanyPassportLocalStore, updateAccountingClassesEnabled, updateAutoReviewIncomeWithoutCustomer, updateCapitalizationAccountThreshold, updateCompanyDownloadState, updateCompanyManagementUIState, updateCompanyPassportLocalStoreData, updateCompanyPortfolioUIState, updateCompanyProductServices, updateCompanyQboRealmId } from './view/companyView/companyViewReducer';
287
+ import { CompanyProductServicesInput, clearQboProjectsReconnectRequest, companyManagementSaveUpdates, companyPassportClearDataInLocalStore, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, disableAccountingProjects, dismissCapitalizationOnboarding, enableAccountingProjects, fetchAllCockpitViews, fetchCompanyManagementView, fetchCompanyPassportView, fetchCompanyPortfolioView, fetchManagementView, fetchOnboardingView, fetchParentSubsidiaryManagementView, fetchPortfolioView, fetchSubscriptionView, fetchZeniUsers, resumeEnableAccountingProjects, saveCompanyPassportDetails, saveIndustryAndIncDateInCompanyPassportLocalStore, updateAccountingClassesEnabled, updateAutoReviewIncomeWithoutCustomer, updateCapitalizationAccountThreshold, updateCompanyDownloadState, updateCompanyManagementUIState, updateCompanyPassportLocalStoreData, updateCompanyPortfolioUIState, updateCompanyProductServices, updateCompanyQboRealmId, updateCustomersTabSetting } from './view/companyView/companyViewReducer';
288
288
  import { canSendMonthEndEmailReport, shouldEnableCalendarPickerForLastReportSent } from './view/companyView/helpers/cockpitHelpers';
289
289
  import { getParentSubsidiaryManagementView } from './view/companyView/parentSubsidiaryView/parentSubsidiaryViewSelector';
290
290
  import { CompanyManagementView, getAddonListZeniSku, getCompanyManagementView, getCompanyProductServicesUpdateStatus, getCompanyQboRealmIdUpdateStatus, getPlanListZeniSku } from './view/companyView/selector/companyManagementViewSelector';
291
- import { CompanyPassportLocalStoreDataView, CompanyPassportView, getCompanyPassportLocalStoreData, getCompanyPassportView, isCompanyPassportDataToBeSaved } from './view/companyView/selector/companyPassportViewSelector';
291
+ import { CompanyPassportLocalStoreDataView, CompanyPassportView, getCompanyPassportLocalStoreData, getCompanyPassportView, getIsCustomersTabSettingsUpdateInProgress, isCompanyPassportDataToBeSaved } from './view/companyView/selector/companyPassportViewSelector';
292
292
  import { CompanyPortfolioView, getCompanyPortfolioView, isInfiniteRunway } from './view/companyView/selector/companyPortfolioViewSelector';
293
293
  import { AllCockpitTabsView, getAllCockpitTabsFilterView } from './view/companyView/selector/getAllCockpitTabsFilterView';
294
294
  import { ALL_COCKPIT_TABS_FILE_TYPES, ALL_COCKPIT_TABS_IDS, CockpitDownloadTabsID, CockpitTabsFileType, CockpitTabsID, toCockpitTabsFileTypeStrict, toCockpitTabsIDStrict } from './view/companyView/types/cockpitTabsID';
@@ -754,7 +754,7 @@ export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePerio
754
754
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorSpendTrendFilterTabType';
755
755
  export { getNumberOfPeriods };
756
756
  export { SCHEDULE_DAYS_OF_MONTH, ScheduleDaysOfMonth, toScheduleDaysOfMonth, Day, Month, toMonth, toMonthStrict, Quarter, toQuarter, toQuarterStrict, AbsoluteDay, TimePeriod, };
757
- export { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, CurrentTenantIds, TenantProductSettings, getTenantBaseById, getCurrentTenant, getCurrentTenantId, getCurrentTenantIds, isCurrentTenantLoaded, isTenantLoaded, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, seedTenantSummary, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
757
+ export { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, CurrentTenantIds, TenantProductSettings, CustomersTabSettings, CustomersTabSettingKey, getTenantBaseById, getCurrentTenant, getCurrentTenantId, getCurrentTenantIds, isCurrentTenantLoaded, isTenantLoaded, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantCustomersTabSettings, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, seedTenantSummary, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
758
758
  export { Account, AccountType, AccountBase, StatementCloseDay, toAccountType, AccountReport, NestedAccountReport, AccountWithBalanceReport, AccountGroup, AccountGroupReportV2, AccountGroupType, toAccountGroupType, AccountGroupReport, getAccountGroupKey, AccountGroupKey, RecommendedAccountBase, AccountFilterOption, getAllAccounts, getTransactionFilterAccountOptions, };
759
759
  export { Class, ClassBase, RecommendedClassBase, } from './entity/class/classState';
760
760
  export { ClassFilterOption, getAllClasses, getClassById, getClassFilterOptions, } from './entity/class/classSelector';
@@ -867,7 +867,7 @@ export { CockpitFilterCategory, CockpitFilters, DownloadCockpitTabOptions, Filte
867
867
  export { CockpitDownloadTabsID, CockpitTabsFileType, CockpitTabsID, ALL_COCKPIT_TABS_FILE_TYPES, ALL_COCKPIT_TABS_IDS, toCockpitTabsIDStrict, toCockpitTabsFileTypeStrict, };
868
868
  export { AllowedValueWithCode, AllowedValue, AllowedValueWithID, isAllowedValueWithCode, isAllowedValueWithID, };
869
869
  export { ManagementUIState, PortfolioUIState };
870
- export { fetchCompanyPassportView, CompanyPassportView, getCompanyPassportView, getCompanyPassportLocalStoreData, isCompanyPassportDataToBeSaved, companyPassportSaveDataInLocalStore, saveIndustryAndIncDateInCompanyPassportLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, updateCompanyPassportLocalStoreData, saveCompanyPassportDetails, updateAccountingClassesEnabled, updateAutoReviewIncomeWithoutCustomer, enableAccountingProjects, resumeEnableAccountingProjects, disableAccountingProjects, clearQboProjectsReconnectRequest, updateCompanyProductServices, CompanyProductServicesInput, getCompanyProductServicesUpdateStatus, updateCompanyQboRealmId, getCompanyQboRealmIdUpdateStatus, updateCapitalizationAccountThreshold, dismissCapitalizationOnboarding, UpdateActionType, CompanyPassportLocalStoreDataView, };
870
+ export { fetchCompanyPassportView, CompanyPassportView, getCompanyPassportView, getCompanyPassportLocalStoreData, getIsCustomersTabSettingsUpdateInProgress, isCompanyPassportDataToBeSaved, companyPassportSaveDataInLocalStore, saveIndustryAndIncDateInCompanyPassportLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, updateCompanyPassportLocalStoreData, saveCompanyPassportDetails, updateAccountingClassesEnabled, updateAutoReviewIncomeWithoutCustomer, updateCustomersTabSetting, enableAccountingProjects, resumeEnableAccountingProjects, disableAccountingProjects, clearQboProjectsReconnectRequest, updateCompanyProductServices, CompanyProductServicesInput, getCompanyProductServicesUpdateStatus, updateCompanyQboRealmId, getCompanyQboRealmIdUpdateStatus, updateCapitalizationAccountThreshold, dismissCapitalizationOnboarding, UpdateActionType, CompanyPassportLocalStoreDataView, };
871
871
  export { CompanyInfoLocalData, IncInfoLocalData, TaxDetailsLocalData, CompanyDetailsLocalData, PrimaryContactLocalData, CompanyOfficerLocalData, CompanyOfficerType, CompanyPassportLocalData, toCompanyPassportLocalData, };
872
872
  export type { CompanyOnboardingIndustryTypeCode, CompanyOnboardingSubIndustryTypeCode, CompanyPurposeOfAccountCode, CompanySourceOfFundsCode, CompanyTransactionVolumeCode, CompanyUsNexusTypeCode, };
873
873
  export { COMPANY_ONBOARDING_INDUSTRY_TYPE_CODES, COMPANY_ONBOARDING_SUB_INDUSTRY_CODES_BY_INDUSTRY, COMPANY_PURPOSE_OF_ACCOUNT_CODES, COMPANY_SOURCE_OF_FUNDS_CODES, COMPANY_TRANSACTION_VOLUME_CODES, COMPANY_US_NEXUS_TYPE_CODES, getCompanyOnboardingSubIndustryCodesForIndustry, };
@@ -1276,7 +1276,8 @@ export type { ActualMatchingMatchId } from './entity/actualMatching/actualMatchi
1276
1276
  export type { SessionEndpointsLoader } from './sessionEndpointsLoader';
1277
1277
  export type { DisplayCurrencyFallback } from './entity/actualMatching/actualMatchingPayload';
1278
1278
  export { fetchCustomerSummaryDetail, fetchCustomerSummaryList, resetCustomerSummaryDetailUiState, saveCustomerSummaryDetail, updateCustomerAllTransactionsTabData, updateCustomerDetailSelectedTab, updateCustomerSummaryRevenueSelection, updateCustomerSummaryScrollYOffset, updateCustomerSummarySortUiState, updateCustomerTrendFilter, } from './view/customerSummaryView/customerSummaryViewReducer';
1279
- export { getCustomerSummaryAllTransactionsTabData, getCustomerSummaryDetail, getCustomerSummaryList, getCustomerSummarySelectedTabType, getCustomerSummaryTrendFilter, isCustomersTabVisible, } from './view/customerSummaryView/customerSummaryViewSelector';
1279
+ export { getCustomerSummaryAllTransactionsTabData, getCustomerSummaryDetail, getCustomerSummaryList, getCustomerSummarySelectedTabType, getCustomerSummaryTrendFilter, getCustomersTabSettings, isCustomersTabVisible, } from './view/customerSummaryView/customerSummaryViewSelector';
1280
1280
  export type { CustomerSummaryDetailView } from './view/customerSummaryView/customerSummaryViewSelector';
1281
1281
  export { CUSTOMER_REVENUE_KEYS } from './view/customerSummaryView/customerSummaryViewState';
1282
- export type { CustomerAllTransactionsTabData, CustomerDetailTabType, CustomerRevenueKey, CustomerSummary, CustomerSummaryDetailChanges, CustomerSummaryDetailState, CustomerSummarySortKey, CustomerSummaryViewState, } from './view/customerSummaryView/customerSummaryViewState';
1282
+ export type { CustomerAllTransactionsTabData, CustomerDetailTabType, CustomerRevenueKey, CustomerSummary, CustomerSummaryDetailChanges, CustomerSummaryDetailState, CustomerSummaryFigures, CustomerSummaryReference, CustomerSummarySortKey, CustomerSummaryViewState, } from './view/customerSummaryView/customerSummaryViewState';
1283
+ export { fromCustomerEntityId, toCustomerWithSubCustomersId, } from './entity/genericEntity/customerWithSubCustomersId';