@zeniai/client-epic-state 5.1.93 → 5.1.94

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 (145) hide show
  1. package/lib/entity/aiCfo/aiCfoPayload.d.ts +7 -0
  2. package/lib/entity/aiCfo/aiCfoReducer.d.ts +3 -2
  3. package/lib/entity/aiCfo/aiCfoReducer.js +25 -2
  4. package/lib/entity/aiCfo/aiCfoState.d.ts +7 -0
  5. package/lib/entity/company/companyPayload.d.ts +4 -0
  6. package/lib/entity/company/companyPayload.js +18 -8
  7. package/lib/entity/company/companyStateTypes.d.ts +4 -0
  8. package/lib/entity/customerSatisfaction/customerSatisfactionReducer.d.ts +1 -1
  9. package/lib/entity/customerSatisfaction/customerSatisfactionReducer.js +6 -2
  10. package/lib/entity/snackbar/snackbarApiError.d.ts +8 -0
  11. package/lib/entity/snackbar/snackbarApiError.js +15 -0
  12. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  13. package/lib/entity/snackbar/snackbarTypes.js +31 -0
  14. package/lib/entity/tenant/tenantReducer.d.ts +5 -1
  15. package/lib/entity/tenant/tenantReducer.js +21 -2
  16. package/lib/epic.d.ts +3 -1
  17. package/lib/epic.js +5 -1
  18. package/lib/esm/entity/aiCfo/aiCfoReducer.js +23 -1
  19. package/lib/esm/entity/company/companyPayload.js +18 -8
  20. package/lib/esm/entity/customerSatisfaction/customerSatisfactionReducer.js +4 -1
  21. package/lib/esm/entity/snackbar/snackbarApiError.js +11 -0
  22. package/lib/esm/entity/snackbar/snackbarTypes.js +31 -0
  23. package/lib/esm/entity/tenant/tenantReducer.js +20 -1
  24. package/lib/esm/epic.js +5 -1
  25. package/lib/esm/index.js +9 -8
  26. package/lib/esm/view/companyHealthMetricView/companyHealthMetricConfigReducer.js +4 -1
  27. package/lib/esm/view/companyView/companyViewReducer.js +58 -1
  28. package/lib/esm/view/companyView/epic/updateCompanyProductServicesEpic.js +91 -0
  29. package/lib/esm/view/companyView/epic/updateCompanyQboRealmIdEpic.js +58 -0
  30. package/lib/esm/view/companyView/selector/companyManagementViewSelector.js +52 -0
  31. package/lib/esm/view/companyView/types/cockpitTypes.js +13 -1
  32. package/lib/esm/view/companyView/types/companyManagementViewState.js +2 -0
  33. package/lib/esm/view/invoicing/createCreditNote/createCreditNoteEpic.js +26 -4
  34. package/lib/esm/view/invoicing/createInvoice/createInvoiceEpic.js +26 -4
  35. package/lib/esm/view/invoicing/createInvoice/createInvoiceSelector.js +37 -10
  36. package/lib/esm/view/invoicing/discountAction/discountActionEpic.js +37 -10
  37. package/lib/esm/view/invoicing/dunningAction/dunningActionEpic.js +39 -10
  38. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +5 -1
  39. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +5 -4
  40. package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +35 -5
  41. package/lib/esm/view/invoicing/editInvoicingCouponDetailView/saveInvoicingCouponEpic.js +25 -3
  42. package/lib/esm/view/invoicing/editInvoicingCustomerDetailView/saveInvoicingCustomerEpic.js +26 -4
  43. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +26 -4
  44. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/syncInvoicingSubscriptionCouponsEpic.js +20 -3
  45. package/lib/esm/view/invoicing/invoiceAction/invoiceActionEpic.js +65 -18
  46. package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +30 -0
  47. package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.js +4 -29
  48. package/lib/esm/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewEpic.js +26 -0
  49. package/lib/esm/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewPageEpic.js +16 -0
  50. package/lib/esm/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewPayload.js +9 -1
  51. package/lib/esm/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewReducer.js +50 -1
  52. package/lib/esm/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewSelector.js +14 -1
  53. package/lib/esm/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +31 -10
  54. package/lib/esm/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +30 -5
  55. package/lib/esm/view/invoicing/issueCreditNote/issueCreditNoteEpic.js +26 -4
  56. package/lib/esm/view/invoicing/issueCreditNote/issueCreditNoteSelector.js +22 -14
  57. package/lib/esm/view/invoicing/recordPayment/recordPaymentEpic.js +49 -7
  58. package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +30 -9
  59. package/lib/esm/view/invoicing/settingsView/settingsViewReducer.js +1 -1
  60. package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +56 -1
  61. package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionEpic.js +45 -10
  62. package/lib/esm/view/vendorFiling1099/vendorFiling1099UploadDetails/vendorFiling1099UploadDetailsReducer.js +4 -1
  63. package/lib/esm/view/vendorTabView/vendorTabViewReducer.js +4 -1
  64. package/lib/index.d.ts +17 -13
  65. package/lib/index.js +62 -50
  66. package/lib/view/companyHealthMetricView/companyHealthMetricConfigReducer.d.ts +1 -1
  67. package/lib/view/companyHealthMetricView/companyHealthMetricConfigReducer.js +5 -2
  68. package/lib/view/companyView/companyViewReducer.d.ts +22 -1
  69. package/lib/view/companyView/companyViewReducer.js +60 -3
  70. package/lib/view/companyView/epic/updateCompanyProductServicesEpic.d.ts +10 -0
  71. package/lib/view/companyView/epic/updateCompanyProductServicesEpic.js +95 -0
  72. package/lib/view/companyView/epic/updateCompanyQboRealmIdEpic.d.ts +8 -0
  73. package/lib/view/companyView/epic/updateCompanyQboRealmIdEpic.js +62 -0
  74. package/lib/view/companyView/selector/companyManagementViewSelector.d.ts +3 -0
  75. package/lib/view/companyView/selector/companyManagementViewSelector.js +55 -0
  76. package/lib/view/companyView/types/cockpitTypes.d.ts +7 -3
  77. package/lib/view/companyView/types/cockpitTypes.js +15 -1
  78. package/lib/view/companyView/types/companyManagementViewState.d.ts +2 -0
  79. package/lib/view/companyView/types/companyManagementViewState.js +2 -0
  80. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  81. package/lib/view/invoicing/createCreditNote/createCreditNoteEpic.d.ts +2 -1
  82. package/lib/view/invoicing/createCreditNote/createCreditNoteEpic.js +25 -3
  83. package/lib/view/invoicing/createInvoice/createInvoiceEpic.d.ts +2 -1
  84. package/lib/view/invoicing/createInvoice/createInvoiceEpic.js +25 -3
  85. package/lib/view/invoicing/createInvoice/createInvoiceSelector.d.ts +22 -8
  86. package/lib/view/invoicing/createInvoice/createInvoiceSelector.js +37 -10
  87. package/lib/view/invoicing/discountAction/discountActionEpic.d.ts +2 -1
  88. package/lib/view/invoicing/discountAction/discountActionEpic.js +35 -8
  89. package/lib/view/invoicing/dunningAction/dunningActionEpic.d.ts +2 -1
  90. package/lib/view/invoicing/dunningAction/dunningActionEpic.js +37 -8
  91. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.d.ts +3 -1
  92. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload.js +5 -1
  93. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +5 -4
  94. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.d.ts +2 -1
  95. package/lib/view/invoicing/editInvoicingCatalogItemDetailView/saveInvoicingCatalogItemEpic.js +34 -4
  96. package/lib/view/invoicing/editInvoicingCouponDetailView/saveInvoicingCouponEpic.d.ts +2 -1
  97. package/lib/view/invoicing/editInvoicingCouponDetailView/saveInvoicingCouponEpic.js +24 -2
  98. package/lib/view/invoicing/editInvoicingCustomerDetailView/saveInvoicingCustomerEpic.d.ts +2 -1
  99. package/lib/view/invoicing/editInvoicingCustomerDetailView/saveInvoicingCustomerEpic.js +25 -3
  100. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.d.ts +2 -1
  101. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/saveInvoicingSubscriptionEpic.js +25 -3
  102. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/syncInvoicingSubscriptionCouponsEpic.d.ts +2 -1
  103. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/syncInvoicingSubscriptionCouponsEpic.js +19 -2
  104. package/lib/view/invoicing/invoiceAction/invoiceActionEpic.d.ts +2 -1
  105. package/lib/view/invoicing/invoiceAction/invoiceActionEpic.js +63 -16
  106. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewPayload.d.ts +13 -0
  107. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.d.ts +1 -1
  108. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +30 -0
  109. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.d.ts +11 -31
  110. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewSelector.js +4 -29
  111. package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewState.d.ts +15 -0
  112. package/lib/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewEpic.d.ts +7 -0
  113. package/lib/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewEpic.js +30 -0
  114. package/lib/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewPageEpic.d.ts +6 -0
  115. package/lib/view/invoicing/invoicingDunningCaseDetailView/fetchInvoicingDunningEmailPreviewPageEpic.js +20 -0
  116. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewEpics.d.ts +2 -2
  117. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewPayload.d.ts +12 -0
  118. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewPayload.js +11 -0
  119. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewReducer.d.ts +21 -4
  120. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewReducer.js +51 -2
  121. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewSelector.d.ts +3 -0
  122. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewSelector.js +16 -2
  123. package/lib/view/invoicing/invoicingDunningCaseDetailView/invoicingDunningCaseDetailViewState.d.ts +13 -0
  124. package/lib/view/invoicing/invoicingQboView/epics/invoicingQboViewActionType.d.ts +2 -1
  125. package/lib/view/invoicing/invoicingQboView/epics/retryInvoicingQboSyncTaskEpic.js +30 -9
  126. package/lib/view/invoicing/invoicingQboView/epics/startInvoicingQboBackfillEpic.js +29 -4
  127. package/lib/view/invoicing/issueCreditNote/issueCreditNoteEpic.d.ts +2 -1
  128. package/lib/view/invoicing/issueCreditNote/issueCreditNoteEpic.js +25 -3
  129. package/lib/view/invoicing/issueCreditNote/issueCreditNoteSelector.d.ts +24 -7
  130. package/lib/view/invoicing/issueCreditNote/issueCreditNoteSelector.js +23 -16
  131. package/lib/view/invoicing/recordPayment/recordPaymentEpic.d.ts +2 -1
  132. package/lib/view/invoicing/recordPayment/recordPaymentEpic.js +48 -6
  133. package/lib/view/invoicing/settingsView/settingsViewEpics.d.ts +2 -1
  134. package/lib/view/invoicing/settingsView/settingsViewEpics.js +28 -7
  135. package/lib/view/invoicing/settingsView/settingsViewReducer.d.ts +10 -1
  136. package/lib/view/invoicing/settingsView/settingsViewReducer.js +1 -1
  137. package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +44 -2
  138. package/lib/view/invoicing/settingsView/settingsViewSelector.js +59 -2
  139. package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.d.ts +2 -1
  140. package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.js +43 -8
  141. package/lib/view/vendorFiling1099/vendorFiling1099UploadDetails/vendorFiling1099UploadDetailsReducer.d.ts +1 -1
  142. package/lib/view/vendorFiling1099/vendorFiling1099UploadDetails/vendorFiling1099UploadDetailsReducer.js +5 -2
  143. package/lib/view/vendorTabView/vendorTabViewReducer.d.ts +1 -1
  144. package/lib/view/vendorTabView/vendorTabViewReducer.js +5 -2
  145. package/package.json +2 -2
