@zeniai/client-epic-state 5.2.23 → 5.2.24-betaAK0

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 (86) hide show
  1. package/lib/entity/aiCfo/aiCfoPayload.d.ts +11 -0
  2. package/lib/entity/aiCfo/aiCfoReducer.js +32 -1
  3. package/lib/entity/aiCfo/aiCfoState.d.ts +14 -0
  4. package/lib/entity/file/fileState.d.ts +3 -3
  5. package/lib/entity/file/fileState.js +2 -0
  6. package/lib/entity/invoicing/creditNote/creditNotePayload.d.ts +0 -1
  7. package/lib/entity/invoicing/creditNote/creditNotePayload.js +0 -1
  8. package/lib/entity/invoicing/creditNote/creditNoteState.d.ts +0 -1
  9. package/lib/entity/invoicing/invoice/invoicePayload.d.ts +0 -1
  10. package/lib/entity/invoicing/invoice/invoicePayload.js +0 -1
  11. package/lib/entity/invoicing/invoice/invoiceState.d.ts +0 -1
  12. package/lib/entity/invoicing/invoicingCommonPayload.d.ts +2 -0
  13. package/lib/entity/invoicing/invoicingCustomer/invoicingCustomerPayload.d.ts +0 -1
  14. package/lib/entity/invoicing/invoicingCustomer/invoicingCustomerPayload.js +0 -1
  15. package/lib/entity/invoicing/invoicingCustomer/invoicingCustomerState.d.ts +0 -1
  16. package/lib/entity/invoicing/invoicingSubscription/invoicingSubscriptionPayload.d.ts +1 -2
  17. package/lib/entity/invoicing/invoicingSubscription/invoicingSubscriptionPayload.js +1 -2
  18. package/lib/entity/invoicing/invoicingSubscription/invoicingSubscriptionState.d.ts +1 -2
  19. package/lib/epic.d.ts +2 -1
  20. package/lib/epic.js +2 -0
  21. package/lib/esm/entity/aiCfo/aiCfoReducer.js +32 -1
  22. package/lib/esm/entity/file/fileState.js +2 -0
  23. package/lib/esm/entity/invoicing/creditNote/creditNotePayload.js +0 -1
  24. package/lib/esm/entity/invoicing/invoice/invoicePayload.js +0 -1
  25. package/lib/esm/entity/invoicing/invoicingCustomer/invoicingCustomerPayload.js +0 -1
  26. package/lib/esm/entity/invoicing/invoicingSubscription/invoicingSubscriptionPayload.js +1 -2
  27. package/lib/esm/epic.js +2 -0
  28. package/lib/esm/index.js +2 -2
  29. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +4 -2
  30. package/lib/esm/view/invoicing/dataImportView/dataImportViewSelector.js +2 -0
  31. package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +2 -0
  32. package/lib/esm/view/invoicing/invoicingOverview/invoicingOverviewPayload.js +0 -1
  33. package/lib/esm/view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewSelector.js +2 -1
  34. package/lib/esm/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.js +1 -0
  35. package/lib/esm/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.js +0 -2
  36. package/lib/esm/view/invoicing/settingsView/invoicingBrandingFormConfig.js +5 -0
  37. package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +5 -1
  38. package/lib/esm/view/recommendation/recommendationReducer.js +13 -1
  39. package/lib/esm/view/recommendation/submitRecommendationFeedbackEpic.js +52 -0
  40. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +18 -2
  41. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +0 -1
  42. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +0 -3
  43. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +18 -2
  44. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +0 -1
  45. package/lib/index.d.ts +7 -5
  46. package/lib/index.js +24 -23
  47. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +5 -3
  48. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +2 -5
  49. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +4 -2
  50. package/lib/view/invoicing/dataImportView/dataImportViewSelector.d.ts +2 -0
  51. package/lib/view/invoicing/dataImportView/dataImportViewSelector.js +2 -0
  52. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewPayload.d.ts +1 -0
  53. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.d.ts +1 -1
  54. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +2 -0
  55. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewState.d.ts +1 -0
  56. package/lib/view/invoicing/invoicingOverview/invoicingOverviewPayload.d.ts +0 -1
  57. package/lib/view/invoicing/invoicingOverview/invoicingOverviewPayload.js +0 -1
  58. package/lib/view/invoicing/invoicingOverview/invoicingOverviewState.d.ts +0 -1
  59. package/lib/view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewSelector.d.ts +3 -1
  60. package/lib/view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewSelector.js +1 -0
  61. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.d.ts +2 -0
  62. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.js +1 -0
  63. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.d.ts +2 -2
  64. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.js +0 -2
  65. package/lib/view/invoicing/issueCreditNote/issueCreditNotePayload.d.ts +0 -1
  66. package/lib/view/invoicing/settingsView/invoicingBrandingFormConfig.d.ts +1 -0
  67. package/lib/view/invoicing/settingsView/invoicingBrandingFormConfig.js +5 -0
  68. package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +5 -1
  69. package/lib/view/invoicing/settingsView/settingsViewSelector.js +4 -0
  70. package/lib/view/invoicing/subscriptionAction/subscriptionActionRequestPayload.d.ts +8 -0
  71. package/lib/view/recommendation/recommendationPayload.d.ts +34 -0
  72. package/lib/view/recommendation/recommendationReducer.d.ts +2 -1
  73. package/lib/view/recommendation/recommendationReducer.js +14 -2
  74. package/lib/view/recommendation/submitRecommendationFeedbackEpic.d.ts +7 -0
  75. package/lib/view/recommendation/submitRecommendationFeedbackEpic.js +56 -0
  76. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.d.ts +2 -1
  77. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +18 -2
  78. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +0 -1
  79. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +0 -1
  80. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +0 -3
  81. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +0 -1
  82. package/lib/view/spendManagement/commonHistoryView/commonHistory.d.ts +1 -1
  83. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.d.ts +2 -1
  84. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +18 -2
  85. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +0 -1
  86. package/package.json +1 -1
