@powerhousedao/service-offering 1.0.0-dev.4 → 1.0.0-dev.6
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/dist/document-models/facet/v1/actions.d.ts +3 -1
- package/dist/document-models/facet/v1/actions.d.ts.map +1 -1
- package/dist/document-models/facet/v1/gen/controller.d.ts +4 -0
- package/dist/document-models/facet/v1/gen/controller.d.ts.map +1 -0
- package/dist/document-models/facet/v1/gen/controller.js +3 -0
- package/dist/document-models/facet/v1/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/facet/v1/gen/document-model.js +31 -7
- package/dist/document-models/facet/v1/gen/document-schema.d.ts +6 -6
- package/dist/document-models/facet/v1/gen/index.d.ts +1 -0
- package/dist/document-models/facet/v1/gen/index.d.ts.map +1 -1
- package/dist/document-models/facet/v1/gen/index.js +1 -0
- package/dist/document-models/facet/v1/gen/option-management/error.d.ts +27 -1
- package/dist/document-models/facet/v1/gen/option-management/error.d.ts.map +1 -1
- package/dist/document-models/facet/v1/gen/option-management/error.js +23 -1
- package/dist/document-models/facet/v1/gen/ph-factories.js +2 -2
- package/dist/document-models/facet/v1/gen/schema/types.d.ts +2 -2
- package/dist/document-models/facet/v1/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/facet/v1/gen/schema/zod.js +2 -2
- package/dist/document-models/facet/v1/gen/utils.js +2 -2
- package/dist/document-models/facet/v1/module.d.ts +1 -1
- package/dist/document-models/facet/v1/module.d.ts.map +1 -1
- package/dist/document-models/facet/v1/module.js +4 -1
- package/dist/document-models/resource-instance/v1/actions.d.ts +4 -1
- package/dist/document-models/resource-instance/v1/actions.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/configuration-management/error.d.ts +34 -1
- package/dist/document-models/resource-instance/v1/gen/configuration-management/error.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/configuration-management/error.js +32 -1
- package/dist/document-models/resource-instance/v1/gen/controller.d.ts +4 -0
- package/dist/document-models/resource-instance/v1/gen/controller.d.ts.map +1 -0
- package/dist/document-models/resource-instance/v1/gen/controller.js +3 -0
- package/dist/document-models/resource-instance/v1/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/document-model.js +222 -70
- package/dist/document-models/resource-instance/v1/gen/document-schema.d.ts +0 -6
- package/dist/document-models/resource-instance/v1/gen/document-schema.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/index.d.ts +1 -0
- package/dist/document-models/resource-instance/v1/gen/index.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/index.js +1 -0
- package/dist/document-models/resource-instance/v1/gen/instance-management/actions.d.ts +6 -2
- package/dist/document-models/resource-instance/v1/gen/instance-management/actions.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/creators.d.ts +3 -2
- package/dist/document-models/resource-instance/v1/gen/instance-management/creators.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/creators.js +2 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/error.d.ts +98 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/error.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/error.js +112 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/operations.d.ts +2 -1
- package/dist/document-models/resource-instance/v1/gen/instance-management/operations.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/ph-factories.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/ph-factories.js +0 -2
- package/dist/document-models/resource-instance/v1/gen/reducer.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/reducer.js +6 -1
- package/dist/document-models/resource-instance/v1/gen/schema/types.d.ts +3 -3
- package/dist/document-models/resource-instance/v1/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/schema/zod.d.ts +2 -1
- package/dist/document-models/resource-instance/v1/gen/schema/zod.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/schema/zod.js +5 -3
- package/dist/document-models/resource-instance/v1/gen/utils.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/gen/utils.js +0 -2
- package/dist/document-models/resource-instance/v1/module.d.ts +1 -1
- package/dist/document-models/resource-instance/v1/module.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/module.js +4 -1
- package/dist/document-models/resource-instance/v1/src/reducers/configuration-management.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/src/reducers/configuration-management.js +57 -53
- package/dist/document-models/resource-instance/v1/src/reducers/instance-management.d.ts.map +1 -1
- package/dist/document-models/resource-instance/v1/src/reducers/instance-management.js +57 -21
- package/dist/document-models/resource-instance/v1/tests/instance-management.test.js +11 -1
- package/dist/document-models/resource-template/v1/actions.d.ts +3 -1
- package/dist/document-models/resource-template/v1/actions.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/audience-management/error.d.ts +20 -1
- package/dist/document-models/resource-template/v1/gen/audience-management/error.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/audience-management/error.js +16 -1
- package/dist/document-models/resource-template/v1/gen/controller.d.ts +4 -0
- package/dist/document-models/resource-template/v1/gen/controller.d.ts.map +1 -0
- package/dist/document-models/resource-template/v1/gen/controller.js +3 -0
- package/dist/document-models/resource-template/v1/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/document-model.js +207 -89
- package/dist/document-models/resource-template/v1/gen/document-schema.d.ts +12 -12
- package/dist/document-models/resource-template/v1/gen/facet-targeting/error.d.ts +27 -1
- package/dist/document-models/resource-template/v1/gen/facet-targeting/error.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/facet-targeting/error.js +23 -1
- package/dist/document-models/resource-template/v1/gen/index.d.ts +1 -0
- package/dist/document-models/resource-template/v1/gen/index.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/index.js +1 -0
- package/dist/document-models/resource-template/v1/gen/option-group-management/error.d.ts +27 -1
- package/dist/document-models/resource-template/v1/gen/option-group-management/error.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/option-group-management/error.js +23 -1
- package/dist/document-models/resource-template/v1/gen/ph-factories.js +3 -3
- package/dist/document-models/resource-template/v1/gen/schema/types.d.ts +4 -4
- package/dist/document-models/resource-template/v1/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/schema/zod.js +4 -4
- package/dist/document-models/resource-template/v1/gen/service-management/error.d.ts +51 -1
- package/dist/document-models/resource-template/v1/gen/service-management/error.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/gen/service-management/error.js +49 -1
- package/dist/document-models/resource-template/v1/gen/utils.js +3 -3
- package/dist/document-models/resource-template/v1/module.d.ts +1 -1
- package/dist/document-models/resource-template/v1/module.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/module.js +4 -1
- package/dist/document-models/resource-template/v1/src/reducers/option-group-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/v1/src/reducers/option-group-management.js +2 -21
- package/dist/document-models/service-offering/v1/actions.d.ts +3 -1
- package/dist/document-models/service-offering/v1/actions.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/controller.d.ts +4 -0
- package/dist/document-models/service-offering/v1/gen/controller.d.ts.map +1 -0
- package/dist/document-models/service-offering/v1/gen/controller.js +3 -0
- package/dist/document-models/service-offering/v1/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/document-model.js +421 -199
- package/dist/document-models/service-offering/v1/gen/document-schema.d.ts +9 -9
- package/dist/document-models/service-offering/v1/gen/index.d.ts +1 -0
- package/dist/document-models/service-offering/v1/gen/index.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/index.js +1 -0
- package/dist/document-models/service-offering/v1/gen/offering/error.d.ts +41 -1
- package/dist/document-models/service-offering/v1/gen/offering/error.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/offering/error.js +37 -1
- package/dist/document-models/service-offering/v1/gen/option-groups/error.d.ts +55 -1
- package/dist/document-models/service-offering/v1/gen/option-groups/error.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/option-groups/error.js +53 -1
- package/dist/document-models/service-offering/v1/gen/ph-factories.js +3 -3
- package/dist/document-models/service-offering/v1/gen/schema/types.d.ts +134 -61
- package/dist/document-models/service-offering/v1/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/schema/zod.d.ts +35 -10
- package/dist/document-models/service-offering/v1/gen/schema/zod.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/schema/zod.js +182 -64
- package/dist/document-models/service-offering/v1/gen/services/error.d.ts +20 -1
- package/dist/document-models/service-offering/v1/gen/services/error.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/services/error.js +16 -1
- package/dist/document-models/service-offering/v1/gen/tiers/error.d.ts +100 -1
- package/dist/document-models/service-offering/v1/gen/tiers/error.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/gen/tiers/error.js +106 -1
- package/dist/document-models/service-offering/v1/gen/utils.js +4 -4
- package/dist/document-models/service-offering/v1/module.d.ts +1 -1
- package/dist/document-models/service-offering/v1/module.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/module.js +4 -1
- package/dist/document-models/service-offering/v1/src/reducers/offering.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/src/reducers/offering.js +20 -12
- package/dist/document-models/service-offering/v1/src/reducers/option-groups.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/src/reducers/option-groups.js +157 -39
- package/dist/document-models/service-offering/v1/src/reducers/services.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/src/reducers/services.js +17 -14
- package/dist/document-models/service-offering/v1/src/reducers/tiers.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/src/reducers/tiers.js +111 -78
- package/dist/document-models/service-offering/v1/src/utils.d.ts +60 -1
- package/dist/document-models/service-offering/v1/src/utils.d.ts.map +1 -1
- package/dist/document-models/service-offering/v1/src/utils.js +173 -1
- package/dist/document-models/service-offering/v1/tests/option-groups.test.js +1 -1
- package/dist/document-models/service-offering/v1/utils.d.ts +3 -0
- package/dist/document-models/service-offering/v1/utils.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/actions.d.ts +3 -1
- package/dist/document-models/subscription-instance/v1/actions.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/controller.d.ts +4 -0
- package/dist/document-models/subscription-instance/v1/gen/controller.d.ts.map +1 -0
- package/dist/document-models/subscription-instance/v1/gen/controller.js +3 -0
- package/dist/document-models/subscription-instance/v1/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/document-model.js +488 -246
- package/dist/document-models/subscription-instance/v1/gen/document-schema.d.ts +3 -3
- package/dist/document-models/subscription-instance/v1/gen/index.d.ts +1 -0
- package/dist/document-models/subscription-instance/v1/gen/index.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/index.js +1 -0
- package/dist/document-models/subscription-instance/v1/gen/metrics/error.d.ts +73 -1
- package/dist/document-models/subscription-instance/v1/gen/metrics/error.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/metrics/error.js +86 -1
- package/dist/document-models/subscription-instance/v1/gen/ph-factories.js +1 -1
- package/dist/document-models/subscription-instance/v1/gen/schema/types.d.ts +199 -82
- package/dist/document-models/subscription-instance/v1/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/schema/zod.d.ts +22 -12
- package/dist/document-models/subscription-instance/v1/gen/schema/zod.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/schema/zod.js +230 -84
- package/dist/document-models/subscription-instance/v1/gen/service/error.d.ts +62 -1
- package/dist/document-models/subscription-instance/v1/gen/service/error.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/service/error.js +60 -1
- package/dist/document-models/subscription-instance/v1/gen/service-group/error.d.ts +39 -1
- package/dist/document-models/subscription-instance/v1/gen/service-group/error.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/service-group/error.js +39 -1
- package/dist/document-models/subscription-instance/v1/gen/subscription/error.d.ts +55 -1
- package/dist/document-models/subscription-instance/v1/gen/subscription/error.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/gen/subscription/error.js +51 -1
- package/dist/document-models/subscription-instance/v1/gen/utils.js +2 -2
- package/dist/document-models/subscription-instance/v1/module.d.ts +1 -1
- package/dist/document-models/subscription-instance/v1/module.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/module.js +4 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/customer.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/customer.js +1 -0
- package/dist/document-models/subscription-instance/v1/src/reducers/metrics.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/metrics.js +70 -45
- package/dist/document-models/subscription-instance/v1/src/reducers/service-group.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/service-group.js +108 -30
- package/dist/document-models/subscription-instance/v1/src/reducers/service.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/service.js +108 -39
- package/dist/document-models/subscription-instance/v1/src/reducers/subscription.d.ts.map +1 -1
- package/dist/document-models/subscription-instance/v1/src/reducers/subscription.js +193 -35
- package/dist/editors/resource-instance-editor/editor.d.ts.map +1 -1
- package/dist/editors/resource-instance-editor/editor.js +13 -3
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +4 -2
- package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ServiceCatalog.js +189 -32
- package/dist/editors/service-offering-editor/components/TheMatrix.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.js +295 -140
- package/dist/editors/service-offering-editor/components/TierDefinition.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TierDefinition.js +2 -0
- package/dist/editors/service-offering-editor/components/TierPricingOptionsPanel.js +3 -3
- package/dist/editors/service-offering-editor/components/pricing-utils.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/pricing-utils.js +26 -7
- package/dist/editors/subscription-instance-editor/components/BillingPanel.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/BillingPanel.js +4 -4
- package/dist/editors/subscription-instance-editor/components/CustomerInfo.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/CustomerInfo.js +3 -2
- package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts +3 -0
- package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/ImportServiceConfigButton.js +12 -0
- package/dist/editors/subscription-instance-editor/components/MetricActions.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/MetricActions.js +4 -2
- package/dist/editors/subscription-instance-editor/components/MockDataButton.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/MockDataButton.js +214 -2
- package/dist/editors/subscription-instance-editor/components/OperatorNotes.js +1 -1
- package/dist/editors/subscription-instance-editor/components/ServicesPanel.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/ServicesPanel.js +9 -20
- package/dist/editors/subscription-instance-editor/components/SubscriptionActions.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/SubscriptionActions.js +8 -9
- package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/SubscriptionHeader.js +1 -1
- package/dist/editors/subscription-instance-editor/components/billing-utils.d.ts +14 -6
- package/dist/editors/subscription-instance-editor/components/billing-utils.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/billing-utils.js +19 -23
- package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.d.ts +16 -2
- package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.d.ts.map +1 -1
- package/dist/editors/subscription-instance-editor/components/mapOfferingToSubscription.js +155 -6
- package/dist/powerhouse.manifest.json +29 -3
- package/dist/style.css +14 -0
- package/dist/subgraphs/resources-services/resolvers.d.ts +1 -1
- package/dist/subgraphs/resources-services/resolvers.d.ts.map +1 -1
- package/dist/subgraphs/resources-services/resolvers.js +273 -158
- package/dist/subgraphs/resources-services/schema.d.ts.map +1 -1
- package/dist/subgraphs/resources-services/schema.js +107 -41
- package/package.json +22 -18
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UpdateTierNotFoundError, UpdateTierPricingNotFoundError, DeleteTierNotFoundError, AddServiceLevelTierNotFoundError, UpdateServiceLevelTierNotFoundError, UpdateServiceLevelNotFoundError, RemoveServiceLevelTierNotFoundError, AddUsageLimitTierNotFoundError, UpdateUsageLimitTierNotFoundError, UpdateUsageLimitNotFoundError, RemoveUsageLimitTierNotFoundError, SetTierDefaultBillingCycleTierNotFoundError, SetTierBillingCycleDiscountsTierNotFoundError, SetTierPricingModeTierNotFoundError, } from "../../gen/tiers/error.js";
|
|
1
2
|
export const serviceOfferingTiersOperations = {
|
|
2
3
|
addTierOperation(state, action) {
|
|
3
4
|
state.tiers.push({
|
|
@@ -5,8 +6,11 @@ export const serviceOfferingTiersOperations = {
|
|
|
5
6
|
name: action.input.name,
|
|
6
7
|
description: action.input.description || null,
|
|
7
8
|
isCustomPricing: action.input.isCustomPricing || false,
|
|
8
|
-
pricingMode:
|
|
9
|
-
pricing:
|
|
9
|
+
pricingMode: null,
|
|
10
|
+
pricing: {
|
|
11
|
+
amount: action.input.amount || null,
|
|
12
|
+
currency: action.input.currency,
|
|
13
|
+
},
|
|
10
14
|
defaultBillingCycle: null,
|
|
11
15
|
billingCycleDiscounts: [],
|
|
12
16
|
serviceLevels: [],
|
|
@@ -16,135 +20,164 @@ export const serviceOfferingTiersOperations = {
|
|
|
16
20
|
},
|
|
17
21
|
updateTierOperation(state, action) {
|
|
18
22
|
const tier = state.tiers.find((t) => t.id === action.input.id);
|
|
19
|
-
if (tier) {
|
|
20
|
-
|
|
21
|
-
tier.name = action.input.name;
|
|
22
|
-
if (action.input.description !== undefined)
|
|
23
|
-
tier.description = action.input.description || null;
|
|
24
|
-
if (action.input.isCustomPricing !== undefined &&
|
|
25
|
-
action.input.isCustomPricing !== null)
|
|
26
|
-
tier.isCustomPricing = action.input.isCustomPricing;
|
|
23
|
+
if (!tier) {
|
|
24
|
+
throw new UpdateTierNotFoundError(`Tier with ID ${action.input.id} not found`);
|
|
27
25
|
}
|
|
26
|
+
if (action.input.name)
|
|
27
|
+
tier.name = action.input.name;
|
|
28
|
+
if (action.input.description !== undefined)
|
|
29
|
+
tier.description = action.input.description || null;
|
|
30
|
+
if (action.input.isCustomPricing !== undefined &&
|
|
31
|
+
action.input.isCustomPricing !== null)
|
|
32
|
+
tier.isCustomPricing = action.input.isCustomPricing;
|
|
28
33
|
state.lastModified = action.input.lastModified;
|
|
29
34
|
},
|
|
30
35
|
updateTierPricingOperation(state, action) {
|
|
31
36
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
32
|
-
if (tier) {
|
|
33
|
-
|
|
34
|
-
tier.pricing = {
|
|
35
|
-
amount: action.input.amount,
|
|
36
|
-
currency: action.input.currency,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
tier.pricing.amount = action.input.amount;
|
|
41
|
-
tier.pricing.currency = action.input.currency;
|
|
42
|
-
}
|
|
37
|
+
if (!tier) {
|
|
38
|
+
throw new UpdateTierPricingNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
43
39
|
}
|
|
40
|
+
if (action.input.amount !== undefined)
|
|
41
|
+
tier.pricing.amount = action.input.amount || null;
|
|
42
|
+
if (action.input.currency)
|
|
43
|
+
tier.pricing.currency = action.input.currency;
|
|
44
44
|
state.lastModified = action.input.lastModified;
|
|
45
45
|
},
|
|
46
46
|
deleteTierOperation(state, action) {
|
|
47
47
|
const index = state.tiers.findIndex((t) => t.id === action.input.id);
|
|
48
|
-
if (index
|
|
49
|
-
|
|
48
|
+
if (index === -1) {
|
|
49
|
+
throw new DeleteTierNotFoundError(`Tier with ID ${action.input.id} not found`);
|
|
50
50
|
}
|
|
51
|
+
state.tiers.splice(index, 1);
|
|
51
52
|
state.lastModified = action.input.lastModified;
|
|
52
53
|
},
|
|
53
54
|
addServiceLevelOperation(state, action) {
|
|
54
55
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
55
|
-
if (tier) {
|
|
56
|
-
|
|
57
|
-
id: action.input.id,
|
|
58
|
-
serviceId: action.input.serviceId,
|
|
59
|
-
level: action.input.level,
|
|
60
|
-
description: action.input.description || null,
|
|
61
|
-
});
|
|
56
|
+
if (!tier) {
|
|
57
|
+
throw new AddServiceLevelTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
62
58
|
}
|
|
59
|
+
tier.serviceLevels.push({
|
|
60
|
+
id: action.input.serviceLevelId,
|
|
61
|
+
serviceId: action.input.serviceId,
|
|
62
|
+
level: action.input.level,
|
|
63
|
+
customValue: action.input.customValue || null,
|
|
64
|
+
optionGroupId: action.input.optionGroupId || null,
|
|
65
|
+
});
|
|
63
66
|
state.lastModified = action.input.lastModified;
|
|
64
67
|
},
|
|
65
68
|
updateServiceLevelOperation(state, action) {
|
|
66
69
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
67
|
-
if (tier) {
|
|
68
|
-
|
|
69
|
-
if (sl) {
|
|
70
|
-
if (action.input.level)
|
|
71
|
-
sl.level = action.input.level;
|
|
72
|
-
if (action.input.description !== undefined)
|
|
73
|
-
sl.description = action.input.description || null;
|
|
74
|
-
}
|
|
70
|
+
if (!tier) {
|
|
71
|
+
throw new UpdateServiceLevelTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
75
72
|
}
|
|
73
|
+
const sl = tier.serviceLevels.find((s) => s.id === action.input.serviceLevelId);
|
|
74
|
+
if (!sl) {
|
|
75
|
+
throw new UpdateServiceLevelNotFoundError(`Service level with ID ${action.input.serviceLevelId} not found`);
|
|
76
|
+
}
|
|
77
|
+
if (action.input.level)
|
|
78
|
+
sl.level = action.input.level;
|
|
79
|
+
if (action.input.customValue !== undefined)
|
|
80
|
+
sl.customValue = action.input.customValue || null;
|
|
81
|
+
if (action.input.optionGroupId !== undefined)
|
|
82
|
+
sl.optionGroupId = action.input.optionGroupId || null;
|
|
76
83
|
state.lastModified = action.input.lastModified;
|
|
77
84
|
},
|
|
78
85
|
removeServiceLevelOperation(state, action) {
|
|
79
86
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
80
|
-
if (tier) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
if (!tier) {
|
|
88
|
+
throw new RemoveServiceLevelTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
89
|
+
}
|
|
90
|
+
const index = tier.serviceLevels.findIndex((s) => s.id === action.input.serviceLevelId);
|
|
91
|
+
if (index !== -1) {
|
|
92
|
+
tier.serviceLevels.splice(index, 1);
|
|
85
93
|
}
|
|
86
94
|
state.lastModified = action.input.lastModified;
|
|
87
95
|
},
|
|
88
96
|
addUsageLimitOperation(state, action) {
|
|
89
97
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
90
|
-
if (tier) {
|
|
91
|
-
|
|
92
|
-
id: action.input.id,
|
|
93
|
-
name: action.input.name,
|
|
94
|
-
limit: action.input.limit,
|
|
95
|
-
unit: action.input.unit || null,
|
|
96
|
-
});
|
|
98
|
+
if (!tier) {
|
|
99
|
+
throw new AddUsageLimitTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
97
100
|
}
|
|
101
|
+
tier.usageLimits.push({
|
|
102
|
+
id: action.input.limitId,
|
|
103
|
+
serviceId: action.input.serviceId,
|
|
104
|
+
metric: action.input.metric,
|
|
105
|
+
unitName: action.input.unitName || null,
|
|
106
|
+
freeLimit: action.input.freeLimit || null,
|
|
107
|
+
paidLimit: action.input.paidLimit || null,
|
|
108
|
+
resetCycle: action.input.resetCycle || null,
|
|
109
|
+
notes: action.input.notes || null,
|
|
110
|
+
unitPrice: action.input.unitPrice || null,
|
|
111
|
+
unitPriceCurrency: action.input.unitPriceCurrency || null,
|
|
112
|
+
});
|
|
98
113
|
state.lastModified = action.input.lastModified;
|
|
99
114
|
},
|
|
100
115
|
updateUsageLimitOperation(state, action) {
|
|
101
116
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
102
|
-
if (tier) {
|
|
103
|
-
|
|
104
|
-
if (ul) {
|
|
105
|
-
if (action.input.limit !== undefined && action.input.limit !== null)
|
|
106
|
-
ul.limit = action.input.limit;
|
|
107
|
-
if (action.input.name !== undefined && action.input.name !== null)
|
|
108
|
-
ul.name = action.input.name;
|
|
109
|
-
if (action.input.unit !== undefined)
|
|
110
|
-
ul.unit = action.input.unit || null;
|
|
111
|
-
}
|
|
117
|
+
if (!tier) {
|
|
118
|
+
throw new UpdateUsageLimitTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
112
119
|
}
|
|
120
|
+
const ul = tier.usageLimits.find((u) => u.id === action.input.limitId);
|
|
121
|
+
if (!ul) {
|
|
122
|
+
throw new UpdateUsageLimitNotFoundError(`Usage limit with ID ${action.input.limitId} not found`);
|
|
123
|
+
}
|
|
124
|
+
if (action.input.metric)
|
|
125
|
+
ul.metric = action.input.metric;
|
|
126
|
+
if (action.input.unitName !== undefined)
|
|
127
|
+
ul.unitName = action.input.unitName || null;
|
|
128
|
+
if (action.input.freeLimit !== undefined)
|
|
129
|
+
ul.freeLimit = action.input.freeLimit || null;
|
|
130
|
+
if (action.input.paidLimit !== undefined)
|
|
131
|
+
ul.paidLimit = action.input.paidLimit || null;
|
|
132
|
+
if (action.input.resetCycle !== undefined)
|
|
133
|
+
ul.resetCycle = action.input.resetCycle || null;
|
|
134
|
+
if (action.input.notes !== undefined)
|
|
135
|
+
ul.notes = action.input.notes || null;
|
|
136
|
+
if (action.input.unitPrice !== undefined)
|
|
137
|
+
ul.unitPrice = action.input.unitPrice || null;
|
|
138
|
+
if (action.input.unitPriceCurrency !== undefined)
|
|
139
|
+
ul.unitPriceCurrency = action.input.unitPriceCurrency || null;
|
|
113
140
|
state.lastModified = action.input.lastModified;
|
|
114
141
|
},
|
|
115
142
|
removeUsageLimitOperation(state, action) {
|
|
116
143
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
117
|
-
if (tier) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
144
|
+
if (!tier) {
|
|
145
|
+
throw new RemoveUsageLimitTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
146
|
+
}
|
|
147
|
+
const index = tier.usageLimits.findIndex((u) => u.id === action.input.limitId);
|
|
148
|
+
if (index !== -1) {
|
|
149
|
+
tier.usageLimits.splice(index, 1);
|
|
122
150
|
}
|
|
123
151
|
state.lastModified = action.input.lastModified;
|
|
124
152
|
},
|
|
125
|
-
|
|
153
|
+
setTierDefaultBillingCycleOperation(state, action) {
|
|
126
154
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
127
|
-
if (tier) {
|
|
128
|
-
|
|
155
|
+
if (!tier) {
|
|
156
|
+
throw new SetTierDefaultBillingCycleTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
129
157
|
}
|
|
158
|
+
tier.defaultBillingCycle = action.input.defaultBillingCycle;
|
|
130
159
|
state.lastModified = action.input.lastModified;
|
|
131
160
|
},
|
|
132
|
-
|
|
161
|
+
setTierBillingCycleDiscountsOperation(state, action) {
|
|
133
162
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
134
|
-
if (tier) {
|
|
135
|
-
|
|
163
|
+
if (!tier) {
|
|
164
|
+
throw new SetTierBillingCycleDiscountsTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
136
165
|
}
|
|
166
|
+
tier.billingCycleDiscounts = action.input.discounts.map((d) => ({
|
|
167
|
+
billingCycle: d.billingCycle,
|
|
168
|
+
discountRule: {
|
|
169
|
+
discountType: d.discountRule.discountType,
|
|
170
|
+
discountValue: d.discountRule.discountValue,
|
|
171
|
+
},
|
|
172
|
+
}));
|
|
137
173
|
state.lastModified = action.input.lastModified;
|
|
138
174
|
},
|
|
139
|
-
|
|
175
|
+
setTierPricingModeOperation(state, action) {
|
|
140
176
|
const tier = state.tiers.find((t) => t.id === action.input.tierId);
|
|
141
|
-
if (tier) {
|
|
142
|
-
|
|
143
|
-
cycle: d.cycle,
|
|
144
|
-
discountType: d.discountType,
|
|
145
|
-
discountValue: d.discountValue,
|
|
146
|
-
}));
|
|
177
|
+
if (!tier) {
|
|
178
|
+
throw new SetTierPricingModeTierNotFoundError(`Tier with ID ${action.input.tierId} not found`);
|
|
147
179
|
}
|
|
180
|
+
tier.pricingMode = action.input.pricingMode;
|
|
148
181
|
state.lastModified = action.input.lastModified;
|
|
149
182
|
},
|
|
150
183
|
};
|
|
@@ -1,2 +1,61 @@
|
|
|
1
|
-
|
|
1
|
+
import type { BillingCycle } from "../gen/schema/types.js";
|
|
2
|
+
import type { ServiceOfferingPHState } from "../gen/types.js";
|
|
3
|
+
export declare const BILLING_CYCLE_MONTHS: Record<BillingCycle, number>;
|
|
4
|
+
export interface DiscountBreakdown {
|
|
5
|
+
discountType: string;
|
|
6
|
+
discountValue: number;
|
|
7
|
+
originalAmount: number;
|
|
8
|
+
discountedAmount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SetupCostDiscountBreakdown {
|
|
11
|
+
originalAmount: number;
|
|
12
|
+
discountedAmount: number;
|
|
13
|
+
discountType: string;
|
|
14
|
+
discountValue: number;
|
|
15
|
+
}
|
|
16
|
+
export interface OptionGroupBreakdown {
|
|
17
|
+
optionGroupId: string;
|
|
18
|
+
optionGroupName: string;
|
|
19
|
+
effectiveBillingCycle: BillingCycle;
|
|
20
|
+
monthlyBase: number;
|
|
21
|
+
cycleAmount: number;
|
|
22
|
+
recurringAmount: number;
|
|
23
|
+
currency: string;
|
|
24
|
+
discount: DiscountBreakdown | null;
|
|
25
|
+
setupCost: number | null;
|
|
26
|
+
setupCostCurrency: string | null;
|
|
27
|
+
setupCostDiscount: SetupCostDiscountBreakdown | null;
|
|
28
|
+
}
|
|
29
|
+
export interface AddOnBreakdown {
|
|
30
|
+
optionGroupId: string;
|
|
31
|
+
optionGroupName: string;
|
|
32
|
+
selectedBillingCycle: BillingCycle;
|
|
33
|
+
monthlyBase: number;
|
|
34
|
+
cycleAmount: number;
|
|
35
|
+
recurringAmount: number;
|
|
36
|
+
currency: string;
|
|
37
|
+
discount: DiscountBreakdown | null;
|
|
38
|
+
setupCost: number | null;
|
|
39
|
+
setupCostCurrency: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface PriceBreakdownTotals {
|
|
42
|
+
grandRecurringTotal: number;
|
|
43
|
+
}
|
|
44
|
+
export interface PriceBreakdown {
|
|
45
|
+
tierCycleTotal: number;
|
|
46
|
+
tierCurrency: string;
|
|
47
|
+
tierMonthlyBase: number;
|
|
48
|
+
optionGroupBreakdowns: OptionGroupBreakdown[];
|
|
49
|
+
setupGroupBreakdowns: OptionGroupBreakdown[];
|
|
50
|
+
addOnBreakdowns: AddOnBreakdown[];
|
|
51
|
+
totals: PriceBreakdownTotals;
|
|
52
|
+
}
|
|
53
|
+
export interface UserSelection {
|
|
54
|
+
tierId: string;
|
|
55
|
+
billingCycle: BillingCycle;
|
|
56
|
+
optionGroupIds: string[];
|
|
57
|
+
groupBillingCycleOverrides?: Record<string, BillingCycle>;
|
|
58
|
+
addonBillingCycleOverrides?: Record<string, BillingCycle>;
|
|
59
|
+
}
|
|
60
|
+
export declare function getUserSelectionPriceBreakdown(state: ServiceOfferingPHState, selection: UserSelection): PriceBreakdown;
|
|
2
61
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../document-models/service-offering/v1/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../document-models/service-offering/v1/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAM7D,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,YAAY,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,YAAY,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1D,0BAA0B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC3D;AAyLD,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,sBAAsB,EAC7B,SAAS,EAAE,aAAa,GACvB,cAAc,CAmGhB"}
|
|
@@ -1 +1,173 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export const BILLING_CYCLE_MONTHS = {
|
|
2
|
+
MONTHLY: 1,
|
|
3
|
+
QUARTERLY: 3,
|
|
4
|
+
SEMI_ANNUAL: 6,
|
|
5
|
+
ANNUAL: 12,
|
|
6
|
+
ONE_TIME: 0,
|
|
7
|
+
};
|
|
8
|
+
function emptyBreakdown(currency) {
|
|
9
|
+
return {
|
|
10
|
+
tierCycleTotal: 0,
|
|
11
|
+
tierCurrency: currency,
|
|
12
|
+
tierMonthlyBase: 0,
|
|
13
|
+
optionGroupBreakdowns: [],
|
|
14
|
+
setupGroupBreakdowns: [],
|
|
15
|
+
addOnBreakdowns: [],
|
|
16
|
+
totals: { grandRecurringTotal: 0 },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function applyDiscount(amount, rule) {
|
|
20
|
+
let discountedAmount;
|
|
21
|
+
if (rule.discountType === "PERCENTAGE") {
|
|
22
|
+
discountedAmount = amount * (1 - rule.discountValue / 100);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
discountedAmount = amount - rule.discountValue;
|
|
26
|
+
}
|
|
27
|
+
discountedAmount = Math.max(0, Math.round(discountedAmount * 100) / 100);
|
|
28
|
+
return {
|
|
29
|
+
discountedAmount,
|
|
30
|
+
discount: {
|
|
31
|
+
discountType: rule.discountType,
|
|
32
|
+
discountValue: rule.discountValue,
|
|
33
|
+
originalAmount: amount,
|
|
34
|
+
discountedAmount,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function resolveGroupPricing(group, tier, effectiveCycle, globalCurrency) {
|
|
39
|
+
const months = BILLING_CYCLE_MONTHS[effectiveCycle];
|
|
40
|
+
// Get pricing source: tier-dependent first, then standalone
|
|
41
|
+
const tierPricing = group.tierDependentPricing?.find((tp) => tp.tierId === tier.id);
|
|
42
|
+
const pricing = tierPricing?.recurringPricing ||
|
|
43
|
+
group.standalonePricing?.recurringPricing ||
|
|
44
|
+
[];
|
|
45
|
+
// Monthly base
|
|
46
|
+
const monthlyOption = pricing.find((p) => p.billingCycle === "MONTHLY");
|
|
47
|
+
const monthlyBase = monthlyOption?.amount ?? 0;
|
|
48
|
+
// Price for effective cycle
|
|
49
|
+
const cycleOption = pricing.find((p) => p.billingCycle === effectiveCycle);
|
|
50
|
+
const cycleAmount = cycleOption?.amount ?? monthlyBase * (months || 1);
|
|
51
|
+
let discount = null;
|
|
52
|
+
let recurringAmount = cycleAmount;
|
|
53
|
+
// Check for discount on the cycle option itself
|
|
54
|
+
const optionDiscount = cycleOption?.discount;
|
|
55
|
+
if (optionDiscount && optionDiscount.discountValue > 0) {
|
|
56
|
+
const result = applyDiscount(cycleAmount, optionDiscount);
|
|
57
|
+
recurringAmount = result.discountedAmount;
|
|
58
|
+
discount = result.discount;
|
|
59
|
+
}
|
|
60
|
+
// If no direct discount, check tier billing cycle discounts for inherited groups
|
|
61
|
+
if (!discount && group.discountMode === "INHERIT_TIER") {
|
|
62
|
+
const tierDiscount = tier.billingCycleDiscounts.find((d) => d.billingCycle === effectiveCycle);
|
|
63
|
+
if (tierDiscount && tierDiscount.discountRule.discountValue > 0) {
|
|
64
|
+
const result = applyDiscount(cycleAmount, tierDiscount.discountRule);
|
|
65
|
+
recurringAmount = result.discountedAmount;
|
|
66
|
+
discount = result.discount;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Setup cost
|
|
70
|
+
const setupCostSource = tierPricing?.setupCost || group.standalonePricing?.setupCost;
|
|
71
|
+
const setupCost = setupCostSource?.amount ?? null;
|
|
72
|
+
const setupCostCurrency = setupCostSource?.currency ?? null;
|
|
73
|
+
let setupCostDiscount = null;
|
|
74
|
+
if (setupCostSource?.discount && setupCostSource.discount.discountValue > 0) {
|
|
75
|
+
const original = setupCostSource.amount;
|
|
76
|
+
const rule = setupCostSource.discount;
|
|
77
|
+
let discounted;
|
|
78
|
+
if (rule.discountType === "PERCENTAGE") {
|
|
79
|
+
discounted = original * (1 - rule.discountValue / 100);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
discounted = original - rule.discountValue;
|
|
83
|
+
}
|
|
84
|
+
discounted = Math.max(0, Math.round(discounted * 100) / 100);
|
|
85
|
+
setupCostDiscount = {
|
|
86
|
+
originalAmount: original,
|
|
87
|
+
discountedAmount: discounted,
|
|
88
|
+
discountType: rule.discountType,
|
|
89
|
+
discountValue: rule.discountValue,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const priceCurrency = cycleOption?.currency || monthlyOption?.currency || globalCurrency;
|
|
93
|
+
return {
|
|
94
|
+
monthlyBase,
|
|
95
|
+
cycleAmount,
|
|
96
|
+
recurringAmount,
|
|
97
|
+
currency: priceCurrency,
|
|
98
|
+
discount,
|
|
99
|
+
setupCost,
|
|
100
|
+
setupCostCurrency,
|
|
101
|
+
setupCostDiscount,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function computeGroupBreakdown(group, tier, globalBillingCycle, globalCurrency, overrides) {
|
|
105
|
+
const effectiveCycle = overrides?.[group.id] || globalBillingCycle;
|
|
106
|
+
const pricing = resolveGroupPricing(group, tier, effectiveCycle, globalCurrency);
|
|
107
|
+
return {
|
|
108
|
+
optionGroupId: group.id,
|
|
109
|
+
optionGroupName: group.name,
|
|
110
|
+
effectiveBillingCycle: effectiveCycle,
|
|
111
|
+
...pricing,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function computeAddOnBreakdown(group, tier, globalBillingCycle, globalCurrency, overrides) {
|
|
115
|
+
const selectedCycle = overrides?.[group.id] || globalBillingCycle;
|
|
116
|
+
const pricing = resolveGroupPricing(group, tier, selectedCycle, globalCurrency);
|
|
117
|
+
return {
|
|
118
|
+
optionGroupId: group.id,
|
|
119
|
+
optionGroupName: group.name,
|
|
120
|
+
selectedBillingCycle: selectedCycle,
|
|
121
|
+
monthlyBase: pricing.monthlyBase,
|
|
122
|
+
cycleAmount: pricing.cycleAmount,
|
|
123
|
+
recurringAmount: pricing.recurringAmount,
|
|
124
|
+
currency: pricing.currency,
|
|
125
|
+
discount: pricing.discount,
|
|
126
|
+
setupCost: pricing.setupCost,
|
|
127
|
+
setupCostCurrency: pricing.setupCostCurrency,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export function getUserSelectionPriceBreakdown(state, selection) {
|
|
131
|
+
const { tierId, billingCycle, optionGroupIds, groupBillingCycleOverrides, addonBillingCycleOverrides, } = selection;
|
|
132
|
+
const globalState = state.global;
|
|
133
|
+
const tier = globalState.tiers.find((t) => t.id === tierId);
|
|
134
|
+
if (!tier) {
|
|
135
|
+
return emptyBreakdown("USD");
|
|
136
|
+
}
|
|
137
|
+
const currency = tier.pricing.currency || "USD";
|
|
138
|
+
const months = BILLING_CYCLE_MONTHS[billingCycle];
|
|
139
|
+
// Tier cycle total from tier pricing
|
|
140
|
+
const tierMonthlyAmount = tier.pricing.amount ?? 0;
|
|
141
|
+
const tierCycleTotal = tierMonthlyAmount * (months || 1);
|
|
142
|
+
// Sum of monthly base prices across all regular (non-setup, non-addon) option groups
|
|
143
|
+
const regularGroups = globalState.optionGroups.filter((g) => g.costType !== "SETUP" && !g.isAddOn);
|
|
144
|
+
const tierMonthlyBase = regularGroups.reduce((sum, group) => {
|
|
145
|
+
const tierPricing = group.tierDependentPricing?.find((tp) => tp.tierId === tierId);
|
|
146
|
+
const pricing = tierPricing?.recurringPricing ||
|
|
147
|
+
group.standalonePricing?.recurringPricing ||
|
|
148
|
+
[];
|
|
149
|
+
const monthlyOption = pricing.find((p) => p.billingCycle === "MONTHLY");
|
|
150
|
+
return sum + (monthlyOption?.amount ?? 0);
|
|
151
|
+
}, 0);
|
|
152
|
+
// Separate option groups by type
|
|
153
|
+
const setupGroups = globalState.optionGroups.filter((g) => g.costType === "SETUP");
|
|
154
|
+
const addonGroups = globalState.optionGroups.filter((g) => g.isAddOn && optionGroupIds.includes(g.id));
|
|
155
|
+
const optionGroupBreakdowns = regularGroups.map((group) => computeGroupBreakdown(group, tier, billingCycle, currency, groupBillingCycleOverrides));
|
|
156
|
+
const setupGroupBreakdowns = setupGroups.map((group) => computeGroupBreakdown(group, tier, billingCycle, currency, groupBillingCycleOverrides));
|
|
157
|
+
const addOnBreakdowns = addonGroups.map((group) => computeAddOnBreakdown(group, tier, billingCycle, currency, addonBillingCycleOverrides));
|
|
158
|
+
// Grand recurring total
|
|
159
|
+
const optionGroupRecurring = optionGroupBreakdowns.reduce((sum, b) => sum + b.recurringAmount, 0);
|
|
160
|
+
const addOnRecurring = addOnBreakdowns.reduce((sum, b) => sum + b.recurringAmount, 0);
|
|
161
|
+
const grandRecurringTotal = tierCycleTotal + optionGroupRecurring + addOnRecurring;
|
|
162
|
+
return {
|
|
163
|
+
tierCycleTotal,
|
|
164
|
+
tierCurrency: currency,
|
|
165
|
+
tierMonthlyBase,
|
|
166
|
+
optionGroupBreakdowns,
|
|
167
|
+
setupGroupBreakdowns,
|
|
168
|
+
addOnBreakdowns,
|
|
169
|
+
totals: {
|
|
170
|
+
grandRecurringTotal,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { generateMock } from "@powerhousedao/common/utils";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { reducer, utils, isServiceOfferingDocument, addOptionGroup, updateOptionGroup, deleteOptionGroup, setOptionGroupStandalonePricing,
|
|
3
|
+
import { reducer, utils, isServiceOfferingDocument, addOptionGroup, updateOptionGroup, deleteOptionGroup, setOptionGroupStandalonePricing, AddOptionGroupInputSchema, UpdateOptionGroupInputSchema, DeleteOptionGroupInputSchema, SetOptionGroupStandalonePricingInputSchema, addOptionGroupTierPricing, updateOptionGroupTierPricing, removeOptionGroupTierPricing, setOptionGroupDiscountMode, AddOptionGroupTierPricingInputSchema, UpdateOptionGroupTierPricingInputSchema, RemoveOptionGroupTierPricingInputSchema, SetOptionGroupDiscountModeInputSchema, } from "@powerhousedao/service-offering/document-models/service-offering/v1";
|
|
4
4
|
describe("OptionGroupsOperations", () => {
|
|
5
5
|
it("should handle addOptionGroup operation", () => {
|
|
6
6
|
const document = utils.createDocument();
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { ServiceOfferingPHState } from "./gen/types.js";
|
|
2
|
+
import * as customUtils from "./src/utils.js";
|
|
2
3
|
/** Utils for the ServiceOffering document model */
|
|
3
4
|
export declare const utils: {
|
|
5
|
+
getUserSelectionPriceBreakdown(state: ServiceOfferingPHState, selection: customUtils.UserSelection): customUtils.PriceBreakdown;
|
|
6
|
+
BILLING_CYCLE_MONTHS: Record<import("./gen/types.js").BillingCycle, number>;
|
|
4
7
|
fileExtension: string;
|
|
5
8
|
createState: import("document-model").CreateState<ServiceOfferingPHState>;
|
|
6
9
|
createDocument: import("document-model").CreateDocument<ServiceOfferingPHState>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../document-models/service-offering/v1/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../document-models/service-offering/v1/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAE9C,mDAAmD;AACnD,eAAO,MAAM,KAAK;;;;;;;;;;;;CAGoC,CAAC"}
|
|
@@ -39,7 +39,9 @@ export declare const actions: {
|
|
|
39
39
|
setAutoRenew: (input: import("./index.js").SetAutoRenewInput) => import("./index.js").SetAutoRenewAction;
|
|
40
40
|
setRenewalDate: (input: import("./index.js").SetRenewalDateInput) => import("./index.js").SetRenewalDateAction;
|
|
41
41
|
updateBillingProjection: (input: import("./index.js").UpdateBillingProjectionInput) => import("./index.js").UpdateBillingProjectionAction;
|
|
42
|
-
setName: (name: string
|
|
42
|
+
setName: (name: string | {
|
|
43
|
+
name: string;
|
|
44
|
+
}) => import("document-model").SetNameAction;
|
|
43
45
|
undo: (count?: number, scope?: string) => import("document-model").UndoAction;
|
|
44
46
|
redo: (count?: number, scope?: string) => import("document-model").RedoAction;
|
|
45
47
|
prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../document-models/subscription-instance/v1/actions.ts"],"names":[],"mappings":"AASA,0DAA0D;AAE1D,eAAO,MAAM,OAAO;sBAKX,gDACM;4BAEuK,sDAAiC;uBAAyF,iDAA4B;mBAA0L,6CAAwB;wBAAkL,kDAA6B;0BAAoM,oDAA+B;2BAA2M,qDAAgC;2BAA8M,qDAAgC;sBAA1rC,gDAA2B;yBAA6L,mDAA8B;wBAAqM,kDAA6B;6BAAwM,uDAAkC;6BAAuN,uDAAkC;iBAAzjB,2CAAsB;oBAAwK,8CAAyB;6BAA0L,uDAAkC;iCAA2N,2DAAyC;yBAAiO,mDAA8B;6BAA0M,uDAAkC;wBAAiN,kDAA6B;+BAAyM,yDAAuC;kCAAoO,4DAA0C;6BAA/uC,uDAAkC;0BAAkN,oDAA+B;+BAA+M,yDAAuC;2BAA4N,qDAAgC;wBAA0M,kDAA6B;kBAA2L,4CAAuB;yBAAgL,mDAA8B;yBAAqM,mDAA8B;gCAA4M,0DAAwC;wBAA4N,kDAA6B;2BAAqM,qDAAgC;yBAA4M,mDAA8B;qBAAkM,+CAA0B;uBAAwL,iDAA4B;mBAA0L,6CAAwB;qBAAgL,+CAA0B;8BAA+L,wDAAmC
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../document-models/subscription-instance/v1/actions.ts"],"names":[],"mappings":"AASA,0DAA0D;AAE1D,eAAO,MAAM,OAAO;sBAKX,gDACM;4BAEuK,sDAAiC;uBAAyF,iDAA4B;mBAA0L,6CAAwB;wBAAkL,kDAA6B;0BAAoM,oDAA+B;2BAA2M,qDAAgC;2BAA8M,qDAAgC;sBAA1rC,gDAA2B;yBAA6L,mDAA8B;wBAAqM,kDAA6B;6BAAwM,uDAAkC;6BAAuN,uDAAkC;iBAAzjB,2CAAsB;oBAAwK,8CAAyB;6BAA0L,uDAAkC;iCAA2N,2DAAyC;yBAAiO,mDAA8B;6BAA0M,uDAAkC;wBAAiN,kDAA6B;+BAAyM,yDAAuC;kCAAoO,4DAA0C;6BAA/uC,uDAAkC;0BAAkN,oDAA+B;+BAA+M,yDAAuC;2BAA4N,qDAAgC;wBAA0M,kDAA6B;kBAA2L,4CAAuB;yBAAgL,mDAA8B;yBAAqM,mDAA8B;gCAA4M,0DAAwC;wBAA4N,kDAA6B;2BAAqM,qDAAgC;yBAA4M,mDAA8B;qBAAkM,+CAA0B;uBAAwL,iDAA4B;mBAA0L,6CAAwB;qBAAgL,+CAA0B;8BAA+L,wDAAmC;;;;gBAAw7D,CAAC,eAAe,CAAC;gBAAkE,CAAC,eAAe,CAAC;iBAAmE,CAAC,aAAa,CAAC,eAAe,CAAC;;;;gBAAqS,CAAC;CAD5wO,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { PHDocumentController } from "document-model/core";
|
|
2
|
+
import type { SubscriptionInstanceAction, SubscriptionInstancePHState } from "./types.js";
|
|
3
|
+
export declare const SubscriptionInstanceController: new (initialDocument?: import("document-model").PHDocument<SubscriptionInstancePHState> | undefined) => PHDocumentController<SubscriptionInstancePHState> & import("document-model/core").ActionMap<SubscriptionInstanceAction, PHDocumentController<SubscriptionInstancePHState>>;
|
|
4
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../../document-models/subscription-instance/v1/gen/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,8BAA8B,oRAIlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-model.d.ts","sourceRoot":"","sources":["../../../../../document-models/subscription-instance/v1/gen/document-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"document-model.d.ts","sourceRoot":"","sources":["../../../../../document-models/subscription-instance/v1/gen/document-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,eAAO,MAAM,aAAa,EAAE,wBA6yB3B,CAAC"}
|