@@ -1,11 +1,31 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateInvoicingCoupons } from '../../../entity/invoicing/coupon/couponReducer';
4
- import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
4
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
5
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
6
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
5
7
  import { runInvoicingDiscountAction, runInvoicingDiscountActionFailure, runInvoicingDiscountActionSuccess, } from './discountActionReducer';
8
+ /** Snackbar copy per action kind; unlisted kinds run without one. */
9
+ const SNACKBAR_SECTION_BY_KIND = {
10
+ archive: 'invoicing_discount_archive',
11
+ delete: 'invoicing_discount_delete',
12
+ unarchive: 'invoicing_discount_unarchive',
13
+ };
6
14
  export const runInvoicingDiscountActionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(runInvoicingDiscountAction.match), mergeMap((action) => {
7
15
  const { action: kind, id } = action.payload;
8
16
  const requestBody = { action: kind };
17
+ const snackbarSection = SNACKBAR_SECTION_BY_KIND[kind];
18
+ /** `status` surfaces the platform's error text; omit it to keep the generic copy. */
19
+ const snackbar = (messageText, status) => snackbarSection == null
20
+ ? []
21
+ : [
22
+ openSnackbar({
23
+ messageSection: snackbarSection,
24
+ messageText,
25
+ type: messageText === 'success' ? 'success' : 'error',
26
+ variables: apiErrorSnackbarVariables(status),
27
+ }),
28
+ ];
9
29
  const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/discounts/${encodeURIComponent(id)}/actions`;
10
30
  return zeniAPI
11
31
  .postAndGetJSON(apiUrl, requestBody)
@@ -14,15 +34,22 @@ export const runInvoicingDiscountActionEpic = (actions$, _state$, zeniAPI) => ac
14
34
  return [
15
35
  updateInvoicingCoupons([response.data], 'merge'),
16
36
  runInvoicingDiscountActionSuccess({ id }),
37
+ ...snackbar('success'),
17
38
  ];
18
39
  }
19
- return of(runInvoicingDiscountActionFailure({
20
- error: response.status,
40
+ return from([
41
+ runInvoicingDiscountActionFailure({
42
+ error: response.status,
43
+ id,
44
+ }),
45
+ ...snackbar('failed', response.status),
46
+ ]);
47
+ }), catchError((error) => from([
48
+ runInvoicingDiscountActionFailure({
49
+ error: createZeniAPIStatus('Unexpected Error', 'Discount action REST API call errored out ' +
50
+ JSON.stringify(error)),
21
51
  id,
22
- }));
23
- }), catchError((error) => of(runInvoicingDiscountActionFailure({
24
- error: createZeniAPIStatus('Unexpected Error', 'Discount action REST API call errored out ' +
25
- JSON.stringify(error)),
26
- id,
27
- }))));
52
+ }),
53
+ ...snackbar('failed'),
54
+ ])));
28
55
  }));
@@ -1,10 +1,32 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateInvoicingDunningCases } from '../../../entity/invoicing/dunningCase/dunningCaseReducer';
4
- import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
4
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
5
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
6
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
5
7
  import { runInvoicingDunningAction, runInvoicingDunningActionFailure, runInvoicingDunningActionSuccess, } from './dunningActionReducer';
8
+ /**
9
+ * Snackbar copy is per action kind; anything not listed here runs without one.
10
+ */
11
+ const SNACKBAR_SECTION_BY_KIND = {
12
+ cancel: 'invoicing_dunning_cancel',
13
+ resolve: 'invoicing_dunning_case_resolved',
14
+ retry: 'invoicing_dunning_retry',
15
+ };
6
16
  export const runInvoicingDunningActionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(runInvoicingDunningAction.match), mergeMap((action) => {
7
17
  const { action: kind, body, id } = action.payload;
18
+ const snackbarSection = SNACKBAR_SECTION_BY_KIND[kind];
19
+ /** `status` surfaces the platform's error text; omit it to keep the generic copy. */
20
+ const snackbar = (messageText, status) => snackbarSection == null
21
+ ? []
22
+ : [
23
+ openSnackbar({
24
+ messageSection: snackbarSection,
25
+ messageText,
26
+ type: messageText === 'success' ? 'success' : 'error',
27
+ variables: apiErrorSnackbarVariables(status),
28
+ }),
29
+ ];
8
30
  const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/dunning/${encodeURIComponent(id)}/${kind}`;
9
31
  return zeniAPI
10
32
  .postAndGetJSON(apiUrl, (body ?? {}))
@@ -13,15 +35,22 @@ export const runInvoicingDunningActionEpic = (actions$, _state$, zeniAPI) => act
13
35
  return [
14
36
  updateInvoicingDunningCases([response.data], 'merge'),
15
37
  runInvoicingDunningActionSuccess({ id }),
38
+ ...snackbar('success'),
16
39
  ];
17
40
  }
18
- return of(runInvoicingDunningActionFailure({
19
- error: response.status,
41
+ return from([
42
+ runInvoicingDunningActionFailure({
43
+ error: response.status,
44
+ id,
45
+ }),
46
+ ...snackbar('failed', response.status),
47
+ ]);
48
+ }), catchError((error) => from([
49
+ runInvoicingDunningActionFailure({
50
+ error: createZeniAPIStatus('Unexpected Error', 'Dunning action REST API call errored out ' +
51
+ JSON.stringify(error)),
20
52
  id,
21
- }));
22
- }), catchError((error) => of(runInvoicingDunningActionFailure({
23
- error: createZeniAPIStatus('Unexpected Error', 'Dunning action REST API call errored out ' +
24
- JSON.stringify(error)),
25
- id,
26
- }))));
53
+ }),
54
+ ...snackbar('failed'),
55
+ ])));
27
56
  }));