@@ -12,8 +12,8 @@ import { getClassList, getNestedClassListHierarchy, } from '../../classList/clas
12
12
  import { getAccountsTypesForScheduleDetails } from '../../scheduleView/scheduleDetailView/scheduleDetailLocalDataHelper';
13
13
  import { filterNestedAccountHierarchyById } from '../../scheduleView/scheduleDetailView/scheduleDetailSelector';
14
14
  import { getAccountLabelForScheduleType, getAccountsTypesForScheduleList, } from '../../scheduleView/scheduleListView/scheduleListHelper';
15
- import { getAllSteps } from './getAllStepsHelper';
16
15
  import { ALL_JE_PAGE_TABS, getJESchedulePeriodTabKey, } from '../types/jeSchedulesViewState';
16
+ import { getAllSteps } from './getAllStepsHelper';
17
17
  import { getJEAccountSettingsView } from './jeAccountSettingsViewSelector';
18
18
  import { getNewScheduleView } from './jeNewScheduleViewSelector';
19
19
  // Matches the AI-automation user addresses webc's schedule list row already
@@ -330,7 +330,9 @@ export function getExpenseAutomationJESchedulesView(state) {
330
330
  */
331
331
  const sumToAmount = (schedules) => {
332
332
  const first = schedules[0];
333
- const currency = first != null ? getScheduleAmountObject(first) : allScheduleAmountFallback;
333
+ const currency = first != null
334
+ ? getScheduleAmountObject(first)
335
+ : allScheduleAmountFallback;
334
336
  return {
335
337
  ...currency,
336
338
  amount: sumAmount(schedules),
@@ -1,3 +1,4 @@
1
+ import { invoicingFieldHelpForGroup } from '../invoicingConfigView/invoicingConfigViewSelector';
1
2
  /**
2
3
  * Single bundled view for the invoicing data-import surfaces — consumers read
3
4
  * only this. Carries the migration `sessions` list + `sessionsFetch`, the
@@ -7,6 +8,7 @@
7
8
  export const getInvoicingDataImportView = (state) => {
8
9
  const dataImportState = state.invoicingDataImportViewState;
9
10
  return {
11
+ fieldHelp: invoicingFieldHelpForGroup(state, 'data_import'),
10
12
  activeMigrationSessionId: dataImportState.activeDetailId,
11
13
  sessionDetail: dataImportState.sessionDetail,
12
14
  sessionDetailFetch: dataImportState.sessionDetailFetch,
@@ -34,6 +34,7 @@ export const initialState = {
34
34
  discountStatusOptions: [],
35
35
  dunningCaseStatusOptions: [],
36
36
  invoiceStatusOptions: [],
37
+ subscriptionCancelReasonCodeOptions: [],
37
38
  subscriptionStatusOptions: [],
38
39
  transactionStatusOptions: [],
39
40
  transactionTypeOptions: [],
@@ -103,6 +104,7 @@ export function mapInvoicingConfigPayloadToState(payload) {
103
104
  discountStatusOptions: (payload.discount_status_options ?? []).map(toInvoicingNamedOption),
104
105
  dunningCaseStatusOptions: (payload.dunning_case_status_options ?? []).map(toInvoicingNamedOption),
105
106
  invoiceStatusOptions: (payload.invoice_status_options ?? []).map(toInvoicingNamedOption),
107
+ subscriptionCancelReasonCodeOptions: (payload.subscription_cancel_reason_code_options ?? []).map(toInvoicingNamedOption),
106
108
  subscriptionStatusOptions: (payload.subscription_status_options ?? []).map(toInvoicingNamedOption),
107
109
  transactionStatusOptions: (payload.transaction_status_options ?? []).map(toInvoicingNamedOption),
108
110
  transactionTypeOptions: (payload.transaction_type_options ?? []).map(toInvoicingNamedOption),
@@ -37,7 +37,6 @@ export const mapInvoicingPlanRevenuePointPayloadToState = (payload) => ({
37
37
  mrr: toAmount(payload.mrr, 'USD', '$'),
38
38
  pct: payload.pct,
39
39
  planID: payload.plan,
40
- productCode: payload.product_code,
41
40
  });
42
41
  export const mapInvoicingDashboardSummaryPayloadToState = (payload) => ({
43
42
  customerMovement: {
@@ -1,11 +1,12 @@
1
1
  import { getInvoicingSubscriptionById as getInvoicingSubscriptionByIdFromState } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionSelector';
2
- import { invoicingFieldHelpForGroup } from '../invoicingConfigView/invoicingConfigViewSelector';
2
+ import { getInvoicingConfigView, invoicingFieldHelpForGroup, } from '../invoicingConfigView/invoicingConfigViewSelector';
3
3
  import { getInvoicingSubscriptionActionState } from '../subscriptionAction/subscriptionActionSelector';
4
4
  export const getInvoicingSubscriptionById = (state, id) => getInvoicingSubscriptionByIdFromState(state.invoicingSubscriptionState, id);
5
5
  export const getInvoicingSubscriptionDetail = (state, invoicingSubscriptionID) => {
6
6
  const { error, fetchState } = state.invoicingSubscriptionDetailViewState;
7
7
  return {
8
8
  fieldHelp: invoicingFieldHelpForGroup(state, 'subscription'),
9
+ cancelReasonCodeOptions: getInvoicingConfigView(state).subscriptionCancelReasonCodeOptions,
9
10
  actionState: getInvoicingSubscriptionActionState(invoicingSubscriptionID)(state),
10
11
  subscription: getInvoicingSubscriptionById(state, invoicingSubscriptionID),
11
12
  fetchState,
@@ -28,6 +28,7 @@ export const getInvoicingSubscriptionListView = createSelector((state) => state.
28
28
  count: listViewState.counts,
29
29
  countsFetchState: listViewState.countsFetchState,
30
30
  subscriptionCommercialEditAllowedFromStatuses: configState.subscriptionCommercialEditAllowedFromStatuses,
31
+ cancelReasonCodeOptions: configState.subscriptionCancelReasonCodeOptions,
31
32
  subscriptionLifecycleActionOptions: configState.subscriptionLifecycleActionOptions,
32
33
  subscriptionMetadataEditAllowedFromStatuses: configState.subscriptionMetadataEditAllowedFromStatuses,
33
34
  statusOptions,
@@ -3,7 +3,6 @@ export const ALL_INVOICING_SUBSCRIPTION_SORT_KEYS = [
3
3
  'subscription',
4
4
  'customer',
5
5
  'plan',
6
- 'product_code',
7
6
  'term_end',
8
7
  'next_billing',
9
8
  'auto_collect',
@@ -15,7 +14,6 @@ export const INVOICING_SUBSCRIPTION_COLUMNS = [
15
14
  { key: 'subscription', sortable: true },
16
15
  { key: 'customer', sortable: false },
17
16
  { key: 'plan', sortable: true },
18
- { key: 'product_code', sortable: true },
19
17
  { key: 'term_end', sortable: true },
20
18
  { key: 'next_billing', sortable: true },
21
19
  { key: 'auto_collect', sortable: true },
@@ -7,6 +7,7 @@ export const initialInvoicingBrandingFormLocalData = {
7
7
  dateFormat: '',
8
8
  defaultMemo: '',
9
9
  email: '',
10
+ invoiceFooterText: '',
10
11
  invoicePrefix: '',
11
12
  logoFileId: '',
12
13
  phone: '',
@@ -19,6 +20,7 @@ export const entityToInvoicingBrandingFormLocalData = (settings) => ({
19
20
  dateFormat: settings?.date_format ?? '',
20
21
  defaultMemo: settings?.default_memo ?? '',
21
22
  email: settings?.email ?? '',
23
+ invoiceFooterText: settings?.invoice_footer_text ?? '',
22
24
  invoicePrefix: settings?.invoice_prefix ?? '',
23
25
  logoFileId: settings?.logo_file_id ?? '',
24
26
  phone: settings?.phone ?? '',
@@ -39,6 +41,9 @@ export const brandingLocalDataToSettingsPayload = (localData, address) => ({
39
41
  date_format: trimOrUndefined(localData.dateFormat),
40
42
  default_memo: trimOrUndefined(localData.defaultMemo),
41
43
  email: trimOrUndefined(localData.email),
44
+ // Sent even when blank: "" is how the API is told to hide the footer line,
45
+ // so this one must not collapse to `undefined` like the fields above.
46
+ invoice_footer_text: localData.invoiceFooterText.trim(),
42
47
  invoice_prefix: trimOrUndefined(localData.invoicePrefix),
43
48
  logo_file_id: localData.logoFileId,
44
49
  phone: trimOrUndefined(localData.phone),
@@ -1,6 +1,6 @@
1
1
  import { getInvoicingQboAccountMappingId, } from '../../../entity/invoicing/invoicingCommonPayload';
2
2
  import { getFormattedAddress } from '../../addressView/addressViewSelector';
3
- import { getInvoicingConfigView } from '../invoicingConfigView/invoicingConfigViewSelector';
3
+ import { getInvoicingConfigView, invoicingFieldHelpForGroup, } from '../invoicingConfigView/invoicingConfigViewSelector';
4
4
  import { getInvoicingQboView, isInvoicingAccountingPickerDataLoading, } from '../invoicingQboView/invoicingQboViewSelector';
5
5
  import { INVOICING_BUSINESS_ADDRESS_TYPE, entityToInvoicingBrandingFormLocalData, } from './invoicingBrandingFormConfig';
6
6
  import { initialInvoicingQboSettingsLocalData, } from './invoicingQboSettingsFormConfig';
@@ -26,6 +26,7 @@ export const getInvoicingSettingsFetchState = (state) => ({
26
26
  export const getInvoicingSettingsView = (state) => {
27
27
  const { error, fetchState, saveFetchState, settings, stripeFetchState } = state.invoicingSettingsViewState;
28
28
  return {
29
+ fieldHelp: invoicingFieldHelpForGroup(state, 'settings'),
29
30
  error,
30
31
  fetchState,
31
32
  saveState: saveFetchState,
@@ -78,6 +79,7 @@ export const getInvoicingSettingsHubView = (state) => {
78
79
  const { dunningScheduleActionOptions, enableState, error: configError, fetchState: configFetchState, qboAccountMappingKindOptions, qboCustomerMatchingOptions, qboSyncStatusOptions, status, } = getInvoicingConfigView(state);
79
80
  const { canEnable, isQboConfigured, isStripeConnected } = deriveInvoicingEnablePrerequisites(state.invoicingSettingsViewState.settings, state.invoicingQboViewState.connection?.connected === true, qboAccountMappingKindOptions);
80
81
  return {
82
+ fieldHelp: invoicingFieldHelpForGroup(state, 'settings'),
81
83
  // Keeps the onboarding step in the gate: a tenant that has not accepted the
82
84
  // terms cannot enable invoicing, whatever the integrations say.
83
85
  canEnableInvoicing: status === 'settings' && canEnable,
@@ -108,6 +110,7 @@ export const getInvoicingQboSettingsFormView = (state) => {
108
110
  const { fetchState: configFetchState, qboAccountMappingKindOptions, qboCustomerMatchingOptions, qboSyncStatusOptions, } = getInvoicingConfigView(state);
109
111
  const qboView = getInvoicingQboView(state);
110
112
  return {
113
+ fieldHelp: invoicingFieldHelpForGroup(state, 'settings'),
111
114
  accountMappingKindOptions: qboAccountMappingKindOptions,
112
115
  accounts: qboView.accounts,
113
116
  backfillState: qboView.backfillState,
@@ -147,6 +150,7 @@ export const getInvoicingBrandingFormView = (state) => {
147
150
  ? getFormattedAddress(newAddress.addressToCreate)
148
151
  : undefined;
149
152
  return {
153
+ fieldHelp: invoicingFieldHelpForGroup(state, 'settings'),
150
154
  addressLabel,
151
155
  dateFormatOptions: getInvoicingConfigView(state).dateFormatOptions,
152
156
  localData: brandingDraft ?? entityToInvoicingBrandingFormLocalData(settings),
@@ -131,6 +131,18 @@ const recommendation = createSlice({
131
131
  };
132
132
  },
133
133
  },
134
+ // Fire-and-forget human feedback on a recommendation (accept, ranked
135
+ // override or outside override). Handled by submitRecommendationFeedbackEpic
136
+ // which POSTs to the accounting recommendation-feedback endpoint. No state
137
+ // mutation: the categorization UX must not depend on the feedback round-trip.
138
+ submitRecommendationFeedback: {
139
+ reducer() {
140
+ // Fire-and-forget: no state mutation; the epic performs the POST.
141
+ },
142
+ prepare(args) {
143
+ return { payload: args };
144
+ },
145
+ },
134
146
  },
135
147
  extraReducers: (builder) => {
136
148
  builder.addCase(clearAll, (draft) => {
@@ -138,7 +150,7 @@ const recommendation = createSlice({
138
150
  });
139
151
  },
140
152
  });
141
- export const { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityName, fetchRecommendationByEntityId, updateRecommendationForEntity, updateRecommendationForEntityFailure, indicateReadyToInitializeRecommendation, } = recommendation.actions;
153
+ export const { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityName, fetchRecommendationByEntityId, updateRecommendationForEntity, updateRecommendationForEntityFailure, indicateReadyToInitializeRecommendation, submitRecommendationFeedback, } = recommendation.actions;
142
154
  export default recommendation.reducer;
143
155
  const doUpdateRecommendationForEntity = (draft, entityId, entityType, payload) => {
144
156
  const key = getEntityRecommendationKey(entityType, entityId);
@@ -0,0 +1,52 @@
1
+ import { EMPTY } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { isSuccessStatus } from '../../responsePayload';
4
+ import { submitRecommendationFeedback } from './recommendationReducer';
5
+ const toRequestBody = (payload) => ({
6
+ line_id: payload.lineId ?? null,
7
+ dimension: payload.dimension,
8
+ recommendation_set_id: payload.recommendationSetId ?? null,
9
+ top_pick_source: payload.topPickSource ?? null,
10
+ shown_recommendations: (payload.shownRecommendations ?? []).map((recommendation) => ({
11
+ source: recommendation.source,
12
+ rank: recommendation.rank,
13
+ value: {
14
+ name: recommendation.value.name,
15
+ id: recommendation.value.id ?? null,
16
+ integration_id: recommendation.value.integrationId ?? null,
17
+ },
18
+ confidence: recommendation.confidence ?? null,
19
+ reasoning: recommendation.reasoning ?? null,
20
+ cot: recommendation.cot ?? [],
21
+ })),
22
+ selected: {
23
+ name: payload.selected.name,
24
+ id: payload.selected.id ?? null,
25
+ integration_id: payload.selected.integrationId ?? null,
26
+ is_new_entity: payload.selected.isNewEntity ?? false,
27
+ },
28
+ matched_source: payload.matchedSource ?? null,
29
+ matched_rank: payload.matchedRank ?? null,
30
+ outcome: payload.outcome,
31
+ reason_text: payload.reasonText ?? null,
32
+ skipped: payload.skipped ?? false,
33
+ retracts_feedback_id: payload.retractsFeedbackId ?? null,
34
+ features: payload.features ?? null,
35
+ });
36
+ // Fire-and-forget: the epic never re-emits an action. Feedback delivery is a
37
+ // side-effect that must not disrupt the categorization UX, so both the
38
+ // success and error paths complete silently (errors are logged for debugging).
39
+ export const submitRecommendationFeedbackEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(submitRecommendationFeedback.match), mergeMap((action) => {
40
+ const { transactionId } = action.payload;
41
+ return zeniAPI
42
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.accountMicroServiceBaseUrl}/1.0/transactions/${transactionId}/recommendation-feedback`, toRequestBody(action.payload))
43
+ .pipe(mergeMap((response) => {
44
+ if (!isSuccessStatus(response)) {
45
+ console.error('submitRecommendationFeedbackEpic: recommendation feedback was not recorded', response.status);
46
+ }
47
+ return EMPTY;
48
+ }), catchError((error) => {
49
+ console.error('submitRecommendationFeedbackEpic: failed to submit recommendation feedback', error);
50
+ return EMPTY;
51
+ }));
52
+ }));
@@ -2,13 +2,20 @@ import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { updateApprovalRules } from '../../../../../entity/approvalRule/approvalRuleReducer';
4
4
  import { getApprovalRulesByIds } from '../../../../../entity/approvalRule/approvalRuleSelector';
5
+ import { getIsAccountingClassesEnabled } from '../../../../../entity/tenant/tenantSelector';
5
6
  import { updateAllUsers } from '../../../../../entity/user/userReducer';
6
7
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
8
+ import { fetchClassList } from '../../../../classList/classListReducer';
7
9
  import { fetchBillPaySetupApproverView, fetchBillPaySetupApproverViewFailure, fetchBillPaySetupApproverViewSuccess, } from '../billPaySetupApproverViewReducer';
8
10
  export const fetchBillPaySetupApproverViewEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchBillPaySetupApproverView.match), switchMap((action) => {
9
11
  const { cacheOverride, useV3 } = action.payload;
10
- const { billPaySetupApproverViewState, approvalRuleState } = state$.value;
12
+ const { billPaySetupApproverViewState, approvalRuleState, classListState } = state$.value;
13
+ const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state$.value);
11
14
  const approvalRules = getApprovalRulesByIds(approvalRuleState, billPaySetupApproverViewState.approvalRuleIds);
15
+ const shouldFetchClassList = isAccountingClassesEnabled &&
16
+ (cacheOverride === true ||
17
+ (classListState.hasValidState() === false &&
18
+ classListState.fetchState !== 'In-Progress'));
12
19
  if (cacheOverride === true ||
13
20
  approvalRules.length !==
14
21
  billPaySetupApproverViewState.approvalRuleIds.length ||
@@ -28,6 +35,9 @@ export const fetchBillPaySetupApproverViewEpic = (actions$, state$, zeniAPI) =>
28
35
  updateApprovalRules(response.data.approval_rules),
29
36
  fetchBillPaySetupApproverViewSuccess(approvalRuleIds),
30
37
  ];
38
+ if (shouldFetchClassList) {
39
+ actions.push(fetchClassList());
40
+ }
31
41
  return from(actions);
32
42
  }
33
43
  else {
@@ -37,6 +47,12 @@ export const fetchBillPaySetupApproverViewEpic = (actions$, state$, zeniAPI) =>
37
47
  }
38
48
  else {
39
49
  const { approvalRuleIds } = billPaySetupApproverViewState;
40
- return of(fetchBillPaySetupApproverViewSuccess(approvalRuleIds));
50
+ const actions = [
51
+ fetchBillPaySetupApproverViewSuccess(approvalRuleIds),
52
+ ];
53
+ if (shouldFetchClassList) {
54
+ actions.push(fetchClassList());
55
+ }
56
+ return from(actions);
41
57
  }
42
58
  }));
@@ -21,7 +21,6 @@ export const initializeBillPaySetupApproverViewUpdateDataEpic = (actions$, state
21
21
  name: approvalRule.name,
22
22
  description: approvalRule.description,
23
23
  separationOfDuties: approvalRule.separationOfDuties,
24
- isFallback: approvalRule.isFallback,
25
24
  };
26
25
  fetchActions.push(clearBillPaySetupApproverViewUpdateData(), saveBillPaySetupApproverViewUpdateData(billPaySetupApproverViewUpdateData));
27
26
  }
@@ -86,9 +86,6 @@ export const toApprovalChangableInfoPayload = (approverViewUpdateData) => {
86
86
  payload.is_separation_of_duty_enabled =
87
87
  approverViewUpdateData.separationOfDuties;
88
88
  }
89
- if (approverViewUpdateData.isFallback != null) {
90
- payload.is_fallback = approverViewUpdateData.isFallback;
91
- }
92
89
  if (isUpdate) {
93
90
  payload.approval_rule_id = approverViewUpdateData.approvalRuleId;
94
91
  }
@@ -2,13 +2,20 @@ import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { updateApprovalRules } from '../../../../../entity/approvalRule/approvalRuleReducer';
4
4
  import { getApprovalRulesByIds } from '../../../../../entity/approvalRule/approvalRuleSelector';
5
+ import { getIsAccountingClassesEnabled } from '../../../../../entity/tenant/tenantSelector';
5
6
  import { updateAllUsers } from '../../../../../entity/user/userReducer';
6
7
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
8
+ import { fetchClassList } from '../../../../classList/classListReducer';
7
9
  import { fetchRemiSetupApproverView, fetchRemiSetupApproverViewFailure, fetchRemiSetupApproverViewSuccess, } from '../remiSetupApproverViewReducer';
8
10
  export const fetchRemiSetupApproverViewEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchRemiSetupApproverView.match), switchMap((action) => {
9
11
  const { cacheOverride, resolveAttributeToUser, includeImplicitActors, useV3, } = action.payload;
10
- const { remiSetupApproverViewState, approvalRuleState } = state$.value;
12
+ const { remiSetupApproverViewState, approvalRuleState, classListState } = state$.value;
13
+ const isAccountingClassesEnabled = getIsAccountingClassesEnabled(state$.value);
11
14
  const approvalRules = getApprovalRulesByIds(approvalRuleState, remiSetupApproverViewState.approvalRuleIds);
15
+ const shouldFetchClassList = isAccountingClassesEnabled &&
16
+ (cacheOverride === true ||
17
+ (classListState.hasValidState() === false &&
18
+ classListState.fetchState !== 'In-Progress'));
12
19
  if (cacheOverride === true ||
13
20
  approvalRules.length !==
14
21
  remiSetupApproverViewState.approvalRuleIds.length ||
@@ -30,6 +37,9 @@ export const fetchRemiSetupApproverViewEpic = (actions$, state$, zeniAPI) => act
30
37
  updateApprovalRules(response.data.approval_rules),
31
38
  fetchRemiSetupApproverViewSuccess(approvalRuleIds),
32
39
  ];
40
+ if (shouldFetchClassList) {
41
+ actions.push(fetchClassList());
42
+ }
33
43
  return from(actions);
34
44
  }
35
45
  else {
@@ -39,6 +49,12 @@ export const fetchRemiSetupApproverViewEpic = (actions$, state$, zeniAPI) => act
39
49
  }
40
50
  else {
41
51
  const { approvalRuleIds } = remiSetupApproverViewState;
42
- return of(fetchRemiSetupApproverViewSuccess(approvalRuleIds));
52
+ const actions = [
53
+ fetchRemiSetupApproverViewSuccess(approvalRuleIds),
54
+ ];
55
+ if (shouldFetchClassList) {
56
+ actions.push(fetchClassList());
57
+ }
58
+ return from(actions);
43
59
  }
44
60
  }));
@@ -21,7 +21,6 @@ export const initializeRemiSetupApproverViewUpdateDataEpic = (actions$, state$)
21
21
  name: approvalRule.name,
22
22
  description: approvalRule.description,
23
23
  separationOfDuties: approvalRule.separationOfDuties,
24
- isFallback: approvalRule.isFallback,
25
24
  };
26
25
  fetchActions.push(clearRemiSetupApproverViewUpdateData(), saveRemiSetupApproverViewUpdateData(remiSetupApproverViewUpdateData));
27
26
  }
package/lib/index.d.ts CHANGED
@@ -311,15 +311,15 @@ import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './v
311
311
  import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
312
312
  import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
313
313
  import { NewAccrualAccountsView, NewScheduleSearchTransactionsView, NewScheduleView } from './view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes';
314
- import { ExpenseAutomationJESchedulesViewSelector, JEKpiSummary } from './view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes';
314
+ import { ExpenseAutomationJESchedulesViewSelector, JEKpiSummary, JEScheduleRow } from './view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes';
315
315
  import { BulkUploadSelectorData, ExpenseAutomationMissingReceiptsViewSelector } from './view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes';
316
316
  import { CompletedTransactionsSelectorData, ResolvedBatchDetails, ResolvedBatchFile, ResolvedCandidate } from './view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes';
317
317
  import { AccountReconSectionID, AccountReconciliationByAccount, AccountReconciliationBySection, ExpenseAutomationReconciliationViewSelector } from './view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes';
318
318
  import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView } from './view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes';
319
319
  import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
320
320
  import { getNewAccrualAccountsView as getJeNewAccrualAccountsView, getNewScheduleSearchTransactionsView as getJeNewScheduleSearchTransactionsView, getNewScheduleView as getJeNewScheduleView } from './view/expenseAutomationView/selectors/jeNewScheduleViewSelector';
321
- import { ExpenseAutomationJEOneTimeAccrualDetailView, JEScheduleRow } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
322
321
  import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeScheduledTransactionWithFailedEntries';
322
+ import { ExpenseAutomationJEOneTimeAccrualDetailView } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
323
323
  import { getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatementOverrideWarning, getLedgerAccountsForCombinedStatementMapping, getReparseStatementStatusByAccountId, getUnavailableLedgerAccountIds, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
324
324
  import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
325
325
  import { applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
@@ -420,7 +420,7 @@ import { ProfitAndLossProjectViewReport } from './view/profitAndLossProjectView/
420
420
  import { ProfitAndLossProjectViewUIState } from './view/profitAndLossProjectView/profitAndLossProjectViewState';
421
421
  import { fetchProjectList } from './view/projectList/projectListReducer';
422
422
  import { ProjectListSelectorView, getProjectList } from './view/projectList/projectListSelector';
423
- import { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityId, fetchRecommendationByEntityName } from './view/recommendation/recommendationReducer';
423
+ import { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityId, fetchRecommendationByEntityName, submitRecommendationFeedback } from './view/recommendation/recommendationReducer';
424
424
  import { DEFAULT_REFERRER_AMOUNT, clearReferrals, fetchReferrals, fetchRewardsPlan, resendReferralInvite, saveReferralFormDataInLocalStore, sendReferralInvite, updateReferViewed, updateReferralListSortUiState } from './view/referralView/referralReducer';
425
425
  import { ReferralListSelectorView, RewardsPlanCardReport, getInviteFormView, getReferralListView, getRewardsPlanCard } from './view/referralView/referralSelector';
426
426
  import { AmountStatusTypes, InviteCompanyLocalData, ReferralAmountStatus, ReferralInvitation, ReferralListViewSortKey, ReferralStatus, ReferralViewState, ReferralViewUIState, RewardsPlanData, StatusTypes, toReferralListViewSortKeyType } from './view/referralView/referralState';
@@ -908,8 +908,9 @@ export { Filing1099TinType };
908
908
  export { BillPayCardReport };
909
909
  export { ReimbursementCardReport };
910
910
  export { VendorListViewSortKey, VendorViewUIState, VendorListSelectorView, VendorListQuery, getVendorList, VendorListView, updateSortUiState, updatePageToken, updateYTDSelectionUIState, VendorListViewYTDSpendSortKey, isColumnYTDSpend, isVendorsTabVisible, VendorViewType, VendorReportIDType, toVendorReportIDType, VendorFiling1099ListSelectorView, getVendorFiling1099List, VendorFiling1099ListViewSortKey, VendorFiling1099ViewUIState, VendorFiling1099DownloadData, fetchVendorsFiling1099Download, Type1099Download, VendorFiling1099DownloadDataForType, };
911
- export { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityId, fetchRecommendationByEntityName, };
911
+ export { fetchEntityRecommendationsByTransactionId, fetchEntityRecommendationsForLineUpdate, fetchRecommendationByEntityId, fetchRecommendationByEntityName, submitRecommendationFeedback, };
912
912
  export type { FetchEntityRecommendationsForLineUpdatePayload, RecommendationLineUpdateFlowType, } from './view/recommendation/recommendationReducer';
913
+ export type { RecommendationFeedbackDimension, RecommendationFeedbackOutcome, RecommendationFeedbackSource, RecommendationFeedbackValue, ShownRecommendationForFeedback, SubmitRecommendationFeedbackPayload, } from './view/recommendation/recommendationPayload';
913
914
  export { fetchOwnerList };
914
915
  export { ZeniAccountsConfigSelectorView, getZeniAccountsConfigDetail, ZeniAccountListSelectorView, getZeniAccountList, fetchZeniAccountList, fetchAccountList, DepositAccount, createCheckingAccount, fetchPaymentAccountList, unlinkPaymentAccount, getDepositAccountDetail, DepositAccountDetailSelectorView, DepositAccountListSelectorView, getAllDepositAccounts, getDepositAccountDetailForPDF, DepositAccountDetailForPDF, fetchDepositAccount, fetchZeniAccountsConfig, AccountHistoryWithBalances, TransferDetailLocalData, ReviewTransferDetail, updateTransferMoneyLocalData, updateTransferToLocalData, updateDepositToLocalData, transferMoney, getTransferDetail, TransferDetailSelectorView, clearTransferDetail, clearReviewTransferDetail, fetchReviewTransferDetail, fetchDepositAccountDetail, DepositAccountTransaction, DepositAccountWithAutoTransferRules, DepositTransactionStatusCode, DepositTransactionStatus, CheckDepositLocalData, depositCheck, updateCheckDepositLocalData, clearCheckDeposit, CheckDepositSelectorView, getCheckDepositDetail, updateDepositAccount, fetchDepositAccountHistorySuccess, fetchDepositAccountHistoryFailure, DepositAccountUpdateType, ZeniAccountSummaryWithBalance, fetchZeniAccStatementPage, getZeniAccStatements, ZeniAccStatementsSelectorView, ZeniAccountPaymentMethod, };
915
916
  export { CommonHistoryView, HistoricEvent, HistoricEventUpdate, ActivityHistorySelectorView, };
@@ -983,7 +984,7 @@ export { AiCfoViewSelector, getAiCfoView, getSuggestedQuestionsForPageContext, g
983
984
  export { MessagePayload, ChatSessionPayload, AiCfoAnswerPayload, } from './entity/aiCfo/aiCfoPayload';
984
985
  export { setNewSession, setSessions, updateAiCfoAnswerCardPolicyWizardPlan, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearSession, toAiCfoExports, toAiCfoVisualization, appendSyntheticAiCfoAnswer, updateSyntheticAiCfoAnswer, removeSyntheticAiCfoAnswer, } from './entity/aiCfo/aiCfoReducer';
985
986
  export { AiCfoSelectorView, getAllQuestionAnswersForChatSession, getQuestionAnswerByIdForChatSession, getAllQuestionsForChatSession, getAiCfoSelectorView, getSyntheticAiCfoAnswersForChatSession, getSyntheticAiCfoAnswerByQuestionAnswerId, ChatSessionWithOrderedQuestionAnswers, } from './entity/aiCfo/aiCfoSelector';
986
- export { AiCfoQuestionWithAnswer, AiCfoAnswerParagraph, AiCfoAnswerStateType, AiCfoChartType, AiCfoAnswerResponseType, TableVisualization, ChartVisualization, CardNameOption, CardsCardKind, CardsCreationInitialData, CardPolicyDraftPolicy, CardPolicyDraftPolicyEntity, CardPolicyInitialData, CardPolicySpendLimits, CardPolicyStep5Review, CardPolicyUploadSource, CardPolicyWizardPlan, InteractiveFormType, InteractiveFormVisualization, AiCfoExport, AiCfoVisualization, AiCfoVisualizationType, AiCfoState, ChatSession, ALL_AI_CFO_CHARTS_TYPES, ALL_AI_CFO_VISUALIZATION_TYPES, ALL_AI_CFO_ANSWER_STATE_TYPES, ALL_AI_CFO_ANSWER_RESPONSE_TYPES, ALL_INTERACTIVE_FORM_TYPES, toAiCfoVisualizationType, toAiCfoVisualizationTypeStrict, toAiCfoChartType, toAiCfoChartTypeStrict, toAiCfoAnswerStateType, toAiCfoAnswerStateTypeStrict, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toInteractiveFormType, toInteractiveFormTypeStrict, ChatSessionWithMessages, ResponseBlockBase, AnswerContentBlockBase, FileAttachmentMetadata, QuestionContentBlockBase, ResponseBlockType, SyntheticAiCfoAnswer, SyntheticAiCfoAnswerKind, ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS, toMessageSender, toMessageType, MessageSender, MessageType, } from './entity/aiCfo/aiCfoState';
987
+ export { AiCfoQuestionWithAnswer, AiCfoAnswerParagraph, AiCfoAnswerStateType, AiCfoChartType, AiCfoAnswerResponseType, TableVisualization, ChartVisualization, CardNameOption, CardsCardKind, CardsCreationInitialData, CardPolicyDraftPolicy, CardPolicyDraftPolicyEntity, CardPolicyInitialData, CardPolicySpendLimits, CardPolicyStep5Review, CardPolicyUploadSource, CardPolicyWizardPlan, InteractiveFormType, InteractiveFormVisualization, AiCfoCapabilityPromo, AiCfoCapabilityPromoCta, AiCfoCapabilityPromoSurface, AiCfoExport, AiCfoVisualization, AiCfoVisualizationType, AiCfoState, ChatSession, ALL_AI_CFO_CHARTS_TYPES, ALL_AI_CFO_VISUALIZATION_TYPES, ALL_AI_CFO_ANSWER_STATE_TYPES, ALL_AI_CFO_ANSWER_RESPONSE_TYPES, ALL_INTERACTIVE_FORM_TYPES, toAiCfoVisualizationType, toAiCfoVisualizationTypeStrict, toAiCfoChartType, toAiCfoChartTypeStrict, toAiCfoAnswerStateType, toAiCfoAnswerStateTypeStrict, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toInteractiveFormType, toInteractiveFormTypeStrict, ChatSessionWithMessages, ResponseBlockBase, AnswerContentBlockBase, FileAttachmentMetadata, QuestionContentBlockBase, ResponseBlockType, SyntheticAiCfoAnswer, SyntheticAiCfoAnswerKind, ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS, toMessageSender, toMessageType, MessageSender, MessageType, } from './entity/aiCfo/aiCfoState';
987
988
  export { clearPolicyDocumentExtraction, extractPolicyDocument, fetchCardPolicyMccCategories, fetchCardPolicyRecommendationFromUpload, fetchCardPolicyVendorOptions, removeCardPolicyTemplate, updateCardPolicyMccCategories, updateCardPolicyMccCategoriesFailure, updateCardPolicyStats, updateCardPolicyTemplates, updateCardPolicyVendorOptions, updateCardPolicyVendorOptionsFailure, updateCreatedCardPolicyTemplate, updatePolicyDocumentExtractionFailure, updatePolicyDocumentExtractionSuccess, updatePolicyRecommendationFromUploadFailure, updatePolicyRecommendationFromUploadSuccess, } from './entity/cardPolicy/cardPolicyReducer';
988
989
  export { getAllCardPolicyTemplates, getCardPolicyMccCategories, getCardPolicyMccCategoriesError, getCardPolicyMccCategoriesFetchState, getCardPolicyStats, getCardPolicySuggestedAllowCategories, getCardPolicySuggestedAllowMerchants, getCardPolicySuggestedBlockCategories, getCardPolicySuggestedBlockMerchants, getCardPolicyTemplateById, getCardPolicyTemplatesByIds, getCardPolicyVendorSearchFetchState, getCardPolicyVendorSearchOptions, getCardPolicyVendorSearchString, getExtractedCardPolicyRules, getPolicyDocumentExtractionError, getPolicyDocumentExtractionFetchState, getPolicyRecommendationFromUploadAnswerId, getPolicyRecommendationFromUploadChatSessionId, getPolicyRecommendationFromUploadError, getPolicyRecommendationFromUploadFetchState, getUploadedPolicyDocumentFileName, } from './entity/cardPolicy/cardPolicySelector';
989
990
  export { ALL_CARD_POLICY_TEMPLATE_MODES, ALL_CARD_POLICY_TEMPLATE_STATUSES, CardPolicyState, CardPolicyStats, CardPolicyTemplate, CardPolicyTemplateEntityList, CardPolicyTemplateMode, CardPolicyTemplateSpendLimits, CardPolicyTemplateStatus, CardPolicyVendorSearchEntry, CardPolicyVendorSearchState, ExtractedCardPolicyRules, MccCategory, PolicyDocumentExtractionState, PolicyRecommendationFromUploadState, toCardPolicyTemplateMode, toCardPolicyTemplateStatus, } from './entity/cardPolicy/cardPolicyState';
@@ -1149,6 +1150,7 @@ export { getInvoicingDiscountActionState } from './view/invoicing/discountAction
1149
1150
  export { runInvoicingSubscriptionAction } from './view/invoicing/subscriptionAction/subscriptionActionReducer';
1150
1151
  export type { InvoicingSubscriptionActionState } from './view/invoicing/subscriptionAction/subscriptionActionState';
1151
1152
  export type { RunInvoicingSubscriptionActionPayload } from './view/invoicing/subscriptionAction/subscriptionActionReducer';
1153
+ export type { InvoicingCancelSubscriptionValues } from './view/invoicing/subscriptionAction/subscriptionActionRequestPayload';
1152
1154
  export { getInvoicingSubscriptionActionState } from './view/invoicing/subscriptionAction/subscriptionActionSelector';
1153
1155
  export { runInvoicingDunningAction } from './view/invoicing/dunningAction/dunningActionReducer';
1154
1156
  export type { InvoicingDunningActionState } from './view/invoicing/dunningAction/dunningActionState';