@zeniai/client-epic-state 5.1.96 → 5.1.97
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.
- package/lib/entity/invoicing/invoicingCommonPayload.d.ts +9 -0
- package/lib/entity/invoicing/invoicingCommonPayload.js +7 -0
- package/lib/esm/entity/invoicing/invoicingCommonPayload.js +6 -0
- package/lib/esm/index.js +2 -2
- package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +1 -1
- package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +2 -0
- package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js +1 -1
- package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +14 -4
- package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.js +56 -1
- package/lib/esm/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.js +6 -0
- package/lib/esm/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +5 -1
- package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +0 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.js +10 -7
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewPayload.js +1 -1
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.d.ts +8 -0
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewSelector.js +2 -0
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.d.ts +1 -1
- package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js +1 -1
- package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.d.ts +4 -0
- package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +13 -3
- package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewState.d.ts +17 -0
- package/lib/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.d.ts +22 -0
- package/lib/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.js +60 -2
- package/lib/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.d.ts +13 -1
- package/lib/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.js +6 -0
- package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewPayload.d.ts +2 -1
- package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.d.ts +1 -1
- package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewReducer.js +4 -0
- package/lib/view/invoicing/invoicingConfigView/invoicingConfigViewState.d.ts +7 -1
- package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +0 -2
- package/lib/view/invoicing/settingsView/settingsViewSelector.js +0 -1
- package/package.json +1 -1
|
@@ -210,6 +210,15 @@ export interface InvoicingSubscriptionEditFieldOption {
|
|
|
210
210
|
name: string;
|
|
211
211
|
}
|
|
212
212
|
export declare function toInvoicingNamedOption(option: InvoicingNamedOptionWire): InvoicingNamedOption;
|
|
213
|
+
/**
|
|
214
|
+
* A config-driven map from some key (a pricing model, a status, …) to the
|
|
215
|
+
* options allowed for it. Lets the backend widen an allowed set without a
|
|
216
|
+
* frontend release, so consumers must branch on what the map returns rather
|
|
217
|
+
* than on a hardcoded list.
|
|
218
|
+
*/
|
|
219
|
+
export type InvoicingNamedOptionsByKeyWire = Record<string, InvoicingNamedOptionWire[]>;
|
|
220
|
+
export type InvoicingNamedOptionsByKey = Record<string, InvoicingNamedOption[]>;
|
|
221
|
+
export declare function toInvoicingNamedOptionsByKey(optionsByKey: InvoicingNamedOptionsByKeyWire): InvoicingNamedOptionsByKey;
|
|
213
222
|
export declare function toInvoicingSubscriptionEditFieldOption(option: InvoicingSubscriptionEditFieldOptionWire): InvoicingSubscriptionEditFieldOption;
|
|
214
223
|
export declare function toAuditLogEntityRouteOption(option: AuditLogEntityRouteOptionWire): AuditLogEntityRouteOption;
|
|
215
224
|
/**
|
|
@@ -15,6 +15,7 @@ exports.getInvoicingQboAccountMappingId = getInvoicingQboAccountMappingId;
|
|
|
15
15
|
exports.withInvoicingQboAccountMappingId = withInvoicingQboAccountMappingId;
|
|
16
16
|
exports.toInvoicingQboAccountMappingKindOption = toInvoicingQboAccountMappingKindOption;
|
|
17
17
|
exports.toInvoicingNamedOption = toInvoicingNamedOption;
|
|
18
|
+
exports.toInvoicingNamedOptionsByKey = toInvoicingNamedOptionsByKey;
|
|
18
19
|
exports.toInvoicingSubscriptionEditFieldOption = toInvoicingSubscriptionEditFieldOption;
|
|
19
20
|
exports.toAuditLogEntityRouteOption = toAuditLogEntityRouteOption;
|
|
20
21
|
exports.buildInvoicingEntityPath = buildInvoicingEntityPath;
|
|
@@ -200,6 +201,12 @@ function toInvoicingQboAccountMappingKindOption(option) {
|
|
|
200
201
|
function toInvoicingNamedOption(option) {
|
|
201
202
|
return { code: option.code, name: option.name };
|
|
202
203
|
}
|
|
204
|
+
function toInvoicingNamedOptionsByKey(optionsByKey) {
|
|
205
|
+
return Object.fromEntries(Object.entries(optionsByKey).map(([key, options]) => [
|
|
206
|
+
key,
|
|
207
|
+
(options ?? []).map(toInvoicingNamedOption),
|
|
208
|
+
]));
|
|
209
|
+
}
|
|
203
210
|
function toInvoicingSubscriptionEditFieldOption(option) {
|
|
204
211
|
return {
|
|
205
212
|
code: option.code,
|
|
@@ -179,6 +179,12 @@ export function toInvoicingQboAccountMappingKindOption(option) {
|
|
|
179
179
|
export function toInvoicingNamedOption(option) {
|
|
180
180
|
return { code: option.code, name: option.name };
|
|
181
181
|
}
|
|
182
|
+
export function toInvoicingNamedOptionsByKey(optionsByKey) {
|
|
183
|
+
return Object.fromEntries(Object.entries(optionsByKey).map(([key, options]) => [
|
|
184
|
+
key,
|
|
185
|
+
(options ?? []).map(toInvoicingNamedOption),
|
|
186
|
+
]));
|
|
187
|
+
}
|
|
182
188
|
export function toInvoicingSubscriptionEditFieldOption(option) {
|
|
183
189
|
return {
|
|
184
190
|
code: option.code,
|
package/lib/esm/index.js
CHANGED
|
@@ -759,7 +759,7 @@ export { initializeInvoicingCustomerAddress, resetEditInvoicingCustomerDetailVie
|
|
|
759
759
|
export { INVOICING_CUSTOMER_BILLING_ADDRESS_TYPE, INVOICING_CUSTOMER_TYPE_VALUES, INVOICING_NET_TERM_DAY_VALUES, INVOICING_TAXABILITY_VALUES, entityToInvoicingCustomerFormLocalData, initialInvoicingCustomerFormLocalData, } from './view/invoicing/editInvoicingCustomerDetailView/invoicingCustomerFormConfig';
|
|
760
760
|
export { getInvoicingCustomerFormView } from './view/invoicing/editInvoicingCustomerDetailView/editInvoicingCustomerDetailViewSelector';
|
|
761
761
|
export { fetchInvoicingSubscriptionFormPage, initializeInvoicingSubscriptionAddress, resetEditInvoicingSubscriptionDetailView, submitInvoicingSubscriptionForm, updateInvoicingSubscriptionFormDraft, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer';
|
|
762
|
-
export { INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES, INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE, entityToInvoicingSubscriptionFormLocalData, initialInvoicingSubscriptionFormLocalData, } from './view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig';
|
|
762
|
+
export { INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES, INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE, entityToInvoicingSubscriptionFormLocalData, initialInvoicingSubscriptionFormLocalData, invoicingSubscriptionTodayIso, toInvoicingSubscriptionQuantity, } from './view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig';
|
|
763
763
|
export { getEditInvoicingSubscriptionDetailViewState, getInvoicingSubscriptionFormView, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector';
|
|
764
764
|
export { archiveInvoicingCatalogSubFamily, createInvoicingCatalogSubFamily, resetEditInvoicingCatalogItemDetailView, saveInvoicingCatalogItem, submitInvoicingCatalogItemForm, updateInvoicingCatalogItemFormDraft, } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer';
|
|
765
765
|
export { catalogDetailEditValuesToSavePayload, createSubFamilyFormToPayload, planToCatalogDetailEditValues, productToCreateSubFamilyFormValues, } from './view/invoicing/editInvoicingCatalogItemDetailView/catalogDetailEditPayload';
|
|
@@ -851,7 +851,7 @@ export { isStripeConnectedFromSettings } from './view/invoicing/settingsView/inv
|
|
|
851
851
|
// ── Invoicing: QBO integration ────────────────────────────────────────────────
|
|
852
852
|
export { clearInvoicingQboView, fetchInvoicingQboAccounts, fetchInvoicingQboClasses, fetchInvoicingQboConnection, fetchInvoicingQboSyncHealth, retryInvoicingQboSyncTask, startInvoicingQboBackfill, } from './view/invoicing/invoicingQboView/invoicingQboViewReducer';
|
|
853
853
|
export { getInvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
|
|
854
|
-
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingQboCustomerMatchingMode, withInvoicingQboAccountMappingId, } from './entity/invoicing/invoicingCommonPayload';
|
|
854
|
+
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingNamedOptionsByKey, toInvoicingQboCustomerMatchingMode, withInvoicingQboAccountMappingId, } from './entity/invoicing/invoicingCommonPayload';
|
|
855
855
|
// ── Invoicing: config ─────────────────────────────────────────────────────────
|
|
856
856
|
export { acceptInvoicingTerms, clearInvoicingConfig, enableInvoicing, fetchInvoicingConfig, resetInvoicingConfigActionStates, updateInvoicingConfig, } from './view/invoicing/invoicingConfigView/invoicingConfigViewReducer';
|
|
857
857
|
export { getInvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
|
|
@@ -80,7 +80,7 @@ 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
|
|
83
|
+
/** `unit` is the item's unit of measure, not a currency; `CURRENCY_CODE` above prices Price points. */
|
|
84
84
|
const DEFAULT_CATALOG_ITEM_UNIT = 'USD';
|
|
85
85
|
/**
|
|
86
86
|
* Build the parent catalog-item request body from the form draft. Creates omit
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createSelector } from '@reduxjs/toolkit';
|
|
2
2
|
import { getInvoicingPlanById, getInvoicingPlansByIds, } from '../../../entity/invoicing/plan/planSelector';
|
|
3
|
+
import { getInvoicingConfigView } from '../invoicingConfigView/invoicingConfigViewSelector';
|
|
3
4
|
import { INVOICING_CATALOG_APPLICABILITY_VALUES, INVOICING_CATALOG_PERIOD_UNIT_VALUES, INVOICING_CATALOG_PRICING_MODEL_VALUES, INVOICING_CATALOG_PRORATION_VALUES, INVOICING_CATALOG_TIER_TYPE_VALUES, INVOICING_CATALOG_TRIAL_END_ACTION_VALUES, INVOICING_CATALOG_TRIAL_UNIT_VALUES, INVOICING_CATALOG_TYPE_VALUES, entityToInvoicingCatalogItemFormLocalData, } from './invoicingCatalogItemFormConfig';
|
|
4
5
|
export const getEditInvoicingCatalogItemDetailViewState = (state) => ({
|
|
5
6
|
fetchState: state.editInvoicingCatalogItemDetailViewState.fetchState,
|
|
@@ -59,6 +60,7 @@ export const getInvoicingCatalogItemFormView = (state, id) => {
|
|
|
59
60
|
trialEndActionValues: INVOICING_CATALOG_TRIAL_END_ACTION_VALUES,
|
|
60
61
|
trialUnitValues: INVOICING_CATALOG_TRIAL_UNIT_VALUES,
|
|
61
62
|
typeValues: INVOICING_CATALOG_TYPE_VALUES,
|
|
63
|
+
catalogTierTypeOptionsByPricingModel: getInvoicingConfigView(state).catalogTierTypeOptionsByPricingModel,
|
|
62
64
|
kind,
|
|
63
65
|
plan,
|
|
64
66
|
savedItemId,
|
package/lib/esm/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js
CHANGED
|
@@ -121,7 +121,7 @@ export const initialInvoicingCatalogItemFormLocalData = {
|
|
|
121
121
|
unit: '',
|
|
122
122
|
};
|
|
123
123
|
/**
|
|
124
|
-
* Seed the form draft from a parent catalog item and its embedded
|
|
124
|
+
* Seed the form draft from a parent catalog item and its embedded Price points.
|
|
125
125
|
*/
|
|
126
126
|
export const entityToInvoicingCatalogItemFormLocalData = (item) => {
|
|
127
127
|
if (item == null) {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { toAddressUpdatableInfoPayload } from '../../addressView/addressViewPayload';
|
|
2
|
-
import { billingFrequencyToPeriod } from './invoicingSubscriptionFormConfig';
|
|
2
|
+
import { billingFrequencyToPeriod, invoicingSubscriptionTodayIso, toInvoicingSubscriptionBillingCycles, toInvoicingSubscriptionQuantity, } from './invoicingSubscriptionFormConfig';
|
|
3
3
|
/**
|
|
4
4
|
* Build the create/update subscription request body from the form draft. The
|
|
5
5
|
* shipping address is sent as an object (captured via the shared Address
|
|
6
6
|
* screen); the backend persists it — same pattern as the customer save flow.
|
|
7
|
+
*
|
|
8
|
+
* `remaining_billing_cycles` is omitted when the user left the field empty, so
|
|
9
|
+
* the backend applies the plan's own `billing_cycles` (or renews forever when
|
|
10
|
+
* the plan sets no limit) rather than being pinned to a value the form invented.
|
|
7
11
|
*/
|
|
8
12
|
export const localDataToSaveInvoicingSubscriptionPayload = (localData, shippingAddress) => {
|
|
9
13
|
const frequency = billingFrequencyToPeriod(localData.billingFrequency);
|
|
@@ -11,32 +15,38 @@ export const localDataToSaveInvoicingSubscriptionPayload = (localData, shippingA
|
|
|
11
15
|
{
|
|
12
16
|
item_price_code: localData.planPriceCode,
|
|
13
17
|
item_type: 'plan',
|
|
14
|
-
quantity:
|
|
18
|
+
quantity: toInvoicingSubscriptionQuantity(localData.planQuantity),
|
|
15
19
|
},
|
|
16
20
|
...localData.addonPriceCodes.map((priceCode) => ({
|
|
17
21
|
item_price_code: priceCode,
|
|
18
22
|
item_type: 'addon',
|
|
19
|
-
quantity:
|
|
23
|
+
quantity: toInvoicingSubscriptionQuantity(localData.addonQuantities[priceCode]),
|
|
20
24
|
})),
|
|
21
25
|
...localData.chargePriceCodes.map((priceCode) => ({
|
|
22
26
|
item_price_code: priceCode,
|
|
23
27
|
item_type: 'charge',
|
|
24
|
-
quantity:
|
|
28
|
+
quantity: toInvoicingSubscriptionQuantity(localData.chargeQuantities[priceCode]),
|
|
25
29
|
})),
|
|
26
30
|
];
|
|
27
31
|
const setupFee = localData.setupFee?.amount;
|
|
28
32
|
const poNumber = localData.poNumber.trim();
|
|
29
33
|
const trialEnd = localData.trialEnd.trim();
|
|
34
|
+
const startedAt = localData.startedAt.trim();
|
|
35
|
+
const remainingBillingCycles = toInvoicingSubscriptionBillingCycles(localData.remainingBillingCycles);
|
|
30
36
|
return {
|
|
31
37
|
auto_collection: localData.autoCollection ? 'on' : 'off',
|
|
32
38
|
billing_period: frequency.period,
|
|
33
39
|
billing_period_unit: frequency.unit,
|
|
34
40
|
currency_code: localData.preferredCurrencyCode,
|
|
35
41
|
customer_id: localData.customerId,
|
|
42
|
+
started_at: startedAt !== '' ? startedAt : invoicingSubscriptionTodayIso(),
|
|
36
43
|
subscription_items: items,
|
|
37
44
|
...(setupFee != null ? { setup_fee: setupFee } : {}),
|
|
38
45
|
...(poNumber !== '' ? { po_number: poNumber } : {}),
|
|
39
46
|
...(trialEnd !== '' ? { trial_end: trialEnd } : {}),
|
|
47
|
+
...(remainingBillingCycles != null
|
|
48
|
+
? { remaining_billing_cycles: remainingBillingCycles }
|
|
49
|
+
: {}),
|
|
40
50
|
...(localData.couponId !== '' ? { coupon_ids: [localData.couponId] } : {}),
|
|
41
51
|
...(shippingAddress != null
|
|
42
52
|
? { shipping_address: toAddressUpdatableInfoPayload(shippingAddress) }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { dateNow } from '../../../zeniDayJS';
|
|
1
2
|
/** `AddressType` key used when the subscription form opens the shared Address screen. */
|
|
2
3
|
export const INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = 'invoicing_subscription_shipping_address';
|
|
3
4
|
/**
|
|
@@ -33,17 +34,63 @@ const subscriptionItemPriceCodes = (subscription, itemType) => subscription?.sub
|
|
|
33
34
|
?.filter((item) => item.itemType === itemType)
|
|
34
35
|
.map((item) => item.itemPriceCode)
|
|
35
36
|
.filter((code) => code != null && code !== '') ?? [];
|
|
37
|
+
const subscriptionItemQuantities = (subscription, itemType) => {
|
|
38
|
+
const quantities = {};
|
|
39
|
+
subscription?.subscriptionItems
|
|
40
|
+
?.filter((item) => item.itemType === itemType)
|
|
41
|
+
.forEach((item) => {
|
|
42
|
+
if (item.itemPriceCode != null && item.itemPriceCode !== '') {
|
|
43
|
+
quantities[item.itemPriceCode] = toInvoicingSubscriptionQuantity(item.quantity);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return quantities;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Today as `YYYY-MM-DD`, the default subscription start date. Goes through
|
|
50
|
+
* dayjs (not `toISOString`, which is UTC) so a user in a UTC+ timezone late in
|
|
51
|
+
* their day gets their own calendar date rather than yesterday's.
|
|
52
|
+
*/
|
|
53
|
+
export const invoicingSubscriptionTodayIso = () => dateNow().format('YYYY-MM-DD');
|
|
54
|
+
/**
|
|
55
|
+
* Clamp a subscription-item quantity to the minimum the API accepts. Shared by
|
|
56
|
+
* the plan, add-on and charge items so none of them can bill a 0 or a fraction.
|
|
57
|
+
*/
|
|
58
|
+
export const toInvoicingSubscriptionQuantity = (quantity) => {
|
|
59
|
+
const whole = Math.floor(Number(quantity));
|
|
60
|
+
return Number.isFinite(whole) && whole > 0 ? whole : 1;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Parse the billing-cycles field into what the API should receive, or
|
|
64
|
+
* `undefined` when the field is empty or unparseable (the payload then omits it
|
|
65
|
+
* so the backend applies the plan's own limit).
|
|
66
|
+
*
|
|
67
|
+
* Deliberately NOT `toInvoicingSubscriptionQuantity`: `0` is a real
|
|
68
|
+
* remaining-cycles value on a subscription serving its last paid term, and edit
|
|
69
|
+
* drafts seed it straight off the entity. Clamping it up to `1` would turn a
|
|
70
|
+
* no-op save of a non-renewing subscription into a one-cycle extension.
|
|
71
|
+
*/
|
|
72
|
+
export const toInvoicingSubscriptionBillingCycles = (remainingBillingCycles) => {
|
|
73
|
+
if (remainingBillingCycles.trim() === '') {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const whole = Math.floor(Number(remainingBillingCycles));
|
|
77
|
+
return Number.isFinite(whole) && whole >= 0 ? whole : undefined;
|
|
78
|
+
};
|
|
36
79
|
export const initialInvoicingSubscriptionFormLocalData = {
|
|
37
80
|
addonPriceCodes: [],
|
|
81
|
+
addonQuantities: {},
|
|
38
82
|
autoCollection: true,
|
|
39
83
|
billingFrequency: 'monthly',
|
|
40
84
|
chargePriceCodes: [],
|
|
85
|
+
chargeQuantities: {},
|
|
41
86
|
couponId: '',
|
|
42
87
|
customerId: '',
|
|
43
88
|
planPriceCode: '',
|
|
44
89
|
planQuantity: 1,
|
|
45
90
|
poNumber: '',
|
|
46
91
|
preferredCurrencyCode: 'USD',
|
|
92
|
+
remainingBillingCycles: '',
|
|
93
|
+
startedAt: '',
|
|
47
94
|
trialEnd: '',
|
|
48
95
|
};
|
|
49
96
|
/** Seed the form draft from an existing subscription entity (edit mode). */
|
|
@@ -54,18 +101,26 @@ export const entityToInvoicingSubscriptionFormLocalData = (subscription) => {
|
|
|
54
101
|
const planItem = subscription.subscriptionItems?.find((item) => item.itemType === 'plan');
|
|
55
102
|
return {
|
|
56
103
|
addonPriceCodes: subscriptionItemPriceCodes(subscription, 'addon'),
|
|
104
|
+
addonQuantities: subscriptionItemQuantities(subscription, 'addon'),
|
|
57
105
|
autoCollection: (subscription.autoCollection ?? 'on') === 'on',
|
|
58
106
|
billingFrequency: periodToBillingFrequency(subscription.billingPeriod, subscription.billingPeriodUnit),
|
|
59
107
|
chargePriceCodes: subscriptionItemPriceCodes(subscription, 'charge'),
|
|
108
|
+
chargeQuantities: subscriptionItemQuantities(subscription, 'charge'),
|
|
60
109
|
couponId: subscription.coupons?.[0]?.couponCode ??
|
|
61
110
|
subscription.coupons?.[0]?.couponID ??
|
|
62
111
|
'',
|
|
63
112
|
customerId: subscription.customerID ?? '',
|
|
64
113
|
planPriceCode: subscriptionItemPriceCodes(subscription, 'plan')[0] ?? '',
|
|
65
|
-
planQuantity: planItem?.quantity
|
|
114
|
+
planQuantity: toInvoicingSubscriptionQuantity(planItem?.quantity),
|
|
66
115
|
poNumber: subscription.poNumber ?? '',
|
|
67
116
|
preferredCurrencyCode: subscription.currencyCode ?? 'USD',
|
|
117
|
+
remainingBillingCycles: subscription.remainingBillingCycles != null
|
|
118
|
+
? String(subscription.remainingBillingCycles)
|
|
119
|
+
: '',
|
|
68
120
|
setupFee: subscription.setupFee,
|
|
121
|
+
startedAt: subscription.startedAt != null
|
|
122
|
+
? subscription.startedAt.format('YYYY-MM-DD')
|
|
123
|
+
: '',
|
|
69
124
|
trialEnd: subscription.trialEnd != null
|
|
70
125
|
? subscription.trialEnd.format('YYYY-MM-DD')
|
|
71
126
|
: '',
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { getInvoicingPlanById } from '../../../entity/invoicing/plan/planSelector';
|
|
2
|
+
import { getInvoicingConfigView } from '../invoicingConfigView/invoicingConfigViewSelector';
|
|
2
3
|
export const getInvoicingCatalogItemDetail = (state, _kind, id) => {
|
|
3
4
|
const { error, fetchState } = state.invoicingCatalogItemDetailViewState;
|
|
5
|
+
const { catalogItemLifecycleActionOptions, catalogProductLifecycleActionOptions, catalogTierTypeOptionsByPricingModel, fetchState: configFetchState, } = getInvoicingConfigView(state);
|
|
4
6
|
return {
|
|
7
|
+
catalogItemLifecycleActionOptions,
|
|
8
|
+
catalogProductLifecycleActionOptions,
|
|
9
|
+
catalogTierTypeOptionsByPricingModel,
|
|
10
|
+
configFetchState,
|
|
5
11
|
plan: getInvoicingPlanById(state.invoicingPlanState, id),
|
|
6
12
|
fetchState,
|
|
7
13
|
error,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createSlice } from '@reduxjs/toolkit';
|
|
2
|
-
import { toAuditLogEntityRouteOption, toInvoicingCatalogItemLifecycleActionOption, toInvoicingCatalogProductLifecycleActionOption, toInvoicingDiscountLifecycleActionOption, toInvoicingDunningAction, toInvoicingNamedOption, toInvoicingQboAccountMappingKindOption, toInvoicingSubscriptionEditFieldOption, toInvoicingSubscriptionLifecycleActionOption, } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
2
|
+
import { toAuditLogEntityRouteOption, toInvoicingCatalogItemLifecycleActionOption, toInvoicingCatalogProductLifecycleActionOption, toInvoicingDiscountLifecycleActionOption, toInvoicingDunningAction, toInvoicingNamedOption, toInvoicingNamedOptionsByKey, toInvoicingQboAccountMappingKindOption, toInvoicingSubscriptionEditFieldOption, toInvoicingSubscriptionLifecycleActionOption, } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
3
3
|
import { clearAll } from '../../../rootActions';
|
|
4
4
|
export const initialState = {
|
|
5
5
|
fetchState: 'Not-Started',
|
|
@@ -10,6 +10,7 @@ export const initialState = {
|
|
|
10
10
|
auditLogSourceLabels: [],
|
|
11
11
|
autoCollectionOptions: [],
|
|
12
12
|
billingPeriodUnitOptions: [],
|
|
13
|
+
catalogTierTypeOptionsByPricingModel: undefined,
|
|
13
14
|
catalogTrialEndActionOptions: [],
|
|
14
15
|
catalogTrialUnitOptions: [],
|
|
15
16
|
customerTypeOptions: [],
|
|
@@ -61,6 +62,9 @@ export function mapInvoicingConfigPayloadToState(payload) {
|
|
|
61
62
|
})),
|
|
62
63
|
autoCollectionOptions: (payload.auto_collection_options ?? []).map(toInvoicingNamedOption),
|
|
63
64
|
billingPeriodUnitOptions: (payload.billing_period_unit_options ?? []).map(toInvoicingNamedOption),
|
|
65
|
+
catalogTierTypeOptionsByPricingModel: payload.catalog_tier_type_options_by_pricing_model != null
|
|
66
|
+
? toInvoicingNamedOptionsByKey(payload.catalog_tier_type_options_by_pricing_model)
|
|
67
|
+
: undefined,
|
|
64
68
|
catalogTrialEndActionOptions: (payload.catalog_trial_end_action_options ?? []).map(toInvoicingNamedOption),
|
|
65
69
|
catalogTrialUnitOptions: (payload.catalog_trial_unit_options ?? []).map(toInvoicingNamedOption),
|
|
66
70
|
customerTypeOptions: (payload.customer_type_options ?? []).map(toInvoicingNamedOption),
|
package/lib/index.d.ts
CHANGED
|
@@ -1096,7 +1096,7 @@ export type { InvoicingCustomerFormView } from './view/invoicing/editInvoicingCu
|
|
|
1096
1096
|
export { fetchInvoicingSubscriptionFormPage, initializeInvoicingSubscriptionAddress, resetEditInvoicingSubscriptionDetailView, submitInvoicingSubscriptionForm, updateInvoicingSubscriptionFormDraft, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer';
|
|
1097
1097
|
export type { SubmitInvoicingSubscriptionFormPayload, UpdateInvoicingSubscriptionFormDraftPayload, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewReducer';
|
|
1098
1098
|
export type { InvoicingSubscriptionFormLocalData } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewState';
|
|
1099
|
-
export { INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES, INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE, entityToInvoicingSubscriptionFormLocalData, initialInvoicingSubscriptionFormLocalData, } from './view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig';
|
|
1099
|
+
export { INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES, INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE, entityToInvoicingSubscriptionFormLocalData, initialInvoicingSubscriptionFormLocalData, invoicingSubscriptionTodayIso, toInvoicingSubscriptionQuantity, } from './view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig';
|
|
1100
1100
|
export { getEditInvoicingSubscriptionDetailViewState, getInvoicingSubscriptionFormView, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector';
|
|
1101
1101
|
export type { EditInvoicingSubscriptionDetailView, InvoicingSubscriptionFormView, } from './view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector';
|
|
1102
1102
|
export { archiveInvoicingCatalogSubFamily, createInvoicingCatalogSubFamily, resetEditInvoicingCatalogItemDetailView, saveInvoicingCatalogItem, submitInvoicingCatalogItemForm, updateInvoicingCatalogItemFormDraft, } from './view/invoicing/editInvoicingCatalogItemDetailView/editInvoicingCatalogItemDetailViewReducer';
|
|
@@ -1230,8 +1230,8 @@ export { clearInvoicingQboView, fetchInvoicingQboAccounts, fetchInvoicingQboClas
|
|
|
1230
1230
|
export { getInvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
|
|
1231
1231
|
export type { InvoicingQboView } from './view/invoicing/invoicingQboView/invoicingQboViewSelector';
|
|
1232
1232
|
export type { InvoicingQboAccountOption, InvoicingQboConnection, InvoicingQboFailedTask, InvoicingQboSyncHealth, } from './view/invoicing/invoicingQboView/invoicingQboViewPayload';
|
|
1233
|
-
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingQboCustomerMatchingMode, withInvoicingQboAccountMappingId, } from './entity/invoicing/invoicingCommonPayload';
|
|
1234
|
-
export type { InvoicingNamedOption, InvoicingQboAccountMappingKindOption, InvoicingQboAccountMappingsPayload, InvoicingQboCustomerMatchingMode, InvoicingQboSettingsPayload, } from './entity/invoicing/invoicingCommonPayload';
|
|
1233
|
+
export { INVOICING_QBO_CUSTOMER_MATCHING_MODES, getInvoicingQboAccountMappingId, toInvoicingNamedOptionsByKey, toInvoicingQboCustomerMatchingMode, withInvoicingQboAccountMappingId, } from './entity/invoicing/invoicingCommonPayload';
|
|
1234
|
+
export type { InvoicingNamedOption, InvoicingNamedOptionsByKey, InvoicingQboAccountMappingKindOption, InvoicingQboAccountMappingsPayload, InvoicingQboCustomerMatchingMode, InvoicingQboSettingsPayload, } from './entity/invoicing/invoicingCommonPayload';
|
|
1235
1235
|
export { acceptInvoicingTerms, clearInvoicingConfig, enableInvoicing, fetchInvoicingConfig, resetInvoicingConfigActionStates, updateInvoicingConfig, } from './view/invoicing/invoicingConfigView/invoicingConfigViewReducer';
|
|
1236
1236
|
export { getInvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
|
|
1237
1237
|
export type { InvoicingConfigView } from './view/invoicing/invoicingConfigView/invoicingConfigViewSelector';
|
package/lib/index.js
CHANGED
|
@@ -79,13 +79,13 @@ exports.seedAiCardPolicyFormDraft = exports.createCardPolicyTemplates = exports.
|
|
|
79
79
|
exports.getUpdateCardPolicyFetchState = exports.getCardPolicyFormDraft = exports.getCardPolicyDetailView = exports.getCardPolicyDetailFetchState = exports.updateCardPolicyFormDraft = exports.updateCardPolicyFetchStatus = exports.updateCardPolicyDetailFetchStatus = exports.updateCardPolicy = exports.fetchCardPolicyDetail = exports.clearCardPolicyDetail = exports.getCardPolicyTemplateIds = exports.getCardPolicyListView = exports.getCardPolicyListFetchState = exports.getArchiveCardPolicyFetchState = exports.updateCardPolicyListFetchStatus = exports.updateArchiveCardPolicyFetchStatus = exports.prependCardPolicyTemplateIds = exports.fetchCardPolicyList = exports.clearCardPolicyList = exports.archiveCardPolicy = exports.toManualCardPolicyTemplateRequestFromDraft = exports.toBulkCardPolicyTemplateRequestsFromDraft = exports.toCardPolicyTemplateRequestFromDraft = exports.applyAiCardPolicyFormDraftUpdate = exports.deriveAiPolicyReviewRowsFromInputs = exports.buildManualCardPolicyFormDraftSeed = exports.buildUploadReviewRows = exports.buildEmptyLimitRows = exports.buildAiCardPolicyFormDraftSeed = exports.toVendorChipFieldValue = exports.toMccCategoryChipFieldValue = exports.buildVendorChipId = exports.buildMccCategoryChipId = exports.VENDOR_CHIP_ID_PREFIX = exports.MCC_CHIP_ID_PREFIX = exports.toMccCategoryLike = exports.CARD_POLICY_LIMIT_ROW_ID_TRANSACTION = exports.CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT = exports.getManualCardPolicyFormDraft = exports.getLastCreatedCardPolicyTemplateIds = exports.getLastCreatedCardPolicyTemplateId = exports.getLastCreateCardPolicyTemplateErrors = exports.getLastCreateCardPolicySourceChatSessionId = exports.getCreateCardPolicyTemplateRequestState = exports.getAiCardPolicyFormDraft = exports.updateManualCardPolicyFormDraft = exports.updateCreateCardPolicyTemplateRequestState = exports.updateAiCardPolicyFormDraftFromUploadPlan = exports.updateAiCardPolicyFormDraft = exports.seedManualCardPolicyFormDraft = void 0;
|
|
80
80
|
exports.clearAllInvoices = exports.mapAuditLogEntry = exports.toAuditLogEntityRouteOption = exports.isInvoicingEntityLinkable = exports.buildInvoicingEntityPath = exports.toInvoicingDiscountLifecycleActionOption = exports.toInvoicingDiscountLifecycleAction = exports.toInvoicingCatalogProductLifecycleActionOption = exports.toInvoicingCatalogItemLifecycleActionOption = exports.toInvoicingCatalogProductLifecycleAction = exports.toInvoicingCatalogItemLifecycleAction = exports.toInvoicingSubscriptionLifecycleActionOption = exports.toInvoicingSubscriptionLifecycleAction = exports.toInvoicingDunningAction = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = exports.toKycProvidedDocumentTypeFromAllowed = exports.toKycProvidedDocumentType = exports.DEFAULT_SESSION_CONFIG = exports.SessionManager = exports.getTransactionActivityLogView = exports.fetchTransactionActivityLog = exports.BULK_UPLOAD_BAR_COMPLETE_HOLD_MS = exports.BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS = exports.getAutoTransferRuleHistory = exports.getAutoTransferRuleById = exports.getAutoTransferRules = exports.clearRuleUpdateLocalData = exports.updateRuleLocalData = exports.fetchAutoTransferReviewDetail = exports.fetchAutoTransferRuleHistory = exports.deleteAutoTransferRule = exports.updateAutoTransferRule = exports.createAutoTransferRule = exports.fetchAutoTransferRules = exports.getTreasuryTaxLetters = exports.fetchTreasuryTaxLetterList = exports.getTreasuryStatements = exports.fetchTreasuryStatementList = exports.getTreasuryTransferMoney = exports.clearTreasuryTransferMoney = exports.updateTreasuryTransferMoneyLocalData = exports.executeTreasuryTransferMoney = exports.getTreasuryDetail = exports.updateTreasuryTransactionListUIState = exports.fetchTreasuryTransactionList = exports.fetchTreasuryOverviewDetail = void 0;
|
|
81
81
|
exports.initializeRecordPaymentDraftFromInvoice = exports.getCreateCreditNoteView = exports.getCreateCreditNoteFormView = exports.initialCreateCreditNoteFormLocalData = exports.localDataToCreateCreditNotePayload = exports.updateCreateCreditNoteFormDraft = exports.submitCreateCreditNote = exports.resetCreateCreditNote = exports.createCreditNoteSuccess = exports.createCreditNoteFailure = exports.getIssueCreditNoteView = exports.initialIssueCreditNoteFormLocalData = exports.INVOICING_CREDIT_NOTE_REASON_CODES = exports.localDataToIssueCreditNotePayload = exports.initializeIssueCreditNoteDraftFromInvoice = exports.computeIssueCreditNoteTotal = exports.updateIssueCreditNoteFormDraft = exports.submitIssueCreditNote = exports.resetIssueCreditNote = exports.issueCreditNoteSuccess = exports.issueCreditNoteFailure = exports.initializeIssueCreditNoteDraft = exports.updateRecordPaymentFormDraft = exports.submitRecordPayment = exports.initializeRecordPaymentDraft = exports.resetRecordPayment = exports.initialInvoicingCreateInvoiceFormLocalData = exports.createInvoiceFormLocalDataToRequest = exports.blankInvoicingCreateInvoiceLineItem = exports.updateInvoicingCreateInvoiceFormDraft = exports.resetCreateInvoice = exports.fetchCreateInvoiceFormPage = exports.createInvoice = exports.getInvoiceDetail = exports.fetchInvoiceDetail = exports.clearAllInvoiceDetail = exports.getInvoiceListView = exports.INVOICING_INVOICE_TABS = exports.ALL_INVOICING_INVOICE_TAB_IDS = exports.updateInvoiceListFilters = exports.setInvoiceActiveTab = exports.fetchInvoiceListPage = exports.fetchInvoiceList = exports.fetchInvoiceKPIs = exports.fetchInvoiceCounts = exports.clearInvoiceList = exports.getInvoicesByIds = exports.getInvoiceById = exports.updateInvoices = exports.removeInvoice = void 0;
|
|
82
|
-
exports.
|
|
83
|
-
exports.
|
|
84
|
-
exports.
|
|
85
|
-
exports.
|
|
86
|
-
exports.
|
|
87
|
-
exports.
|
|
88
|
-
exports.getInvoicingConfigView = exports.updateInvoicingConfig = void 0;
|
|
82
|
+
exports.createSubFamilyFormToPayload = exports.catalogDetailEditValuesToSavePayload = exports.updateInvoicingCatalogItemFormDraft = exports.submitInvoicingCatalogItemForm = exports.saveInvoicingCatalogItem = exports.resetEditInvoicingCatalogItemDetailView = exports.createInvoicingCatalogSubFamily = exports.archiveInvoicingCatalogSubFamily = exports.getInvoicingSubscriptionFormView = exports.getEditInvoicingSubscriptionDetailViewState = exports.toInvoicingSubscriptionQuantity = exports.invoicingSubscriptionTodayIso = exports.initialInvoicingSubscriptionFormLocalData = exports.entityToInvoicingSubscriptionFormLocalData = exports.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = exports.INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES = exports.updateInvoicingSubscriptionFormDraft = exports.submitInvoicingSubscriptionForm = exports.resetEditInvoicingSubscriptionDetailView = exports.initializeInvoicingSubscriptionAddress = exports.fetchInvoicingSubscriptionFormPage = exports.getInvoicingCustomerFormView = exports.initialInvoicingCustomerFormLocalData = exports.entityToInvoicingCustomerFormLocalData = exports.INVOICING_TAXABILITY_VALUES = exports.INVOICING_NET_TERM_DAY_VALUES = exports.INVOICING_CUSTOMER_TYPE_VALUES = exports.INVOICING_CUSTOMER_BILLING_ADDRESS_TYPE = exports.updateInvoicingCustomerFormDraft = exports.submitInvoicingCustomerFormSuccess = exports.submitInvoicingCustomerFormFailure = exports.submitInvoicingCustomerForm = exports.resetEditInvoicingCustomerDetailView = exports.initializeInvoicingCustomerAddress = exports.getRecordPaymentView = exports.getRecordPaymentInvoiceOptions = exports.getRecordPaymentFormView = exports.getCreateInvoiceFormView = exports.getInvoicingAuditView = exports.fetchInvoicingAuditLog = exports.clearInvoicingAuditView = exports.getInvoicingOverview = exports.buildPeriodOptions = exports.fetchInvoicingOverview = exports.clearInvoicingOverview = exports.initialRecordPaymentFormLocalData = exports.INVOICING_PAYMENT_METHOD_VALUES = exports.INVOICING_PAYMENT_GATEWAY_VALUES = exports.localDataToRecordPaymentPayload = exports.localDataToInvoiceRecordPaymentBody = void 0;
|
|
83
|
+
exports.fetchInvoicingDataImportStatus = exports.clearInvoicingDataImportView = exports.getInvoicingPaymentActionState = exports.runInvoicingPaymentAction = exports.clearInvoicingPaymentAction = exports.getInvoicingDunningActionState = exports.runInvoicingDunningAction = exports.clearInvoicingDunningAction = exports.getInvoicingSubscriptionActionState = exports.runInvoicingSubscriptionAction = exports.clearInvoicingSubscriptionAction = exports.getInvoicingDiscountActionState = exports.runInvoicingDiscountAction = exports.clearInvoicingDiscountAction = exports.getInvoicingCatalogActionState = exports.runInvoicingCatalogProductAction = exports.runInvoicingCatalogPlanAction = exports.clearInvoicingCatalogAction = exports.getInvoicingInvoiceActionState = exports.updateInvoicingInvoice = exports.runInvoicingInvoiceAction = exports.clearInvoicingInvoiceAction = exports.getInvoicingCouponFormView = exports.getEditInvoicingCouponDetailViewState = exports.initialInvoicingCouponFormLocalData = exports.entityToInvoicingCouponFormLocalData = exports.updateInvoicingCouponFormDraft = exports.submitInvoicingCouponForm = exports.saveInvoicingCoupon = exports.resetEditInvoicingCouponDetailView = exports.getSavedInvoicingCatalogItemKind = exports.getSavedInvoicingCatalogItemId = exports.getInvoicingCatalogItemFormView = exports.getInvoicingApplicableCatalogItemOptions = exports.getEditInvoicingCatalogItemDetailViewState = exports.isTieredCatalogPricingModel = exports.initialInvoicingCatalogItemFormLocalData = exports.entityToInvoicingCatalogItemFormLocalData = exports.blankInvoicingCatalogTier = exports.blankInvoicingCatalogSubFamily = exports.INVOICING_CATALOG_TYPE_VALUES = exports.INVOICING_CATALOG_TRIAL_UNIT_VALUES = exports.INVOICING_CATALOG_TRIAL_END_ACTION_VALUES = exports.INVOICING_CATALOG_TIER_TYPE_VALUES = exports.INVOICING_CATALOG_PRORATION_VALUES = exports.INVOICING_CATALOG_PRICING_MODEL_VALUES = exports.INVOICING_CATALOG_PERIOD_UNIT_VALUES = exports.INVOICING_CATALOG_APPLICABILITY_VALUES = exports.productToCreateSubFamilyFormValues = exports.planToCatalogDetailEditValues = void 0;
|
|
84
|
+
exports.clearInvoicingSubscriptionListView = exports.updateInvoicingSubscriptions = exports.removeInvoicingSubscription = exports.clearAllInvoicingSubscriptions = exports.resetPromotionalCreditAction = exports.submitAddPromotionalCredits = exports.getInvoicingSetupIntentFetchState = exports.getInvoicingSetupIntent = exports.getInvoicingSentPaymentLinkMagicUrl = exports.getInvoicingSentPaymentLinkEmail = exports.getInvoicingPlaidLinkTokenFetchState = exports.getInvoicingPlaidLinkToken = exports.getInvoicingPaymentMethodSaveState = exports.getInvoicingPaymentLinkSendState = exports.sendInvoicingPaymentLink = exports.saveInvoicingPaymentMethod = exports.resetInvoicingCustomerPaymentMethod = exports.fetchInvoicingPlaidLinkToken = exports.createInvoicingSetupIntent = exports.getInvoicingCustomerDetail = exports.fetchInvoicingCustomerDetailPage = exports.fetchInvoicingCustomerDetail = exports.clearInvoicingCustomerDetailView = exports.getInvoicingCustomerListView = exports.INVOICING_CUSTOMER_TABS = exports.INVOICING_CUSTOMER_COLUMNS = exports.ALL_INVOICING_CUSTOMER_TAB_IDS = exports.ALL_INVOICING_CUSTOMER_SORT_KEYS = exports.updateInvoicingCustomerFilters = exports.setInvoicingCustomerActiveTab = exports.fetchInvoicingCustomerListPage = exports.fetchInvoicingCustomerList = exports.fetchInvoicingCustomerCounts = exports.clearInvoicingCustomerListView = exports.updateInvoicingCustomers = exports.removeInvoicingCustomer = exports.clearAllInvoicingCustomers = exports.INVOICING_LIST_PAGE_SIZE = exports.getInvoicingDataImportActionState = exports.uploadInvoicingMigrationFiles = exports.startInvoicingMigration = exports.rollbackInvoicingMigration = exports.retryInvoicingMigration = exports.connectInvoicingChargebee = exports.clearAllInvoicingDataImportActions = exports.getInvoicingDataImportView = exports.setInvoicingActiveMigrationSessionId = exports.fetchInvoicingMigrationSessions = exports.fetchInvoicingMigrationSession = exports.fetchInvoicingMigrationDiagnostics = void 0;
|
|
85
|
+
exports.clearAllInvoicingCoupons = exports.getInvoicingCreditNoteDetail = exports.getInvoicingCreditNoteById = exports.fetchInvoicingCreditNoteDetail = exports.clearInvoicingCreditNoteDetailView = exports.getInvoicingCreditNoteListView = exports.INVOICING_CREDIT_NOTE_TABS = exports.INVOICING_CREDIT_NOTE_COLUMNS = exports.ALL_INVOICING_CREDIT_NOTE_TAB_IDS = exports.ALL_INVOICING_CREDIT_NOTE_SORT_KEYS = exports.updateInvoicingCreditNoteFilters = exports.setInvoicingCreditNoteActiveTab = exports.fetchInvoicingCreditNoteListPage = exports.fetchInvoicingCreditNoteList = exports.fetchInvoicingCreditNoteCounts = exports.clearInvoicingCreditNoteListView = exports.updateInvoicingCreditNotes = exports.removeInvoicingCreditNote = exports.clearAllInvoicingCreditNotes = exports.getInvoicingTransactionDetail = exports.getInvoicingTransactionById = exports.fetchInvoicingTransactionDetail = exports.clearInvoicingTransactionDetailView = exports.getInvoicingTransactionListView = exports.INVOICING_TRANSACTION_TABS = exports.INVOICING_TRANSACTION_COLUMNS = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = exports.updateInvoicingTransactionFilters = exports.setInvoicingTransactionActiveTab = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.clearInvoicingTransactionListView = exports.updateInvoicingTransactions = exports.removeInvoicingTransaction = exports.clearAllInvoicingTransactions = exports.getInvoicingSubscriptionDetail = exports.getInvoicingSubscriptionById = exports.fetchInvoicingSubscriptionDetail = exports.clearInvoicingSubscriptionDetailView = exports.getInvoicingSubscriptionListView = exports.INVOICING_SUBSCRIPTION_TABS = exports.INVOICING_SUBSCRIPTION_COLUMNS = exports.ALL_INVOICING_SUBSCRIPTION_TAB_IDS = exports.ALL_INVOICING_SUBSCRIPTION_SORT_KEYS = exports.updateInvoicingSubscriptionFilters = exports.setInvoicingSubscriptionActiveTab = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionCounts = void 0;
|
|
86
|
+
exports.removeInvoicingProduct = exports.clearAllInvoicingProducts = exports.updateInvoicingPlans = exports.removeInvoicingPlan = exports.mergeInvoicingPlanSubFamily = exports.clearAllInvoicingPlans = exports.getInvoicingDunningEmailPreview = exports.getInvoicingDunningCaseDetail = exports.getInvoicingDunningCaseById = exports.invalidateInvoicingDunningEmailPreview = exports.fetchInvoicingDunningEmailPreviewPage = exports.fetchInvoicingDunningCaseDetail = exports.clearInvoicingDunningCaseDetailView = exports.getInvoicingDunningCaseListView = exports.INVOICING_DUNNING_CASE_TABS = exports.INVOICING_DUNNING_CASE_COLUMNS = exports.ALL_INVOICING_DUNNING_CASE_TAB_IDS = exports.ALL_INVOICING_DUNNING_CASE_SORT_KEYS = exports.updateInvoicingDunningCaseFilters = exports.setInvoicingDunningCaseActiveTab = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseCounts = exports.clearInvoicingDunningCaseListView = exports.updateInvoicingDunningCases = exports.removeInvoicingDunningCase = exports.clearAllInvoicingDunningCases = exports.getInvoicingCouponDetail = exports.fetchInvoicingCouponDetail = exports.clearInvoicingCouponDetailView = exports.getInvoicingCouponById = exports.getInvoicingCouponListView = exports.getInvoicingCouponListNextCursor = exports.getInvoicingCouponListItems = exports.getInvoicingCouponListHasMore = exports.getInvoicingCouponListFilters = exports.getInvoicingCouponListFetchState = exports.getInvoicingCouponCounts = exports.INVOICING_COUPON_TABS = exports.INVOICING_COUPON_COLUMNS = exports.ALL_INVOICING_COUPON_TAB_IDS = exports.ALL_INVOICING_COUPON_SORT_KEYS = exports.updateInvoicingCouponFilters = exports.setInvoicingCouponActiveTab = exports.fetchInvoicingCouponListPage = exports.fetchInvoicingCouponList = exports.fetchInvoicingCouponCounts = exports.clearInvoicingCouponView = exports.updateInvoicingCoupons = exports.removeInvoicingCoupon = void 0;
|
|
87
|
+
exports.clearInvoicingConfig = exports.acceptInvoicingTerms = exports.withInvoicingQboAccountMappingId = exports.toInvoicingQboCustomerMatchingMode = exports.toInvoicingNamedOptionsByKey = exports.getInvoicingQboAccountMappingId = exports.INVOICING_QBO_CUSTOMER_MATCHING_MODES = exports.getInvoicingQboView = exports.startInvoicingQboBackfill = exports.retryInvoicingQboSyncTask = exports.fetchInvoicingQboSyncHealth = exports.fetchInvoicingQboConnection = exports.fetchInvoicingQboClasses = exports.fetchInvoicingQboAccounts = exports.clearInvoicingQboView = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.getInvoicingSettingsView = exports.getInvoicingSettingsHubView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = exports.connectInvoicingStripe = exports.clearInvoicingSettings = exports.getInvoicingProductById = exports.getInvoicingPlanById = exports.getInvoicingCatalogItemDetail = exports.fetchInvoicingCatalogItemDetail = exports.clearInvoicingCatalogItemDetailView = exports.getInvoicingCatalogListView = exports.INVOICING_PRODUCT_COLUMNS = exports.ALL_INVOICING_PRODUCT_SORT_KEYS = exports.updateInvoicingCatalogProductFilters = exports.updateInvoicingCatalogPlanFilters = exports.fetchInvoicingCatalogProductList = exports.fetchInvoicingCatalogPlanList = exports.fetchInvoicingCatalogListPage = exports.fetchInvoicingCatalogCounts = exports.clearInvoicingCatalogListView = exports.updateInvoicingProducts = void 0;
|
|
88
|
+
exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = void 0;
|
|
89
89
|
const allowedValue_1 = require("./commonStateTypes/allowedValue");
|
|
90
90
|
Object.defineProperty(exports, "isAllowedValueWithCode", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithCode; } });
|
|
91
91
|
Object.defineProperty(exports, "isAllowedValueWithID", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithID; } });
|
|
@@ -2837,6 +2837,8 @@ Object.defineProperty(exports, "INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES"
|
|
|
2837
2837
|
Object.defineProperty(exports, "INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE", { enumerable: true, get: function () { return invoicingSubscriptionFormConfig_1.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE; } });
|
|
2838
2838
|
Object.defineProperty(exports, "entityToInvoicingSubscriptionFormLocalData", { enumerable: true, get: function () { return invoicingSubscriptionFormConfig_1.entityToInvoicingSubscriptionFormLocalData; } });
|
|
2839
2839
|
Object.defineProperty(exports, "initialInvoicingSubscriptionFormLocalData", { enumerable: true, get: function () { return invoicingSubscriptionFormConfig_1.initialInvoicingSubscriptionFormLocalData; } });
|
|
2840
|
+
Object.defineProperty(exports, "invoicingSubscriptionTodayIso", { enumerable: true, get: function () { return invoicingSubscriptionFormConfig_1.invoicingSubscriptionTodayIso; } });
|
|
2841
|
+
Object.defineProperty(exports, "toInvoicingSubscriptionQuantity", { enumerable: true, get: function () { return invoicingSubscriptionFormConfig_1.toInvoicingSubscriptionQuantity; } });
|
|
2840
2842
|
var editInvoicingSubscriptionDetailViewSelector_1 = require("./view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewSelector");
|
|
2841
2843
|
Object.defineProperty(exports, "getEditInvoicingSubscriptionDetailViewState", { enumerable: true, get: function () { return editInvoicingSubscriptionDetailViewSelector_1.getEditInvoicingSubscriptionDetailViewState; } });
|
|
2842
2844
|
Object.defineProperty(exports, "getInvoicingSubscriptionFormView", { enumerable: true, get: function () { return editInvoicingSubscriptionDetailViewSelector_1.getInvoicingSubscriptionFormView; } });
|
|
@@ -3184,6 +3186,7 @@ Object.defineProperty(exports, "getInvoicingQboView", { enumerable: true, get: f
|
|
|
3184
3186
|
var invoicingCommonPayload_2 = require("./entity/invoicing/invoicingCommonPayload");
|
|
3185
3187
|
Object.defineProperty(exports, "INVOICING_QBO_CUSTOMER_MATCHING_MODES", { enumerable: true, get: function () { return invoicingCommonPayload_2.INVOICING_QBO_CUSTOMER_MATCHING_MODES; } });
|
|
3186
3188
|
Object.defineProperty(exports, "getInvoicingQboAccountMappingId", { enumerable: true, get: function () { return invoicingCommonPayload_2.getInvoicingQboAccountMappingId; } });
|
|
3189
|
+
Object.defineProperty(exports, "toInvoicingNamedOptionsByKey", { enumerable: true, get: function () { return invoicingCommonPayload_2.toInvoicingNamedOptionsByKey; } });
|
|
3187
3190
|
Object.defineProperty(exports, "toInvoicingQboCustomerMatchingMode", { enumerable: true, get: function () { return invoicingCommonPayload_2.toInvoicingQboCustomerMatchingMode; } });
|
|
3188
3191
|
Object.defineProperty(exports, "withInvoicingQboAccountMappingId", { enumerable: true, get: function () { return invoicingCommonPayload_2.withInvoicingQboAccountMappingId; } });
|
|
3189
3192
|
// ── Invoicing: config ─────────────────────────────────────────────────────────
|
|
@@ -83,7 +83,7 @@ const buildSubFamilyPayload = (localData, subFamily, clearEmptyValues) => {
|
|
|
83
83
|
}
|
|
84
84
|
return payload;
|
|
85
85
|
};
|
|
86
|
-
/** `unit` is the item's unit of measure, not a currency; `CURRENCY_CODE` above prices
|
|
86
|
+
/** `unit` is the item's unit of measure, not a currency; `CURRENCY_CODE` above prices Price points. */
|
|
87
87
|
const DEFAULT_CATALOG_ITEM_UNIT = 'USD';
|
|
88
88
|
/**
|
|
89
89
|
* Build the parent catalog-item request body from the form draft. Creates omit
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FetchStateAndError, ID } from '../../../commonStateTypes/common';
|
|
2
2
|
import { SelectorView } from '../../../commonStateTypes/viewAndReport/viewAndReport';
|
|
3
|
+
import { InvoicingNamedOptionsByKey } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
3
4
|
import { InvoicingPlan } from '../../../entity/invoicing/plan/planState';
|
|
4
5
|
import { RootState } from '../../../reducer';
|
|
5
6
|
import { InvoicingCatalogItemKind } from '../invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewState';
|
|
@@ -38,6 +39,13 @@ export interface InvoicingCatalogItemFormView extends SelectorView {
|
|
|
38
39
|
trialEndActionValues: readonly string[];
|
|
39
40
|
trialUnitValues: readonly string[];
|
|
40
41
|
typeValues: readonly string[];
|
|
42
|
+
/**
|
|
43
|
+
* Backend tier-type choices per pricing model. Folded in here rather than left
|
|
44
|
+
* for the screen to pull off `getInvoicingConfigView` itself, so the form wires
|
|
45
|
+
* one selector and CES stays the only place that knows which slice each option
|
|
46
|
+
* set lives in.
|
|
47
|
+
*/
|
|
48
|
+
catalogTierTypeOptionsByPricingModel?: InvoicingNamedOptionsByKey;
|
|
41
49
|
kind?: InvoicingCatalogItemKind;
|
|
42
50
|
plan?: InvoicingPlan;
|
|
43
51
|
savedItemId?: ID;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getInvoicingCatalogItemFormView = exports.getInvoicingApplicableCatalogItemOptions = exports.getSavedInvoicingCatalogItemKind = exports.getSavedInvoicingCatalogItemId = exports.getEditInvoicingCatalogItemDetailViewState = void 0;
|
|
4
4
|
const toolkit_1 = require("@reduxjs/toolkit");
|
|
5
5
|
const planSelector_1 = require("../../../entity/invoicing/plan/planSelector");
|
|
6
|
+
const invoicingConfigViewSelector_1 = require("../invoicingConfigView/invoicingConfigViewSelector");
|
|
6
7
|
const invoicingCatalogItemFormConfig_1 = require("./invoicingCatalogItemFormConfig");
|
|
7
8
|
const getEditInvoicingCatalogItemDetailViewState = (state) => ({
|
|
8
9
|
fetchState: state.editInvoicingCatalogItemDetailViewState.fetchState,
|
|
@@ -65,6 +66,7 @@ const getInvoicingCatalogItemFormView = (state, id) => {
|
|
|
65
66
|
trialEndActionValues: invoicingCatalogItemFormConfig_1.INVOICING_CATALOG_TRIAL_END_ACTION_VALUES,
|
|
66
67
|
trialUnitValues: invoicingCatalogItemFormConfig_1.INVOICING_CATALOG_TRIAL_UNIT_VALUES,
|
|
67
68
|
typeValues: invoicingCatalogItemFormConfig_1.INVOICING_CATALOG_TYPE_VALUES,
|
|
69
|
+
catalogTierTypeOptionsByPricingModel: (0, invoicingConfigViewSelector_1.getInvoicingConfigView)(state).catalogTierTypeOptionsByPricingModel,
|
|
68
70
|
kind,
|
|
69
71
|
plan,
|
|
70
72
|
savedItemId,
|
package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.d.ts
CHANGED
|
@@ -19,6 +19,6 @@ export declare const blankInvoicingCatalogSubFamily: () => InvoicingCatalogItemF
|
|
|
19
19
|
export declare const invoicingProductToCatalogItemFormSubFamily: (product?: InvoicingProduct) => InvoicingCatalogItemFormSubFamily;
|
|
20
20
|
export declare const initialInvoicingCatalogItemFormLocalData: InvoicingCatalogItemFormLocalData;
|
|
21
21
|
/**
|
|
22
|
-
* Seed the form draft from a parent catalog item and its embedded
|
|
22
|
+
* Seed the form draft from a parent catalog item and its embedded Price points.
|
|
23
23
|
*/
|
|
24
24
|
export declare const entityToInvoicingCatalogItemFormLocalData: (item?: InvoicingPlan) => InvoicingCatalogItemFormLocalData;
|
package/lib/view/invoicing/editInvoicingCatalogItemDetailView/invoicingCatalogItemFormConfig.js
CHANGED
|
@@ -128,7 +128,7 @@ exports.initialInvoicingCatalogItemFormLocalData = {
|
|
|
128
128
|
unit: '',
|
|
129
129
|
};
|
|
130
130
|
/**
|
|
131
|
-
* Seed the form draft from a parent catalog item and its embedded
|
|
131
|
+
* Seed the form draft from a parent catalog item and its embedded Price points.
|
|
132
132
|
*/
|
|
133
133
|
const entityToInvoicingCatalogItemFormLocalData = (item) => {
|
|
134
134
|
if (item == null) {
|
|
@@ -7,5 +7,9 @@ export type SaveInvoicingSubscriptionResponse = ZeniAPIResponse<InvoicingSubscri
|
|
|
7
7
|
* Build the create/update subscription request body from the form draft. The
|
|
8
8
|
* shipping address is sent as an object (captured via the shared Address
|
|
9
9
|
* screen); the backend persists it — same pattern as the customer save flow.
|
|
10
|
+
*
|
|
11
|
+
* `remaining_billing_cycles` is omitted when the user left the field empty, so
|
|
12
|
+
* the backend applies the plan's own `billing_cycles` (or renews forever when
|
|
13
|
+
* the plan sets no limit) rather than being pinned to a value the form invented.
|
|
10
14
|
*/
|
|
11
15
|
export declare const localDataToSaveInvoicingSubscriptionPayload: (localData: InvoicingSubscriptionFormLocalData, shippingAddress?: AddressUpdatableInfo) => Record<string, unknown>;
|
|
@@ -7,6 +7,10 @@ const invoicingSubscriptionFormConfig_1 = require("./invoicingSubscriptionFormCo
|
|
|
7
7
|
* Build the create/update subscription request body from the form draft. The
|
|
8
8
|
* shipping address is sent as an object (captured via the shared Address
|
|
9
9
|
* screen); the backend persists it — same pattern as the customer save flow.
|
|
10
|
+
*
|
|
11
|
+
* `remaining_billing_cycles` is omitted when the user left the field empty, so
|
|
12
|
+
* the backend applies the plan's own `billing_cycles` (or renews forever when
|
|
13
|
+
* the plan sets no limit) rather than being pinned to a value the form invented.
|
|
10
14
|
*/
|
|
11
15
|
const localDataToSaveInvoicingSubscriptionPayload = (localData, shippingAddress) => {
|
|
12
16
|
const frequency = (0, invoicingSubscriptionFormConfig_1.billingFrequencyToPeriod)(localData.billingFrequency);
|
|
@@ -14,32 +18,38 @@ const localDataToSaveInvoicingSubscriptionPayload = (localData, shippingAddress)
|
|
|
14
18
|
{
|
|
15
19
|
item_price_code: localData.planPriceCode,
|
|
16
20
|
item_type: 'plan',
|
|
17
|
-
quantity:
|
|
21
|
+
quantity: (0, invoicingSubscriptionFormConfig_1.toInvoicingSubscriptionQuantity)(localData.planQuantity),
|
|
18
22
|
},
|
|
19
23
|
...localData.addonPriceCodes.map((priceCode) => ({
|
|
20
24
|
item_price_code: priceCode,
|
|
21
25
|
item_type: 'addon',
|
|
22
|
-
quantity:
|
|
26
|
+
quantity: (0, invoicingSubscriptionFormConfig_1.toInvoicingSubscriptionQuantity)(localData.addonQuantities[priceCode]),
|
|
23
27
|
})),
|
|
24
28
|
...localData.chargePriceCodes.map((priceCode) => ({
|
|
25
29
|
item_price_code: priceCode,
|
|
26
30
|
item_type: 'charge',
|
|
27
|
-
quantity:
|
|
31
|
+
quantity: (0, invoicingSubscriptionFormConfig_1.toInvoicingSubscriptionQuantity)(localData.chargeQuantities[priceCode]),
|
|
28
32
|
})),
|
|
29
33
|
];
|
|
30
34
|
const setupFee = localData.setupFee?.amount;
|
|
31
35
|
const poNumber = localData.poNumber.trim();
|
|
32
36
|
const trialEnd = localData.trialEnd.trim();
|
|
37
|
+
const startedAt = localData.startedAt.trim();
|
|
38
|
+
const remainingBillingCycles = (0, invoicingSubscriptionFormConfig_1.toInvoicingSubscriptionBillingCycles)(localData.remainingBillingCycles);
|
|
33
39
|
return {
|
|
34
40
|
auto_collection: localData.autoCollection ? 'on' : 'off',
|
|
35
41
|
billing_period: frequency.period,
|
|
36
42
|
billing_period_unit: frequency.unit,
|
|
37
43
|
currency_code: localData.preferredCurrencyCode,
|
|
38
44
|
customer_id: localData.customerId,
|
|
45
|
+
started_at: startedAt !== '' ? startedAt : (0, invoicingSubscriptionFormConfig_1.invoicingSubscriptionTodayIso)(),
|
|
39
46
|
subscription_items: items,
|
|
40
47
|
...(setupFee != null ? { setup_fee: setupFee } : {}),
|
|
41
48
|
...(poNumber !== '' ? { po_number: poNumber } : {}),
|
|
42
49
|
...(trialEnd !== '' ? { trial_end: trialEnd } : {}),
|
|
50
|
+
...(remainingBillingCycles != null
|
|
51
|
+
? { remaining_billing_cycles: remainingBillingCycles }
|
|
52
|
+
: {}),
|
|
43
53
|
...(localData.couponId !== '' ? { coupon_ids: [localData.couponId] } : {}),
|
|
44
54
|
...(shippingAddress != null
|
|
45
55
|
? { shipping_address: (0, addressViewPayload_1.toAddressUpdatableInfoPayload)(shippingAddress) }
|
|
@@ -9,15 +9,32 @@ import { FetchedState, ID } from '../../../commonStateTypes/common';
|
|
|
9
9
|
*/
|
|
10
10
|
export interface InvoicingSubscriptionFormLocalData {
|
|
11
11
|
addonPriceCodes: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Per-add-on quantity, keyed by item price code. Only the codes currently in
|
|
14
|
+
* `addonPriceCodes` are read when the save payload is built, so a code left
|
|
15
|
+
* behind by a deselect is inert; a missing key bills as 1.
|
|
16
|
+
*/
|
|
17
|
+
addonQuantities: Record<string, number>;
|
|
12
18
|
autoCollection: boolean;
|
|
13
19
|
billingFrequency: string;
|
|
14
20
|
chargePriceCodes: string[];
|
|
21
|
+
/** Per-charge quantity, keyed by item price code. See `addonQuantities`. */
|
|
22
|
+
chargeQuantities: Record<string, number>;
|
|
15
23
|
couponId: string;
|
|
16
24
|
customerId: string;
|
|
17
25
|
planPriceCode: string;
|
|
18
26
|
planQuantity: number;
|
|
19
27
|
poNumber: string;
|
|
20
28
|
preferredCurrencyCode: string;
|
|
29
|
+
/**
|
|
30
|
+
* Number of paid billing cycles including the first invoice, held as a string
|
|
31
|
+
* so an empty field stays distinguishable from a real 0. Empty means "no
|
|
32
|
+
* limit set here" — the payload omits it and the backend falls back to the
|
|
33
|
+
* plan's `billing_cycles` (renewing forever when the plan has no limit).
|
|
34
|
+
*/
|
|
35
|
+
remainingBillingCycles: string;
|
|
36
|
+
/** `YYYY-MM-DD`. Empty falls back to today when the payload is built. */
|
|
37
|
+
startedAt: string;
|
|
21
38
|
trialEnd: string;
|
|
22
39
|
/** Unset until the user enters one, so an explicit 0 stays distinguishable. */
|
|
23
40
|
setupFee?: Amount;
|
package/lib/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.d.ts
CHANGED
|
@@ -15,6 +15,28 @@ export declare const billingFrequencyToPeriod: (value: string) => {
|
|
|
15
15
|
};
|
|
16
16
|
/** Map an existing subscription's period/unit back to a billing-frequency value. */
|
|
17
17
|
export declare const periodToBillingFrequency: (period?: number, unit?: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Today as `YYYY-MM-DD`, the default subscription start date. Goes through
|
|
20
|
+
* dayjs (not `toISOString`, which is UTC) so a user in a UTC+ timezone late in
|
|
21
|
+
* their day gets their own calendar date rather than yesterday's.
|
|
22
|
+
*/
|
|
23
|
+
export declare const invoicingSubscriptionTodayIso: () => string;
|
|
24
|
+
/**
|
|
25
|
+
* Clamp a subscription-item quantity to the minimum the API accepts. Shared by
|
|
26
|
+
* the plan, add-on and charge items so none of them can bill a 0 or a fraction.
|
|
27
|
+
*/
|
|
28
|
+
export declare const toInvoicingSubscriptionQuantity: (quantity?: number) => number;
|
|
29
|
+
/**
|
|
30
|
+
* Parse the billing-cycles field into what the API should receive, or
|
|
31
|
+
* `undefined` when the field is empty or unparseable (the payload then omits it
|
|
32
|
+
* so the backend applies the plan's own limit).
|
|
33
|
+
*
|
|
34
|
+
* Deliberately NOT `toInvoicingSubscriptionQuantity`: `0` is a real
|
|
35
|
+
* remaining-cycles value on a subscription serving its last paid term, and edit
|
|
36
|
+
* drafts seed it straight off the entity. Clamping it up to `1` would turn a
|
|
37
|
+
* no-op save of a non-renewing subscription into a one-cycle extension.
|
|
38
|
+
*/
|
|
39
|
+
export declare const toInvoicingSubscriptionBillingCycles: (remainingBillingCycles: string) => number | undefined;
|
|
18
40
|
export declare const initialInvoicingSubscriptionFormLocalData: InvoicingSubscriptionFormLocalData;
|
|
19
41
|
/** Seed the form draft from an existing subscription entity (edit mode). */
|
|
20
42
|
export declare const entityToInvoicingSubscriptionFormLocalData: (subscription?: InvoicingSubscription) => InvoicingSubscriptionFormLocalData;
|
package/lib/view/invoicing/editInvoicingSubscriptionDetailView/invoicingSubscriptionFormConfig.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.entityToInvoicingSubscriptionFormLocalData = exports.initialInvoicingSubscriptionFormLocalData = exports.periodToBillingFrequency = exports.billingFrequencyToPeriod = exports.INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES = exports.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = void 0;
|
|
3
|
+
exports.entityToInvoicingSubscriptionFormLocalData = exports.initialInvoicingSubscriptionFormLocalData = exports.toInvoicingSubscriptionBillingCycles = exports.toInvoicingSubscriptionQuantity = exports.invoicingSubscriptionTodayIso = exports.periodToBillingFrequency = exports.billingFrequencyToPeriod = exports.INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES = exports.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = void 0;
|
|
4
|
+
const zeniDayJS_1 = require("../../../zeniDayJS");
|
|
4
5
|
/** `AddressType` key used when the subscription form opens the shared Address screen. */
|
|
5
6
|
exports.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = 'invoicing_subscription_shipping_address';
|
|
6
7
|
/**
|
|
@@ -38,17 +39,66 @@ const subscriptionItemPriceCodes = (subscription, itemType) => subscription?.sub
|
|
|
38
39
|
?.filter((item) => item.itemType === itemType)
|
|
39
40
|
.map((item) => item.itemPriceCode)
|
|
40
41
|
.filter((code) => code != null && code !== '') ?? [];
|
|
42
|
+
const subscriptionItemQuantities = (subscription, itemType) => {
|
|
43
|
+
const quantities = {};
|
|
44
|
+
subscription?.subscriptionItems
|
|
45
|
+
?.filter((item) => item.itemType === itemType)
|
|
46
|
+
.forEach((item) => {
|
|
47
|
+
if (item.itemPriceCode != null && item.itemPriceCode !== '') {
|
|
48
|
+
quantities[item.itemPriceCode] = (0, exports.toInvoicingSubscriptionQuantity)(item.quantity);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return quantities;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Today as `YYYY-MM-DD`, the default subscription start date. Goes through
|
|
55
|
+
* dayjs (not `toISOString`, which is UTC) so a user in a UTC+ timezone late in
|
|
56
|
+
* their day gets their own calendar date rather than yesterday's.
|
|
57
|
+
*/
|
|
58
|
+
const invoicingSubscriptionTodayIso = () => (0, zeniDayJS_1.dateNow)().format('YYYY-MM-DD');
|
|
59
|
+
exports.invoicingSubscriptionTodayIso = invoicingSubscriptionTodayIso;
|
|
60
|
+
/**
|
|
61
|
+
* Clamp a subscription-item quantity to the minimum the API accepts. Shared by
|
|
62
|
+
* the plan, add-on and charge items so none of them can bill a 0 or a fraction.
|
|
63
|
+
*/
|
|
64
|
+
const toInvoicingSubscriptionQuantity = (quantity) => {
|
|
65
|
+
const whole = Math.floor(Number(quantity));
|
|
66
|
+
return Number.isFinite(whole) && whole > 0 ? whole : 1;
|
|
67
|
+
};
|
|
68
|
+
exports.toInvoicingSubscriptionQuantity = toInvoicingSubscriptionQuantity;
|
|
69
|
+
/**
|
|
70
|
+
* Parse the billing-cycles field into what the API should receive, or
|
|
71
|
+
* `undefined` when the field is empty or unparseable (the payload then omits it
|
|
72
|
+
* so the backend applies the plan's own limit).
|
|
73
|
+
*
|
|
74
|
+
* Deliberately NOT `toInvoicingSubscriptionQuantity`: `0` is a real
|
|
75
|
+
* remaining-cycles value on a subscription serving its last paid term, and edit
|
|
76
|
+
* drafts seed it straight off the entity. Clamping it up to `1` would turn a
|
|
77
|
+
* no-op save of a non-renewing subscription into a one-cycle extension.
|
|
78
|
+
*/
|
|
79
|
+
const toInvoicingSubscriptionBillingCycles = (remainingBillingCycles) => {
|
|
80
|
+
if (remainingBillingCycles.trim() === '') {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const whole = Math.floor(Number(remainingBillingCycles));
|
|
84
|
+
return Number.isFinite(whole) && whole >= 0 ? whole : undefined;
|
|
85
|
+
};
|
|
86
|
+
exports.toInvoicingSubscriptionBillingCycles = toInvoicingSubscriptionBillingCycles;
|
|
41
87
|
exports.initialInvoicingSubscriptionFormLocalData = {
|
|
42
88
|
addonPriceCodes: [],
|
|
89
|
+
addonQuantities: {},
|
|
43
90
|
autoCollection: true,
|
|
44
91
|
billingFrequency: 'monthly',
|
|
45
92
|
chargePriceCodes: [],
|
|
93
|
+
chargeQuantities: {},
|
|
46
94
|
couponId: '',
|
|
47
95
|
customerId: '',
|
|
48
96
|
planPriceCode: '',
|
|
49
97
|
planQuantity: 1,
|
|
50
98
|
poNumber: '',
|
|
51
99
|
preferredCurrencyCode: 'USD',
|
|
100
|
+
remainingBillingCycles: '',
|
|
101
|
+
startedAt: '',
|
|
52
102
|
trialEnd: '',
|
|
53
103
|
};
|
|
54
104
|
/** Seed the form draft from an existing subscription entity (edit mode). */
|
|
@@ -59,18 +109,26 @@ const entityToInvoicingSubscriptionFormLocalData = (subscription) => {
|
|
|
59
109
|
const planItem = subscription.subscriptionItems?.find((item) => item.itemType === 'plan');
|
|
60
110
|
return {
|
|
61
111
|
addonPriceCodes: subscriptionItemPriceCodes(subscription, 'addon'),
|
|
112
|
+
addonQuantities: subscriptionItemQuantities(subscription, 'addon'),
|
|
62
113
|
autoCollection: (subscription.autoCollection ?? 'on') === 'on',
|
|
63
114
|
billingFrequency: (0, exports.periodToBillingFrequency)(subscription.billingPeriod, subscription.billingPeriodUnit),
|
|
64
115
|
chargePriceCodes: subscriptionItemPriceCodes(subscription, 'charge'),
|
|
116
|
+
chargeQuantities: subscriptionItemQuantities(subscription, 'charge'),
|
|
65
117
|
couponId: subscription.coupons?.[0]?.couponCode ??
|
|
66
118
|
subscription.coupons?.[0]?.couponID ??
|
|
67
119
|
'',
|
|
68
120
|
customerId: subscription.customerID ?? '',
|
|
69
121
|
planPriceCode: subscriptionItemPriceCodes(subscription, 'plan')[0] ?? '',
|
|
70
|
-
planQuantity: planItem?.quantity
|
|
122
|
+
planQuantity: (0, exports.toInvoicingSubscriptionQuantity)(planItem?.quantity),
|
|
71
123
|
poNumber: subscription.poNumber ?? '',
|
|
72
124
|
preferredCurrencyCode: subscription.currencyCode ?? 'USD',
|
|
125
|
+
remainingBillingCycles: subscription.remainingBillingCycles != null
|
|
126
|
+
? String(subscription.remainingBillingCycles)
|
|
127
|
+
: '',
|
|
73
128
|
setupFee: subscription.setupFee,
|
|
129
|
+
startedAt: subscription.startedAt != null
|
|
130
|
+
? subscription.startedAt.format('YYYY-MM-DD')
|
|
131
|
+
: '',
|
|
74
132
|
trialEnd: subscription.trialEnd != null
|
|
75
133
|
? subscription.trialEnd.format('YYYY-MM-DD')
|
|
76
134
|
: '',
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { ID } from '../../../commonStateTypes/common';
|
|
1
|
+
import { FetchState, ID } from '../../../commonStateTypes/common';
|
|
2
2
|
import { SelectorView } from '../../../commonStateTypes/viewAndReport/viewAndReport';
|
|
3
|
+
import { InvoicingCatalogItemLifecycleAction, InvoicingCatalogLifecycleActionOption, InvoicingCatalogProductLifecycleAction, InvoicingNamedOptionsByKey } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
3
4
|
import { InvoicingPlan } from '../../../entity/invoicing/plan/planState';
|
|
4
5
|
import { RootState } from '../../../reducer';
|
|
5
6
|
import { InvoicingCatalogItemKind } from './invoicingCatalogItemDetailViewState';
|
|
@@ -7,8 +8,19 @@ import { InvoicingCatalogItemKind } from './invoicingCatalogItemDetailViewState'
|
|
|
7
8
|
* Read-only view for the catalog item (plan or product) detail page. One screen
|
|
8
9
|
* serves both kinds, so the bundled view carries the resolved `plan` or
|
|
9
10
|
* `product` (whichever the `kind` denotes) + the shared fetch state.
|
|
11
|
+
*
|
|
12
|
+
* The lifecycle/tier option sets and `configFetchState` are folded in from the
|
|
13
|
+
* config slice rather than left for the screen to select itself, so the page
|
|
14
|
+
* wires one selector and CES stays the only place that knows which slice each
|
|
15
|
+
* option set lives in. `configFetchState` is named apart from the view's own
|
|
16
|
+
* `fetchState` because they track different requests — the screen gates a config
|
|
17
|
+
* refetch on the former while rendering off the latter.
|
|
10
18
|
*/
|
|
11
19
|
export interface InvoicingCatalogItemDetailView extends SelectorView {
|
|
20
|
+
catalogItemLifecycleActionOptions: InvoicingCatalogLifecycleActionOption<InvoicingCatalogItemLifecycleAction>[];
|
|
21
|
+
catalogProductLifecycleActionOptions: InvoicingCatalogLifecycleActionOption<InvoicingCatalogProductLifecycleAction>[];
|
|
22
|
+
configFetchState: FetchState;
|
|
23
|
+
catalogTierTypeOptionsByPricingModel?: InvoicingNamedOptionsByKey;
|
|
12
24
|
plan?: InvoicingPlan;
|
|
13
25
|
}
|
|
14
26
|
export declare const getInvoicingCatalogItemDetail: (state: RootState, _kind: InvoicingCatalogItemKind, id: ID) => InvoicingCatalogItemDetailView;
|
package/lib/view/invoicing/invoicingCatalogItemDetailView/invoicingCatalogItemDetailViewSelector.js
CHANGED
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getInvoicingCatalogItemDetail = void 0;
|
|
4
4
|
const planSelector_1 = require("../../../entity/invoicing/plan/planSelector");
|
|
5
|
+
const invoicingConfigViewSelector_1 = require("../invoicingConfigView/invoicingConfigViewSelector");
|
|
5
6
|
const getInvoicingCatalogItemDetail = (state, _kind, id) => {
|
|
6
7
|
const { error, fetchState } = state.invoicingCatalogItemDetailViewState;
|
|
8
|
+
const { catalogItemLifecycleActionOptions, catalogProductLifecycleActionOptions, catalogTierTypeOptionsByPricingModel, fetchState: configFetchState, } = (0, invoicingConfigViewSelector_1.getInvoicingConfigView)(state);
|
|
7
9
|
return {
|
|
10
|
+
catalogItemLifecycleActionOptions,
|
|
11
|
+
catalogProductLifecycleActionOptions,
|
|
12
|
+
catalogTierTypeOptionsByPricingModel,
|
|
13
|
+
configFetchState,
|
|
8
14
|
plan: (0, planSelector_1.getInvoicingPlanById)(state.invoicingPlanState, id),
|
|
9
15
|
fetchState,
|
|
10
16
|
error,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuditLogEntityRouteOptionWire, AuditLogListSortFieldOptionWire, AuditLogSourceLabelOptionWire, InvoicingCatalogLifecycleActionOptionWire, InvoicingDunningActionOption, InvoicingNamedOptionWire, InvoicingQboAccountMappingKindOptionWire, InvoicingSubscriptionEditFieldOptionWire, InvoicingSubscriptionLifecycleActionOptionWire } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
1
|
+
import { AuditLogEntityRouteOptionWire, AuditLogListSortFieldOptionWire, AuditLogSourceLabelOptionWire, InvoicingCatalogLifecycleActionOptionWire, InvoicingDunningActionOption, InvoicingNamedOptionWire, InvoicingNamedOptionsByKeyWire, InvoicingQboAccountMappingKindOptionWire, InvoicingSubscriptionEditFieldOptionWire, InvoicingSubscriptionLifecycleActionOptionWire } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
2
2
|
import { ZeniAPIResponse } from '../../../responsePayload';
|
|
3
3
|
/**
|
|
4
4
|
* Wire payload of the invoicing config API (GET/PUT `/1.0/config`). Follows
|
|
@@ -23,6 +23,7 @@ export interface InvoicingConfigPayload {
|
|
|
23
23
|
subscription_metadata_edit_allowed_from_statuses: string[];
|
|
24
24
|
auto_collection_options?: InvoicingNamedOptionWire[];
|
|
25
25
|
billing_period_unit_options?: InvoicingNamedOptionWire[];
|
|
26
|
+
catalog_tier_type_options_by_pricing_model?: InvoicingNamedOptionsByKeyWire;
|
|
26
27
|
catalog_trial_end_action_options?: InvoicingNamedOptionWire[];
|
|
27
28
|
catalog_trial_unit_options?: InvoicingNamedOptionWire[];
|
|
28
29
|
created_at?: string | null;
|
|
@@ -2,7 +2,7 @@ import { ZeniAPIStatus } from '../../../responsePayload';
|
|
|
2
2
|
import { InvoicingConfigPayload } from './invoicingConfigViewPayload';
|
|
3
3
|
import { InvoicingConfigViewState } from './invoicingConfigViewState';
|
|
4
4
|
export declare const initialState: InvoicingConfigViewState;
|
|
5
|
-
export declare function mapInvoicingConfigPayloadToState(payload: InvoicingConfigPayload): Pick<InvoicingConfigViewState, 'auditLogEntityRouteOptions' | 'auditLogListSortFieldOptions' | 'auditLogSourceLabels' | 'autoCollectionOptions' | 'billingPeriodUnitOptions' | 'catalogTrialEndActionOptions' | 'catalogTrialUnitOptions' | 'customerTypeOptions' | 'dateFormatOptions' | 'discountApplyOnOptions' | 'discountDurationTypeOptions' | 'discountTypeOptions' | 'manualPaymentMethodOptions' | 'netTermDayOptions' | 'paymentGatewayOptions' | 'taxabilityOptions' | 'createdAt' | 'updatedAt' | 'dunningScheduleActionOptions' | 'subscriptionLifecycleActionOptions' | 'subscriptionCommercialEditAllowedFromStatuses' | 'subscriptionMetadataEditAllowedFromStatuses' | 'subscriptionEditFieldOptions' | 'subscriptionCancelTimingOptions' | 'subscriptionChangeOptionOptions' | 'catalogItemLifecycleActionOptions' | 'catalogProductLifecycleActionOptions' | 'discountLifecycleActionOptions' | 'qboAccountMappingKindOptions' | 'qboCustomerMatchingOptions' | 'qboSyncStatusOptions' | 'isInvoicingEnabled' | 'isInvoicingTosAccepted' | 'invoicingTosAcceptanceIp' | 'invoicingTosAcceptanceTime' | 'invoicingTosAcceptanceUserAgent' | 'invoicingTosAcceptanceUserId' | 'isInvoicingSettingsSeeded'>;
|
|
5
|
+
export declare function mapInvoicingConfigPayloadToState(payload: InvoicingConfigPayload): Pick<InvoicingConfigViewState, 'auditLogEntityRouteOptions' | 'auditLogListSortFieldOptions' | 'auditLogSourceLabels' | 'autoCollectionOptions' | 'billingPeriodUnitOptions' | 'catalogTierTypeOptionsByPricingModel' | 'catalogTrialEndActionOptions' | 'catalogTrialUnitOptions' | 'customerTypeOptions' | 'dateFormatOptions' | 'discountApplyOnOptions' | 'discountDurationTypeOptions' | 'discountTypeOptions' | 'manualPaymentMethodOptions' | 'netTermDayOptions' | 'paymentGatewayOptions' | 'taxabilityOptions' | 'createdAt' | 'updatedAt' | 'dunningScheduleActionOptions' | 'subscriptionLifecycleActionOptions' | 'subscriptionCommercialEditAllowedFromStatuses' | 'subscriptionMetadataEditAllowedFromStatuses' | 'subscriptionEditFieldOptions' | 'subscriptionCancelTimingOptions' | 'subscriptionChangeOptionOptions' | 'catalogItemLifecycleActionOptions' | 'catalogProductLifecycleActionOptions' | 'discountLifecycleActionOptions' | 'qboAccountMappingKindOptions' | 'qboCustomerMatchingOptions' | 'qboSyncStatusOptions' | 'isInvoicingEnabled' | 'isInvoicingTosAccepted' | 'invoicingTosAcceptanceIp' | 'invoicingTosAcceptanceTime' | 'invoicingTosAcceptanceUserAgent' | 'invoicingTosAcceptanceUserId' | 'isInvoicingSettingsSeeded'>;
|
|
6
6
|
export declare const fetchInvoicingConfig: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload?: {
|
|
7
7
|
cacheOverride?: boolean;
|
|
8
8
|
} | undefined], {
|
|
@@ -15,6 +15,7 @@ exports.initialState = {
|
|
|
15
15
|
auditLogSourceLabels: [],
|
|
16
16
|
autoCollectionOptions: [],
|
|
17
17
|
billingPeriodUnitOptions: [],
|
|
18
|
+
catalogTierTypeOptionsByPricingModel: undefined,
|
|
18
19
|
catalogTrialEndActionOptions: [],
|
|
19
20
|
catalogTrialUnitOptions: [],
|
|
20
21
|
customerTypeOptions: [],
|
|
@@ -66,6 +67,9 @@ function mapInvoicingConfigPayloadToState(payload) {
|
|
|
66
67
|
})),
|
|
67
68
|
autoCollectionOptions: (payload.auto_collection_options ?? []).map(invoicingCommonPayload_1.toInvoicingNamedOption),
|
|
68
69
|
billingPeriodUnitOptions: (payload.billing_period_unit_options ?? []).map(invoicingCommonPayload_1.toInvoicingNamedOption),
|
|
70
|
+
catalogTierTypeOptionsByPricingModel: payload.catalog_tier_type_options_by_pricing_model != null
|
|
71
|
+
? (0, invoicingCommonPayload_1.toInvoicingNamedOptionsByKey)(payload.catalog_tier_type_options_by_pricing_model)
|
|
72
|
+
: undefined,
|
|
69
73
|
catalogTrialEndActionOptions: (payload.catalog_trial_end_action_options ?? []).map(invoicingCommonPayload_1.toInvoicingNamedOption),
|
|
70
74
|
catalogTrialUnitOptions: (payload.catalog_trial_unit_options ?? []).map(invoicingCommonPayload_1.toInvoicingNamedOption),
|
|
71
75
|
customerTypeOptions: (payload.customer_type_options ?? []).map(invoicingCommonPayload_1.toInvoicingNamedOption),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FetchStateAndError, FetchedState } from '../../../commonStateTypes/common';
|
|
2
|
-
import type { AuditLogEntityRouteOption, AuditLogListSortFieldOption, AuditLogSourceLabelOption, InvoicingCatalogItemLifecycleAction, InvoicingCatalogLifecycleActionOption, InvoicingCatalogProductLifecycleAction, InvoicingDiscountLifecycleActionOption, InvoicingNamedOption, InvoicingQboAccountMappingKindOption, InvoicingSubscriptionEditFieldOption, InvoicingSubscriptionLifecycleActionOption } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
2
|
+
import type { AuditLogEntityRouteOption, AuditLogListSortFieldOption, AuditLogSourceLabelOption, InvoicingCatalogItemLifecycleAction, InvoicingCatalogLifecycleActionOption, InvoicingCatalogProductLifecycleAction, InvoicingDiscountLifecycleActionOption, InvoicingNamedOption, InvoicingNamedOptionsByKey, InvoicingQboAccountMappingKindOption, InvoicingSubscriptionEditFieldOption, InvoicingSubscriptionLifecycleActionOption } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
3
3
|
import { InvoicingDunningActionOption } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
4
4
|
export interface InvoicingConfigViewState extends FetchedState {
|
|
5
5
|
acceptTermsFetchState: FetchStateAndError;
|
|
@@ -33,6 +33,12 @@ export interface InvoicingConfigViewState extends FetchedState {
|
|
|
33
33
|
subscriptionLifecycleActionOptions: InvoicingSubscriptionLifecycleActionOption[];
|
|
34
34
|
subscriptionMetadataEditAllowedFromStatuses: string[];
|
|
35
35
|
taxabilityOptions: InvoicingNamedOption[];
|
|
36
|
+
/**
|
|
37
|
+
* Allowed tier `Type` options per pricing model. `undefined` means the config
|
|
38
|
+
* has not been loaded yet — consumers disable the tier editor rather than
|
|
39
|
+
* falling back to a hardcoded model-to-type map.
|
|
40
|
+
*/
|
|
41
|
+
catalogTierTypeOptionsByPricingModel?: InvoicingNamedOptionsByKey;
|
|
36
42
|
createdAt?: string;
|
|
37
43
|
invoicingTosAcceptanceIp?: string;
|
|
38
44
|
invoicingTosAcceptanceTime?: string;
|
|
@@ -2,7 +2,6 @@ import { FetchState, FetchStateAndError } from '../../../commonStateTypes/common
|
|
|
2
2
|
import { InvoicingNamedOption, InvoicingQboAccountMappingKindOption, InvoicingSettingsPayload } from '../../../entity/invoicing/invoicingCommonPayload';
|
|
3
3
|
import { RootState } from '../../../reducer';
|
|
4
4
|
import { ZeniAPIStatus } from '../../../responsePayload';
|
|
5
|
-
import { InvoicingOnboardingStatus } from '../invoicingConfigView/invoicingConfigViewPayload';
|
|
6
5
|
import { InvoicingBrandingFormLocalData } from './invoicingBrandingFormConfig';
|
|
7
6
|
/**
|
|
8
7
|
* Shared primitive: the raw invoicing settings. Consumed internally by other
|
|
@@ -50,7 +49,6 @@ export interface InvoicingSettingsHubView {
|
|
|
50
49
|
isEnablingInvoicing: boolean;
|
|
51
50
|
isQboConfigured: boolean;
|
|
52
51
|
isStripeConnected: boolean;
|
|
53
|
-
status?: InvoicingOnboardingStatus;
|
|
54
52
|
}
|
|
55
53
|
/**
|
|
56
54
|
* The settings hub's composite of everything it derives from the store: whether
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeniai/client-epic-state",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.97",
|
|
4
4
|
"description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib/esm/index.js",
|