@@ -116,17 +116,21 @@ export const catalogDetailEditValuesToSavePayload = (values, itemType = 'plan',
116
116
  export const createSubFamilyFormToPayload = (itemId, itemType, values) => {
117
117
  const name = values.name.trim();
118
118
  const priceCode = trimOrUndefined(values.priceCode) ?? toProductCode(name);
119
+ const tiered = isTieredCatalogPricingModel(values.pricingModel);
119
120
  const payload = {
120
121
  currency_code: 'USD',
121
122
  free_quantity: Number(values.freeQuantity) || 0,
122
123
  is_taxable: true,
123
124
  item_id: itemId,
124
125
  name,
125
- price: values.priceDollars?.amount ?? 0,
126
+ price: tiered ? 0 : (values.priceDollars?.amount ?? 0),
126
127
  price_code: priceCode,
127
128
  pricing_model: values.pricingModel || 'flat_fee',
128
129
  show_description_in_invoices: true,
129
130
  };
131
+ if (tiered) {
132
+ payload.tiers = (values.tiers ?? []).map(tierToPayload);
133
+ }
130
134
  const description = trimOrUndefined(values.description);
131
135
  if (description != null) {
132
136
  payload.description = description;
@@ -80,6 +80,8 @@ const buildSubFamilyPayload = (localData, subFamily, clearEmptyValues) => {
80
80
  }
81
81
  return payload;
82
82
  };
83
+ /** `unit` is the item's unit of measure, not a currency; `CURRENCY_CODE` above prices sub-families. */
84
+ const DEFAULT_CATALOG_ITEM_UNIT = 'USD';
83
85
  /**
84
86
  * Build the parent catalog-item request body from the form draft. Creates omit
85
87
  * both parent and sub-family IDs; edits retain returned sub-family IDs.
@@ -101,10 +103,9 @@ export const localDataToSaveInvoicingCatalogItemPayload = (localData, isCreate)
101
103
  if (description != null) {
102
104
  itemPayload.description = description;
103
105
  }
104
- const unit = trimOrUndefined(localData.unit);
105
- if (unit != null) {
106
- itemPayload.unit = unit;
107
- }
106
+ // The form no longer collects a unit; an item that already has one keeps it.
107
+ itemPayload.unit =
108
+ trimOrUndefined(localData.unit) ?? DEFAULT_CATALOG_ITEM_UNIT;
108
109
  if (localData.itemApplicability === 'restricted' &&
109
110
  localData.applicableItems.length > 0) {
110
111
  itemPayload.applicable_items = localData.applicableItems;
@@ -1,7 +1,9 @@
1
- import { forkJoin, of } from 'rxjs';
1
+ import { forkJoin, from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { mergeInvoicingPlanSubFamily, updateInvoicingPlans, } from '../../../entity/invoicing/plan/planReducer';
4
4
  import { updateInvoicingProducts } from '../../../entity/invoicing/product/productReducer';
5
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
6
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
5
7
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
6
8
  import { addInvoicingCatalogItem } from '../invoicingCatalogListView/invoicingCatalogListViewReducer';
7
9
  import { localDataToSaveInvoicingCatalogItemPayload, } from './editInvoicingCatalogItemDetailViewPayload';
@@ -38,7 +40,15 @@ export const saveInvoicingCatalogItemEpic = (actions$, state$, zeniAPI) => actio
38
40
  const failedProductResponse = productResponses.find((productResponse) => !isSuccessResponse(productResponse) ||
39
41
  productResponse.data == null);
40
42
  if (failedProductResponse != null) {
41
- return of(submitInvoicingCatalogItemFormFailure(failedProductResponse.status));
43
+ return from([
44
+ submitInvoicingCatalogItemFormFailure(failedProductResponse.status),
45
+ openSnackbar({
46
+ messageSection: 'invoicing_catalog_item_saved',
47
+ messageText: 'failed',
48
+ type: 'error',
49
+ variables: apiErrorSnackbarVariables(failedProductResponse.status),
50
+ }),
51
+ ]);
42
52
  }
43
53
  const savedProducts = productResponses.flatMap((productResponse) => productResponse.data != null ? [productResponse.data] : []);
44
54
  const resultActions = [
@@ -65,6 +75,11 @@ export const saveInvoicingCatalogItemEpic = (actions$, state$, zeniAPI) => actio
65
75
  : 'plan';
66
76
  resultActions.push(addInvoicingCatalogItem({ id: savedItem.id, type: itemType }));
67
77
  }
78
+ resultActions.push(openSnackbar({
79
+ messageSection: 'invoicing_catalog_item_saved',
80
+ messageText: 'success',
81
+ type: 'success',
82
+ }));
68
83
  return resultActions;
69
84
  };
70
85
  const productUpdates = saveInvoicingCatalogItem.match(action)
@@ -75,7 +90,22 @@ export const saveInvoicingCatalogItemEpic = (actions$, state$, zeniAPI) => actio
75
90
  }
76
91
  return forkJoin(productUpdates.map((productUpdate) => zeniAPI.putAndGetJSON(`${baseUrl}/catalog/products/${encodeURIComponent(productUpdate.id)}`, productUpdate.data))).pipe(mergeMap(completeSave));
77
92
  }
78
- return of(submitInvoicingCatalogItemFormFailure(response.status));
79
- }), catchError((error) => of(submitInvoicingCatalogItemFormFailure(createZeniAPIStatus('Unexpected Error', 'Save catalog item REST API call errored out ' +
80
- JSON.stringify(error))))));
93
+ return from([
94
+ submitInvoicingCatalogItemFormFailure(response.status),
95
+ openSnackbar({
96
+ messageSection: 'invoicing_catalog_item_saved',
97
+ messageText: 'failed',
98
+ type: 'error',
99
+ variables: apiErrorSnackbarVariables(response.status),
100
+ }),
101
+ ]);
102
+ }), catchError((error) => from([
103
+ submitInvoicingCatalogItemFormFailure(createZeniAPIStatus('Unexpected Error', 'Save catalog item REST API call errored out ' +
104
+ JSON.stringify(error))),
105
+ openSnackbar({
106
+ messageSection: 'invoicing_catalog_item_saved',
107
+ messageText: 'failed',
108
+ type: 'error',
109
+ }),
110
+ ])));
81
111
  }));
@@ -1,6 +1,8 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateInvoicingCoupons } from '../../../entity/invoicing/coupon/couponReducer';
4
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
5
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
6
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
5
7
  import { addInvoicingCouponToList } from '../couponView/couponViewReducer';
6
8
  import { localDataToSaveInvoicingCouponPayload, } from './editInvoicingCouponDetailViewPayload';
@@ -43,8 +45,28 @@ export const saveInvoicingCouponEpic = (actions$, state$, zeniAPI) => actions$.p
43
45
  status: couponPayload.status,
44
46
  }));
45
47
  }
48
+ resultActions.push(openSnackbar({
49
+ messageSection: 'invoicing_coupon_saved',
50
+ messageText: 'success',
51
+ type: 'success',
52
+ }));
46
53
  return resultActions;
47
54
  }
48
- return of(submitInvoicingCouponFormFailure(response.status));
49
- }), catchError((error) => of(submitInvoicingCouponFormFailure(createZeniAPIStatus('Unexpected Error', 'Save coupon REST API call errored out ' + JSON.stringify(error))))));
55
+ return from([
56
+ submitInvoicingCouponFormFailure(response.status),
57
+ openSnackbar({
58
+ messageSection: 'invoicing_coupon_saved',
59
+ messageText: 'failed',
60
+ type: 'error',
61
+ variables: apiErrorSnackbarVariables(response.status),
62
+ }),
63
+ ]);
64
+ }), catchError((error) => from([
65
+ submitInvoicingCouponFormFailure(createZeniAPIStatus('Unexpected Error', 'Save coupon REST API call errored out ' + JSON.stringify(error))),
66
+ openSnackbar({
67
+ messageSection: 'invoicing_coupon_saved',
68
+ messageText: 'failed',
69
+ type: 'error',
70
+ }),
71
+ ])));
50
72
  }));
@@ -1,8 +1,10 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateAddresses } from '../../../entity/address/addressReducer';
4
4
  import { extractInvoicingCustomerAddresses } from '../../../entity/invoicing/invoicingCustomer/invoicingCustomerPayload';
5
5
  import { updateInvoicingCustomers } from '../../../entity/invoicing/invoicingCustomer/invoicingCustomerReducer';
6
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
7
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
6
8
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
7
9
  import { resetNewAddressDataInLocalStore } from '../../addressView/addressViewReducer';
8
10
  import { addInvoicingCustomerToList } from '../invoicingCustomerListView/invoicingCustomerListViewReducer';
@@ -45,9 +47,29 @@ export const saveInvoicingCustomerEpic = (actions$, state$, zeniAPI) => actions$
45
47
  status: response.data.status,
46
48
  }));
47
49
  }
50
+ resultActions.push(openSnackbar({
51
+ messageSection: 'invoicing_customer_saved',
52
+ messageText: 'success',
53
+ type: 'success',
54
+ }));
48
55
  return resultActions;
49
56
  }
50
- return of(submitInvoicingCustomerFormFailure(response.status));
51
- }), catchError((error) => of(submitInvoicingCustomerFormFailure(createZeniAPIStatus('Unexpected Error', 'Save customer REST API call errored out ' +
52
- JSON.stringify(error))))));
57
+ return from([
58
+ submitInvoicingCustomerFormFailure(response.status),
59
+ openSnackbar({
60
+ messageSection: 'invoicing_customer_saved',
61
+ messageText: 'failed',
62
+ type: 'error',
63
+ variables: apiErrorSnackbarVariables(response.status),
64
+ }),
65
+ ]);
66
+ }), catchError((error) => from([
67
+ submitInvoicingCustomerFormFailure(createZeniAPIStatus('Unexpected Error', 'Save customer REST API call errored out ' +
68
+ JSON.stringify(error))),
69
+ openSnackbar({
70
+ messageSection: 'invoicing_customer_saved',
71
+ messageText: 'failed',
72
+ type: 'error',
73
+ }),
74
+ ])));
53
75
  }));
@@ -1,8 +1,10 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateAddresses } from '../../../entity/address/addressReducer';
4
4
  import { extractInvoicingSubscriptionAddresses } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionPayload';
5
5
  import { updateInvoicingSubscriptions } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionReducer';
6
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
7
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
6
8
  import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
7
9
  import { resetNewAddressDataInLocalStore } from '../../addressView/addressViewReducer';
8
10
  import { addInvoicingSubscriptionToList } from '../invoicingSubscriptionListView/invoicingSubscriptionListViewReducer';
@@ -38,7 +40,15 @@ export const saveInvoicingSubscriptionEpic = (actions$, state$, zeniAPI) => acti
38
40
  : zeniAPI.postAndGetJSON(`${baseUrl}/subscriptions`, { ...data });
39
41
  return request$.pipe(mergeMap((response) => {
40
42
  if (!isSuccessResponse(response) || response.data == null) {
41
- return [submitInvoicingSubscriptionFormFailure(response.status)];
43
+ return [
44
+ submitInvoicingSubscriptionFormFailure(response.status),
45
+ openSnackbar({
46
+ messageSection: 'invoicing_subscription_saved',
47
+ messageText: 'failed',
48
+ type: 'error',
49
+ variables: apiErrorSnackbarVariables(response.status),
50
+ }),
51
+ ];
42
52
  }
43
53
  const saved = response.data;
44
54
  const couponChanged = id != null &&
@@ -78,7 +88,19 @@ export const saveInvoicingSubscriptionEpic = (actions$, state$, zeniAPI) => acti
78
88
  status: saved.status,
79
89
  }));
80
90
  }
91
+ resultActions.push(openSnackbar({
92
+ messageSection: 'invoicing_subscription_saved',
93
+ messageText: 'success',
94
+ type: 'success',
95
+ }));
81
96
  return resultActions;
82
- }), catchError((error) => of(submitInvoicingSubscriptionFormFailure(createZeniAPIStatus('Unexpected Error', 'Save subscription REST API call errored out ' +
83
- JSON.stringify(error))))));
97
+ }), catchError((error) => from([
98
+ submitInvoicingSubscriptionFormFailure(createZeniAPIStatus('Unexpected Error', 'Save subscription REST API call errored out ' +
99
+ JSON.stringify(error))),
100
+ openSnackbar({
101
+ messageSection: 'invoicing_subscription_saved',
102
+ messageText: 'failed',
103
+ type: 'error',
104
+ }),
105
+ ])));
84
106
  }));
@@ -1,8 +1,9 @@
1
- import { EMPTY, of } from 'rxjs';
1
+ import { EMPTY, from, of } from 'rxjs';
2
2
  import { catchError, filter, map, mergeMap } from 'rxjs/operators';
3
3
  import { updateAddresses } from '../../../entity/address/addressReducer';
4
4
  import { extractInvoicingSubscriptionAddresses, } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionPayload';
5
5
  import { updateInvoicingSubscriptions } from '../../../entity/invoicing/invoicingSubscription/invoicingSubscriptionReducer';
6
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
6
7
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
7
8
  import { resetNewAddressDataInLocalStore } from '../../addressView/addressViewReducer';
8
9
  import { submitInvoicingSubscriptionFormFailure, submitInvoicingSubscriptionFormSuccess, syncInvoicingSubscriptionCoupons, } from './editInvoicingSubscriptionDetailViewReducer';
@@ -39,7 +40,14 @@ export const syncInvoicingSubscriptionCouponsEpic = (actions$, _state$, zeniAPI)
39
40
  : couponMutation$(zeniAPI, baseUrl, subscriptionId, 'remove-coupon', prev);
40
41
  return removeStep$.pipe(mergeMap((removeResult) => {
41
42
  if (!removeResult.success) {
42
- return of(submitInvoicingSubscriptionFormFailure(failureStatus(removeResult)));
43
+ return from([
44
+ submitInvoicingSubscriptionFormFailure(failureStatus(removeResult)),
45
+ openSnackbar({
46
+ messageSection: 'invoicing_subscription_saved',
47
+ messageText: 'failed',
48
+ type: 'error',
49
+ }),
50
+ ]);
43
51
  }
44
52
  const applyStep$ = next === ''
45
53
  ? of({
@@ -51,6 +59,11 @@ export const syncInvoicingSubscriptionCouponsEpic = (actions$, _state$, zeniAPI)
51
59
  if (!applyResult.success) {
52
60
  return [
53
61
  submitInvoicingSubscriptionFormFailure(failureStatus(applyResult)),
62
+ openSnackbar({
63
+ messageSection: 'invoicing_subscription_saved',
64
+ messageText: 'failed',
65
+ type: 'error',
66
+ }),
54
67
  ];
55
68
  }
56
69
  const couponUpdated = applyResult.payload ?? removeResult.payload;
@@ -58,7 +71,11 @@ export const syncInvoicingSubscriptionCouponsEpic = (actions$, _state$, zeniAPI)
58
71
  if (couponUpdated != null) {
59
72
  resultActions.push(updateInvoicingSubscriptions([couponUpdated], 'merge'), updateAddresses(extractInvoicingSubscriptionAddresses([couponUpdated])));
60
73
  }
61
- resultActions.push(submitInvoicingSubscriptionFormSuccess({ subscriptionId }), resetNewAddressDataInLocalStore(INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE));
74
+ resultActions.push(submitInvoicingSubscriptionFormSuccess({ subscriptionId }), resetNewAddressDataInLocalStore(INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE), openSnackbar({
75
+ messageSection: 'invoicing_subscription_saved',
76
+ messageText: 'success',
77
+ type: 'success',
78
+ }));
62
79
  return resultActions;
63
80
  }));
64
81
  }));
@@ -1,13 +1,33 @@
1
- import { of } from 'rxjs';
1
+ import { from } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { updateAddresses } from '../../../entity/address/addressReducer';
4
4
  import { extractInvoicingInvoiceAddresses } from '../../../entity/invoicing/invoice/invoicePayload';
5
5
  import { updateInvoices } from '../../../entity/invoicing/invoice/invoiceReducer';
6
- import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
6
+ import { apiErrorSnackbarVariables } from '../../../entity/snackbar/snackbarApiError';
7
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
8
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
7
9
  import { runInvoicingInvoiceAction, runInvoicingInvoiceActionFailure, runInvoicingInvoiceActionSuccess, updateInvoicingInvoice, } from './invoiceActionReducer';
10
+ /** Snackbar copy per action kind; unlisted kinds run without one. */
11
+ const SNACKBAR_SECTION_BY_KIND = {
12
+ regenerate: 'invoicing_invoice_regenerated',
13
+ 'send-reminder': 'invoicing_invoice_reminder_sent',
14
+ void: 'invoicing_invoice_voided',
15
+ };
8
16
  export const runInvoicingInvoiceActionEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter((action) => runInvoicingInvoiceAction.match(action) &&
9
17
  action.payload.action !== 'issue-credit-note'), mergeMap((action) => {
10
18
  const { action: kind, body, invoiceId } = action.payload;
19
+ const snackbarSection = SNACKBAR_SECTION_BY_KIND[kind];
20
+ /** `status` surfaces the platform's error text; omit it to keep the generic copy. */
21
+ const snackbar = (messageText, status) => snackbarSection == null
22
+ ? []
23
+ : [
24
+ openSnackbar({
25
+ messageSection: snackbarSection,
26
+ messageText,
27
+ type: messageText === 'success' ? 'success' : 'error',
28
+ variables: apiErrorSnackbarVariables(status),
29
+ }),
30
+ ];
11
31
  const apiUrl = `${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/invoices/${encodeURIComponent(invoiceId)}/${kind}`;
12
32
  return zeniAPI
13
33
  .postAndGetJSON(apiUrl, (body ?? {}))
@@ -17,17 +37,24 @@ export const runInvoicingInvoiceActionEpic = (actions$, _state$, zeniAPI) => act
17
37
  updateInvoices([response.data], 'merge'),
18
38
  updateAddresses(extractInvoicingInvoiceAddresses([response.data])),
19
39
  runInvoicingInvoiceActionSuccess({ invoiceId }),
40
+ ...snackbar('success'),
20
41
  ];
21
42
  }
22
- return of(runInvoicingInvoiceActionFailure({
23
- error: response.status,
43
+ return from([
44
+ runInvoicingInvoiceActionFailure({
45
+ error: response.status,
46
+ invoiceId,
47
+ }),
48
+ ...snackbar('failed', response.status),
49
+ ]);
50
+ }), catchError((error) => from([
51
+ runInvoicingInvoiceActionFailure({
52
+ error: createZeniAPIStatus('Unexpected Error', 'Invoice action REST API call errored out ' +
53
+ JSON.stringify(error)),
24
54
  invoiceId,
25
- }));
26
- }), catchError((error) => of(runInvoicingInvoiceActionFailure({
27
- error: createZeniAPIStatus('Unexpected Error', 'Invoice action REST API call errored out ' +
28
- JSON.stringify(error)),
29
- invoiceId,
30
- }))));
55
+ }),
56
+ ...snackbar('failed'),
57
+ ])));
31
58
  }));
