@zeniai/client-epic-state 5.2.73 → 5.2.74

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 (118) hide show
  1. package/lib/entity/aiCfo/aiCfoState.d.ts +2 -2
  2. package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
  3. package/lib/entity/chargeCardTransaction/chargeCardTransaction.d.ts +1 -1
  4. package/lib/entity/depositAccountTransaction/depositAccountTransaction.d.ts +1 -1
  5. package/lib/entity/invoicing/{product/productPayload.d.ts → invoicingCatalog/invoicingCatalogPayload.d.ts} +44 -6
  6. package/lib/entity/invoicing/{product/productPayload.js → invoicingCatalog/invoicingCatalogPayload.js} +50 -6
  7. package/lib/entity/invoicing/invoicingCatalog/invoicingCatalogReducer.d.ts +12 -0
  8. package/lib/entity/invoicing/{plan/planReducer.js → invoicingCatalog/invoicingCatalogReducer.js} +20 -21
  9. package/lib/entity/invoicing/{plan/planSelector.d.ts → invoicingCatalog/invoicingCatalogSelector.d.ts} +5 -6
  10. package/lib/entity/invoicing/{plan/planSelector.js → invoicingCatalog/invoicingCatalogSelector.js} +12 -12
  11. package/lib/entity/invoicing/{product/productState.d.ts → invoicingCatalog/invoicingCatalogState.d.ts} +42 -6
  12. package/lib/entity/jeSchedules/jeSchedulesTypes.d.ts +4 -4
  13. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  14. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  15. package/lib/epic.d.ts +3 -2
  16. package/lib/epic.js +3 -1
  17. package/lib/esm/entity/invoicing/{product/productPayload.js → invoicingCatalog/invoicingCatalogPayload.js} +46 -3
  18. package/lib/esm/entity/invoicing/{plan/planReducer.js → invoicingCatalog/invoicingCatalogReducer.js} +19 -20
  19. package/lib/esm/entity/invoicing/{plan/planSelector.js → invoicingCatalog/invoicingCatalogSelector.js} +8 -8
  20. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  21. package/lib/esm/epic.js +3 -1
  22. package/lib/esm/index.js +6 -9
  23. package/lib/esm/reducer.js +4 -7
  24. package/lib/esm/view/invoicing/createInvoice/createInvoiceEpic.js +9 -1
  25. package/lib/esm/view/invoicing/createInvoice/createInvoiceSelector.js +1 -1
  26. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +5 -3
  27. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/fetchInvoicingCatalogItemDetailEpic.js +2 -2
  28. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogPlanActionEpic.js +2 -2
  29. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogProductActionEpic.js +4 -4
  30. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +3 -7
  31. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/seedInvoicingCatalogItemFormDraftEpic.js +2 -2
  32. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.js +5 -1
  33. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.js +27 -1
  34. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +5 -1
  35. package/lib/esm/view/invoicing/invoiceList/invoiceListReducer.js +8 -1
  36. package/lib/esm/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogPlanListEpic.js +2 -2
  37. package/lib/esm/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogProductListEpic.js +2 -2
  38. package/lib/esm/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector.js +55 -22
  39. package/lib/esm/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState.js +1 -20
  40. package/lib/esm/view/spendManagement/commonSetup/epic/setup/resetKycKybEpic.js +37 -0
  41. package/lib/esm/view/spendManagement/commonSetup/setupViewReducer.js +21 -1
  42. package/lib/esm/view/spendManagement/commonSetup/setupViewSelector.js +2 -1
  43. package/lib/index.d.ts +9 -13
  44. package/lib/index.js +39 -45
  45. package/lib/reducer.d.ts +1 -2
  46. package/lib/reducer.js +4 -7
  47. package/lib/rootStateTypes.d.ts +3 -5
  48. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  49. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +2 -2
  50. package/lib/view/invoicing/createInvoice/createInvoiceEpic.d.ts +3 -2
  51. package/lib/view/invoicing/createInvoice/createInvoiceEpic.js +8 -0
  52. package/lib/view/invoicing/createInvoice/createInvoiceSelector.d.ts +2 -2
  53. package/lib/view/invoicing/createInvoice/createInvoiceSelector.js +2 -2
  54. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.d.ts +8 -9
  55. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.d.ts +2 -2
  56. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +5 -3
  57. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/fetchInvoicingCatalogItemDetailEpic.d.ts +2 -2
  58. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/fetchInvoicingCatalogItemDetailEpic.js +2 -2
  59. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormHelper.d.ts +3 -4
  60. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogPlanActionEpic.d.ts +2 -2
  61. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogPlanActionEpic.js +2 -2
  62. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogProductActionEpic.d.ts +2 -3
  63. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/runInvoicingCatalogProductActionEpic.js +4 -4
  64. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.d.ts +2 -3
  65. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +3 -7
  66. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/seedInvoicingCatalogItemFormDraftEpic.js +2 -2
  67. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.d.ts +3 -1
  68. package/lib/view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer.js +6 -2
  69. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.d.ts +3 -2
  70. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector.js +29 -2
  71. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.d.ts +3 -1
  72. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +5 -1
  73. package/lib/view/invoicing/invoiceList/invoiceListReducer.d.ts +3 -1
  74. package/lib/view/invoicing/invoiceList/invoiceListReducer.js +9 -2
  75. package/lib/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogListPageEpic.d.ts +2 -2
  76. package/lib/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogPlanListEpic.d.ts +2 -2
  77. package/lib/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogPlanListEpic.js +2 -2
  78. package/lib/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogProductListEpic.d.ts +2 -2
  79. package/lib/view/invoicing/invoicingCatalogListView/epics/fetchInvoicingCatalogProductListEpic.js +2 -2
  80. package/lib/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewPayload.d.ts +3 -3
  81. package/lib/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector.d.ts +33 -15
  82. package/lib/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector.js +57 -23
  83. package/lib/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState.d.ts +0 -15
  84. package/lib/view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState.js +0 -22
  85. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.d.ts +1 -1
  86. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState.d.ts +1 -1
  87. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.d.ts +1 -1
  88. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.d.ts +1 -1
  89. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  90. package/lib/view/spendManagement/billPay/billList/billListReducer.d.ts +5 -5
  91. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  92. package/lib/view/spendManagement/billPay/editBillView/editBillViewReducer.d.ts +2 -2
  93. package/lib/view/spendManagement/commonSetup/epic/setup/resetKycKybEpic.d.ts +8 -0
  94. package/lib/view/spendManagement/commonSetup/epic/setup/resetKycKybEpic.js +41 -0
  95. package/lib/view/spendManagement/commonSetup/setupViewReducer.d.ts +1 -1
  96. package/lib/view/spendManagement/commonSetup/setupViewReducer.js +22 -2
  97. package/lib/view/spendManagement/commonSetup/setupViewSelector.d.ts +1 -0
  98. package/lib/view/spendManagement/commonSetup/setupViewSelector.js +2 -1
  99. package/lib/view/spendManagement/commonSetup/setupViewState.d.ts +1 -0
  100. package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewReducer.d.ts +2 -2
  101. package/lib/view/spendManagement/reimbursement/remiListView/remiListReducer.d.ts +5 -5
  102. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +2 -2
  103. package/package.json +1 -26
  104. package/lib/entity/invoicing/plan/planPayload.d.ts +0 -40
  105. package/lib/entity/invoicing/plan/planPayload.js +0 -51
  106. package/lib/entity/invoicing/plan/planReducer.d.ts +0 -14
  107. package/lib/entity/invoicing/plan/planState.d.ts +0 -43
  108. package/lib/entity/invoicing/product/productReducer.d.ts +0 -9
  109. package/lib/entity/invoicing/product/productReducer.js +0 -50
  110. package/lib/entity/invoicing/product/productSelector.d.ts +0 -4
  111. package/lib/entity/invoicing/product/productSelector.js +0 -17
  112. package/lib/entity/invoicing/product/productState.js +0 -2
  113. package/lib/esm/entity/invoicing/plan/planPayload.js +0 -47
  114. package/lib/esm/entity/invoicing/product/productReducer.js +0 -43
  115. package/lib/esm/entity/invoicing/product/productSelector.js +0 -10
  116. package/lib/esm/entity/invoicing/product/productState.js +0 -1
  117. /package/lib/entity/invoicing/{plan/planState.js → invoicingCatalog/invoicingCatalogState.js} +0 -0
  118. /package/lib/esm/entity/invoicing/{plan/planState.js → invoicingCatalog/invoicingCatalogState.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
- import { updateInvoicingPlans } from '../../../entity/invoicing/plan/planReducer';
3
+ import { updateInvoicingCatalogItems } from '../../../entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
5
5
  import { runInvoicingCatalogPlanAction, runInvoicingCatalogPlanActionFailure, runInvoicingCatalogPlanActionSuccess, } from './editInvoicingCatalogItemDetailViewReducer';
6
6
  export const runInvoicingCatalogPlanActionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(runInvoicingCatalogPlanAction.match), mergeMap((action) => {
@@ -12,7 +12,7 @@ export const runInvoicingCatalogPlanActionEpic = (actions$, _state$, zeniAPI) =>
12
12
  .pipe(mergeMap((response) => {
13
13
  if (isSuccessResponse(response) && response.data != null) {
14
14
  return [
15
- updateInvoicingPlans([response.data], 'merge'),
15
+ updateInvoicingCatalogItems([response.data], 'merge'),
16
16
  runInvoicingCatalogPlanActionSuccess({ id }),
17
17
  ];
18
18
  }
@@ -1,7 +1,6 @@
1
1
  import { of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
- import { mergeInvoicingPlanSubFamily } from '../../../entity/invoicing/plan/planReducer';
4
- import { updateInvoicingProducts } from '../../../entity/invoicing/product/productReducer';
3
+ import { mergeInvoicingCatalogPricePoint } from '../../../entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
5
4
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
6
5
  import { runInvoicingCatalogProductAction, runInvoicingCatalogProductActionFailure, runInvoicingCatalogProductActionSuccess, } from './editInvoicingCatalogItemDetailViewReducer';
7
6
  export const runInvoicingCatalogProductActionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(runInvoicingCatalogProductAction.match), mergeMap((action) => {
@@ -16,9 +15,10 @@ export const runInvoicingCatalogProductActionEpic = (actions$, _state$, zeniAPI)
16
15
  .pipe(mergeMap((response) => {
17
16
  if (isSuccessResponse(response) && response.data != null) {
18
17
  return [
19
- updateInvoicingProducts([response.data], 'merge'),
20
18
  ...(parentItemId != null
21
- ? [mergeInvoicingPlanSubFamily(parentItemId, response.data)]
19
+ ? [
20
+ mergeInvoicingCatalogPricePoint(parentItemId, response.data),
21
+ ]
22
22
  : []),
23
23
  runInvoicingCatalogProductActionSuccess({ id: stateKey }),
24
24
  ];
@@ -1,7 +1,6 @@
1
1
  import { forkJoin, from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
- import { mergeInvoicingPlanSubFamily, updateInvoicingPlans, } from '../../../entity/invoicing/plan/planReducer';
4
- import { updateInvoicingProducts } from '../../../entity/invoicing/product/productReducer';
3
+ import { mergeInvoicingCatalogPricePoint, updateInvoicingCatalogItems, } from '../../../entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
5
4
  import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
6
5
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
7
6
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
@@ -51,11 +50,8 @@ export const saveInvoicingCatalogItemEpic = (actions$, state$, zeniAPI) => actio
51
50
  }
52
51
  const savedProducts = productResponses.flatMap((productResponse) => productResponse.data != null ? [productResponse.data] : []);
53
52
  const resultActions = [
54
- updateInvoicingPlans([savedItem], 'merge'),
55
- ...(savedProducts.length > 0
56
- ? [updateInvoicingProducts(savedProducts, 'merge')]
57
- : []),
58
- ...savedProducts.map((product) => mergeInvoicingPlanSubFamily(savedItem.id, product)),
53
+ updateInvoicingCatalogItems([savedItem], 'merge'),
54
+ ...savedProducts.map((product) => mergeInvoicingCatalogPricePoint(savedItem.id, product)),
59
55
  submitInvoicingCatalogItemFormSuccess({
60
56
  itemId: savedItem.id,
61
57
  kind: 'plan',
@@ -1,6 +1,6 @@
1
1
  import { EMPTY, of } from 'rxjs';
2
2
  import { filter, mergeMap, withLatestFrom } from 'rxjs/operators';
3
- import { getInvoicingPlanById } from '../../../entity/invoicing/plan/planSelector';
3
+ import { getInvoicingCatalogItemById } from '../../../entity/invoicing/invoicingCatalog/invoicingCatalogSelector';
4
4
  import { fetchInvoicingCatalogItemDetailPage, seedInvoicingCatalogItemFormDraft, updateInvoicingCatalogItemDetail, } from './editInvoicingCatalogItemDetailViewReducer';
5
5
  import { entityToInvoicingCatalogItemFormLocalData } from './invoicingCatalogItemFormHelper';
6
6
  /**
@@ -34,7 +34,7 @@ export const seedInvoicingCatalogItemFormDraftEpic = (actions$, state$) => actio
34
34
  }
35
35
  // Nothing to seed from on a cold open; the detail response triggers this
36
36
  // again once it lands.
37
- const plan = getInvoicingPlanById(state.invoicingPlanState, id);
37
+ const plan = getInvoicingCatalogItemById(state.invoicingCatalogState, id);
38
38
  if (plan == null) {
39
39
  return EMPTY;
40
40
  }
@@ -95,6 +95,10 @@ const editInvoicingCustomerDetailView = createSlice({
95
95
  error: undefined,
96
96
  };
97
97
  },
98
+ // Makes the page epic refetch a record that changed server-side (e.g. a new subscription).
99
+ invalidateInvoicingCustomerDetail(draft, action) {
100
+ delete draft.recordStateById[action.payload.id];
101
+ },
98
102
  fetchInvoicingCustomerDetail(draft, action) {
99
103
  draft.recordStateById[action.payload.id] = {
100
104
  fetchState: 'In-Progress',
@@ -198,5 +202,5 @@ const editInvoicingCustomerDetailView = createSlice({
198
202
  });
199
203
  },
200
204
  });
201
- export const { fetchInvoicingPaymentLinkEmailPreview, fetchInvoicingPaymentLinkEmailPreviewPage, updateInvoicingPaymentLinkEmailPreview, updateInvoicingPaymentLinkEmailPreviewFailure, addPromotionalCreditsFailure, addPromotionalCreditsSuccess, fetchInvoicingCustomerDetail, fetchInvoicingCustomerDetailPage, seedInvoicingCustomerFormDraft, updateInvoicingCustomerDetail, resetPromotionalCreditAction, submitAddPromotionalCredits, updateInvoicingCustomerDetailFailure, updateInvoicingCustomerFormDraft, submitInvoicingCustomerForm, submitInvoicingCustomerFormSuccess, submitInvoicingCustomerFormFailure, resetEditInvoicingCustomerDetailView, initializeInvoicingCustomerAddress, claimInvoicingCustomerBillingAddress, } = editInvoicingCustomerDetailView.actions;
205
+ export const { fetchInvoicingPaymentLinkEmailPreview, fetchInvoicingPaymentLinkEmailPreviewPage, updateInvoicingPaymentLinkEmailPreview, updateInvoicingPaymentLinkEmailPreviewFailure, addPromotionalCreditsFailure, addPromotionalCreditsSuccess, fetchInvoicingCustomerDetail, fetchInvoicingCustomerDetailPage, invalidateInvoicingCustomerDetail, seedInvoicingCustomerFormDraft, updateInvoicingCustomerDetail, resetPromotionalCreditAction, submitAddPromotionalCredits, updateInvoicingCustomerDetailFailure, updateInvoicingCustomerFormDraft, submitInvoicingCustomerForm, submitInvoicingCustomerFormSuccess, submitInvoicingCustomerFormFailure, resetEditInvoicingCustomerDetailView, initializeInvoicingCustomerAddress, claimInvoicingCustomerBillingAddress, } = editInvoicingCustomerDetailView.actions;
202
206
  export default editInvoicingCustomerDetailView.reducer;
@@ -86,6 +86,27 @@ export const getInvoicingItemsAllowedForPlan = (products, plan) => {
86
86
  }
87
87
  return products.filter((product) => product.itemID != null && allowedItemIDs.includes(product.itemID));
88
88
  };
89
+ // Years count as months so they compare; any other unit only meets itself.
90
+ const billingPeriodInCommonUnit = (pricePoint) => {
91
+ const { period, periodUnit } = pricePoint;
92
+ if (period == null || periodUnit == null || periodUnit === '') {
93
+ return undefined;
94
+ }
95
+ return periodUnit === 'year'
96
+ ? { count: period * 12, unit: 'month' }
97
+ : { count: period, unit: periodUnit };
98
+ };
99
+ // The add-on's period must divide the plan's (create 422s otherwise); fails open when they cannot be compared.
100
+ export const isInvoicingAddonPeriodCompatible = (addon, plan) => {
101
+ const addonPeriod = billingPeriodInCommonUnit(addon);
102
+ const planPeriod = plan != null ? billingPeriodInCommonUnit(plan) : undefined;
103
+ if (addonPeriod == null ||
104
+ planPeriod == null ||
105
+ addonPeriod.unit !== planPeriod.unit) {
106
+ return true;
107
+ }
108
+ return addonPeriod.count > 0 && planPeriod.count % addonPeriod.count === 0;
109
+ };
89
110
  /**
90
111
  * A price row can only be subscribed by its price code, so one without a code
91
112
  * is not an option the form can offer.
@@ -174,7 +195,12 @@ export const getInvoicingSubscriptionFormView = (state, invoicingSubscriptionID)
174
195
  // pickers offer only those: subscription create rejects the rest with a 422,
175
196
  // and an option that can only fail is not a choice. The applicability rides
176
197
  // on the price rows already in the store, so this is a join, not a refetch.
177
- const allowedCatalogPrices = getInvoicingItemsAllowedForPlan(getInvoicingCatalogPrices(catalogListView.products), planPrices.find((plan) => plan.priceCode === localData.planPriceCode)).filter(hasInvoicingPriceCode);
198
+ const selectedPlanPrice = planPrices.find((plan) => plan.priceCode === localData.planPriceCode);
199
+ // Add-ons also have to bill on the plan's cadence; charges are one-time.
200
+ const allowedCatalogPrices = getInvoicingItemsAllowedForPlan(getInvoicingCatalogPrices(catalogListView.products), selectedPlanPrice)
201
+ .filter(hasInvoicingPriceCode)
202
+ .filter((product) => product.itemType !== 'addon' ||
203
+ isInvoicingAddonPeriodCompatible(product, selectedPlanPrice));
178
204
  const catalogItemOptionsOfType = (itemType) => allowedCatalogPrices
179
205
  .filter((product) => product.itemType === itemType)
180
206
  .map(toInvoicingCatalogItemOption);
@@ -7,6 +7,8 @@ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiE
7
7
  import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
8
8
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
9
9
  import { resetNewAddressDataInLocalStore } from '../../addressView/addressViewReducer';
10
+ import { invalidateInvoicingCustomerDetail } from '../editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewReducer';
11
+ import { invalidateInvoiceListForCustomer } from '../invoiceList/invoiceListReducer';
10
12
  import { addInvoicingSubscriptionToList } from '../invoicingSubscriptionListView/invoicingSubscriptionListViewReducer';
11
13
  import { localDataToSaveInvoicingSubscriptionPayload, } from './editInvoicingSubscriptionDetailViewPayload';
12
14
  import { submitInvoicingSubscriptionForm, submitInvoicingSubscriptionFormFailure, submitInvoicingSubscriptionFormSuccess, syncInvoicingSubscriptionCoupons, } from './editInvoicingSubscriptionDetailViewReducer';
@@ -86,7 +88,9 @@ export const saveInvoicingSubscriptionEpic = (actions$, state$, zeniAPI) => acti
86
88
  resultActions.push(addInvoicingSubscriptionToList({
87
89
  id: saved.id,
88
90
  status: saved.status,
89
- }));
91
+ }),
92
+ // The service may bill the first invoice on create.
93
+ invalidateInvoicingCustomerDetail({ id: saved.customer_id }), invalidateInvoiceListForCustomer({ customerId: saved.customer_id }));
90
94
  }
91
95
  resultActions.push(openSnackbar({
92
96
  messageSection: 'invoicing_subscription_saved',
@@ -124,6 +124,13 @@ const invoiceList = createSlice({
124
124
  draft.kpisFetchState.fetchState = 'Error';
125
125
  draft.kpisFetchState.error = action.payload;
126
126
  },
127
+ // Counts are fetched under the same customer filter, so they go stale with the tabs.
128
+ invalidateInvoiceListForCustomer(draft, action) {
129
+ if (draft.filters.customerId === action.payload.customerId) {
130
+ draft.invoiceByTab = makeInvoiceByTab();
131
+ draft.countsFetchState = { fetchState: 'Not-Started', error: undefined };
132
+ }
133
+ },
127
134
  updateInvoiceListFilters(draft, action) {
128
135
  draft.filters = action.payload;
129
136
  },
@@ -166,5 +173,5 @@ const invoiceList = createSlice({
166
173
  });
167
174
  },
168
175
  });
169
- export const { fetchInvoiceList, fetchInvoiceListPage, updateInvoiceList, updateInvoiceListFailure, fetchInvoiceCounts, updateInvoiceCounts, updateInvoiceCountsFailure, fetchInvoiceKPIs, updateInvoiceKPIs, updateInvoiceKPIsFailure, updateInvoiceListFilters, setInvoiceActiveTab, addInvoiceToList, } = invoiceList.actions;
176
+ export const { fetchInvoiceList, fetchInvoiceListPage, updateInvoiceList, updateInvoiceListFailure, fetchInvoiceCounts, updateInvoiceCounts, updateInvoiceCountsFailure, fetchInvoiceKPIs, updateInvoiceKPIs, updateInvoiceKPIsFailure, updateInvoiceListFilters, setInvoiceActiveTab, addInvoiceToList, invalidateInvoiceListForCustomer, } = invoiceList.actions;
170
177
  export default invoiceList.reducer;
@@ -1,6 +1,6 @@
1
1
  import { of } from 'rxjs';
2
2
  import { catchError, filter, switchMap } from 'rxjs/operators';
3
- import { updateInvoicingPlans } from '../../../../entity/invoicing/plan/planReducer';
3
+ import { updateInvoicingCatalogItems } from '../../../../entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
5
  import { INVOICING_LIST_PAGE_SIZE, applyListSortParams, withQuery, } from '../../invoicingApiHelper';
6
6
  import { fetchInvoicingCatalogPlanList, updateInvoicingCatalogPlanList, updateInvoicingCatalogPlanListFailure, } from '../invoicingCatalogListViewReducer';
@@ -29,7 +29,7 @@ export const fetchInvoicingCatalogPlanListEpic = (actions$, _state$, zeniAPI) =>
29
29
  if (isSuccessResponse(response)) {
30
30
  const items = response.data?.items ?? [];
31
31
  return [
32
- updateInvoicingPlans(items, 'merge'),
32
+ updateInvoicingCatalogItems(items, 'merge'),
33
33
  updateInvoicingCatalogPlanList({
34
34
  ids: items.map((item) => item.id),
35
35
  nextCursor: response.data?.next_cursor ?? null,
@@ -1,6 +1,6 @@
1
1
  import { of } from 'rxjs';
2
2
  import { catchError, filter, switchMap } from 'rxjs/operators';
3
- import { updateInvoicingPlans } from '../../../../entity/invoicing/plan/planReducer';
3
+ import { updateInvoicingCatalogItems } from '../../../../entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
5
  import { INVOICING_LIST_PAGE_SIZE, applyListSortParams, withQuery, } from '../../invoicingApiHelper';
6
6
  import { fetchInvoicingCatalogProductList, updateInvoicingCatalogProductList, updateInvoicingCatalogProductListFailure, } from '../invoicingCatalogListViewReducer';
@@ -29,7 +29,7 @@ export const fetchInvoicingCatalogProductListEpic = (actions$, _state$, zeniAPI)
29
29
  if (isSuccessResponse(response)) {
30
30
  const items = response.data?.items ?? [];
31
31
  return [
32
- updateInvoicingPlans(items, 'merge'),
32
+ updateInvoicingCatalogItems(items, 'merge'),
33
33
  updateInvoicingCatalogProductList({
34
34
  ids: items.map((item) => item.id),
35
35
  nextCursor: response.data?.next_cursor ?? null,
@@ -1,7 +1,5 @@
1
1
  import { createSelector } from '@reduxjs/toolkit';
2
- import { getInvoicingPlansByIds } from '../../../entity/invoicing/plan/planSelector';
3
- import { runningInvoicingActionId } from '../runningInvoicingActionId';
4
- import { INVOICING_PRODUCT_COLUMNS, } from './invoicingCatalogListViewState';
2
+ import { getInvoicingCatalogItemsByIds, invoicingPricePointDisplayAmount, } from '../../../entity/invoicing/invoicingCatalog/invoicingCatalogSelector';
5
3
  /**
6
4
  * Flatten catalog items into the price rows the pickers render.
7
5
  *
@@ -22,28 +20,63 @@ export const getInvoicingCatalogPrices = (items) => items.flatMap((item) => (ite
22
20
  priceCode: subFamily.priceCode,
23
21
  productCode: item.productCode,
24
22
  })));
23
+ const lowestStartingTier = (tiers) => tiers.reduce((lowest, tier) => lowest == null || tier.startingUnit < lowest.startingUnit ? tier : lowest, undefined);
24
+ export const getInvoicingCatalogPlanRows = (items) => items.flatMap((item) => {
25
+ const pricePoints = item.subFamilies ?? [];
26
+ if (pricePoints.length === 0) {
27
+ return [
28
+ {
29
+ id: item.id,
30
+ item,
31
+ period: item.period,
32
+ periodUnit: item.periodUnit,
33
+ price: item.price,
34
+ productFamily: item.name,
35
+ status: item.status,
36
+ tierCount: item.tiers?.length ?? 0,
37
+ firstTier: lowestStartingTier(item.tiers ?? []),
38
+ },
39
+ ];
40
+ }
41
+ return pricePoints.map((pricePoint) => ({
42
+ id: pricePoint.id,
43
+ item,
44
+ period: pricePoint.period,
45
+ periodUnit: pricePoint.periodUnit,
46
+ planName: pricePoint.name,
47
+ price: invoicingPricePointDisplayAmount(pricePoint),
48
+ pricingModel: pricePoint.pricingModel,
49
+ productFamily: item.name,
50
+ status: pricePoint.status,
51
+ tierCount: pricePoint.tiers?.length ?? 0,
52
+ firstTier: lowestStartingTier(pricePoint.tiers ?? []),
53
+ }));
54
+ });
25
55
  /**
26
56
  * Bundled read view for the single catalog page (plans + products tabs).
27
57
  * Memoized over the plan + product entity slices and the list-view slice so the
28
58
  * denormalized arrays keep referential identity. The base `fetchState`/`error`
29
59
  * track the plan list; the product list has its own `productFetchState`.
30
60
  */
31
- export const getInvoicingCatalogListView = createSelector((state) => state.invoicingPlanState, (state) => state.invoicingCatalogListViewState, (state) => state.invoicingConfigViewState.catalogItemLifecycleActionOptions, (state) => state.editInvoicingCatalogItemDetailViewState.actionStateById, (planState, listViewState, catalogItemLifecycleActionOptions, actionStateById) => ({
32
- catalogItemLifecycleActionOptions,
33
- runningActionId: runningInvoicingActionId(actionStateById),
34
- plans: getInvoicingPlansByIds(planState, listViewState.planIds),
35
- planSort: listViewState.planSort,
36
- productColumns: INVOICING_PRODUCT_COLUMNS,
37
- products: getInvoicingPlansByIds(planState, listViewState.productIds),
38
- productSort: listViewState.productSort,
39
- count: listViewState.counts,
40
- countsFetchState: listViewState.countsFetchState,
41
- planFilters: listViewState.planFilters,
42
- planNextCursor: listViewState.planNextCursor,
43
- productFilters: listViewState.productFilters,
44
- productNextCursor: listViewState.productNextCursor,
45
- productFetchState: listViewState.productFetchState,
46
- fetchState: listViewState.fetchState,
47
- error: listViewState.error,
48
- version: 1.0,
49
- }));
61
+ export const getInvoicingCatalogListView = createSelector((state) => state.invoicingCatalogState, (state) => state.invoicingCatalogListViewState, (catalogState, listViewState) => {
62
+ const plans = getInvoicingCatalogItemsByIds(catalogState, listViewState.planIds);
63
+ const products = getInvoicingCatalogItemsByIds(catalogState, listViewState.productIds);
64
+ return {
65
+ planRows: getInvoicingCatalogPlanRows(plans),
66
+ plans,
67
+ planSort: listViewState.planSort,
68
+ productRows: getInvoicingCatalogPlanRows(products),
69
+ products,
70
+ productSort: listViewState.productSort,
71
+ count: listViewState.counts,
72
+ countsFetchState: listViewState.countsFetchState,
73
+ planFilters: listViewState.planFilters,
74
+ planNextCursor: listViewState.planNextCursor,
75
+ productFilters: listViewState.productFilters,
76
+ productNextCursor: listViewState.productNextCursor,
77
+ productFetchState: listViewState.productFetchState,
78
+ fetchState: listViewState.fetchState,
79
+ error: listViewState.error,
80
+ version: 1.0,
81
+ };
82
+ });
@@ -1,20 +1 @@
1
- import { stringToUnion } from '../../../commonStateTypes/stringToUnion';
2
- export const ALL_INVOICING_PRODUCT_SORT_KEYS = [
3
- 'product_name',
4
- 'product_code',
5
- 'type',
6
- 'pricing',
7
- 'usage',
8
- 'updated',
9
- 'status',
10
- ];
11
- export const toInvoicingProductSortKey = (v) => stringToUnion(v, ALL_INVOICING_PRODUCT_SORT_KEYS);
12
- export const INVOICING_PRODUCT_COLUMNS = [
13
- { key: 'product_name', sortable: true },
14
- { key: 'product_code', sortable: true },
15
- { key: 'type', sortable: true },
16
- { key: 'pricing', sortable: false },
17
- { key: 'usage', sortable: true },
18
- { key: 'updated', sortable: true },
19
- { key: 'status', sortable: true },
20
- ];
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import { from } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../../entity/snackbar/snackbarReducer';
4
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../../responsePayload';
5
+ import { resetKycKyb, resetKycKybFailure, resetKycKybSuccess, } from '../../setupViewReducer';
6
+ export const resetKycKybEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(resetKycKyb.match), mergeMap(() => zeniAPI
7
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.tenantMicroServiceBaseUrl}/1.0/kyc-kyb-reset`, { is_reset_company_officers: false })
8
+ .pipe(mergeMap((response) => {
9
+ if (isSuccessResponse(response)) {
10
+ return from([
11
+ resetKycKybSuccess(),
12
+ openSnackbar({
13
+ messageSection: 'kyc_kyb_reset',
14
+ messageText: 'success',
15
+ type: 'success',
16
+ }),
17
+ ]);
18
+ }
19
+ return from([
20
+ resetKycKybFailure(response.status),
21
+ openSnackbar({
22
+ messageSection: 'kyc_kyb_reset',
23
+ messageText: 'failed',
24
+ type: 'error',
25
+ }),
26
+ ]);
27
+ }), catchError((error) => from([
28
+ resetKycKybFailure(createZeniAPIStatus('Unexpected error', 'Reset KYC/KYB errored out: ' +
29
+ (error instanceof Error
30
+ ? error.message
31
+ : JSON.stringify(error)))),
32
+ openSnackbar({
33
+ messageSection: 'kyc_kyb_reset',
34
+ messageText: 'failed',
35
+ type: 'error',
36
+ }),
37
+ ])))));
@@ -13,6 +13,7 @@ const emptyOfficerSlot = {
13
13
  };
14
14
  export const initialState = {
15
15
  updateStatus: { fetchState: 'Not-Started', error: undefined },
16
+ kycKybResetStatus: { fetchState: 'Not-Started', error: undefined },
16
17
  parsingDocumentFileIds: [],
17
18
  companyDetails: { autoFilledFields: [] },
18
19
  companyOfficerUpdateStatus: {
@@ -84,6 +85,25 @@ const setupView = createSlice({
84
85
  };
85
86
  },
86
87
  },
88
+ resetKycKyb(draft) {
89
+ draft.kycKybResetStatus = { fetchState: 'In-Progress', error: undefined };
90
+ },
91
+ resetKycKybSuccess(draft) {
92
+ draft.kycKybResetStatus = { fetchState: 'Completed', error: undefined };
93
+ },
94
+ resetKycKybFailure: {
95
+ reducer(draft, action) {
96
+ draft.kycKybResetStatus = { fetchState: 'Error', error: action.payload };
97
+ },
98
+ prepare(error) {
99
+ return {
100
+ payload: error,
101
+ };
102
+ },
103
+ },
104
+ clearKycKybResetStatus(draft) {
105
+ draft.kycKybResetStatus = { fetchState: 'Not-Started', error: undefined };
106
+ },
87
107
  updateSelectedCompanyOfficer: {
88
108
  reducer(draft, action) {
89
109
  const { selectedOfficerType } = action.payload;
@@ -359,5 +379,5 @@ const setupView = createSlice({
359
379
  });
360
380
  },
361
381
  });
362
- export const { enableSetup, enableSetupSuccess, enableSetupFailure, updateBusinessVerificationDetails, updateBusinessVerificationDetailsSuccess, updateBusinessVerificationDetailsFailure, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData, saveSetupViewDataInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, sendOtp: sendOtpSpendManagementSetUp, resendOtp: resendOtpSpendManagementSetUp, sendOtpSuccess: sendOtpSuccessSpendManagementSetUp, sendOtpFailure: sendOtpFailureSpendManagementSetUp, verifyOtp: verifyOtpSpendManagementSetUp, verifyOtpSuccess: verifyOtpSuccessSpendManagementSetUp, verifyOtpFailure: verifyOtpFailureSpendManagementSetUp, saveIndustryAndIncDateInLocalStore, clearSetupViewDataInLocalStore, applyKycDocumentAutofillForSetup, applyKybDocumentAutofillForSetup, clearKycKybAutofillForSetup, } = setupView.actions;
382
+ export const { enableSetup, enableSetupSuccess, enableSetupFailure, updateBusinessVerificationDetails, updateBusinessVerificationDetailsSuccess, updateBusinessVerificationDetailsFailure, resetKycKyb, resetKycKybSuccess, resetKycKybFailure, clearKycKybResetStatus, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData, saveSetupViewDataInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, sendOtp: sendOtpSpendManagementSetUp, resendOtp: resendOtpSpendManagementSetUp, sendOtpSuccess: sendOtpSuccessSpendManagementSetUp, sendOtpFailure: sendOtpFailureSpendManagementSetUp, verifyOtp: verifyOtpSpendManagementSetUp, verifyOtpSuccess: verifyOtpSuccessSpendManagementSetUp, verifyOtpFailure: verifyOtpFailureSpendManagementSetUp, saveIndustryAndIncDateInLocalStore, clearSetupViewDataInLocalStore, applyKycDocumentAutofillForSetup, applyKybDocumentAutofillForSetup, clearKycKybAutofillForSetup, } = setupView.actions;
363
383
  export default setupView.reducer;
@@ -85,7 +85,7 @@ function getPrimaryAccountForTheProduct(state, companyId, setupViewType) {
85
85
  }
86
86
  export function getBusinessVerificationDetails(state, companyId) {
87
87
  const { setupViewState, countryListState } = state;
88
- const { companyDetails, companyOfficerUpdateStatus, primaryContactDetails, updateStatus, } = setupViewState;
88
+ const { companyDetails, companyOfficerUpdateStatus, kycKybResetStatus, primaryContactDetails, updateStatus, } = setupViewState;
89
89
  const companyView = getCompanyView(state, companyId, []);
90
90
  const { companyDetailsLocalData, companyOfficerLocalData, parsingDocumentFileIds, } = getCompanyAndIdentityDetails(state, companyId, {
91
91
  companyDetails,
@@ -100,6 +100,7 @@ export function getBusinessVerificationDetails(state, companyId) {
100
100
  parsingDocumentFileIds,
101
101
  companyView,
102
102
  updateStatus,
103
+ kycKybResetStatus,
103
104
  allNationalityCountries,
104
105
  };
105
106
  }
package/lib/index.d.ts CHANGED
@@ -310,7 +310,7 @@ 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 { ackCloseMatchAfterIgnore, ackCloseMatchAfterUndo, clearActualMatchingView as clearExpenseAutomationActualMatchingView, clearMatchNewModal, closeMatchNewModal, fetchActualMatching as fetchExpenseAutomationActualMatching, fetchActualMatchingMatch, fetchActualMatchingPage as fetchExpenseAutomationActualMatchingPage, ignoreActualMatchingSuggestion, matchAndReverseAccruals, openMatchNewModal, searchMatchAccruals, searchMatchTransactions, undoReversalAccruals, updateActualMatchingUIState as updateExpenseAutomationActualMatchingUIState } from './view/expenseAutomationView/reducers/actualMatchingViewReducer';
313
+ import { ackCloseMatchAfterIgnore, ackCloseMatchAfterUndo, clearActualMatchingView as clearExpenseAutomationActualMatchingView, clearMatchNewModal, closeMatchNewModal, fetchActualMatchingMatch, fetchActualMatching as fetchExpenseAutomationActualMatching, fetchActualMatchingPage as fetchExpenseAutomationActualMatchingPage, ignoreActualMatchingSuggestion, 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
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';
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';
@@ -334,7 +334,7 @@ import { getExpenseAutomationReconciliationView, getLedgerAccountIdsWithStatemen
334
334
  import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
335
335
  import { applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
336
336
  import { TRANSACTION_FILTER_CATEGORIES, TransactionFilterAmountMatchingOperator, TransactionFilterCategory, TransactionFilterCategoryDropdownOption, TransactionFilterCategoryField, TransactionFilterEntityType, TransactionFilters } from './view/expenseAutomationView/transactionFilterTypes';
337
- import { ActualMatchingTransactionSearchResult, ActualMatchingSortKey as ExpenseAutomationActualMatchingSortKey, ActualMatchingStatusFilter as ExpenseAutomationActualMatchingStatusFilter, ActualMatchingViewUIState as ExpenseAutomationActualMatchingViewUIState, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, ALL_ACTUAL_MATCHING_IGNORE_REASONS, ActualMatchingIgnoreReasonType, IgnoreActualMatchingSuggestionParams, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, actualMatchingTransactionLineKey, toActualMatchingIgnoreReasonType, toActualMatchingSortKey as toExpenseAutomationActualMatchingSortKey, toActualMatchingStatusFilter as toExpenseAutomationActualMatchingStatusFilter, toMatchAndReverseResultStatus, toUndoReversalResultStatus } from './view/expenseAutomationView/types/actualMatchingViewState';
337
+ import { ALL_ACTUAL_MATCHING_IGNORE_REASONS, ActualMatchingIgnoreReasonType, ActualMatchingTransactionSearchResult, ActualMatchingSortKey as ExpenseAutomationActualMatchingSortKey, ActualMatchingStatusFilter as ExpenseAutomationActualMatchingStatusFilter, ActualMatchingViewUIState as ExpenseAutomationActualMatchingViewUIState, IgnoreActualMatchingSuggestionParams, MATCH_ACCRUAL_SEARCH_LIMIT, MATCH_SEARCH_DEBOUNCE_MS, MATCH_TRANSACTION_SEARCH_PAGE_SIZE, MatchAndReverseAccrualsParams, MatchAndReverseResult, MatchAndReverseResultStatus, UndoReversalAccrualsParams, UndoReversalResult, UndoReversalResultStatus, actualMatchingTransactionLineKey, toActualMatchingIgnoreReasonType, toActualMatchingSortKey as toExpenseAutomationActualMatchingSortKey, toActualMatchingStatusFilter as toExpenseAutomationActualMatchingStatusFilter, toMatchAndReverseResultStatus, toUndoReversalResultStatus } from './view/expenseAutomationView/types/actualMatchingViewState';
338
338
  import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
339
339
  import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSectionType, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
340
340
  import { ALL_JE_PAGE_TABS, AccountSettingsLocalData, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEPageTab, JEScheduleLocalData, NewJeDetailLocalData, NewJeScheduleState, NewOneTimeAccrualLocalData, NewScheduleLocalData, NewScheduleLocalDataFixedAssets, SearchTransactionsState, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey, toJEPageTab } from './view/expenseAutomationView/types/jeSchedulesViewState';
@@ -550,7 +550,7 @@ import { toIssueChargeCardLocalDataFromDraft } from './view/spendManagement/char
550
550
  import { CommonHistoryView, HistoricEvent, HistoricEventUpdate } from './view/spendManagement/commonHistoryView/commonHistory';
551
551
  import { ActivityHistorySelectorView } from './view/spendManagement/commonHistoryView/commonHistorySelector';
552
552
  import { parseUploadedKybDocument, parseUploadedKycDocument } from './view/spendManagement/commonSetup/kycKybAutofillActions';
553
- import { applyKybDocumentAutofillForSetup, applyKycDocumentAutofillForSetup, clearKycKybAutofillForSetup, clearSetupViewDataInLocalStore, enableSetup, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveIndustryAndIncDateInLocalStore, saveSetupViewDataInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, updateBusinessVerificationDetails, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData } from './view/spendManagement/commonSetup/setupViewReducer';
553
+ import { applyKybDocumentAutofillForSetup, applyKycDocumentAutofillForSetup, clearKycKybAutofillForSetup, clearKycKybResetStatus, clearSetupViewDataInLocalStore, enableSetup, resetKycKyb, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveIndustryAndIncDateInLocalStore, saveSetupViewDataInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, updateBusinessVerificationDetails, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData } from './view/spendManagement/commonSetup/setupViewReducer';
554
554
  import { BusinessVerificationDetails, SetupView, getBusinessVerificationDetails, getCommonSetupViewDetails } from './view/spendManagement/commonSetup/setupViewSelector';
555
555
  import { CompanyDetails, CompanyOfficersDetails, FundingAccount, SetupViewLocalData, SetupViewState } from './view/spendManagement/commonSetup/setupViewState';
556
556
  import { 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, CompanyOnboardingIndustryTypeCode, CompanyOnboardingSubIndustryTypeCode, CompanyPurposeOfAccountCode, CompanySourceOfFundsCode, CompanyTransactionVolumeCode, CompanyUsNexusTypeCode, getCompanyOnboardingSubIndustryCodesForIndustry } from './view/spendManagement/commonSetup/types/businessVerification';
@@ -880,7 +880,7 @@ export { AccountListSelectorView, ClassListSelectorView, getClassList, fetchClas
880
880
  export { BillTab, BillsSubTabType, SaveBillStageCode, BillPayReviewSelectorView, DuplicateBillsSelectorView, EditBillDetailSelectorView, LineItemRecommendationsLocalData, EditBillInitialDetails, BillableStatus, PaymentDetailsSection, BillListReport, BillListDownloadReport, WhatForSection, fetchBillList, fetchBillListPerTab, updateTab, updateSubTab, updateSelectedBillId, updateBillDetailSaveBillCode, fetchVendorByNameAndParseInvoice, saveBillUpdatesToLocalStore, discardBillUpdatesInLocalStore, saveBillDetail, approveOrRejectBill, updateApprovalStatusOnSuccess, deleteBill, cancelAndDeleteBill, retryOrRefundBill, getBillList, getBillDownloadList, BillDetailViewSelector, ActorActivityWithUser, BillActivity, StepWithStatus, getBillDetailView, checkApproveRejectBtnShowForBill, BillDetailView, getBillTransactionDetailKey, fetchBillDetail, fetchBillRecommendations, fetchEditBillDetailPage, fetchAndUpdateVendorRecommendations, fetchDuplicateBill, clearBillPayReview, EditBillDetail, EditBillDetailViewState, getEditBillDetail, getReviewPageBillDetail, BillDetailLocalData, PaymentDetailsSectionView, fetchBillAndInitializeLocalStore, updateShowAutofill, saveVendorSuccessOrFailure, BillPaymentStatus, BillPaymentStatusCodeType, BillPaymentRefundStatus, BillPaymentRefundStatusCodeType, BillStatus, BillStatusCodeType, BillApprovalType, updateBillListUIState, BillListUIState, BillPayViewSortKey, BillPayFilters, BillPayFilterCategory, BillListViewFilterCategoryField, BILL_PAY_FILTER_CATEGORIES, updateVendorDetailLocalData, resetVendorDetailLocalData, resetVendorSaveStatus, updateContactsInVendorDetailLocalData, updateVendorTabDetailUIState, updateContactsInVendorTabDetailLocalData, updateBillUploadFetchState, updateBillListSearchResult, fetchUserDetails, verifyUser, updateVendorContact, PaymentToOption, toPaymentToOption, convertAmountToHomeCurrency, RecurringBillInstance, RecurringBillConfigLocalData, EditRecurringBillType, fetchVendorAndUpdateBillLocalData, markBillForRetry, updateWithdrawFromAccountId, removeBillFileFromLocalStore, replaceBillFileInLocalStore, updateShouldReplaceBillData, };
881
881
  export { SpendManagementFiltersType, SpendManagementFilterEntityType, FilterCategoryType, BillPayFilterCategoryDropdownOption, ReimbursementFilterCategoryDropdownOption, TaskFilterCategoryDropdownOption, SpendManagementFilterCategoryDropdownOption, MatchingOperatorDropdownOption, CategoryCombinationOperator, hideCreatedByFilter, };
882
882
  export { TRANSACTION_FILTER_CATEGORIES, TransactionFilterAmountMatchingOperator, TransactionFilterCategory, TransactionFilterCategoryDropdownOption, TransactionFilterCategoryField, TransactionFilterEntityType, TransactionFilters, applyTransactionFilters, };
883
- export { BillPaySetupViewState, ZeniAccountSetupViewState, BillPaySetupViewLocalData, ZeniAccountSetupViewLocalData, PlaidAccountState, fetchBillPaySetupView, fetchZeniAccountSetupView, enableSetup, getPaymentAccounts, getPlaidLinkToken, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData, updateBusinessVerificationDetails, updatePaymentAccount, updatePaymentAccountLoginStatus, updatePaymentAccountStatus, establishPlaidConnection, updateMappedCashAccount, updatePrimaryFundingAccount, acceptBillPayTerms, acceptZeniAccountTerms, acceptBillPayUpdatedTerms, saveSetupViewDataInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, saveIndustryAndIncDateInLocalStore, clearSetupViewDataInLocalStore, applyKycDocumentAutofillForSetup, applyKybDocumentAutofillForSetup, clearKycKybAutofillForSetup, parseUploadedKycDocument, parseUploadedKybDocument, sendOtp, resendOtp, verifyOtp, CompanyDetails, CompanyOfficersDetails, BillPaySetupView, ZeniAccountSetupView, BillPayBusinessVerificationDetails, ZeniAccountBusinessVerificationDetails, TreasuryBusinessVerificationDetails, SetupViewState, SetupViewLocalData, SetupView, BusinessVerificationDetails, getBillPaySetupViewDetails, getPlaidAccountDetails, getPlaidPaymentAccounts, getZeniAccountSetupViewDetails, getBusinessVerificationDetails, getBillPayBusinessVerificationDetails, getZeniAccountBusinessVerificationDetails, getTreasuryBusinessVerificationDetails, getCommonSetupViewDetails, PlaidConnectionDetails, PlaidLinkTokenType, PlaidAccountKeyType, Token, FundingAccount, getTwoFactorAuthenticationView, getTwoFactorAuthenticationViewForCardUserOnboarding, getTwoFactorAuthenticationViewForChargeCardHolder, TwoFactorAuthenticationView, };
883
+ export { BillPaySetupViewState, ZeniAccountSetupViewState, BillPaySetupViewLocalData, ZeniAccountSetupViewLocalData, PlaidAccountState, fetchBillPaySetupView, fetchZeniAccountSetupView, enableSetup, getPaymentAccounts, getPlaidLinkToken, updateSelectedCompanyOfficer, updateSetupViewLocalStoreData, updateBusinessVerificationDetails, clearKycKybResetStatus, resetKycKyb, updatePaymentAccount, updatePaymentAccountLoginStatus, updatePaymentAccountStatus, establishPlaidConnection, updateMappedCashAccount, updatePrimaryFundingAccount, acceptBillPayTerms, acceptZeniAccountTerms, acceptBillPayUpdatedTerms, saveSetupViewDataInLocalStore, saveCompnayOfficerPhoneInLocalStore, saveCompnayOfficerAdditionalDocumentsInLocalStore, saveTreasuryAdditionalDocumentsInLocalStore, saveIndustryAndIncDateInLocalStore, clearSetupViewDataInLocalStore, applyKycDocumentAutofillForSetup, applyKybDocumentAutofillForSetup, clearKycKybAutofillForSetup, parseUploadedKycDocument, parseUploadedKybDocument, sendOtp, resendOtp, verifyOtp, CompanyDetails, CompanyOfficersDetails, BillPaySetupView, ZeniAccountSetupView, BillPayBusinessVerificationDetails, ZeniAccountBusinessVerificationDetails, TreasuryBusinessVerificationDetails, SetupViewState, SetupViewLocalData, SetupView, BusinessVerificationDetails, getBillPaySetupViewDetails, getPlaidAccountDetails, getPlaidPaymentAccounts, getZeniAccountSetupViewDetails, getBusinessVerificationDetails, getBillPayBusinessVerificationDetails, getZeniAccountBusinessVerificationDetails, getTreasuryBusinessVerificationDetails, getCommonSetupViewDetails, PlaidConnectionDetails, PlaidLinkTokenType, PlaidAccountKeyType, Token, FundingAccount, getTwoFactorAuthenticationView, getTwoFactorAuthenticationViewForCardUserOnboarding, getTwoFactorAuthenticationViewForChargeCardHolder, TwoFactorAuthenticationView, };
884
884
  export { BankConnectionsSetupView, IntegrationsView, getApprovalRuleViewDetails, getBankConnectionsSetupViewDetails, getIntegrationsView, };
885
885
  export { fetchUserFinancialAccount };
886
886
  export { getUserFinancialAccount, UserFinancialAccountSelectorView };
@@ -1066,8 +1066,7 @@ export type { InvoicingInvoiceStatus } from './entity/invoicing/invoice/invoiceT
1066
1066
  export type { InvoicingDunningAttempt, InvoicingInvoice, InvoicingInvoiceDiscount, InvoicingInvoiceKPIs, InvoicingInvoiceNote, InvoicingIssuedCreditNote, InvoicingLineItem, InvoicingLinkedPayment, } from './entity/invoicing/invoice/invoiceState';
1067
1067
  export type { InvoicingDunningAction, InvoicingDunningActionOption, InvoicingDunningScheduleStepPayload, InvoicingFormOption, InvoicingListCounts, InvoicingPaginatedList, InvoicingPriceType, InvoicingSettingsPayload as InvoicingSettings, InvoicingStripeAccountPayload, InvoicingSubscriptionLifecycleAction, InvoicingSubscriptionLifecycleActionOption, InvoicingSubscriptionLifecycleActionOptionWire, InvoicingCatalogItemLifecycleAction, InvoicingCatalogProductLifecycleAction, InvoicingCatalogLifecycleActionOption, InvoicingCatalogLifecycleActionOptionWire, InvoicingDiscountLifecycleAction, InvoicingDiscountLifecycleActionOption, AuditLogEntityRouteOption, AuditLogEntityRouteOptionWire, AuditLogListSortFieldOption, AuditLogListSortFieldOptionWire, AuditLogSourceLabelOption, AuditLogSourceLabelOptionWire, } from './entity/invoicing/invoicingCommonPayload';
1068
1068
  export { INVOICING_DUNNING_ACTIONS, INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS, INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS, INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS, INVOICING_DISCOUNT_LIFECYCLE_ACTIONS, toInvoicingDunningAction, toInvoicingSubscriptionLifecycleAction, toInvoicingSubscriptionLifecycleActionOption, toInvoicingCatalogItemLifecycleAction, toInvoicingCatalogProductLifecycleAction, toInvoicingCatalogItemLifecycleActionOption, toInvoicingCatalogProductLifecycleActionOption, toInvoicingDiscountLifecycleAction, toInvoicingDiscountLifecycleActionOption, buildInvoicingEntityPath, isInvoicingEntityLinkable, toAuditLogEntityRouteOption, } from './entity/invoicing/invoicingCommonPayload';
1069
- export type { InvoicingPlan } from './entity/invoicing/plan/planState';
1070
- export type { InvoicingAccountingDetail, InvoicingPlanTier, InvoicingProduct, } from './entity/invoicing/product/productState';
1069
+ export type { InvoicingAccountingDetail, InvoicingCatalogItem, InvoicingCatalogTier, InvoicingCatalogPricePoint, } from './entity/invoicing/invoicingCatalog/invoicingCatalogState';
1071
1070
  export type { InvoicingBillingPeriodUnit, InvoicingSubscriptionStatus, } from './entity/invoicing/invoicingSubscription/invoicingSubscriptionTypes';
1072
1071
  export type { InvoicingContractTerm, InvoicingSubscription, InvoicingSubscriptionCoupon, InvoicingSubscriptionItem, } from './entity/invoicing/invoicingSubscription/invoicingSubscriptionState';
1073
1072
  export type { InvoicingLinkedCreditNoteRef, InvoicingLinkedInvoiceRef, InvoicingLinkedRefund, InvoicingTransaction, } from './entity/invoicing/invoicingTransaction/invoicingTransactionState';
@@ -1225,17 +1224,14 @@ export { clearInvoicingDunningCaseDetailView, fetchInvoicingDunningCaseDetail, f
1225
1224
  export { getInvoicingDunningCaseById, getInvoicingDunningCaseDetail, getInvoicingDunningEmailPreview, } from './view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewSelector';
1226
1225
  export type { InvoicingDunningCaseDetailView } from './view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewSelector';
1227
1226
  export type { InvoicingDunningEmailPreview, InvoicingDunningEmailPreviewState, } from './view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewState';
1228
- export { mergeInvoicingPlanSubFamily, removeInvoicingPlan, updateInvoicingPlans, } from './entity/invoicing/plan/planReducer';
1229
- export { removeInvoicingProduct, updateInvoicingProducts, } from './entity/invoicing/product/productReducer';
1227
+ export { mergeInvoicingCatalogPricePoint, removeInvoicingCatalogItem, updateInvoicingCatalogItems, } from './entity/invoicing/invoicingCatalog/invoicingCatalogReducer';
1230
1228
  export { fetchInvoicingCatalogCounts, fetchInvoicingCatalogListPage, fetchInvoicingCatalogPlanList, fetchInvoicingCatalogProductList, updateInvoicingCatalogPlanFilters, updateInvoicingCatalogProductFilters, } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewReducer';
1231
- export { ALL_INVOICING_PRODUCT_SORT_KEYS, INVOICING_PRODUCT_COLUMNS, } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState';
1232
- export type { InvoicingCatalogPlanFilters, InvoicingCatalogProductFilters, InvoicingProductColumnConfig, InvoicingProductSortKey, } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState';
1229
+ export type { InvoicingCatalogPlanFilters, InvoicingCatalogProductFilters, } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewState';
1233
1230
  export { getInvoicingCatalogListView } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector';
1234
- export type { InvoicingCatalogListView } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector';
1231
+ export type { InvoicingCatalogListView, InvoicingCatalogPlanRow, } from './view/invoicing/invoicingCatalogListView/invoicingCatalogListViewSelector';
1235
1232
  export { fetchInvoicingCatalogItemDetail } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer';
1236
1233
  export type { InvoicingCatalogItemKind } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewState';
1237
- export { getInvoicingPlanById, getLowestInvoicingPlanPricePointAmount, } from './entity/invoicing/plan/planSelector';
1238
- export { getInvoicingProductById } from './entity/invoicing/product/productSelector';
1234
+ export { getInvoicingCatalogItemById, getLowestInvoicingCatalogPricePointAmount, } from './entity/invoicing/invoicingCatalog/invoicingCatalogSelector';
1239
1235
  export { connectInvoicingStripe, disconnectInvoicingStripe, fetchInvoicingSettings, resetInvoicingBrandingFormDraft, resetInvoicingQboSettingsDraft, resetSaveInvoicingSettings, saveInvoicingSettings, submitInvoicingBrandingForm, submitInvoicingQboSettings, updateInvoicingBrandingFormDraft, updateInvoicingQboSettingsDraft, updateInvoicingSettings, } from './view/invoicing/settingsView/settingsViewReducer';
1240
1236
  export { getInvoicingBrandingFormView, getInvoicingQboSettingsFormView, getInvoicingSettings, getInvoicingSettingsFetchState, getInvoicingSettingsHubView, getInvoicingSettingsView, } from './view/invoicing/settingsView/settingsViewSelector';
1241
1237
  export type { InvoicingBrandingFormView, InvoicingQboSettingsFormView, InvoicingSettingsHubView, InvoicingSettingsView, } from './view/invoicing/settingsView/settingsViewSelector';