32
59
  export const updateInvoicingInvoiceEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(updateInvoicingInvoice.match), mergeMap((action) => {
33
60
  const { data, invoiceId } = action.payload;
@@ -40,15 +67,35 @@ export const updateInvoicingInvoiceEpic = (actions$, _state$, zeniAPI) => action
40
67
  updateInvoices([response.data], 'merge'),
41
68
  updateAddresses(extractInvoicingInvoiceAddresses([response.data])),
42
69
  runInvoicingInvoiceActionSuccess({ invoiceId }),
70
+ openSnackbar({
71
+ messageSection: 'invoicing_invoice_saved',
72
+ messageText: 'success',
73
+ type: 'success',
74
+ }),
43
75
  ];
44
76
  }
45
- return of(runInvoicingInvoiceActionFailure({
46
- error: response.status,
77
+ return from([
78
+ runInvoicingInvoiceActionFailure({
79
+ error: response.status,
80
+ invoiceId,
81
+ }),
82
+ openSnackbar({
83
+ messageSection: 'invoicing_invoice_saved',
84
+ messageText: 'failed',
85
+ type: 'error',
86
+ variables: apiErrorSnackbarVariables(response.status),
87
+ }),
88
+ ]);
89
+ }), catchError((error) => from([
90
+ runInvoicingInvoiceActionFailure({
91
+ error: createZeniAPIStatus('Unexpected Error', 'Invoice update REST API call errored out ' +
92
+ JSON.stringify(error)),
47
93
  invoiceId,
48
- }));
49
- }), catchError((error) => of(runInvoicingInvoiceActionFailure({
50
- error: createZeniAPIStatus('Unexpected Error', 'Invoice update REST API call errored out ' +
51
- JSON.stringify(error)),
52
- invoiceId,
53
- }))));
94
+ }),
95
+ openSnackbar({
96
+ messageSection: 'invoicing_invoice_saved',
97
+ messageText: 'failed',
98
+ type: 'error',
99
+ }),
100
+ ])));
54
101
  }));
@@ -8,7 +8,20 @@ export const initialState = {
8
8
  auditLogEntityRouteOptions: [],
9
9
  auditLogListSortFieldOptions: [],
10
10
  auditLogSourceLabels: [],
11
+ autoCollectionOptions: [],
12
+ billingPeriodUnitOptions: [],
13
+ catalogTrialEndActionOptions: [],
14
+ catalogTrialUnitOptions: [],
15
+ customerTypeOptions: [],
16
+ dateFormatOptions: [],
17
+ discountApplyOnOptions: [],
18
+ discountDurationTypeOptions: [],
19
+ discountTypeOptions: [],
11
20
  dunningScheduleActionOptions: [],
21
+ manualPaymentMethodOptions: [],
22
+ netTermDayOptions: [],
23
+ paymentGatewayOptions: [],
24
+ taxabilityOptions: [],
12
25
  enableFetchState: { fetchState: 'Not-Started', error: undefined },
13
26
  subscriptionLifecycleActionOptions: [],
14
27
  subscriptionCommercialEditAllowedFromStatuses: [],
@@ -29,6 +42,8 @@ export const initialState = {
29
42
  invoicingTosAcceptanceUserAgent: undefined,
30
43
  invoicingTosAcceptanceUserId: undefined,
31
44
  isInvoicingSettingsSeeded: undefined,
45
+ createdAt: undefined,
46
+ updatedAt: undefined,
32
47
  hasValidState() {
33
48
  return (this.fetchState === 'Completed' && this.isInvoicingTosAccepted != null);
34
49
  },
@@ -44,6 +59,21 @@ export function mapInvoicingConfigPayloadToState(payload) {
44
59
  code: option.code,
45
60
  name: option.name,
46
61
  })),
62
+ autoCollectionOptions: (payload.auto_collection_options ?? []).map(toInvoicingNamedOption),
63
+ billingPeriodUnitOptions: (payload.billing_period_unit_options ?? []).map(toInvoicingNamedOption),
64
+ catalogTrialEndActionOptions: (payload.catalog_trial_end_action_options ?? []).map(toInvoicingNamedOption),
65
+ catalogTrialUnitOptions: (payload.catalog_trial_unit_options ?? []).map(toInvoicingNamedOption),
66
+ customerTypeOptions: (payload.customer_type_options ?? []).map(toInvoicingNamedOption),
67
+ dateFormatOptions: (payload.date_format_options ?? []).map(toInvoicingNamedOption),
68
+ discountApplyOnOptions: (payload.discount_apply_on_options ?? []).map(toInvoicingNamedOption),
69
+ discountDurationTypeOptions: (payload.discount_duration_type_options ?? []).map(toInvoicingNamedOption),
70
+ discountTypeOptions: (payload.discount_type_options ?? []).map(toInvoicingNamedOption),
71
+ manualPaymentMethodOptions: (payload.manual_payment_method_options ?? []).map(toInvoicingNamedOption),
72
+ netTermDayOptions: (payload.net_term_day_options ?? []).map(toInvoicingNamedOption),
73
+ paymentGatewayOptions: (payload.payment_gateway_options ?? []).map(toInvoicingNamedOption),
74
+ taxabilityOptions: (payload.taxability_options ?? []).map(toInvoicingNamedOption),
75
+ createdAt: payload.created_at ?? undefined,
76
+ updatedAt: payload.updated_at ?? undefined,
47
77
  dunningScheduleActionOptions: payload.dunning_schedule_action_options.map((option) => ({
48
78
  code: toInvoicingDunningAction(option.code),
49
79
  name: option.name,
@@ -1,35 +1,10 @@
1
1
  import { deriveInvoicingOnboardingStatus, } from './invoicingConfigViewPayload';
2
- /**
3
- * Single bundled view for the invoicing config — consumers read only this.
4
- * Carries the config flags, the derived onboarding `status` used for route
5
- * gating, the config fetch (`fetchState`/`error`), and the accept-terms /
6
- * enable action fetch states.
7
- */
8
2
  export const getInvoicingConfigView = (state) => {
9
- const configState = state.invoicingConfigViewState;
3
+ const { acceptTermsFetchState, enableFetchState, ...configState } = state.invoicingConfigViewState;
10
4
  return {
11
- acceptTermsState: configState.acceptTermsFetchState,
12
- auditLogEntityRouteOptions: configState.auditLogEntityRouteOptions,
13
- auditLogListSortFieldOptions: configState.auditLogListSortFieldOptions,
14
- auditLogSourceLabels: configState.auditLogSourceLabels,
15
- dunningScheduleActionOptions: configState.dunningScheduleActionOptions,
16
- enableState: configState.enableFetchState,
17
- subscriptionLifecycleActionOptions: configState.subscriptionLifecycleActionOptions,
18
- subscriptionCommercialEditAllowedFromStatuses: configState.subscriptionCommercialEditAllowedFromStatuses,
19
- subscriptionMetadataEditAllowedFromStatuses: configState.subscriptionMetadataEditAllowedFromStatuses,
20
- subscriptionEditFieldOptions: configState.subscriptionEditFieldOptions,
21
- subscriptionCancelTimingOptions: configState.subscriptionCancelTimingOptions,
22
- subscriptionChangeOptionOptions: configState.subscriptionChangeOptionOptions,
23
- catalogItemLifecycleActionOptions: configState.catalogItemLifecycleActionOptions,
24
- catalogProductLifecycleActionOptions: configState.catalogProductLifecycleActionOptions,
25
- discountLifecycleActionOptions: configState.discountLifecycleActionOptions,
26
- qboAccountMappingKindOptions: configState.qboAccountMappingKindOptions,
27
- qboCustomerMatchingOptions: configState.qboCustomerMatchingOptions,
28
- qboSyncStatusOptions: configState.qboSyncStatusOptions,
29
- error: configState.error,
30
- fetchState: configState.fetchState,
31
- isInvoicingEnabled: configState.isInvoicingEnabled,
32
- isInvoicingTosAccepted: configState.isInvoicingTosAccepted,
5
+ ...configState,
6
+ acceptTermsState: acceptTermsFetchState,
7
+ enableState: enableFetchState,
33
8
  status: deriveInvoicingOnboardingStatus(configState.isInvoicingTosAccepted, configState.isInvoicingEnabled),
34
9
  };
35
10
  };